def test_model_index(): from biorefineries.sugarcane import sugarcane_sys, flowsheet as f import biosteam as bst # Make sure repeated metrics raise an error biorefinery = bst.process_tools.UnitGroup('Biorefinery', sugarcane_sys.units) heating_duty = bst.Metric('Heating duty', biorefinery.get_heating_duty, 'GJ/hr') heating_duty_repeated = bst.Metric('Heating duty', biorefinery.get_heating_duty, 'GJ/hr') with pytest.raises(ValueError): model = bst.Model(sugarcane_sys, [heating_duty, heating_duty_repeated]) model = bst.Model(sugarcane_sys, [heating_duty]) # Make sure repeated parameters raise an error R301 = f.unit.R301 @model.parameter(element=R301) def set_efficiency(efficiency): R301.efficiency = efficiency with pytest.raises(ValueError): @model.parameter(element=R301) def set_efficiency(efficiency): R301.efficiency = efficiency bst.default()
def test_model(): from biosteam.examples import ethanol_subsystem as ethanol_sys from biosteam import main_flowsheet as F import biosteam as bst # Make sure repeated metrics raise an error biorefinery = bst.process_tools.UnitGroup('Biorefinery', ethanol_sys.units) heating_duty = bst.Metric('Heating duty', biorefinery.get_heating_duty, 'GJ/hr') heating_duty_repeated = bst.Metric('Heating duty', biorefinery.get_heating_duty, 'GJ/hr') with pytest.raises(ValueError): model = bst.Model(ethanol_sys, [heating_duty, heating_duty_repeated]) model = bst.Model(ethanol_sys, [heating_duty]) # Make sure repeated parameters raise an error R301 = F.flowsheet.ethanol_subsystem_example.unit.R301 @model.parameter(element=R301) def set_efficiency(efficiency): R301.efficiency = efficiency with pytest.raises(ValueError): @model.parameter(element=R301) def set_efficiency(efficiency): R301.efficiency = efficiency bst.process_tools.default()
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 test_model_exception_hook(): import biosteam as bst import pytest from biorefineries import lipidcane as lc from chaospy import distributions as shape from warnings import simplefilter import numpy as np bst.settings.set_thermo(lc.chemicals) simplefilter("ignore") IRR_metric = bst.Metric('Internal rate of return', lc.lipidcane_tea.solve_IRR) metrics = [IRR_metric] lipidcane_model = bst.Model(lc.lipidcane_sys, metrics) baseline = lc.lipidcane.F_mass distribution = shape.Triangle(-baseline, baseline, 2 * baseline) # Negative value should fail @lipidcane_model.parameter(element=lc.lipidcane, distribution=distribution, units='kg/hr') def set_lipidcane_flow_rate(flow_rate): lc.lipidcane.F_mass = flow_rate samples = lipidcane_model.sample(15, 'L') lipidcane_model.load_samples(samples) # Without an exception hook, the same behavior will result (NaN values for failed evaluations) lipidcane_model.evaluate() assert np.isnan(lipidcane_model.table.values).any() InfeasibleRegion = bst.exceptions.InfeasibleRegion # This will provide a more understandable IRR result for infeasible regions def exception_hook(exception, sample): if isinstance(exception, (InfeasibleRegion, ValueError, RuntimeError)): return [0] else: raise exception lipidcane_model.exception_hook = exception_hook lipidcane_model.evaluate() assert not np.isnan(lipidcane_model.table.values).any() # This will raise an exception due to negative flow rates def exception_hook(exception, sample): if isinstance(exception, InfeasibleRegion): raise exception lipidcane_model.exception_hook = exception_hook with pytest.raises(InfeasibleRegion): lipidcane_model.evaluate() # This will raise an exception regardless def exception_hook(exception, sample): raise exception lipidcane_model.exception_hook = exception_hook with pytest.raises(InfeasibleRegion): lipidcane_model.evaluate() # Here is another cool thing we could do in the case where # some metrics are expected to fail bad_metric = bst.Metric('bad metric', lambda: 1 / 0) lipidcane_model.metrics = (IRR_metric, bad_metric) lipidcane_model.load_samples( samples) # Metrics changed, so need to reload sample def exception_hook(exception, sample): if not isinstance(exception, ZeroDivisionError): return lc.lipidcane_sys.simulate() values = [] for i in lipidcane_model.metrics: try: x = i() except: x = None values.append(x) return values lipidcane_model.exception_hook = exception_hook lipidcane_model.evaluate() bad_metric_results = lipidcane_model.table[bad_metric.index] IRR_metric_results = lipidcane_model.table[IRR_metric.index] assert np.isnan(bad_metric_results).all() assert not np.isnan(IRR_metric_results).all()