Source code for co2mpas.core.model

# -*- coding: utf-8 -*-
#
# Copyright 2015-2019 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
"""
It provides CO2MPAS architecture model `dsp`.

Sub-Modules:

.. currentmodule:: co2mpas.core.model

.. autosummary::
    :nosignatures:
    :toctree: model/

    physical
    selector
"""

import schedula as sh
from .physical import dsp as _physical
from .selector import dsp as _selector, calibration_cycles, prediction_cycles

dsp = sh.BlueDispatcher(
    name='CO2MPAS model',
    description='Calibrates the models with WLTP data and predicts NEDC cycle.'
)

_prediction_data = [
    'angle_slope', 'alternator_nominal_voltage', 'alternator_efficiency',
    'battery_capacity', 'cycle_type', 'cycle_name', 'engine_capacity',
    'engine_stroke', 'final_drive_efficiency', 'final_drive_ratios',
    'frontal_area', 'final_drive_ratio', 'engine_thermostat_temperature',
    'aerodynamic_drag_coefficient', 'fuel_type', 'ignition_type',
    'gear_box_type', 'engine_max_power', 'engine_speed_at_max_power',
    'rolling_resistance_coeff', 'time_cold_hot_transition',
    'engine_idle_fuel_consumption', 'engine_type', 'engine_is_turbo',
    'engine_fuel_lower_heating_value', 'has_start_stop',
    'has_energy_recuperation', 'fuel_carbon_content_percentage',
    'f0', 'f1', 'f2', 'vehicle_mass', 'full_load_speeds',
    'plateau_acceleration', 'full_load_powers', 'fuel_saving_at_strategy',
    'stand_still_torque_ratio', 'lockup_speed_ratio',
    'change_gear_window_width', 'alternator_start_window_width',
    'stop_velocity', 'min_time_engine_on_after_start',
    'min_engine_on_speed', 'max_velocity_full_load_correction',
    'is_hybrid', 'tyre_code', 'engine_has_cylinder_deactivation',
    'active_cylinder_ratios', 'engine_has_variable_valve_actuation',
    'has_torque_converter', 'has_gear_box_thermal_management',
    'has_lean_burn', 'ki_additive', 'ki_multiplicative', 'n_wheel_drive',
    'has_periodically_regenerating_systems', 'n_dyno_axes',
    'has_selective_catalytic_reduction', 'has_exhausted_gas_recirculation',
    'start_stop_activation_time', 'engine_n_cylinders',
    'initial_drive_battery_state_of_charge',
    'motor_p0_speed_ratio', 'motor_p1_speed_ratio',
    'motor_p2_speed_ratio', 'motor_p2_planetary_speed_ratio',
    'motor_p3_front_speed_ratio', 'motor_p3_rear_speed_ratio',
    'motor_p4_front_speed_ratio', 'motor_p4_rear_speed_ratio',
    'rcb_correction', 'speed_distance_correction',
    'atct_family_correction_factor', 'is_plugin'
]

_prediction_data_ts = ['times', 'velocities', 'gears']

_physical = sh.SubDispatch(_physical)

dsp.add_data(
    data_id='input.calibration.wltp_h',
    description='User input data of WLTP-H calibration stage.'
)
dsp.add_data(
    data_id='input.calibration.wltp_l',
    description='User input data of WLTP-L calibration stage.'
)
dsp.add_data(
    data_id='output.calibration.wltp_h',
    description='Output data of WLTP-H calibration stage.'
)
dsp.add_data(
    data_id='output.calibration.wltp_l',
    description='Output data of WLTP-L calibration stage.'
)
dsp.add_function(
    function_id='calibrate_with_wltp_h',
    function=_physical,
    inputs=['input.calibration.wltp_h'],
    outputs=['output.calibration.wltp_h'],
    description='Wraps all functions needed to calibrate the models to '
                'predict CO2 emissions.'
)

dsp.add_function(
    function_id='calibrate_with_wltp_l',
    function=_physical,
    inputs=['input.calibration.wltp_l'],
    outputs=['output.calibration.wltp_l'],
    description='Wraps all functions needed to calibrate the models to '
                'predict CO2 emissions.'
)

