def make_dantzig(mp: Platform, solve: bool = False, quiet: bool = False) -> Scenario: """Return :class:`ixmp.Scenario` of Dantzig's canning/transport problem. Parameters ---------- mp : .Platform Platform on which to create the scenario. solve : bool, optional If :obj:`True`. then solve the scenario before returning. Default :obj:`False`. quiet : bool, optional If :obj:`True`, suppress console output when solving. Returns ------- .Scenario See also -------- .DantzigModel """ # add custom units and region for timeseries data try: mp.add_unit("USD/km") except Exception: # Unit already exists. Pending bugfix from zikolach pass mp.add_region("DantzigLand", "country") # Initialize a new Scenario, and use the DantzigModel class' initialize() # method to populate it annot = "Dantzig's transportation problem for illustration and testing" scen = Scenario( mp, **models["dantzig"], # type: ignore [arg-type] version="new", annotation=annot, scheme="dantzig", with_data=True, ) # commit the scenario scen.commit("Import Dantzig's transport problem for testing.") # set this new scenario as the default version for the model/scenario name scen.set_as_default() if solve: # Solve the model using the GAMS code provided in the `tests` folder scen.solve(model="dantzig", case="transport_standard", quiet=quiet) # add timeseries data for testing `clone(keep_solution=False)` # and `remove_solution()` scen.check_out(timeseries_only=True) scen.add_timeseries(HIST_DF, meta=True) scen.add_timeseries(INP_DF) scen.commit("Import Dantzig's transport problem for testing.") return scen
def test_error_message(self, test_data_path, test_mp): """GAMSModel.solve() displays a user-friendly message on error.""" # Empty Scenario s = Scenario(test_mp, model="foo", scenario="bar", version="new") s.commit("Initial commit") # Expected paths for error message paths = map( lambda name: re.escape(str(test_data_path.joinpath(name))), ["_abort.lst", "default_in.gdx"], ) with pytest.raises( ModelError, match="""GAMS errored with return code 2: There was a compilation error For details, see the terminal output above, plus: Listing : {} Input data: {}""".format(*paths), ): s.solve(model_file=test_data_path / "_abort.gms", use_temp_dir=False)