Skip to content

Commit 3765fa2

Browse files
authored
Merge pull request #6 from stepeos/multiple-mop
finalize mulitple mop
2 parents 572f48f + a6622e3 commit 3765fa2

File tree

4 files changed

+33
-9
lines changed

4 files changed

+33
-9
lines changed

carmodel_calibration/cmd.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ def _get_parser(args_to_parse):
168168
type=str,
169169
help="measure of performance, "
170170
"comma separated list, default:"
171-
"`distance`")
171+
"`distance`, options are `distance`"
172+
"`speed`, `acceleration`")
172173
args_to_check = ["--action=read_matrix", "--action=create_matrix",
173174
"--action=create_data_config"]
174175
if _check_for_args(args_to_parse, args_to_check):

carmodel_calibration/optimization.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def measure_of_performance_factory(objectives=["distance"],
2323
case2: leader-follower-pair, mmop: distance and speed
2424
:param identification: (leader identification, follower identification,
2525
recordingId)
26-
:param objectives: ['distance', 'speed', 'speedVariance',...] the
26+
:param objectives: ['distance', 'speed', 'acceleration'] the
2727
objectives to calibrate, weighted equally if not
2828
specified differently by the `weights` parameter
2929
:param weights: `tuple` of len(objectives), each item of type float
@@ -46,10 +46,21 @@ def measure_of_performance_factory(objectives=["distance"],
4646
except AssertionError as exc:
4747
_LOGGER.error("Failed creating objective function with given args.")
4848
raise exc
49+
weights_renamed = []
50+
for sop in objectives:
51+
if sop not in ["distance", "speed", "acceleration"]:
52+
raise ValueError(f"Objective {sop} not supported.")
53+
if sop == "acceleration":
54+
sop = "accFollower"
55+
if sop == "speed":
56+
sop = "speedFollower"
57+
weights_renamed.append(sop)
58+
objectives = weights_renamed
4959
for weights_value, objective in zip(weights_values, objectives):
5060
weights[objective] = weights_value
5161
def rmse(ground_truth, prediction):
52-
"""RMSE(v)
62+
"""
63+
RMSE(v)
5364
see 'About calibration of car-following dynamics of automated and
5465
human-driven vehicles: Methodology, guidelines and codes'
5566
"""
@@ -75,7 +86,8 @@ def rmspe(ground_truth, prediction):
7586
sums[idx] = np.sqrt(sums[idx] / len(ground_truth)) * weights[sop]
7687
return np.sum(sums)
7788
def theils_u(ground_truth, prediction):
78-
"""theils U(v)
89+
"""
90+
theils U(v)
7991
see 'About calibration of car-following dynamics of automated and
8092
human-driven vehicles: Methodology, guidelines and codes'
8193
"""

carmodel_calibration/sumo/simulation_module.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def _interpolate_jumpy_start(leader_jumpy, follower_jumpy):
7272
follower_synced.iloc[1:], follower_synced.iloc[:-1])
7373
free_follower = (set(leader_synced["trackId"])
7474
== set(follower_synced["trackId"]))
75-
columns = ["xCenter", "yCenter", "speed", "lon", "lat", "accel"]
75+
columns = ["xCenter", "yCenter", "speed", "lon", "lat", "acc"]
7676
jumpy_points = []
7777
if np.any(np.abs(covered_distance_l) > 1):
7878
jumpy_points.extend(np.where(np.abs(covered_distance_l) > 1)[0])
@@ -480,6 +480,11 @@ def _process_chunk(self, selection_data, chunk):
480480
follower_synced = pd.concat((follower_ss, follower_synced))
481481
follower_synced.reset_index(drop=True, inplace=True)
482482
follower_synced["time"] = new_time
483+
follower_speed = np.clip(follower_synced["speed"].values, 0, np.inf)
484+
if not "acc" in follower_synced:
485+
follower_synced["acc"] = np.insert(
486+
(follower_speed[1:] - follower_speed[:-1]) / self._timestep,
487+
0, 0, axis=0)
483488

484489
# covered distance per vehicle
485490
distance = (_get_distance_df(leader_synced, follower_synced)
@@ -500,7 +505,11 @@ def _process_chunk(self, selection_data, chunk):
500505
new_speed_padded = np.pad(new_speed, (5//2, 5-1-5//2), mode="edge")
501506
new_speed_smooth = np.convolve(new_speed_padded, np.ones((5,))/5,
502507
mode="valid")
503-
leader_synced["speed"] = np.clip(new_speed_smooth,0, np.inf)
508+
leader_synced["speed"] = np.clip(new_speed_smooth, 0, np.inf)
509+
if not "acc" in leader_synced:
510+
leader_synced["acc"] = np.insert(
511+
(new_speed_smooth[1:] - new_speed_smooth[:-1]) / self._timestep,
512+
0, 0, axis=0)
504513

505514
if leader != "":
506515
# distance = (_get_distance_df(leader_synced, follower_synced)
@@ -525,7 +534,9 @@ def _process_chunk(self, selection_data, chunk):
525534
"coveredDistanceFollower": accumulated_distance_f,
526535
"distance": distance,
527536
"speedLeader": leader_synced["speed"],
528-
"speedFollower": follower_synced["speed"]})
537+
"speedFollower": follower_synced["speed"],
538+
"accLeader": leader_synced["acc"],
539+
"accFollower": follower_synced["acc"]})
529540
ground_truth["counter"] = counter
530541
ground_truth["leader"] = leader
531542
ground_truth["follower"] = follower

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
setup_dic = dict(
55
name="carmodel_calibration",
66
description="a tool for calibration car-following models using sumo",
7-
author="Steve Oswald",
7+
author="Steve Oswald, Dominik Salles",
88
author_email="stevepeter.oswald@gmail.com",
99
packages=find_packages(exclude=["scripting", "tests", 'tests.*', ".*"]),
10-
version=0.1,
10+
version=0.2,
1111
entry_points={
1212
'console_scripts': [
1313
'carmodel-calibration = carmodel_calibration.cmd:main'

0 commit comments

Comments
 (0)