def test_forced_cycle_two_ramps(): V = datamodel.get_class_v_cycle("class1").rename("foo") forced = pd.DataFrame({"V": np.hstack((np.r_[0:100:2], np.r_[98:0:-2]))}) forced["A"] = 0 cycle = cycler.init_cycle_velocity(V, forced) assert (cycle["V"].dropna() == forced.V).all()
def test_identify_checksums_works_with_all_CRCs(full): wltc_class = 0 V = datamodel.get_class_v_cycle(wltc_class) crc = cycles.crc_velocity(V, full=full) exp = ("class1", None, "V") assert cycles.identify_cycle_v_crc(crc) == exp assert cycles.identify_cycle_v_crc(crc.lower()) == exp assert cycles.identify_cycle_v_crc(crc.upper()) == exp assert cycles.identify_cycle_v_crc(int(crc, 16)) == exp
def test_stopdecel(wltc_class): V = datamodel.get_class_v_cycle(wltc_class) cb = CycleBuilder(V) cycle = cycler.PhaseMarker().add_phase_markers(cb.cycle, cb.V, cb.A) n_stops = (cycle["stop"].astype(int).diff() < 0).sum(None) n_decels = (cycle["decel"].astype(int).diff() < 0).sum(None) n_stopdecels = (cycle["stopdecel"].astype(int).diff() < 0).sum(None) assert n_stopdecels < n_decels ## The initial stop has no deceleration before it BUT no diff >0 either! assert n_stopdecels == n_stops
def test_identify_conjecutive_truths_repeat_threshold_1_is_identical(): V = datamodel.get_class_v_cycle(0) A = -V.diff(-1) pm = PhaseMarker(phase_repeat_threshold=1) col1 = (V > 1) & (A < 0) col2 = pm._identify_conjecutive_truths((V > 1) & (A < 0), right_edge=False) assert col2.equals(col1) col2 = pm._identify_conjecutive_truths((V > 1) & (A < 0), right_edge=True) assert col2.equals(col1 | col1.shift())
def test_validate_t_start(wltc_class, t_cold_end, err): """ .. TODO:: move `t_cold_end` check in validations pipeline. """ V = datamodel.get_class_v_cycle(wltc_class) wltc_parts = datamodel.get_class_parts_limits(wltc_class) cb = CycleBuilder(V) cb.cycle = cycler.PhaseMarker().add_phase_markers(cb.cycle, cb.V, cb.A) with pytest.raises(type(err), match=str(err)): for err in cb.validate_nims_t_cold_end(t_cold_end, wltc_parts): raise err
def calc_class_sums(cl): V = datamodel.get_class_v_cycle(cl) cycle_parts = datamodel.get_class_parts_limits(cl, edges=True) prev = (0, 0) for partno, (start, end) in enumerate(itz.sliding_window(2, cycle_parts), 1): start += start_offset end += end_offset sums = calc_v_sums(V.loc[start:end]) cums = calc_v_sums(V.loc[start:end], prev) results.append((cl, f"part-{partno}", *sums, *cums)) prev = cums return results
def test_wltc_validate_checksums(self): for cl in datamodel.get_class_names(): ## Test below the helper api in datamodel. # cycle = datamodel.get_class_v_cycle(cl) cd = datamodel.get_class(cl) numsum = cycle.sum() checksum = cd["checksum"] self.assertAlmostEqual(numsum, checksum) parts = datamodel.get_class_parts_limits(cl) cycle_parts = np.split(cycle, parts) for partnum, (pchk, cpart) in enumerate( zip(cd["part_checksums"], cycle_parts)): self.assertAlmostEqual(pchk, cpart.sum(), msg=f"class={cl}, partnum={partnum}")
def test_full_build_smoketest(h5_accdb): vehnum = 8 veh_class = 3 # v008's class t_cold_end = 470 # stop in all classes prop, wot, n2vs = vehdb.load_vehicle_accdb(h5_accdb, vehnum) renames = vehdb.accdb_renames() prop = prop.rename(renames) wot = wot.rename(renames, axis=1) wot["n"] = wot.index V = datamodel.get_class_v_cycle(veh_class) wltc_parts = datamodel.get_class_parts_limits(veh_class) pm = cycler.PhaseMarker() cb = cycler.CycleBuilder(V) cb.cycle = pm.add_phase_markers(cb.cycle, cb.V, cb.A) for err in cb.validate_nims_t_cold_end(t_cold_end, wltc_parts): raise err cb.cycle = pm.add_class_phase_markers(cb.cycle, wltc_parts) SM = 0.1 gwots = engine.interpolate_wot_on_v_grid(wot, n2vs) gwots = engine.calc_p_avail_in_gwots(gwots, SM=SM) gwots["p_resist"] = vehicle.calc_road_load_power(gwots.index, prop.f0, prop.f1, prop.f2) kr = 1.03 cb.add_wots(gwots) cb.cycle["p_inert"] = vehicle.calc_inertial_power(cb.V, cb.A, prop.test_mass, kr) cb.cycle["p_req"] = vehicle.calc_required_power(cb.cycle["p_inert"], cb.cycle["p_resist"]) acc_cycle = vehdb.load_vehicle_nodes(h5_accdb, vehnum, "cycle") diffs = {} def cmpr_cols(c1, c2): diffs[c1.name] = (c1 - c2).abs() acc_cycle["P_tot"], "p_required"
def test_identify_wltc_checksums(indexer, exp): V = datamodel.get_class_v_cycle(0) assert cycles.identify_cycle_v(V.loc[indexer]) == exp
def test_full_cycles_in_wltc_checksums(wltc_class, exp): V = datamodel.get_class_v_cycle(wltc_class) assert cycles.identify_cycle_v(V) == exp
# prop = prop.rename(renames) mdl = vehdb.mdl_from_accdb(prop, wot, n2vs) datamodel.validate_model(mdl, additional_properties="true") wot = mdl["wot"] # %% print(list(acc_cycle.columns)) print(list(mdl.keys())) # %% gwots = engine.interpolate_wot_on_v_grid(wot, n2vs) gwots = engine.attach_p_avail_in_gwots(gwots, f_safety_margin=0.1) gwots["p_resist"] = vehicle.calc_p_resist(gwots.index, mdl["f0"], mdl["f1"], mdl["f2"]) # %% V = datamodel.get_class_v_cycle(3) # %% cb = cycler.CycleBuilder(V) pm = cycler.PhaseMarker() # %% wltc_parts = datamodel.get_class_parts_limits(3, edges=True) cb.cycle = pm.add_class_phase_markers(cb.cycle, wltc_parts) # %% cb.cycle = pm.add_phase_markers(cb.cycle, cb.V, cb.A) cb.cycle.select_dtypes(bool).sum() # %% t_cold_end = 470 # gap for all classes
def test_cycle_initaccel(wltc_class, exp, gwots): V = datamodel.get_class_v_cycle(wltc_class) cb = CycleBuilder(V) PhaseMarker().add_phase_markers(cb.cycle, cb.V, cb.A) print(cb.cycle.initaccel.sum()) assert cb.cycle.initaccel.sum() == exp