def test_error_band_cost_range_equiv(default_cost_err):
    covering = datamodel.ErrorBandCost(
        bands=[
            datamodel.CostBand(
                error_range=(-2, 2),
                cost_function='constant',
                cost_function_parameters=datamodel.ConstantCost(
                    cost=2.0, aggregation='sum', net=True
                )
            ),
            datamodel.CostBand(
                error_range=(-np.inf, np.inf),
                cost_function='constant',
                cost_function_parameters=datamodel.ConstantCost(
                    cost=4.0, aggregation='sum', net=False
                )
            )
        ]
    )
    split = datamodel.ErrorBandCost(
        bands=[
            datamodel.CostBand(
                error_range=(-2, 2),
                cost_function='constant',
                cost_function_parameters=datamodel.ConstantCost(
                    cost=2.0, aggregation='sum', net=True
                )
            ),
            datamodel.CostBand(
                error_range=(-np.inf, -2),
                cost_function='constant',
                cost_function_parameters=datamodel.ConstantCost(
                    cost=4.0, aggregation='sum', net=False
                )
            ),
            datamodel.CostBand(
                error_range=(2, np.inf),
                cost_function='constant',
                cost_function_parameters=datamodel.ConstantCost(
                    cost=4.0, aggregation='sum', net=False
                )
            )
        ]
    )
    fx = default_cost_err
    obs = pd.Series(0, index=fx.index)
    err_cov = deterministic.error_band_cost(
        obs, fx, covering, deterministic.error)
    err_split = deterministic.error_band_cost(
        obs, fx, split, deterministic.error)
    assert err_cov == err_split
def test_invalid_costband(constant_cost, datetime_cost, timeofday_cost,
                          errorband_cost, a, b):
    dd = {'constant': constant_cost, 'timeofday': timeofday_cost,
          'datetime': datetime_cost, 'errorband': errorband_cost}
    with pytest.raises(TypeError):
        datamodel.CostBand(
            error_range=(0, 2),
            cost_function=a,
            cost_function_parameters=dd[b]
        )
def test_error_band_cost_out_of_range(default_cost_err):
    params = datamodel.ErrorBandCost(
        bands=[datamodel.CostBand(
            error_range=(10, 100),
            cost_function='constant',
            cost_function_parameters=datamodel.ConstantCost(
                cost=2.0, aggregation='sum', net=True
            )
        )]
    )
    fx = default_cost_err
    obs = pd.Series(0, index=fx.index)
    err = deterministic.error_band_cost(
        obs, fx, params, deterministic.error)
    assert err == 0
def test_error_band_cost_out_of_times(default_cost_err):
    params = datamodel.ErrorBandCost(
        bands=[datamodel.CostBand(
            error_range=(-10, 1),
            cost_function='datetime',
            cost_function_parameters=datamodel.DatetimeCost(
                datetimes=[pd.Timestamp('2020-05-01T02:00-07:00')],
                cost=[1.0],
                aggregation='sum',
                fill='forward',
                net=True
            )
        )]
    )
    fx = default_cost_err
    obs = pd.Series(0, index=fx.index)
    err = deterministic.error_band_cost(
        obs, fx, params, deterministic.error)
    assert err == 0