def test_kolmogorov_smirnov_d(model): # Test made by Yalin. import numpy as np import biosteam as bst from chaospy import distributions as shape bst.settings.set_thermo(['H2O', 'Ethanol'], cache=True) s1 = bst.Stream('s1', H2O=100) M1 = bst.MixTank(ins=s1) M2 = bst.MixTank(ins=M1 - 0) sys = bst.System('sys', path=(M1, M2)) model = bst.Model(sys) baseline = 1 distribution = shape.Uniform(lower=0.5, upper=1.5) @model.parameter(name='M1 tau', element=M1, kind='coupled', distribution=distribution, units='hr', baseline=baseline) def set_M1_tau(i): M1.tau = i baseline = 1.75 distribution = shape.Uniform(lower=1, upper=2) @model.parameter(name='M2 tau', element=M2, kind='coupled', distribution=distribution, units='hr', baseline=baseline) def set_M2_tau(i): M2.tau = i model.metrics = [ bst.Metric(name='tau1', getter=lambda: M1.tau, units='hr', element=M1), bst.Metric(name='tau2', getter=lambda: M2.tau, units='hr', element=M2), ] np.random.seed(3221) samples = model.sample(100, rule='L') model.load_samples(samples) model.evaluate() D, p = model.kolmogorov_smirnov_d( thresholds=[1, 1.5]) # Just make sure it works for now
def batch_setting_unit_params(df, model, unit, exclude=()): for para in df.index: if para in exclude: continue b = getattr(unit, para) lower = float(df.loc[para]['low']) upper = float(df.loc[para]['high']) dist = df.loc[para]['distribution'] if dist == 'uniform': D = shape.Uniform(lower=lower, upper=upper) elif dist == 'triangular': D = shape.Triangle(lower=lower, midpoint=b, upper=upper) elif dist == 'constant': continue else: raise ValueError( f'Distribution {dist} not recognized for unit {unit}.') su_type = type(unit).__name__ if su_type.lower() == 'lagoon': su_type = f'{unit.design_type.capitalize()} lagoon' name = f'{su_type} {para}' model.parameter(setter=AttrSetter(unit, para), name=name, element=unit, kind='coupled', units=df.loc[para]['unit'], baseline=b, distribution=D)
def baseline_uniform(baseline, ratio): return shape.Uniform(baseline * (1 - ratio), baseline * (1 + ratio))
U101 = system.U101 D = baseline_uniform(2205, 0.1) @param(name='Flow rate', element=U101, kind='coupled', units='dry U.S. ton/day', baseline=2205, distribution=D) def set_feedstock_flow_rate(rate): U101.feedstock_flow_rate = rate D = shape.Uniform(0.9, 1) @param(name='Plant uptime', element='TEA', kind='isolated', units='%', baseline=0.96, distribution=D) def set_operating_days(uptime): lactic_tea.operating_days = 365 * uptime special_price = { # stream distribution min max 'feedstock': ('Uniform', (0.0529, 0.117)),
distribution=shape.Triangle(0.02, 0.048, 0.111), units='USD/kg') def set_feedstock_price(price): cs.cornstover.price = price @parameter(element='Operation', distribution=shape.Triangle(21, 30, 30), units='year') def set_plant_life(plant_life): start = cs.cornstover_tea.duration[0] cs.cornstover_tea.duration = (start, start + plant_life) @parameter(element='Operation', distribution=shape.Uniform(7920, 8610), units='hours') def set_annual_operating_hours(annual_operating_hours): cs.cornstover_tea.operating_days = annual_operating_hours / 24. @parameter(element='Economics', distribution=shape.Triangle(7, 10, 22), units='%') def set_discount_rate(discount_rate): cs.cornstover_tea.IRR = discount_rate / 100. # TODO: Find what type of depreciation schedules # are used (hopefully MARCS) and whether a 30 yr # depreciation is realistic for MARCS.
__all__ = ('model_bsm1', 'model_2dv', 'model_ss', 'run_uncertainty', 'analyze_timeseries', 'run_wdiff_init') bsm1 = bm.bsm1 s = bm.system #%% # ============================================================================= # model with all uncertain variables # ============================================================================= model_bsm1 = qs.Model(system=bsm1, exception_hook='raise') ########## Add Uncertainty Parameters ########## param = model_bsm1.parameter get_uniform_w_frac = lambda b, frac: shape.Uniform(lower=b * (1 - frac), upper=b * (1 + frac)) cmps = s.cmps PE = s.PE b = 0.08 D = shape.Triangle(lower=0.04, midpoint=b, upper=0.12) @param(name='Biomass N content i_XB', element=PE, kind='coupled', units='g N/g COD', baseline=b, distribution=D) def set_i_XB(i):