Source code for wltp.test.samples_db_tests

#! python
#-*- coding: utf-8 -*-
#
# Copyright 2013-2014 European Commission (JRC);
# Licensed under the EUPL (the 'Licence');
# You may not use this work except in compliance with the Licence.
# You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
'''Compares the results of synthetic vehicles from JRC against pre-phase-1b Heinz's tool.

* Run as Test-case to generate results for sample-vehicles.
* Run it as cmd-line to compare with Heinz's results.
'''

from __future__ import division, print_function, unicode_literals

import glob
import logging
import math
import os
import re
import unittest
from unittest.case import skip

from matplotlib import pyplot as plt
from six import string_types

import numpy as np
import numpy.testing as npt
import pandas as pd

from ..experiment import Experiment
from ..utils import FileNotFoundError
from .goodvehicle import goodVehicle


overwrite_old_results = True # NOTE: Set 'False' to UPDATE sample-results or run main() (assuming they are ok).


mydir = os.path.dirname(__file__)
vehs_data_inp_fname = 'sample_vehicles.csv'
samples_dir = 'samples_db'
gened_fname_regex = r'.*sample_vehicles-(\d+).csv'
heinz_fname_regex = r'.*heinz-(\d+).csv'
gened_fname_glob = 'sample_vehicles-*.csv'
driver_weight = 70
"For calculating unladen_mass."
encoding="ISO-8859-1"


def init_logging(loglevel = logging.DEBUG):
    logging.basicConfig(level=loglevel)
    logging.getLogger().setLevel(level=loglevel)
    log = logging.getLogger(__name__)

    return log
log = init_logging()

def make_heinz_fname(veh_num):
    return 'heinz_Petrol_veh{:05}.csv'.format(veh_num)

def read_vehicle_data():
    csvfname = os.path.join(mydir, samples_dir, vehs_data_inp_fname)
    df = pd.read_csv(csvfname, encoding = encoding, index_col = 0)

    return df


