def __init__(self, descriptor=None): """Constructor.""" if isinstance(descriptor, int): descriptor = str(descriptor) if descriptor is not None and not isinstance(descriptor, str): raise TypeError( "Descriptor must be a string or int (for a Scenario ID)") self.data_access = Context.get_data_access() self._scenario_list_manager = ScenarioListManager(self.data_access) self._execute_list_manager = ExecuteListManager(self.data_access) if not descriptor: self.info = OrderedDict(self._default_info) self.status = None self.state = Create(self) else: self._set_info(descriptor) try: state = self.info["state"] self._set_status() if state == "execute": self.state = Execute(self) elif state == "analyze": self.state = Analyze(self) except AttributeError: pass
def __init__(self, descriptor): """Constructor. """ if not isinstance(descriptor, str): raise TypeError('Descriptor must be a string') self.ssh = setup_server_connection() if not descriptor: self.state = Create(self) else: self._set_info(descriptor) try: state = self.info['state'] self._set_status() if state == 'execute': self.state = Execute(self) elif state == 'analyze': self.state = Analyze(self) except AttributeError: return
class Scenario: """Handles scenario. :param int/str descriptor: scenario name or index. If None, default to a Scenario in Create state. """ _setattr_allowlist = { "data_access", "state", "status", "info", "_scenario_list_manager", "_execute_list_manager", } _default_info = [ ("plan", ""), ("name", ""), ("state", "create"), ("grid_model", ""), ("interconnect", ""), ("base_demand", ""), ("base_hydro", ""), ("base_solar", ""), ("base_wind", ""), ("change_table", ""), ("start_date", ""), ("end_date", ""), ("interval", ""), ("engine", ""), ] def __init__(self, descriptor=None): """Constructor.""" if isinstance(descriptor, int): descriptor = str(descriptor) if descriptor is not None and not isinstance(descriptor, str): raise TypeError( "Descriptor must be a string or int (for a Scenario ID)") self.data_access = Context.get_data_access() self._scenario_list_manager = ScenarioListManager(self.data_access) self._execute_list_manager = ExecuteListManager(self.data_access) if not descriptor: self.info = OrderedDict(self._default_info) self.status = None self.state = Create(self) else: self._set_info(descriptor) try: state = self.info["state"] self._set_status() if state == "execute": self.state = Execute(self) elif state == "analyze": self.state = Analyze(self) except AttributeError: pass def __getattr__(self, name): if name in self.state.exported_methods: return getattr(self.state, name) elif hasattr(self.state, "__getattr__"): return self.state.__getattr__(name) else: raise AttributeError(f"Scenario object in {self.state.name} state " f"has no attribute {name}") def __setattr__(self, name, value): if name in self._setattr_allowlist: super().__setattr__(name, value) elif isinstance(self.state, Create) and name in _Builder.exported_methods: raise AttributeError( f"{name} is exported from Scenario.state.builder, " "edit it there if necessary") elif name in self.state.exported_methods: raise AttributeError( f"{name} is exported from Scenario.state, edit it there if necessary" ) super().__setattr__(name, value) def __dir__(self): return sorted(super().__dir__() + list(self.state.exported_methods)) def _set_info(self, descriptor): """Sets scenario information. :param str descriptor: scenario descriptor. """ info = self._scenario_list_manager.get_scenario(descriptor) if info is None: raise ValueError( f"{descriptor} not found in Scenario List. " "See available scenarios with Scenario().get_scenario_table()") self.info = info def _set_status(self): """Sets execution status of scenario.""" scenario_id = self.info["id"] self.status = self._execute_list_manager.get_status(scenario_id) def get_scenario_table(self): """Get scenario table :return: (*pandas.DataFrame*) -- scenario table """ return self._scenario_list_manager.get_scenario_table() def change(self, state): """Changes state. :param class state: One of :class:`.Analyze` :class:`.Create`, :class:`.Execute` or :class:`.Delete`. """ self.state.switch(state)
class Scenario(object): """Handles scenario. :param int/str descriptor: scenario name or index. """ def __init__(self, descriptor): """Constructor.""" if isinstance(descriptor, int): descriptor = str(descriptor) if not isinstance(descriptor, str): raise TypeError("Descriptor must be a string or int (for a Scenario ID)") self.data_access = Context.get_data_access() self._scenario_list_manager = ScenarioListManager(self.data_access) self._execute_list_manager = ExecuteListManager(self.data_access) if not descriptor: self.state = Create(self) else: self._set_info(descriptor) try: state = self.info["state"] self._set_status() if state == "execute": self.state = Execute(self) elif state == "analyze": self.state = Analyze(self) except AttributeError: return def _set_info(self, descriptor): """Sets scenario information. :param str descriptor: scenario descriptor. """ info = self._scenario_list_manager.get_scenario(descriptor) if info is not None: self.info = info def _set_status(self): """Sets execution status of scenario.""" scenario_id = self.info["id"] self.status = self._execute_list_manager.get_status(scenario_id) def print_scenario_info(self): """Prints scenario information.""" self.state.print_scenario_info() def get_scenario_table(self): """Get scenario table :return: (*pandas.DataFrame*) -- scenario table """ return self._scenario_list_manager.get_scenario_table() def change(self, state): """Changes state. :param class state: One of :class:`.Analyze` :class:`.Create`, :class:`.Execute` or :class:`.Delete`. """ self.state.switch(state)
class Scenario(object): """Handles scenario. :param str descriptor: scenario name or index. """ def __init__(self, descriptor): """Constructor. """ if not isinstance(descriptor, str): raise TypeError('Descriptor must be a string') self.ssh = setup_server_connection() if not descriptor: self.state = Create(self) else: self._set_info(descriptor) try: state = self.info['state'] self._set_status() if state == 'execute': self.state = Execute(self) elif state == 'analyze': self.state = Analyze(self) except AttributeError: return def _set_info(self, descriptor): """Sets scenario information. :param str descriptor: scenario descriptor. """ scenario_table = get_scenario_table(self.ssh) def not_found_message(table): """Print message when scenario is not found. :param pandas table: scenario table. """ print("------------------") print("SCENARIO NOT FOUND") print("------------------") print( table.to_string(index=False, justify='center', columns=[ 'id', 'plan', 'name', 'interconnect', 'base_demand', 'base_hydro', 'base_solar', 'base_wind' ])) try: int(descriptor) scenario = scenario_table[scenario_table.id == descriptor] if scenario.shape[0] == 0: not_found_message(scenario_table) else: self.info = scenario.to_dict('records', into=OrderedDict)[0] return except ValueError: scenario = scenario_table[scenario_table.name == descriptor] if scenario.shape[0] == 0: not_found_message(scenario_table) elif scenario.shape[0] == 1: self.info = scenario.to_dict('records', into=OrderedDict)[0] elif scenario.shape[0] > 1: print("-----------------------") print("MULTIPLE SCENARIO FOUND") print("-----------------------") print('Use id to access scenario') print( scenario_table.to_string(index=False, justify='center', columns=[ 'id', 'plan', 'name', 'interconnect', 'base_demand', 'base_hydro', 'base_solar', 'base_wind' ])) return def _set_status(self): """Sets execution status of scenario. :raises Exception: if scenario not found in execute list on server. """ execute_table = get_execute_table(self.ssh) status = execute_table[execute_table.id == self.info['id']] if status.shape[0] == 0: raise Exception("Scenario not found in %s on server" % const.EXECUTE_DIR) elif status.shape[0] == 1: self.status = status.status.values[0] def print_scenario_info(self): """Prints scenario information. """ self.state.print_scenario_info() def change(self, state): """Changes state. :param class state: One of :class:`.Analyze` :class:`.Create`, :class:`.Execute` or :class:`.Delete`. """ self.state.switch(state)