dsp.add_data(
    data_id='input.prediction.wltp_h', default_value={},
    description='User input data of WLTP-H prediction stage.'
)
dsp.add_data(
    data_id='input.prediction.wltp_l', default_value={},
    description='User input data of WLTP-L prediction stage.'
)
dsp.add_data(
    data_id='data.prediction.models_wltp_h',
    description='Calibrated models for WLTP-H prediction stage.'
)
dsp.add_data(
    data_id='data.prediction.models_wltp_l',
    description='Calibrated models for WLTP-L prediction stage.'
)
dsp.add_data(
    data_id='data.prediction.wltp_h',
    description='Input data of WLTP-H prediction stage.'
)
dsp.add_data(
    data_id='data.prediction.wltp_l',
    description='Input data of WLTP-L prediction stage.'
)


[docs]@sh.add_function( dsp, inputs=['output.calibration.wltp_h', 'data.prediction.models_wltp_h', 'input.prediction.wltp_h'], outputs=['data.prediction.wltp_h'] ) @sh.add_function( dsp, inputs=['output.calibration.wltp_l', 'data.prediction.models_wltp_l', 'input.prediction.wltp_l'], outputs=['data.prediction.wltp_l'] ) def select_prediction_data(data, *new_data): """ Selects the data required to predict the CO2 emissions with CO2MPAS model. :param data: Output data. :type data: dict :param new_data: New data. :type new_data: dict :return: Data required to predict the CO2 emissions with CO2MPAS model. :rtype: dict """ ids = _prediction_data from co2mpas.defaults import dfl if not dfl.functions.select_prediction_data.theoretical: ids = ids + _prediction_data_ts data = sh.selector(ids, data, allow_miss=True) if new_data: new_data = sh.combine_dicts(*new_data) data = sh.combine_dicts(data, new_data) if 'gears' in data and 'gears' not in new_data: if data.get('gear_box_type', 0) == 'automatic' or \ len(data.get('velocities', ())) != len(data['gears']): data.pop('gears') return data
dsp.add_data( data_id='input.prediction.models', default_value={}, description='User input models for prediction stages.' ) dsp.add_data( data_id='enable_selector', default_value=False, description='Enable the selection of the best model to predict both ' 'H/L cycles.' ) dsp.add_data( data_id='data.calibration.model_scores', description='Scores of calibrated models.' ) _prediction_models = tuple(map('models_{}'.format, prediction_cycles)) dsp.add_function( function=sh.SubDispatchPipe( _selector, function_id='extract_calibrated_models', inputs=('enable_selector', 'default_models',) + calibration_cycles, outputs=('selections',) + _prediction_models ), inputs=[ 'enable_selector', 'input.prediction.models', 'output.calibration.wltp_h', 'output.calibration.wltp_l' ], outputs=['data.calibration.model_scores'] + [ 'data.prediction.%s' % k for k in _prediction_models ] ) dsp.add_data( data_id='output.prediction.wltp_h', description='Output data of WLTP-H prediction stage.' ) dsp.add_data( data_id='output.prediction.wltp_l', description='Output data of WLTP-L prediction stage.' ) dsp.add_function( function_id='predict_wltp_h', function=_physical, inputs=['data.prediction.wltp_h'], outputs=['output.prediction.wltp_h'], description='Wraps all functions needed to predict CO2 emissions.' ) dsp.add_function( function_id='predict_wltp_l', function=_physical, inputs=['data.prediction.wltp_l'], outputs=['output.prediction.wltp_l'], description='Wraps all functions needed to predict CO2 emissions.' ) dsp.add_data( data_id='input.prediction.nedc_h', description='User input data of NEDC-H prediction stage.' ) dsp.add_data( data_id='input.prediction.nedc_l', description='User input data of NEDC-L prediction stage.' ) dsp.add_data( data_id='data.prediction.models_nedc_h', description='Calibrated models for NEDC-H prediction stage.' ) dsp.add_data( data_id='data.prediction.models_nedc_l', description='Calibrated models for NEDC-L prediction stage.' ) dsp.add_data( data_id='output.prediction.nedc_h', description='Output data of NEDC-H prediction stage.' ) dsp.add_data( data_id='output.prediction.nedc_l', description='Output data of NEDC-L prediction stage.' ) dsp.add_function( function_id='predict_nedc_h', function=_physical, inputs=['data.prediction.models_nedc_h', 'input.prediction.nedc_h'], outputs=['output.prediction.nedc_h'], description='Wraps all functions needed to predict CO2 emissions.' ) dsp.add_function( function_id='predict_nedc_l', function=_physical, inputs=['data.prediction.models_nedc_l', 'input.prediction.nedc_l'], outputs=['output.prediction.nedc_l'], description='Wraps all functions needed to predict CO2 emissions.' )