[docs]class ExperimentSampleVehs(unittest.TestCase): '''Compares a batch of vehicles with results obtained from "Official" implementation.''' def setUp(self): self.run_comparison = overwrite_old_results #@skip def test0_runExperiments(self, plot_results=False, encoding="ISO-8859-1"): _run_the_experiments(plot_results=False, compare_results=self.run_comparison, encoding="ISO-8859-1") #@skip
[docs] def test1_AvgRPMs(self): """Check mean-engine-speed diff with Heinz within some percent. Results:: mean std min max python 1876.555626 146.755857 1652.457262 2220.657166 heinz 1892.048584 148.248303 1660.710716 2223.772904 diff_prcnt 0.008256 0.010170 0.004995 0.001403 """ pcrnt_limit = 3 h_n = [] g_n = [] all_gened = glob.glob(os.path.join(mydir, samples_dir, gened_fname_glob)) for g_fname in all_gened: m = re.match(gened_fname_regex, g_fname) veh_num = int(m.groups()[0]) df_g = read_sample_file(g_fname) df_h = read_heinz_file(veh_num) if abs(df_g.v_class.sum() - df_h.v_orig.sum()) > 1: log.warning('Cycle-mismatched(%s): gened(%s) !+ heinz(%s)!', g_fname, df_g.v_class.sum(), df_h.v_orig.sum()) continue g_n.append(df_g['rpm'].mean()) h_n.append(df_h['n'].mean()) g_n = np.array(g_n) h_n = np.array(h_n) df = pd.DataFrame() df['mean'] = [g_n.mean(), h_n.mean()] df['std'] = [g_n.std(), h_n.std()] df['min'] = [g_n.min(), h_n.min()] df['max'] = [g_n.max(), h_n.max()] df.index = ['python', 'heinz'] dff = (df.loc['heinz', :] - df.loc['python', :]) / df.min(axis=0) df.loc['diff_prcnt', :] = dff print(df) diff_prcnt = df.loc['diff_prcnt', 'mean'] self.assertLess(abs(diff_prcnt), pcrnt_limit/100)
[docs] def test1_PMRatio(self): """Check mean-engine-speed diff with Heinz within some percent for all PMRs. Results:: gened_mean_rpm heinz_mean_rpm diff_prcnt count pmr (40.759, 49.936] 1814.752308 1822.011660 0.004000 4 (49.936, 59.00401] 1861.137208 1879.822876 0.010040 4 (59.00401, 68.072] 2015.693195 2031.240237 0.007713 3 (68.072, 77.14] 1848.735584 1859.116047 0.005615 5 (77.14, 86.208] NaN NaN NaN 0 (86.208, 95.276] 1786.879366 1807.764020 0.011688 5 (95.276, 104.344] 1956.288657 1980.523043 0.012388 3 (104.344, 113.412] 1929.718933 1947.787155 0.009363 3 (113.412, 122.48] 2033.321183 2051.602998 0.008991 1 (122.48, 131.548] 1781.487338 1781.591893 0.000059 1 (131.548, 140.616] NaN NaN NaN 0 (140.616, 149.684] 1895.125082 1907.872848 0.006727 1 """ pcrnt_limit = 3 vehdata = read_vehicle_data() vehdata['pmr'] = 1000.0 * vehdata['rated_power'] / vehdata['kerb_mass'] all_gened = glob.glob(os.path.join(mydir, samples_dir, gened_fname_glob)) for g_fname in all_gened: m = re.match(gened_fname_regex, g_fname) veh_num = int(m.groups()[0]) df_g = read_sample_file(g_fname) df_h = read_heinz_file(veh_num) if abs(df_g.v_class.sum() - df_h.v_orig.sum()) > 1: log.warning('Cycle-mismatched(%s): gened(%s) !+ heinz(%s)!', g_fname, df_g.v_class.sum(), df_h.v_orig.sum()) continue vehdata.loc[veh_num, 'gened_mean_rpm'] = df_g['rpm'].mean() vehdata.loc[veh_num, 'heinz_mean_rpm'] = df_h['n'].mean() df = vehdata.sort('pmr')[['gened_mean_rpm', 'heinz_mean_rpm']] dfg = df.groupby(pd.cut(vehdata.pmr, 12)) df = dfg.mean() dif = (df['heinz_mean_rpm'] - df['gened_mean_rpm']) / df.min(axis=1) df['diff_prcnt']= dif df['count']= dfg.count().iloc[:, -1] print (df) diff_prcnt = df['diff_prcnt'] np.testing.assert_array_less(abs(diff_prcnt.fillna(0)), pcrnt_limit/100)
def _run_the_experiments(transplant_original_gears=False, plot_results=False, compare_results=False, encoding="ISO-8859-1"): # rated_power,kerb_mass,rated_speed,idling_speed,test_mass,no_of_gears,ndv_1,ndv_2,ndv_3,ndv_4,ndv_5,ndv_6,ndv_7,ID_cat,user_def_driv_res_coeff,user_def_power_curve,f0,f1,f2,Comment # 0 5 10 15 19 df = read_vehicle_data() for (ix, row) in df.iterrows(): veh_num = ix model = goodVehicle() veh = model['vehicle'] veh['test_mass'] = row['test_mass'] veh['unladen_mass'] = veh['test_mass'] - driver_weight veh['resistance_coeffs'] = list(row['f0':'f2']) veh['p_rated'] = row['rated_power'] veh['n_rated'] = row['rated_speed'] veh['n_idle'] = int(row['idling_speed']) ngears = int(row['no_of_gears']) veh['gear_ratios'] = list(row[6:6+ngears]) #'ndv_1' if (transplant_original_gears): log.warning(">>> Transplanting gears from Heinz's!") df_h = read_heinz_file(veh_num) forced_cycle = df_h['g_max'] forced_cycle.columns = ['gears_orig'] model['forced_cycle'] = forced_cycle experiment = Experiment(model) model = experiment.run() params = model['params'] f_downscale = params['f_downscale'] if (f_downscale > 0): log.warning('>> DOWNSCALE %s', f_downscale) # ankostis_mdb: 't', "v in km/h","v_orig","a in m/s²","gear","g_min","g_max","gear_modification","error_description" # heinz: 't', 'km_h', 'stg', 'gear' (root, ext) = os.path.splitext(vehs_data_inp_fname) outfname = os.path.join(mydir, samples_dir, '{}-{:05}{}'.format(root, veh_num, ext)) df = pd.DataFrame(model['cycle_run']) _compare_exp_results(df, outfname, compare_results) df.to_csv(outfname, index_label='time') def read_sample_file(inpfname): df = pd.read_csv(inpfname) return df def read_heinz_file(veh_num, heinz_dir=None): if (heinz_dir is None): heinz_dir = os.path.join(mydir, samples_dir) vehfpath = os.path.join(heinz_dir, make_heinz_fname(veh_num)) try: inpfname = glob.glob(vehfpath)[0] except IndexError: raise FileNotFoundError(vehfpath) df = pd.read_csv(inpfname, encoding='latin-1', header=0, index_col=3) assert df['vehicle_no'][0] == veh_num # vehfpath = os.path.join(samples_dir, 'heinz_Petrol_veh{:05}.dri'.format(veh_num)) # inpfname = glob.glob(vehfpath)[0] # df = pd.read_csv(inpfname, encoding='latin-1') return df ################### # COMPARE RESULTS # ################### def _compare_exp_results(tabular, outfname, run_comparison): if (run_comparison): try: data_prev = read_sample_file(outfname) ## Compare changed-tabular # npt.assert_array_equal(tabular['gears'], data_prev['gears']) # Unreached code in case of assertion. # cmp = tabular['gears'] != data_prev['gears'] # if (cmp.any()): # self._plotResults(data_prev) # print('>> COMPARING(%s): %s'%(fname, cmp.nonzero())) # else: # print('>> COMPARING(%s): OK'%fname) except FileNotFoundError: print('>> COMPARING(%s): No old-tabular found, 1st time to run' % outfname) run_comparison = False def _plotResults(veh_fname, df_g, df_h, g_diff, ax, plot_diffs_gears_only=True, plot_original_gears = False): if (plot_original_gears): my_gear_col = 'gears_orig' hz_gear_col = 'g_max' else: my_gear_col = 'gears' hz_gear_col = 'gear' ax.grid(True) ax2 = ax.twinx() tlen = len(df_g.index) #ax.set_xticks(np.arange(0.0, tlen, 50.0)) NO! looses auto when zooming. clutch = df_g['clutch'] clutch = clutch.nonzero()[0] ax.vlines(clutch, 0, 0.2) ## Add pickers on driveability lines showing the specific msg. # driveability = df_g['driveability'] driveability_true = driveability.apply(lambda s: isinstance(s, string_types)) lines = ax2.vlines(driveability_true.nonzero()[0], 2, 4, 'c', picker=5) lines.set_urls(driveability[driveability_true]) v_max = df_g['v_class'].max() ax.hlines(1 / v_max, 0, tlen, color="0.75") ax.plot(df_g['v_class'] / v_max) ax.plot(df_g['v_target'] / v_max, '-.') # ax.plot(df_g['rpm'] / df_g['rpm'].max()) # p_req = df_g['p_required'] / df_g['p_required'].max() # p_req[p_req < 0] = 0 # ax.plot(p_req) ## Plot gear diffs. # my_gears = df_g[my_gear_col] hz_v_real = df_h['v'] hz_v_target = df_h['v_downscale'] hz_gears = df_h[hz_gear_col] orig_gears = df_g['gears_orig'] if plot_diffs_gears_only: diff_gears = my_gears != hz_gears difft = diff_gears.nonzero()[0] difft = set().union(difft, difft+1, difft+2, difft+3, difft+4, difft+5, difft+6, difft-1, difft-2, difft-3, difft-4, difft-5, difft-6, ) difft = list(difft) my_gears = my_gears[difft] hz_gears = hz_gears[difft] ax2.plot(difft, my_gears.tolist(), 'o', color='red') ax2.plot(difft, orig_gears[difft].tolist(), 'v', color='green') ax2.plot(difft, hz_gears.tolist(), '*', color='blue') else: ax2.plot(my_gears.tolist(), 'o', color='red') ax2.plot(hz_gears.tolist(), '*', color='blue') ax.plot(df_g['v_real'] / v_max) ## Add pickers on driveability lines showing the specific msg. # hz_driveability = df_h['gear_modification'] hz_driveability_true = ~hz_driveability.apply(np.isreal) lines = ax2.vlines(hz_driveability_true.nonzero()[0], 0, 2, 'm', picker=5) lines.set_urls(hz_driveability[hz_driveability_true]) ax.plot(hz_v_target / v_max, '--') ax.plot(hz_v_real / v_max, ':') ax.text(0.7, 0, 'Diffs: %.4f' % g_diff, transform=ax.transAxes, bbox={'facecolor':'red', 'alpha':0.5, 'pad':10}) def plot_diffs_with_heinz(heinz_dir, experiment_num=None, transplant_original_gears=False, force_rerun_experiments=False): def is_experiments_outdated(outfiles): if not outfiles or force_rerun_experiments: return True resfiles_date = min([os.path.getmtime(file) for file in outfiles]) checkfiles = ['../model.py', '../experiment.py', os.path.join(samples_dir, 'sample_vehicles.csv')] checkdates = [os.path.getmtime(os.path.join(mydir, fheinz_fname)) for fheinz_fname in checkfiles] modifs = [fdate > resfiles_date for fdate in checkdates] return any(modifs) def read_and_compare_experiment(samples_dir, myfname, veh_num): df_my = read_sample_file(myfname) df_hz = read_heinz_file(veh_num, samples_dir) ## Count base-calc errors (before dirveability). ndiff_gears_orig = np.count_nonzero(df_my['gears_orig'] != df_hz['g_max']) ## Count all errors. # my_gears = df_my['gears'] gears_hz = df_hz['gear'] diff_gears = (my_gears != gears_hz) ndiff_gears = np.count_nonzero(diff_gears) ## Count Acceleration-only errors. # accel = np.gradient(df_my['v_class']) diff_gears_accel = diff_gears[accel >= 0] ndiff_gears_accel = np.count_nonzero(diff_gears_accel) return (df_my, df_hz, ndiff_gears, ndiff_gears_accel, ndiff_gears_orig) fig = plt.figure() text_infos = fig.text(0.5, 0.5, '', transform=fig.transFigure, bbox={'facecolor':'grey', 'alpha':0.4, 'pad':10}, horizontalalignment='center', verticalalignment='center', color='blue') def fig_onpick(event): pickline = event.artist urls = pickline.get_urls() rule = urls.iloc[event.ind] print(rule) text_infos.set_text('Rule: %s' % rule) fig.canvas.draw() fig.canvas.mpl_connect('pick_event', fig_onpick) if experiment_num is None: paths = glob.glob(os.path.join(mydir, samples_dir, 'sample_vehicles-*.csv')) if is_experiments_outdated(paths): _run_the_experiments(transplant_original_gears = transplant_original_gears) paths = glob.glob(os.path.join(mydir, samples_dir, 'sample_vehicles-*.csv')) npaths = len(paths) ## NOTE: Limit subplots to facilitate research. # # paths_to_plot = paths # paths_to_plot = paths[0:9] # paths_to_plot = paths[5:6] + paths[7:9] + paths[14:16] + paths[23:24] paths_to_plot = paths[5:8] + paths[17:18] + paths[22:24] ## Decide subplot-grid dimensions. # npaths_to_plot = len(paths_to_plot) w = math.ceil(math.sqrt(npaths_to_plot)) h = w-1 if ((w-1) * w >= npaths_to_plot) else w g_diff = np.zeros((3, npaths)) nplotted = 0 for (n, inpfname) in enumerate(paths): m = re.match(gened_fname_regex, inpfname) assert m veh_num = int(m.group(1)) (df_my, df_hz, ndiff_gears, ndiff_gears_accel, ndiff_gears_orig) \ = read_and_compare_experiment(heinz_dir, inpfname, veh_num) g_diff[0, n] = ndiff_gears g_diff[1, n] = ndiff_gears_accel g_diff[2, n] = ndiff_gears_orig log.info(">> %i: %s: ±DIFFs(%i), +DIFFs(%i), ±ORIGs(%i)", n, inpfname, ndiff_gears, ndiff_gears_accel, ndiff_gears_orig) if (inpfname in paths_to_plot): nplotted += 1 ax = fig.add_subplot(w, h, nplotted) veh_name = os.path.basename(inpfname) ax.set_title('%i: %s'%(n, veh_name), fontdict={'fontsize': 8} ) _plotResults(veh_name, df_my, df_hz, ndiff_gears, ax, plot_original_gears = not transplant_original_gears) orig = 'Driveability' if transplant_original_gears else 'Pre-Driveability' fig.suptitle('%s: ±DIFFs: count(%i), min(%i), MEAN(%.2f±%.2f), max(%i).' % (orig, g_diff[0].sum(), g_diff[0].min(), g_diff[0].mean(), g_diff[0].std(), g_diff[0].max())) log.info('# ±DIFFs: count(%i), min(%i), MEAN(%.2f±%.2f), max(%i).', g_diff[0].sum(), g_diff[0].min(), g_diff[0].mean(), g_diff[0].std(), g_diff[0].max()) log.info('# +DIFFs: count(%i), min(%i), MEAN(%.2f±%.2f), max(%i).', g_diff[1].sum(), g_diff[1].min(), g_diff[1].mean(), g_diff[1].std(), g_diff[1].max()) log.info('# ±ORIGs: count(%i), min(%i), MEAN(%.2f±%.2f), max(%i).', g_diff[2].sum(), g_diff[2].min(), g_diff[2].mean(), g_diff[2].std(), g_diff[2].max()) ## RESULTS: # 0.0.5-alpha: min(0.6108%), MEAN(3.6276%), max(12.1599%) # 0.0.5-alpha: count(1960), min(11.0000), MEAN(65.3333), max(219.0000) # ±Accel erros count(6486), min(151.0000), MEAN(216.2000), max(396.0000). # # (b2)skip-decel: count(5995), min(137.0000), MEAN(199.8333±78.0727), max(401.0000). # vehs: 02189=332, 02371=401m 0891=381, 00409=301 # Accel only errs count(1894), min(11.0000), MEAN(63.1333±63.211), max(220.0000) # # Heinz-db Pwot: # ±DIFFs: count(5758), min(135), MEAN(191.93±67.34), max(363). # +DIFFs: count(1681), min(10), MEAN(56.03±54.33), max(192). # Rule(f) before rule(bheinz_fname: # ±DIFFs: count(5583), min(135), MEAN(186.10±57.99), max(335). # +DIFFs: count(1515), min(10), MEAN(50.50±46.65), max(176). # Rule(f) applied also forheinz_fnamei-2, i-3, ... signular-downshifts: # ±DIFFs: count(5568), min(135), MEAN(185.60±57.59), max(335). # +DIFFs: count(1500), min(10), MEAN(50.00±46.26), max(176). # Precise input values: # ±DIFFs: count(5569), min(135), MEAN(185.63±57.57), max(335). # +DIFFs: count(1501), min(10), MEAN(50.03±46.25), max(176). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(e): Cancel +1 upshift for ANY previous-gear LOWER than the upshifted one: # ±DIFFs: count(5547), min(135), MEAN(184.90±56.22), max(327). # +DIFFs: count(1490), min(10), MEAN(49.67±45.68), max(173). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(e): Cancel ANY upshift for ANY previous-gear LOWER than the upshifted one: # ±DIFFs: count(5533), min(135), MEAN(184.43±54.80), max(319). # +DIFFs: count(1477), min(10), MEAN(49.23±44.40), max(161). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(g): Enable mistakenly impossible rule: # ±DIFFs: count(5151), min(133), MEAN(171.70±41.96), max(288). # +DIFFs: count(1116), min(8), MEAN(37.20±31.94), max(113). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(g): Apply only on Acell(not Flats): # ±DIFFs: count(5149), min(133), MEAN(171.63±41.77), max(286). # +DIFFs: count(1112), min(8), MEAN(37.07±31.73), max(112). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(b2): Apply it also for flats (not only Accels): # ±DIFFs: count(5142), min(133), MEAN(171.40±41.15), max(279). # +DIFFs: count(1109), min(8), MEAN(36.97±31.50), max(111). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(b2): Check if Accell on NEXT- time-step (A[t]). # ±DIFFs: count(5275), min(133), MEAN(175.83±47.54), max(304). # +DIFFs: count(1219), min(8), MEAN(40.63±36.33), max(128). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # Rule(b2): Check if Accell/FLAT on NEXT- time-step (A[t]). # ±DIFFs: count(5306), min(135), MEAN(176.87±47.05), max(303). # +DIFFs: count(1205), min(8), MEAN(40.17±35.84), max(127). # ±ORIGs: count(539), min(7), MEAN(17.97±8.83), max(35). # # TRANSPLANTED: # ±DIFFs: count(4771), min(122), MEAN(159.03±42.49), max(274). # +DIFFs: count(752), min(3), MEAN(25.07±31.71), max(106). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(g) more greedy: # ±DIFFs: count(4826), min(122), MEAN(160.87±41.65), max(268). # +DIFFs: count(791), min(3), MEAN(26.37±30.30), max(101). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Apply Rule(g) on any beginning-gear (not on lower): # ±DIFFs: count(4738), min(122), MEAN(157.93±37.54), max(255). # +DIFFs: count(704), min(3), MEAN(23.47±26.32), max(88). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(g) on Accell but beggining on Accell OR flat: # ±DIFFs: count(4676), min(122), MEAN(155.87±35.53), max(249). # +DIFFs: count(642), min(3), MEAN(21.40±24.08), max(82). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # NO Rule(c)! # ±DIFFs: count(1828), min(29), MEAN(60.93±37.66), max(157). # +DIFFs: count(587), min(1), MEAN(19.57±24.41), max(81). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # NO RULE(d): !!!(BUT err++ in ACCEL-phases)!!! # ±DIFFs: count(1799), min(29), MEAN(59.97±36.93), max(156). # +DIFFs: count(592), min(1), MEAN(19.73±24.54), max(81). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Overlapping application of rules: # ±DIFFs: count(1826), min(29), MEAN(60.87±36.32), max(150). # +DIFFs: count(576), min(1), MEAN(19.20±23.23), max(77). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # NO RULE(d): !!!(BUT increase in ^^)!!! # ±DIFFs: count(1800), min(29), MEAN(60.00±35.87), max(150). # +DIFFs: count(582), min(1), MEAN(19.40±23.66), max(77). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # AFTER CHECK WITH HEINZ b reorder b1, b2 order: # ±DIFFs: count(1739), min(29), MEAN(57.97±30.61), max(132). # +DIFFs: count(539), min(1), MEAN(17.97±21.02), max(72). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # RENABLED Rule(c2): skip final 1st-gear. # ±DIFFs: count(861), min(2), MEAN(28.70±30.43), max(105). # +DIFFs: count(539), min(1), MEAN(17.97±21.02), max(72). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(c2) in the x2-loop: # ±DIFFs: count(831), min(1), MEAN(27.70±30.43), max(104). # +DIFFs: count(539), min(1), MEAN(17.97±21.02), max(72). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(a) after other rules: # ±DIFFs: count(792), min(0), MEAN(26.40±30.53), max(103). # +DIFFs: count(500), min(0), MEAN(16.67±21.15), max(71). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(g) slightly more greedy: accept any A in starting-T: # ±DIFFs: count(481), min(0), MEAN(16.03±20.84), max(77). # +DIFFs: count(234), min(0), MEAN(7.80±12.90), max(47). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(b2): check A>0 also for t-1 (not only t-2): But MAX++ & STDEV++ # ±DIFFs: count(479), min(0), MEAN(15.97±20.97), max(82). # +DIFFs: count(231), min(0), MEAN(7.70±12.77), max(47). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(c1): check A<0 also for t-1 (not only t-2): But MAX++ & STDEV++ # ±DIFFs: count(474), min(0), MEAN(15.80±21.21), max(83). # +DIFFs: count(230), min(0), MEAN(7.67±12.97), max(47). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # NO RULE(d): !!!(BUT increase in ^^)!!! # ±DIFFs: count(450), min(0), MEAN(15.00±20.59), max(76). # +DIFFs: count(242), min(0), MEAN(8.07±13.59), max(47). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(c2): check A<0 also for t (not only t-1): # ±DIFFs: count(476), min(0), MEAN(15.87±21.07), max(78). # +DIFFs: count(233), min(0), MEAN(7.77±13.10), max(47). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # NO RULE(d): !!!(BUT increase in ^^)!!! # ±DIFFs: count(445), min(0), MEAN(14.83±20.82), max(77). # +DIFFs: count(241), min(0), MEAN(8.03±13.82), max(48). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # First run rules(e & g) in isolation: # ±DIFFs: count(546), min(0), MEAN(18.20±24.69), max(91). # +DIFFs: count(258), min(0), MEAN(8.60±14.79), max(55). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # NO RULE(d): !!!(BUT increase in ^^)!!! # ±DIFFs: count(500), min(0), MEAN(16.67±23.40), max(87). # +DIFFs: count(254), min(0), MEAN(8.47±14.61), max(55). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # First run rules(f) in isolation: !!! # ±DIFFs: count(348), min(0), MEAN(11.60±15.83), max(61). # +DIFFs: count(101), min(0), MEAN(3.37±5.82), max(25).heinz_fname # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(c1): Skip even further on decel. # ±DIFFs: count(256), min(0), MEAN(8.53±13.40), max(48). # +DIFFs: count(101), min(0), MEAN(3.37±5.82), max(25). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # First run rules(e) in isolation, g in main-loop: # ±DIFFs: count(226), min(0), MEAN(7.53±11.74), max(52). # +DIFFs: count(101), min(0), MEAN(3.37±5.41), max(24). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(c1) in isolation AFTER rest rules:([step_rule_g, step_rule_f][step_rule_e, step_rule_b1, step_rule_b2][step_rule_c1]) # ±DIFFs: count(214), min(0), MEAN(7.13±10.57), max(46). # +DIFFs: count(97), min(0), MEAN(3.23±4.96), max(21). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(e) above rule b1&b2: # ±DIFFs: count(211), min(0), MEAN(7.03±11.47), max(46). # +DIFFs: count(93), min(0), MEAN(3.10±5.88), max(24). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # group rule(e & c1 (OR reversed)) ABOVE rules b1&b2: # ±DIFFs: count(240), min(0), MEAN(8.00±12.87), max(53). # +DIFFs: count(92), min(0), MEAN(3.07±5.83), max(24). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # group rule(e & c1 ) BELOW rules b1&b2: # ±DIFFs: count(230), min(0), MEAN(7.67±11.78), max(46). # +DIFFs: count(106), min(0), MEAN(3.53±5.57), max(21). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # group rule(e & c1 REVERSED) BELOW rules b1&b2: # ±DIFFs: count(236), min(0), MEAN(7.87±12.46), max(52). # +DIFFs: count(109), min(0), MEAN(3.63±5.90), max(24). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(f) also applied when G(t-1) GT_or_eq G(t+1) (the same also with apply-if-diff BUG fixed): # ±DIFFs: count(187), min(0), MEAN(6.23±9.27), max(37). # +DIFFs: count(72), min(0),heinz_fnameMEAN(2.40±3.76), max(13). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Ungroup rules(G, F): # ±DIFFs: count(189), min(0), MEAN(6.30±9.42), max(37). # +DIFFs: count(74), min(0), MEAN(2.47±3.88), max(13). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Ungroup rules(F, G): # ±DIFFs: count(190), min(0), MEAN(6.33±9.48), max(37). # +DIFFs: count(75), min(0), MEAN(2.50±3.96), max(13). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(b2): check A>0 also till t (not t-1) (the same also with apply-if-diff BUG fixed): # ±DIFFs: count(209), min(0), MEAN(6.97±11.04), max(46). # +DIFFs: count(70), min(0), MEAN(2.33±3.65), max(12). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rul(b2): Check A>0 for t-1 only (not only t-2 & t-1): # ±DIFFs: count(202), min(0), MEAN(6.73±10.51), max(41). # +DIFFs: count(64), min(0), MEAN(2.13±3.38), max(11). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(f) applied on any singletton downshift: # ±DIFFs: count(204), min(0), MEAN(6.80±9.23), max(32). # +DIFFs: count(88), min(0), MEAN(2.93±3.78), max(12). # ±ORIGs: count(0), miheinz_fname(0), MEAN(0.00±0.00), max(0). # Rule(b2) Correct: # ±DIFFs: count(209), min(0), MEAN(6.97±11.04), max(46). # +DIFFs: count(70), min(0), MEAN(2.33±3.65), max(12). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(b2) Correct NOT checking Accel on the final step of rule(b2)!: # ±DIFFs: count(187), min(0), MEAN(6.23±9.27), max(37). # +DIFFs: count(72), min(0), MEAN(2.40±3.76), max(13). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Switch g with e, make e applied only for equal. # ±DIFFs: count(284), min(0), MEAN(9.47±14.55), max(54). # +DIFFs: count(127), min(0), MEAN(4.23±6.77), max(26). # ±ORIGs: count(0), min(0), MEAN(0.00±0.00), max(0). # Rule(f) applied on any singletton downshift: # ±DIFFs: count(292), min(0), MEAN(9.73±14.50), max(49). # +DIFFs: count(131), min(0), MEAN(4.37±6.60), max(25). # ±ORIGs: count(0), min(0), heinz_fnameEAN(0.00±0.00), max(0). # NO TRANSPLANT: # ±DIFFs: count(772), min(7), MEAN(25.73±14.24), max(65). # +DIFFs: count(499), min(2), MEAN(16.63±10.30), max(45). # ±ORIGs: count(779), min(15), MEAN(25.97±8.83), max(43). # Do not allow G2 when V==0: # ±DIFFs: count(670), min(4), MEAN(22.33±13.88), max(61). # +DIFFs: count(499), min(2), MEAN(16.63±10.30), max(45). # ±ORIGs: count(719), min(13), MEAN(23.97±8.83), max(41). else: inpfname = os.path.join(mydir, samples_dir, 'sample_vehicles-{:05}.csv'.format(experiment_num)) (df_my, df_hz, ndiff_gears, ndiff_gears_accel, ndiff_gears_orig) = read_and_compare_experiment(inpfname, veh_num) ax = fig.axes() _plotResults(os.path.basename(inpfname), df_my, df_hz, ndiff_gears, ax) log.info(">> %i: %s: ±DIFFs(%i), +DIFFs(%i), ±ORIGs(%i)", n, inpfname, ndiff_gears, ndiff_gears_accel, ndiff_gears_orig) fig.tight_layout() plt.show() if __name__ == "__main__": import sys heinz_dir = None experiment_num = None compare_original_gears = False force_rerun_experiments = False # Set to True to recalc experiments or 'compare_original_gears' has changed. try: if len(sys.argv) > 1: heinz_dir = sys.argv[1] if len(sys.argv) > 2: experiment_num = int(sys.argv[2]) if len(sys.argv) > 3: compare_original_gears = bool(sys.argv[3]) except (ValueError, IndexError) as ex: exit('Help: \n <cmd> [heinz_dir [vehicle_num]]\neg: \n python experiment_SampleVehicleTests d:\Work/Fontaras\WLTNED\HeinzCycles\for_JRC_Petrol_* \nor \n d:\Work/Fontaras\WLTNED\HeinzCycles\for_JRC_Petrol_* 2357') plot_diffs_with_heinz(heinz_dir, experiment_num=experiment_num, transplant_original_gears = compare_original_gears, force_rerun_experiments = force_rerun_experiments)