From d15f327d9ba3d56293a5a3eb90c0a973a490d743 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Mon, 13 May 2024 13:26:19 -0400 Subject: [PATCH 01/12] Starting v0.5.7.0b0 --- CHANGELOG.md | 3 ++- dse_do_utils/version.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cedac9..f7e9511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -[Unreleased]## [0.5.5.2b7] +[Unreleased]## [0.5.7.0b0] +### Changed ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/version.py b/dse_do_utils/version.py index 16e6970..44e15f5 100644 --- a/dse_do_utils/version.py +++ b/dse_do_utils/version.py @@ -9,4 +9,4 @@ See https://stackoverflow.com/questions/458550/standard-way-to-embed-version-into-python-package """ -__version__ = "0.5.6.0" +__version__ = "0.5.7.0b" From aaa7faf88c873650e196032108bb6cb0413cbd0c Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Mon, 13 May 2024 14:04:59 -0400 Subject: [PATCH 02/12] Remove ScenarioDbManager from __init__.py --- CHANGELOG.md | 2 ++ dse_do_utils/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7e9511..9900d1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [Unreleased]## [0.5.7.0b0] ### Changed +- Removed ScenarioDbManager from dse_do_utils.__init__.py. This avoids the dependency on sqlalchemy with use of dse_do_utils where the ScenarioDbManager is not used. +Introduces a slight backward incompatibility. Need to import as: 'from dse_do_utils.scenariodbmanager import ScenarioDbManager' ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/__init__.py b/dse_do_utils/__init__.py index 61b470b..bc604a5 100644 --- a/dse_do_utils/__init__.py +++ b/dse_do_utils/__init__.py @@ -5,7 +5,7 @@ from .datamanager import DataManager from .optimizationengine import OptimizationEngine from .scenariomanager import ScenarioManager -from .scenariodbmanager import ScenarioDbManager +# from .scenariodbmanager import ScenarioDbManager # from .scenariopicker import ScenarioPicker # from .deployeddomodel import DeployedDOModel # from .mapmanager import MapManager From 51e5cd562c736128a51d55e338d2e5b3746b1788 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Tue, 14 May 2024 23:43:46 -0400 Subject: [PATCH 03/12] backward incompatibilities and cleanup --- CHANGELOG.md | 9 +- dse_do_utils/__init__.py | 83 ------------------- dse_do_utils/core/core01_data_manager.py | 21 ++--- .../core/core01_optimization_engine.py | 5 +- .../core/core02_optimization_engine.py | 5 +- dse_do_utils/core/core02_scenario_runner.py | 8 +- dse_do_utils/datamanager.py | 7 +- dse_do_utils/optimizationengine.py | 2 +- dse_do_utils/scenariodbmanager.py | 16 ++-- dse_do_utils/scenariorunner.py | 11 ++- dse_do_utils/version.py | 2 +- 11 files changed, 52 insertions(+), 117 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9900d1e..ddc0c96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [Unreleased]## [0.5.7.0b0] ### Changed -- Removed ScenarioDbManager from dse_do_utils.__init__.py. This avoids the dependency on sqlalchemy with use of dse_do_utils where the ScenarioDbManager is not used. -Introduces a slight backward incompatibility. Need to import as: 'from dse_do_utils.scenariodbmanager import ScenarioDbManager' +- BACKWARD INCOMPATIBILITY - ScenarioDbManager.__init__: changed default values for enable_scenario_seq=True, db_type=DatabaseType.PostgreSQL, future=True. This reflects the current best practices. +- BACKWARD INCOMPATIBILITY - Removed ScenarioDbManager from `dse_do_utils.__init__.py`. This avoids the dependency on sqlalchemy with use of dse_do_utils where the ScenarioDbManager is not used. +Introduces a slight backward incompatibility. Need to import as: `from dse_do_utils.scenariodbmanager import ScenarioDbManager` +- Removed (deprecated) `module_reload()` from `dse_do_utils.__init__.py`. In notebooks `autoreload` works well, +- Generics in ScenarioRunner +- Removed deprecated optional argument `dtypes` from `Core01DataManager.prepare_output_data_frames()` +- Fixed mutable default arguments in scenariodbmanager module ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/__init__.py b/dse_do_utils/__init__.py index bc604a5..ad68b95 100644 --- a/dse_do_utils/__init__.py +++ b/dse_do_utils/__init__.py @@ -11,86 +11,3 @@ # from .mapmanager import MapManager name = "dse_do_utils" - - -def module_reload(): - """DEPRECATED. Requires updates to Python 3.6 - Reloads all component modules. Use when you want to force a reload of this module with imp.reload(). - - This avoids having to code somewhat complex reloading logic in the notebook that is using this module. - - Challenge with imp.reload of dse-do_utils. The following is NOT (!) sufficient:: - - import imp - import dse_do_utils - imp.reload(dse_do_utils) - - The package dse_do_utils internally contains a number of sub modules that each contain a part of the code. - This keeps development easier and more organized. But to make importing easier, the classes are exposed - in the top level `init.py`, which allows for a simple import statement like from dse_do_utils import ScenarioManager. - Unfortunately, reloading the top-level module dse_do_utils doesn't force a reload of the internal modules. - - In case of subclassing, reloading needs to be done in the right order, i.e. first the parent classes. - - Usage:: - - import imp - import dse_do_utils # You have to do the import, otherwise not possible to do the next 2 steps - dse_do_utils.module_reload() #This function - imp.reload(dse_do_utils) # Necessary to ensure all following expressions `from dse_do_utils import class` are using the updated classes - from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager # This needs to be done AFTER the reload to refresh the definitions - - - Note that this function assumes that the set of classes and component modules is not part of the update. - If it is, you may need to add another reload:: - - import imp - import dse_do_utils # You have to do the import, otherwise not possible to do the next 2 steps - imp.reload(dse_do_utils) # To reload this function - dse_do_utils.module_reload() #This function - imp.reload(dse_do_utils) # Necessary to ensure all future expressions `from dse_do_utils import class` are using the updated classes - from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager # This needs to be done AFTER the reload to refresh the definitions - - - If not using this function, in the notebook you would need to do the following (or the relevant parts of it):: - - import imp - import dse_do_utils - imp.reload(dse_do_utils.datamanager) - imp.reload(dse_do_utils.optimizationengine) - imp.reload(dse_do_utils.scenariomanager) - imp.reload(dse_do_utils.scenariopicker) - imp.reload(dse_do_utils.deployeddomodel) - imp.reload(dse_do_utils.mapmanager) - imp.reload(dse_do_utils) - from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager - - Returns: - - """ - import importlib - import datamanager - import optimizationengine - import scenariomanager - import scenariopicker - import deployeddomodel - import mapmanager - import multiscenariomanager - importlib.reload(datamanager) - importlib.reload(optimizationengine) - importlib.reload(scenariomanager) - importlib.reload(scenariopicker) - importlib.reload(deployeddomodel) - importlib.reload(mapmanager) - importlib.reload(multiscenariomanager) - - # The imports below cannot be done here. - # You need to redo the class imports from the notebook that is calling this function - - # from .version import __version__ - # from .datamanager import DataManager - # from .optimizationengine import OptimizationEngine - # from .scenariomanager import ScenarioManager - # from .scenariopicker import ScenarioPicker - # from .deployeddomodel import DeployedDOModel - # from .mapmanager import MapManager diff --git a/dse_do_utils/core/core01_data_manager.py b/dse_do_utils/core/core01_data_manager.py index f8d4cbc..af0738d 100644 --- a/dse_do_utils/core/core01_data_manager.py +++ b/dse_do_utils/core/core01_data_manager.py @@ -50,14 +50,18 @@ def __init__(self, inputs=None, outputs=None, log_level=None): # `self.__class__.__module__` returns `fruit.data_manager` (same as `self.__module__`) # VT20230607: changed to __name__ from self.__module__ + self.logger = logging.getLogger(__name__) # `__name__` is Python best practice - # Parameters: - self.params = None - self.param = types.SimpleNamespace() + # # Parameters: + # self.params = None + # self.param = types.SimpleNamespace() self.dtypes: Dict = self.get_default_dtypes() + # Output data + self.kpis: Optional[pd.DataFrame] = None + def prepare_input_data_frames(self): super().prepare_input_data_frames() # self.logger.debug("Enter") @@ -82,11 +86,6 @@ def set_parameters(self): self.param.threads = self.get_parameter_value(self.params, 'threads', param_type='int', default_value=0) # default 0 implies no limit - # self.param.n_threads = self.get_parameter_value( - # self.params, - # param_name='numberThreads', - # param_type='int', - # default_value=0) self.param.enable_lp_names = self.get_parameter_value( self.params, @@ -106,11 +105,8 @@ def set_parameters(self): param_type='bool', default_value=False) - def prepare_output_data_frames(self, dtypes=None): + def prepare_output_data_frames(self): """ - TODO: remove dtypes argument. Beware that this can break existing code - :param dtypes: - :return: """ super().prepare_output_data_frames() self.logger.debug("Enter") @@ -173,6 +169,7 @@ def prepare_df(self, df: dataframe index_columns: index column names value_columns: value column names + optional_columns: dtypes: map of column data types. Adds and overrides values in self.dtypes data_specs_key: data specs key verify_integrity: flag to verify integrity when setting the index diff --git a/dse_do_utils/core/core01_optimization_engine.py b/dse_do_utils/core/core01_optimization_engine.py index 58e9b25..53da345 100644 --- a/dse_do_utils/core/core01_optimization_engine.py +++ b/dse_do_utils/core/core01_optimization_engine.py @@ -34,10 +34,13 @@ class FruitOptimizationEngine(Core01OptimizationEngine[DM]): engine = FruitOptimizationEngine[FruitDataManager] """ - def __init__(self, data_manager: DM, name: str = None, solve_kwargs: Dict = {"log_output": True}, + def __init__(self, data_manager: DM, name: str = None, solve_kwargs=None, export_lp: bool = False, export_sav: bool = False, export_lp_path: str = '', enable_refine_conflict: bool = False): super().__init__(data_manager=data_manager, name=name) + + if solve_kwargs is None: + solve_kwargs = {"log_output": True} self.solve_kwargs = solve_kwargs self.export_lp = export_lp self.export_sav = export_sav diff --git a/dse_do_utils/core/core02_optimization_engine.py b/dse_do_utils/core/core02_optimization_engine.py index 6c5e4fb..7e6ed8a 100644 --- a/dse_do_utils/core/core02_optimization_engine.py +++ b/dse_do_utils/core/core02_optimization_engine.py @@ -41,13 +41,14 @@ class Core02OptimizationEngine(Core01OptimizationEngine[DM]): to the input_db_tables """ - def __init__(self, data_manager: Core02DataManager, name: str = None, solve_kwargs: Dict = {"log_output": True}, + def __init__(self, data_manager: DM, name: str = None, solve_kwargs=None, export_lp: bool = False, export_sav: bool = False, export_lp_path: str = '', enable_refine_conflict: bool = False): + if solve_kwargs is None: + solve_kwargs = {"log_output": True} super().__init__(data_manager, name=name, solve_kwargs=solve_kwargs, export_lp=export_lp, export_sav=export_sav, export_lp_path=export_lp_path, enable_refine_conflict=enable_refine_conflict) - # self.solver_metrics = None self.lex_opti_metrics_list: List[Dict] = [] #################################################################################### diff --git a/dse_do_utils/core/core02_scenario_runner.py b/dse_do_utils/core/core02_scenario_runner.py index 2caf865..7701c8a 100644 --- a/dse_do_utils/core/core02_scenario_runner.py +++ b/dse_do_utils/core/core02_scenario_runner.py @@ -13,7 +13,7 @@ from dse_do_utils.datamanager import Inputs, Outputs, DataManager from dse_do_utils.scenariodbmanager import ScenarioDbManager from logging import Logger, getLogger -from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union +from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union, TypeVar from dse_do_utils.scenariomanager import Platform from dse_do_utils.scenariorunner import ScenarioConfig, ScenarioGenerator @@ -25,13 +25,15 @@ class Core02ScenarioConfig(ScenarioConfig): lex_opti_goals: Dict = None # Dict compatible with pd.DataFrame.__init__() -class Core02ScenarioGenerator(ScenarioGenerator): +SC = TypeVar('SC', bound='Core02ScenarioConfig') + +class Core02ScenarioGenerator(ScenarioGenerator[SC]): """Adds LexOptiLevel and LexOptiGoal configuration """ def __init__(self, inputs: Inputs, - scenario_config: ScenarioConfig) -> None: + scenario_config: Core02ScenarioConfig) -> None: super().__init__(inputs=inputs, scenario_config=scenario_config) def generate_scenario(self): diff --git a/dse_do_utils/datamanager.py b/dse_do_utils/datamanager.py index d20371b..2719385 100644 --- a/dse_do_utils/datamanager.py +++ b/dse_do_utils/datamanager.py @@ -22,7 +22,7 @@ class DataManager(object): It typically contains the input and output dictionaries with DataFrames that came from or will be inserted into a DO scenario. - In addition it will hold any intermediate data. + In addition, it will hold any intermediate data. It holds methods that operate on and convert the data. When used in combination with an optimization engine, it should not contain the docplex code that creates or interacts with the docplex Model. (That is the task of the OptimizationEngine.) @@ -38,7 +38,10 @@ class DataManager(object): def __init__(self, inputs: Optional[Inputs] = None, outputs: Optional[Outputs] = None): self.inputs = inputs self.outputs = outputs - return + + # Parameters: + self.params: Optional[pd.DataFrame] = None + self.param = types.SimpleNamespace() def prepare_data_frames(self): if (self.inputs is not None) and (len(self.inputs) > 0): diff --git a/dse_do_utils/optimizationengine.py b/dse_do_utils/optimizationengine.py index ab9a819..02ca1ad 100644 --- a/dse_do_utils/optimizationengine.py +++ b/dse_do_utils/optimizationengine.py @@ -123,7 +123,7 @@ def semiinteger_var_series_s(mdl: docplex.mp.model, df: pd.DataFrame, lb, **karg """Returns pd.Series[SemiIntegerVarType].""" return pd.Series(mdl.semiinteger_var_list(df.index, lb, **kargs), index=df.index, dtype='object') - def solve(self, refine_conflict: bool = False, **kwargs) -> docplex.mp.solution.SolveSolution: + def solve(self, refine_conflict: Optional[bool] = False, **kwargs) -> docplex.mp.solution.SolveSolution: # TODO: enable export_as_lp_path()? # self.export_as_lp_path(lp_file_name=self.mdl.name) # TODO: use self.solve_kwargs if **kwargs is empty/None. Or merge them? diff --git a/dse_do_utils/scenariodbmanager.py b/dse_do_utils/scenariodbmanager.py index fa1ee6e..f417a9b 100644 --- a/dse_do_utils/scenariodbmanager.py +++ b/dse_do_utils/scenariodbmanager.py @@ -30,6 +30,7 @@ import re from sqlalchemy import exc, MetaData from sqlalchemy import Table, Column, String, Integer, Float, ForeignKey, ForeignKeyConstraint +import enum # Typing aliases from dse_do_utils import ScenarioManager @@ -37,7 +38,6 @@ Inputs = Dict[str, pd.DataFrame] Outputs = Dict[str, pd.DataFrame] -import enum class DatabaseType(enum.Enum): """Used in ScenarioDbManager.__init__ to specify the type of DB it is connecting to.""" @@ -52,8 +52,8 @@ class ScenarioDbTable(ABC): """ def __init__(self, db_table_name: str, - columns_metadata: List[sqlalchemy.Column] = [], - constraints_metadata: List[ForeignKeyConstraint] = []): + columns_metadata=None, + constraints_metadata=None): """ Warning: Do not use mixed case names for the db_table_name. Supplying a mixed-case is not working well and is causing DB FK errors. @@ -66,6 +66,10 @@ def __init__(self, db_table_name: str, :param columns_metadata: :param constraints_metadata: """ + if constraints_metadata is None: + constraints_metadata = [] + if columns_metadata is None: + columns_metadata = [] self.db_table_name = db_table_name # ScenarioDbTable.camel_case_to_snake_case(db_table_name) # To make sure it is a proper DB table name. Also allows us to use the scenario table name. self.columns_metadata = self.resolve_metadata_column_conflicts(columns_metadata) @@ -488,10 +492,10 @@ class ScenarioDbManager(): def __init__(self, input_db_tables: Dict[str, ScenarioDbTable], output_db_tables: Dict[str, ScenarioDbTable], credentials=None, schema: str = None, echo: bool = False, multi_scenario: bool = True, enable_transactions: bool = True, enable_sqlite_fk: bool = True, enable_astype: bool = True, - enable_debug_print: bool = False, enable_scenario_seq: bool = False, - db_type: DatabaseType = DatabaseType.DB2, + enable_debug_print: bool = False, enable_scenario_seq: bool = True, + db_type: DatabaseType = DatabaseType.PostgreSQL, use_custom_naming_convention: bool = False, - future: bool = False, + future: bool = True, ): """Create a ScenarioDbManager. diff --git a/dse_do_utils/scenariorunner.py b/dse_do_utils/scenariorunner.py index a1049c0..eddfe5b 100644 --- a/dse_do_utils/scenariorunner.py +++ b/dse_do_utils/scenariorunner.py @@ -13,7 +13,7 @@ from dse_do_utils.datamanager import Inputs, Outputs, DataManager from dse_do_utils.scenariodbmanager import ScenarioDbManager from logging import Logger, getLogger -from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union +from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union, TypeVar, Generic from dse_do_utils.scenariomanager import Platform @@ -42,7 +42,10 @@ class RunConfig: template_scenario_name: Optional[str] = None # 'TemplateScenario' -class ScenarioGenerator(): +SC = TypeVar('SC', bound='ScenarioConfig') + + +class ScenarioGenerator(Generic[SC]): """Generates a variation of a scenario, i.e. `inputs` dataset, driven by a ScenarioConfig. To be subclassed. This base class implements overrides of the Parameter table. @@ -60,10 +63,10 @@ def generate_scenario(self): def __init__(self, inputs: Inputs, - scenario_config: ScenarioConfig) -> None: + scenario_config: SC) -> None: self._logger: Logger = getLogger(__name__) self.inputs: Inputs = inputs.copy() # Only copy of dict - self.scenario_config: ScenarioConfig = scenario_config + self.scenario_config: SC = scenario_config def generate_scenario(self): """Generate a variation of the base_inputs. To be overridden. diff --git a/dse_do_utils/version.py b/dse_do_utils/version.py index 44e15f5..226edc5 100644 --- a/dse_do_utils/version.py +++ b/dse_do_utils/version.py @@ -9,4 +9,4 @@ See https://stackoverflow.com/questions/458550/standard-way-to-embed-version-into-python-package """ -__version__ = "0.5.7.0b" +__version__ = "0.5.7.0b0" From d5cc716f0ae003e6e0c5d3c7faf63369c6dbbb2e Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Mon, 17 Jun 2024 09:13:32 -0400 Subject: [PATCH 04/12] iterative solve --- CHANGELOG.md | 3 +- .../core/core01_cpo_optimization_engine.py | 291 ++++++++++++++++++ .../core/core01_optimization_engine.py | 23 ++ dse_do_utils/deployeddomodel.py | 2 +- dse_do_utils/optimizationengine.py | 36 ++- dse_do_utils/scenariodbmanager.py | 176 ++++++++++- dse_do_utils/scenariorunner.py | 6 +- dse_do_utils/utilities.py | 32 +- 8 files changed, 560 insertions(+), 9 deletions(-) create mode 100644 dse_do_utils/core/core01_cpo_optimization_engine.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ddc0c96..fec8f0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [Unreleased]## [0.5.7.0b0] ### Changed -- BACKWARD INCOMPATIBILITY - ScenarioDbManager.__init__: changed default values for enable_scenario_seq=True, db_type=DatabaseType.PostgreSQL, future=True. This reflects the current best practices. +- BACKWARD INCOMPATIBILITY - ScenarioDbManager.__init__: changed default values for db_type=DatabaseType.SQLite. For other uses (DB2 or PostgreSQL, always specify the db_type. +- BACKWARD INCOMPATIBILITY - ScenarioDbManager.__init__: changed default values for enable_scenario_seq=True, future=True. This reflects the current best practices. - BACKWARD INCOMPATIBILITY - Removed ScenarioDbManager from `dse_do_utils.__init__.py`. This avoids the dependency on sqlalchemy with use of dse_do_utils where the ScenarioDbManager is not used. Introduces a slight backward incompatibility. Need to import as: `from dse_do_utils.scenariodbmanager import ScenarioDbManager` - Removed (deprecated) `module_reload()` from `dse_do_utils.__init__.py`. In notebooks `autoreload` works well, diff --git a/dse_do_utils/core/core01_cpo_optimization_engine.py b/dse_do_utils/core/core01_cpo_optimization_engine.py new file mode 100644 index 0000000..5ac67f3 --- /dev/null +++ b/dse_do_utils/core/core01_cpo_optimization_engine.py @@ -0,0 +1,291 @@ +# Copyright IBM Corp. 2021, 2022 +# IBM Confidential Source Code Materials +# This Source Code is subject to the license and security terms contained in the License.txt file contained in this source code package. +import os +import pathlib +from abc import abstractmethod +from typing import Dict, List, Optional + +import pandas as pd +from docplex import cp +from docplex.mp.conflict_refiner import ConflictRefiner +from docplex.mp.solution import SolveSolution +from docplex.cp.parameters import CpoParameters +from docplex.cp.solution import CpoSolveResult, CpoRefineConflictResult + +from dse_do_utils import OptimizationEngine +from dse_do_utils.core.core01_data_manager import Core01DataManager +from dse_do_utils.datamanager import Outputs +from typing import TypeVar, Generic + +DM = TypeVar('DM', bound='Core01DataManager') + + +class Core01CpoOptimizationEngine(OptimizationEngine[DM]): + """ + DRAFT. Needs a lot of updates to match CP Optimizer specifics! + + This class supports Python generics to specify the class of the DataManager. + This allows an IDE like PyCharm and VSCode to check for methods and attributes + and allows more easy navigation (i.e. control-click on name) + + Usage 1 - Define a use-case specific OptimizationEngine class:: + + DM = TypeVar('DM', bound='FruitDataManager') + class FruitOptimizationEngine(Core01OptimizationEngine[DM]): + pass + + Usage 2 - When creating an instance:: + + engine = FruitOptimizationEngine[FruitDataManager] + """ + def __init__(self, data_manager: DM, name: str = None, solve_kwargs=None, + export_lp: bool = False, export_sav: bool = False, export_lp_path: str = '', + enable_refine_conflict: bool = False): + super().__init__(data_manager=data_manager, name=name, is_cpo_model=True) + + if solve_kwargs is None: + solve_kwargs = {"log_output": True} + self.solve_kwargs = solve_kwargs + self.export_lp = export_lp + self.export_sav = export_sav + self.export_lp_path = export_lp_path + self.enable_refine_conflict = enable_refine_conflict + self.logger = data_manager.logger + + self.cpo_params = CpoParameters() + + def run(self) -> Outputs: + self.dm.prepare_data_frames() + self.dm.pre_processing() + + self.create_dvars() + self.create_objectives() + self.set_objective() + self.create_constraints() + # self.set_cplex_parameters() + self.set_cpo_parameters() + msol = self.solve() + if msol.is_solution() is not None: + self.extract_solution(msol) + self.post_processing() + outputs = self.get_outputs() + else: + outputs = {} + return outputs + + @abstractmethod + def create_dvars(self) -> None: + pass + + @abstractmethod + def create_objectives(self) -> None: + pass + + @abstractmethod + def set_objective(self) -> None: + pass + + @abstractmethod + def create_constraints(self) -> None: + pass + + def set_cplex_parameters(self) -> None: + if int(self.dm.param.time_limit) > 0: + self.mdl.parameters.timelimit = int(self.dm.param.time_limit) + + if int(self.dm.param.threads) > 0: + self.mdl.parameters.threads = int(self.dm.param.threads) + + if self.dm.param.handle_unscaled_infeasibilities: + self._set_cplex_parameters_unscaled_infeasibilities() + + if self.dm.param.log_solution_quality_metrics: + # Configure the mdl to generate quality metrics, will be available in mdl.solve_details.quality_metrics + self.mdl.quality_metrics = True + + def set_cpo_parameters(self): + if self.cpo_params is None: + self.cpo_params = CpoParameters() + + if int(self.dm.param.time_limit) > 0: + self.cpo_params.TimeLimit = int(self.dm.param.time_limit) + + # self.cpo_params.KPIDisplay = 'MultipleLines' + # self.cpo_params.ConflictRefinerTimeLimit = 60 + # self.cpo_params.LogPeriod = 10_000 # Number of branches, default 1000 + # self.cpo_params.LogVerbosity = 'Normal' #'Terse' + + def solve(self) -> Optional[CpoSolveResult]: + """ + TODO: In CPO, is msol None if no solution? + """ + msol = self.mdl.solve(params=self.cpo_params, **self.solve_kwargs) + self.export_as_lp_path(lp_file_name=self.mdl.name) + if msol.is_solution(): + pass + # TODO: CPO equivalent of CPLEX report? + # self.mdl.report() + elif self.enable_refine_conflict: + self.refine_conflict() + return msol + + @abstractmethod + def extract_solution(self, msol: CpoSolveResult, drop: bool = True) -> None: + self.dm.logger.debug("Enter") + + # KPIs + self.dm.kpis = self.get_kpi_output_table(msol) + + @abstractmethod + def post_processing(self) -> None: + self.dm.post_processing() + + def get_outputs(self) -> Outputs: + return self.dm.get_outputs() + + ################################################################ + # Utils + ################################################################ + def refine_conflict(self): + """ + TODO: refine to logger? + TODO: control by parameter? + TODO: support CP Optimizer + :return: + """ + self.logger.debug("Start ConflictRefiner") + conflicts: CpoRefineConflictResult = self.mdl.refine_conflict() # TODO: Is this working? + conflicts.print_conflict() # TODO: Deprecated + # crefiner = ConflictRefiner() # Create an instance of the ConflictRefiner + # conflicts = crefiner.refine_conflict(self.mdl) # Run the conflict refiner + # # ConflictRefiner.display_conflicts(conflicts) #Display the results + # for c in conflicts: + # print(c.element) # Display conflict result in a little more compact format than ConflictRefiner.display_conflicts + + + @staticmethod + def condition_values(var): + """Fix issues with CPLEX using a tolerance""" + if isinstance(var, int): + return var + elif isinstance(var, float): + return var + else: + return round(var.solution_value + 1e-6, 5) + + @staticmethod + def df_extract_solution(df, + extract_dvar_names: List[str] = None, + drop_column_names: List[str] = None, + drop: bool = True, + column_name_post_fix: str = 'Sol'): + """Generalized routine to extract a solution value. + Can remove the dvar column from the df to be able to have a clean df for export into scenario. + For each dvar column in extract_dvar_names, extract solution into a new column with the same name + and the column_name_post_fix added. + + :param df + :param extract_dvar_names: + :param drop_column_names: List of columns to drop **in addition** to the columns in extract_dvar_names + :param drop: + :param column_name_post_fix: + + """ + + if extract_dvar_names is not None: + for xDVarName in extract_dvar_names: + if xDVarName in df.columns: + df[f'{xDVarName}{column_name_post_fix}'] = [Core01CpoOptimizationEngine.condition_values(dvar) for dvar in df[xDVarName]] + if drop and len(column_name_post_fix) > 0: + # Only drop if we created a new column + df = df.drop([xDVarName], axis=1) + if drop and drop_column_names is not None: + for column in drop_column_names: + if column in df.columns: + df = df.drop([column], axis=1) + return df + + def get_kpi_output_table(self, msol: CpoSolveResult) -> pd.DataFrame: + """Overrides the default and uses the default `['NAME', 'VALUE']` columns.""" + # print(" KPIs: {}".format(msol.get_kpis())) + # all_kpis = [(kp.name, kp.compute()) for kp in self.mdl.get_kpis()] + all_kpis = msol.get_kpis() + df_kpis = pd.DataFrame(all_kpis, columns=['NAME', 'VALUE']).set_index('NAME') + return df_kpis + + def export_as_lp_path(self, lp_file_name: str = 'my_cpo_file') -> str: + """ + Saves .lp file in self.export_lp_path + Note: Does not conflict with `OptimizationEngine.export_as_lp()` which has a different signature. + :return: file_path + """ + filepath = None + if self.export_lp: + if pathlib.Path(lp_file_name).suffix != '.cpo': + lp_file_name = lp_file_name + '.cpo' + filepath = os.path.join(self.export_lp_path, lp_file_name) + self.logger.debug(f"Exporting .cpo file: {filepath}") + self.mdl.export_as_cpo(filepath) + return filepath + + def export_as_sav_path(self, sav_file_name: str = 'my_sav_file') -> str: + """ + Saves .sav file in self.export_lp_path + :return: file_path + """ + filepath = None + if self.export_sav: + if pathlib.Path(sav_file_name).suffix != '.sav': + sav_file_name = sav_file_name + '.sav' + filepath = os.path.join(self.export_lp_path, sav_file_name) + self.dm.logger.debug(f"Exporting .sav file: {filepath}") + self.mdl.export_as_sav(filepath) + return filepath + + ######################################################## + # Metrics + ######################################################## + def _set_cplex_parameters_unscaled_infeasibilities(self): + """CPLEX Parameters to help handle unscaled infeasibilities + See: + - https://www.ibm.com/docs/en/icos/22.1.0?topic=infeasibility-coping-ill-conditioned-problem-handling-unscaled-infeasibilities + - https://orinanobworld.blogspot.com/2010/08/ill-conditioned-bases-and-numerical.html + """ + self.mdl.parameters.read.scale = 1 + self.mdl.parameters.simplex.tolerances.markowitz = 0.90 + self.mdl.parameters.simplex.tolerances.feasibility = 1e-9 + self.mdl.parameters.emphasis.numerical = 1 + # self.mdl.parameters.lpmethod = 1 # 1: primal-simplex + + def log_solution_quality_metrics(self): + """Log the solution quality metrics + :return: + """ + if self.dm.param.log_solution_quality_metrics: + self.dm.logger.debug(f"Solution quality metrics:") + max_key_length = max([len(key) for key in self.mdl.solve_details.quality_metrics.keys()], default=10) # `default` option is just to ensure the code doesn't throw an exception in case there are no quality_metrics + for key, value in self.mdl.solve_details.quality_metrics.items(): + self.dm.logger.debug(f"{key.ljust(max_key_length, ' ')} = {value:,}") + + def extract_engine_metrics(self): + if self.solver_metrics is not None: + return pd.DataFrame(self.solver_metrics).set_index('name') + else: + return pd.DataFrame(columns=['name', 'value']).set_index('name') + +############################################################ +class CplexSum(): + """Function class that adds a series of dvars into a cplex sum expression. + To be used as a custom aggregation in a groupby. + Usage: + df2 = df1.groupby(['a']).agg({'xDVar':CplexSum(engine.mdl)}).rename(columns={'xDVar':'expr'}) + + Sums the dvars in the 'xDVar' column into an expression + """ + def __init__(self, mdl): + self.mdl = mdl + def __call__(self, dvar_series): + return self.mdl.sum(dvar_series) + + diff --git a/dse_do_utils/core/core01_optimization_engine.py b/dse_do_utils/core/core01_optimization_engine.py index 53da345..1cfe4fe 100644 --- a/dse_do_utils/core/core01_optimization_engine.py +++ b/dse_do_utils/core/core01_optimization_engine.py @@ -98,6 +98,8 @@ def set_cplex_parameters(self) -> None: def solve(self) -> Optional[SolveSolution]: msol = self.mdl.solve(**self.solve_kwargs) + self.dm.logger.info( + f"Solve completed with status '{self.mdl.solve_details.status}' and time {self.mdl.solve_details.time:.2f} sec") self.export_as_lp_path(lp_file_name=self.mdl.name) if msol is not None: # TODO: enable print report? @@ -246,6 +248,27 @@ def extract_engine_metrics(self): else: return pd.DataFrame(columns=['name', 'value']).set_index('name') + ########################################## + # Tuning (TODO) + ########################################## + def cplex_tune_model(self): + """DRAFT + Run the cplex parameter tuning + From https://stackoverflow.com/questions/53353970/where-can-i-find-the-documentation-of-docplex-automatic-tuning-tool + Works but beware of too short time-limit + Returns: + + """ + cpx = self.mdl.get_engine().get_cplex() + status = cpx.parameters.tune_problem() + if status == cpx.parameters.tuning_status.completed: + print("tuned parameters:") + for param, value in cpx.parameters.get_changed(): + print("{0}: {1}".format(repr(param), value)) + else: + print("tuning status was: {0}".format( + cpx.parameters.tuning_status[status])) + ############################################################ class CplexSum(): """Function class that adds a series of dvars into a cplex sum expression. diff --git a/dse_do_utils/deployeddomodel.py b/dse_do_utils/deployeddomodel.py index d686e3f..d0a7d7e 100644 --- a/dse_do_utils/deployeddomodel.py +++ b/dse_do_utils/deployeddomodel.py @@ -241,7 +241,7 @@ def get_solve_payload(self, inputs: Inputs, max_oaas_time_limit_sec: Optional[in # self.outputs = self.get_outputs(job_details) # self.solve_details = self.get_solve_details(job_details) - def solve_v2(self, inputs: Inputs, max_oaas_time_limit_sec: int = None, max_run_time_sec: int = None): + def solve_v2(self, inputs: Inputs, max_oaas_time_limit_sec: int = None, max_run_time_sec: int = None) -> dict: """Master routine. Initializes the job, starts the execution, monitors the results, post-processes the solution and cleans-up after. Args: diff --git a/dse_do_utils/optimizationengine.py b/dse_do_utils/optimizationengine.py index 02ca1ad..4607104 100644 --- a/dse_do_utils/optimizationengine.py +++ b/dse_do_utils/optimizationengine.py @@ -336,9 +336,43 @@ def cp_integer_var_series_s(mdl: cp.CpoModel, df: pd.DataFrame, **kwargs) -> pd. integer_series = pd.Series(integer_list, index=df.index) return integer_series + @staticmethod + def cp_integer_var_series_s_v2(mdl: cp.CpoModel, df: pd.DataFrame, min=None, max=None, name=None, + domain=None) -> pd.Series: + """Returns pd.Series[docplex.cp.expression.CpoIntVar]. + If name is not None, will generate unique names based on pattern: '{name}_{index of df}' + If multi-index df, keys are separated by '_', e.g. 'xDvar_1_2_3' + """ + + if name is None: + integer_list = mdl.integer_var_list(df.shape[0], min, max, name, domain) + else: + integer_list = [] + for ix in df.index: + new_name = f"{name}_{OptimizationEngine._get_index_as_str(ix)}" + integer_list.append(mdl.integer_var(min, max, new_name, domain)) + integer_series = pd.Series(integer_list, index=df.index) + return integer_series + + @staticmethod + def _get_index_as_str(ix) -> str: + """Convert an index of a DF to a string. For naming dvars and constraints. + If df has a multi-index, the ix is a tuple.""" + if type(ix) is tuple: # If muli-index + name = '_'.join(map(str, ix)) + else: + name = str(ix) + # elif isinstance(ix, str): + # new_name = f"{name}_{ix}" + # elif isinstance(ix, int): + # new_name = f"{name}_{ix}" + # else: + # new_name = f"{name}_{str(ix)}" + return name + def cp_integer_var_series(self, df, **kwargs) -> pd.Series: """Returns pd.Series[docplex.cp.expression.CpoIntVar]""" - return OptimizationEngine.cp_integer_var_series_s(self.mdl, df=df, **kwargs) + return OptimizationEngine.cp_integer_var_series_s_v2(self.mdl, df=df, **kwargs) @staticmethod def cp_binary_var_series_s(mdl: cp.CpoModel, df: pd.DataFrame, **kwargs) -> pd.Series: diff --git a/dse_do_utils/scenariodbmanager.py b/dse_do_utils/scenariodbmanager.py index f417a9b..dabf949 100644 --- a/dse_do_utils/scenariodbmanager.py +++ b/dse_do_utils/scenariodbmanager.py @@ -72,7 +72,7 @@ def __init__(self, db_table_name: str, columns_metadata = [] self.db_table_name = db_table_name # ScenarioDbTable.camel_case_to_snake_case(db_table_name) # To make sure it is a proper DB table name. Also allows us to use the scenario table name. - self.columns_metadata = self.resolve_metadata_column_conflicts(columns_metadata) + self.columns_metadata: List[sqlalchemy.Column] = self.resolve_metadata_column_conflicts(columns_metadata) self.constraints_metadata = constraints_metadata self.dtype = None if not db_table_name.islower() and not db_table_name.isupper(): ## I.e. is mixed_case @@ -493,7 +493,7 @@ def __init__(self, input_db_tables: Dict[str, ScenarioDbTable], output_db_tables credentials=None, schema: str = None, echo: bool = False, multi_scenario: bool = True, enable_transactions: bool = True, enable_sqlite_fk: bool = True, enable_astype: bool = True, enable_debug_print: bool = False, enable_scenario_seq: bool = True, - db_type: DatabaseType = DatabaseType.PostgreSQL, + db_type: DatabaseType = DatabaseType.SQLite, use_custom_naming_convention: bool = False, future: bool = True, ): @@ -2007,6 +2007,178 @@ def delete_scenario_seq_column(inputs: Inputs, outputs: Outputs) -> (Inputs, Out new_outputs[scenario_table_name] = df return new_inputs, new_outputs + ##################################################################################################### + # Insert, Update, Delete row + ##################################################################################################### + def insert_table_row(self, scenario_table_name: str, scenario_name: str, values): + if self.enable_transactions: + # print("Insert row scenario within a transaction") + with self.engine.begin() as connection: + self._insert_table_row(scenario_table_name, scenario_name, values, connection) + else: + self._insert_table_row(scenario_table_name, scenario_name, values, self.engine) + + def _insert_table_row(self, scenario_table_name: str, scenario_name: str, values, connection=None): + """DRAFT. Insert one row of data. + TODO: handle update if it already exists: 'upsert' + Args: + scenario_table_name (str): Name of scenario table (as used in Inputs/Outputs, not the name in the DB) + values (Dict): values of row to be inserted. Typically, a Dict or tuple (e.g. from df.itertuples(). + connection + """ + # raise NotImplementedError + + if scenario_table_name in self.db_tables: + db_table = self.db_tables[scenario_table_name] + else: + raise ValueError(f"Scenario table name '{scenario_table_name}' unknown. Cannot insert data into DB.") + + # TODO: add scenario_seq to values + # TODO: if values is a sequence, we need to convert to a Dict so that we can add a value? + scenario_seq = self._get_scenario_seq(scenario_name=scenario_name, connection=connection) + if scenario_seq is not None: + values['scenario_seq'] = scenario_seq + else: + raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot insert row.") + + stmt = ( + sqlalchemy.insert(db_table.get_sa_table()).values(values) + ) + try: + if connection is None: + self.engine.execute(stmt) + else: + connection.execute(stmt) + + except exc.IntegrityError as e: + print("++++++++++++Integrity Error+++++++++++++") + print(e) + except exc.StatementError as e: + print("++++++++++++Statement Error+++++++++++++") + print(e) + + def update_table_row(self, scenario_table_name: str, scenario_name: str, values): + if self.enable_transactions: + # print("Insert row scenario within a transaction") + with self.engine.begin() as connection: + self._update_table_row(scenario_table_name, scenario_name, values, connection) + else: + self._update_table_row(scenario_table_name, scenario_name, values, self.engine) + + def _update_table_row(self, scenario_table_name: str, scenario_name: str, values, connection=None): + """DRAFT. Update one row of data. + Args: + scenario_table_name (str): Name of scenario table (as used in Inputs/Outputs, not the name in the DB) + values (Dict): values of row to be inserted. Typically, a Dict or tuple (e.g. from df.itertuples(). + connection + """ + if scenario_table_name in self.db_tables: + db_table = self.db_tables[scenario_table_name] + else: + raise ValueError(f"Scenario table name '{scenario_table_name}' unknown. Cannot insert data into DB.") + + scenario_seq = self._get_scenario_seq(scenario_name=scenario_name, connection=connection) + if scenario_seq is not None: + values['scenario_seq'] = scenario_seq + else: + raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot insert row.") + + # Split values in 2 parts: + # 1. The primary keys + # 2. The other columns + primary_keys = [c.name for c in db_table.columns_metadata if c.primary_key and c.name != 'scenario_seq'and c.name != 'scenario_name' ] + pk_values = {k: v for k,v in values.items() if k in primary_keys} + pk_conditions = [(db_table.get_sa_column(k) == v) for k, v in pk_values.items()] # TODO: + column_values = {k: v for k,v in values.items() if k not in primary_keys and k not in['scenario_seq', 'scenario_name']} # remove PK values + t: sqlalchemy.Table = db_table.get_sa_table() + + if self.enable_scenario_seq: + if (scenario_seq := self._get_scenario_seq(scenario_name, connection)) is not None: + # print(f"ScenarioSeq = {scenario_seq}") + sql = t.update().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)).values(column_values) + # connection.execute(sql) # VT20230204: Duplicate execute? Will be done anyway at the end of this method! + else: + raise ValueError(f"No scenario with name {scenario_name} exists") + else: + sql = t.update().where(sqlalchemy.and_((t.c.scenario_name == scenario_name), *pk_conditions)).values(column_values) + + # TODO: this does NOT fail if the row doesn't exist. It simply doesn;t do anything !? How can we have this fail, so we can do an insert? + connection.execute(sql) + + + def upsert_table_row(self, scenario_table_name: str, scenario_name: str, values): + if self.enable_transactions: + # print("Insert row scenario within a transaction") + with self.engine.begin() as connection: + self._upsert_table_row(scenario_table_name, scenario_name, values, connection) + else: + self._upsert_table_row(scenario_table_name, scenario_name, values, self.engine) + + def _upsert_table_row(self, scenario_table_name: str, scenario_name: str, values, connection=None): + """Updates or inserts a row in a DB table. + Assumes the values contain all primary key values. + Other columns are optional. + If row exists, will update the row. If row doesn't exist, will do an insert. + Update also supports partial updates of non-pk fields. + Beware that a None will result in a NULL. + + Args: + scenario_table_name (str): Name of scenario table (as used in Inputs/Outputs, not the name in the DB) + scenario_name (str): scenario_name + values (Dict): values of row to be inserted. Typically, a Dict or tuple (e.g. from df.itertuples(). Must include values for all PK columns. + connection + + Raises errors for: + Unknown scenario_name + Primary Key value not in values + """ + if scenario_table_name in self.db_tables: + db_table = self.db_tables[scenario_table_name] + else: + raise ValueError(f"Scenario table name '{scenario_table_name}' unknown. Cannot upsert data into DB.") + + # scenario_seq = self._get_scenario_seq(scenario_name=scenario_name, connection=connection) + # if scenario_seq is not None: + # values['scenario_seq'] = scenario_seq + # else: + # raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot upsert row.") + + # Split values in 2 parts: + # 1. The primary keys + # 2. The other columns + primary_keys = [c.name for c in db_table.columns_metadata if c.primary_key and c.name != 'scenario_seq'and c.name != 'scenario_name' ] + if not all(pk in values.keys() for pk in primary_keys): + raise ValueError(f"Not all required primary keys {primary_keys} specified in upsert request {values}") + # for pk in primary_keys: + # if pk not in values.keys(): + # raise ValueError(f"Primary key {pk} value not specified in upsert request") + pk_values = {k: v for k,v in values.items() if k in primary_keys} + pk_conditions = [(db_table.get_sa_column(k) == v) for k, v in pk_values.items()] + column_values = {k: v for k,v in values.items() if k not in primary_keys and k not in['scenario_seq', 'scenario_name']} # remove PK values + t: sqlalchemy.Table = db_table.get_sa_table() + + if self.enable_scenario_seq: + if (scenario_seq := self._get_scenario_seq(scenario_name, connection)) is not None: + # print(f"ScenarioSeq = {scenario_seq}") + # sql_exists = sqlalchemy.exists().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)) + sql_select = t.select().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)) #.exists() + res = connection.execute(sql_select) + count = res.rowcount + if count > 0: + # Update existing record + sql_update = t.update().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)).values(column_values) + connection.execute(sql_update) + else: + # Insert new record + sql_insert = t.insert().values(values) + connection.execute(sql_insert) + else: + raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot upsert row.") + else: + raise NotImplementedError(f"Upsert only supports enable_scenario_seq") + # TODO: implement. Easy to do. + # sql = t.update().where(sqlalchemy.and_((t.c.scenario_name == scenario_name), *pk_conditions)).values(column_values) + # connection.execute(sql) ####################################################################################################### # Input Tables ####################################################################################################### diff --git a/dse_do_utils/scenariorunner.py b/dse_do_utils/scenariorunner.py index eddfe5b..065398e 100644 --- a/dse_do_utils/scenariorunner.py +++ b/dse_do_utils/scenariorunner.py @@ -11,7 +11,7 @@ from dse_do_utils import ScenarioManager, OptimizationEngine from dse_do_utils.datamanager import Inputs, Outputs, DataManager -from dse_do_utils.scenariodbmanager import ScenarioDbManager +from dse_do_utils.scenariodbmanager import ScenarioDbManager, DatabaseType from logging import Logger, getLogger from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union, TypeVar, Generic @@ -347,7 +347,7 @@ def data_check_inputs(self, inputs: Inputs, scenario_name: str = 'data_check', b Set bulk to False to get more granular DB insert errors, i.e. per record. TODO: add a data_check() on the DataManager for additional checks.""" self._logger.info('Checking input data via SQLite and DataManager') - self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class() + self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class(db_type=DatabaseType.SQLite) self.sqlite_scenario_db_manager.create_schema() self.sqlite_scenario_db_manager.replace_scenario_in_db(scenario_name, deepcopy(inputs), {}, bulk=bulk) @@ -364,7 +364,7 @@ def data_check_outputs(self, inputs: Inputs, outputs: Outputs, scenario_name: st TODO: add a data_check() on the DataManager for additional checks.""" self._logger.info('Checking output data via SQLite and DataManager') if self.sqlite_scenario_db_manager is None: - self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class() + self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class(db_type=DatabaseType.SQLite) self.sqlite_scenario_db_manager.create_schema() self.sqlite_scenario_db_manager.replace_scenario_in_db(scenario_name, deepcopy(inputs), deepcopy(outputs), bulk=bulk) else: diff --git a/dse_do_utils/utilities.py b/dse_do_utils/utilities.py index fd13d17..247e341 100644 --- a/dse_do_utils/utilities.py +++ b/dse_do_utils/utilities.py @@ -118,8 +118,38 @@ def df_itertuples_with_index_names(df: pd.DataFrame): Index columns are added at the tail of the tuple, so to be compatible with code that uses the position of the fields in the tuple. Inspired by https://stackoverflow.com/questions/46151666/iterate-over-pandas-dataframe-with-multiindex-by-index-names. + + Notes: + * Does NOT work when df.Index has no names + TODO: does not work if only Index and no columns + TODO: test the combinations where row or Index are not tuples. Is row always a tuple? """ Row = namedtuple("Row", ['Index', *df.columns, *df.index.names]) for row in df.itertuples(): - yield Row(*(row + row.Index)) + # Option1 - Fails when Index is not a tuple + # yield Row(*(row + row.Index)) + + # Option 2 - In case the df has no columns? + if isinstance(row.Index, tuple): + yield Row(*(row + row.Index)) + else: + yield Row(*row, row.Index) + + # Option 3 - not necessary? + # if isinstance(row, tuple): + # if isinstance(row.Index, tuple): + # yield Row(*(row + row.Index)) + # else: + # yield Row(*row,row.Index) + # else: + # if isinstance(row.Index, tuple): + # yield Row(row, *row.Index) + # else: + # yield Row(row,row.Index) + + + # if isinstance(row, tuple): + # # + # yield Row(*((row) + (row.Index))) + # if isinstance(row, tuple): From b6435d8c8085fe8a76d02e569f171a26074e5e4e Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Mon, 26 Aug 2024 23:04:34 -0400 Subject: [PATCH 05/12] CplexDot generic function class --- CHANGELOG.md | 2 ++ .../core/core01_optimization_engine.py | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fec8f0b..0202256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ Introduces a slight backward incompatibility. Need to import as: `from dse_do_ut - Generics in ScenarioRunner - Removed deprecated optional argument `dtypes` from `Core01DataManager.prepare_output_data_frames()` - Fixed mutable default arguments in scenariodbmanager module +### Added +- CplexDot in core01_optimization_engine: generic function class to use groupby aggregation and the mdl.dot() function. ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/core/core01_optimization_engine.py b/dse_do_utils/core/core01_optimization_engine.py index 1cfe4fe..4f26467 100644 --- a/dse_do_utils/core/core01_optimization_engine.py +++ b/dse_do_utils/core/core01_optimization_engine.py @@ -6,6 +6,7 @@ from abc import abstractmethod from typing import Dict, List, Optional +import docplex.mp.model import pandas as pd from docplex.mp.conflict_refiner import ConflictRefiner from docplex.mp.solution import SolveSolution @@ -283,4 +284,24 @@ def __init__(self, mdl): def __call__(self, dvar_series): return self.mdl.sum(dvar_series) +class CplexDot(): + """Function class that adds a series of dvars into a cplex sum expression. + To be used as a custom aggregation in a groupby. + Usage: + df2 = df1.groupby(['a']).apply(CplexDot(engine.mdl, 'xDVar', 'volume')).to_frame(name='expr') + For each group, creates an expression df2['expr'] = mdl.dot(group.xDVar, group.volume) + In above usage, df2 is a DataFrame with the index based on the groupby keys and one column named 'expr'. + """ + def __init__(self, mdl: docplex.mp.model.Model, column1: str, column2: str): + """ + Args: + mdl: Cplex Model instance + column1 (str): Name of column_1 in DataFrame + column1 (str): Name of column_2 in DataFrame + """ + self.mdl = mdl + self.column1 = column1 + self.column2 = column2 + def __call__(self, group): + return self.mdl.dot(group[self.column1], group[self.column2]) From c02ed9eecb77fd7d94ce69d68b6bced7b0312a26 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Tue, 3 Sep 2024 20:31:22 -0400 Subject: [PATCH 06/12] PlotlyManager.plotly_kpi_compare_bar_charts and .get_multi_scenario_table --- CHANGELOG.md | 2 + dse_do_utils/plotlymanager.py | 107 +++++++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0202256..be5b42f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ Introduces a slight backward incompatibility. Need to import as: `from dse_do_ut - Fixed mutable default arguments in scenariodbmanager module ### Added - CplexDot in core01_optimization_engine: generic function class to use groupby aggregation and the mdl.dot() function. +- PlotlyManager - self.ref_dm, self.ms_inputs, self.ms_outputs property declarations and documentation +- PlotlyManager.plotly_kpi_compare_bar_charts and .get_multi_scenario_table for scenario compare ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/plotlymanager.py b/dse_do_utils/plotlymanager.py index 76accd5..a4f7cb0 100644 --- a/dse_do_utils/plotlymanager.py +++ b/dse_do_utils/plotlymanager.py @@ -1,9 +1,12 @@ # Copyright IBM All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from typing import Generic, TypeVar +from typing import Generic, TypeVar, Optional, Dict +import pandas as pd +import plotly.express as px +import plotly.graph_objs as go # from typing import List, Dict, Tuple, Optional -from dse_do_utils.datamanager import DataManager +from dse_do_utils.datamanager import DataManager, Inputs # import plotly # import plotly.graph_objs as go @@ -29,6 +32,15 @@ class PlotlyManager(Generic[DM]): def __init__(self, dm: DM): self.dm: DM = dm + # Used by DoDashApp for scenario compare, when the Reference Scenario is selected + # This supports scenario compare visualizations + self.ref_dm: Optional[DM] = None # A DataManager based on the reference scenario + # Used by the DoDashApp for scenario compare, when multiple scenarios are selected for compare + # These DataFrames are 'multi-scenario': they have an additional colum with the scenarioName. + # One 'multi-scenario' df contains data for the same scenario table from multiple scenarios + self.ms_inputs: Dict[str, pd.DataFrame] = None # Dict[TableName, 'multi-scenario' dataframe] + self.ms_outputs: Dict[str, pd.DataFrame] = None # Dict[TableName, 'multi-scenario' dataframe] + def get_plotly_fig_m(self, id): """DEPRECATED. Not used in dse_do_dashboard package. On the instance `self`, call the method named by id['index'] @@ -42,4 +54,93 @@ def get_dash_tab_layout_m(self, page_id): On the instance `self`, call the method named by get_tab_layout_{page_id}. Used in dse_do_dashboard Plotly-Dash dashboards """ - return getattr(self, f"get_tab_layout_{page_id}")() \ No newline at end of file + return getattr(self, f"get_tab_layout_{page_id}")() + + ################################################################### + # For scenario-compare in dse-do-dashboard + ################################################################### + def plotly_kpi_compare_bar_charts(self, figs_per_row: int = 3, orientation: str = 'v') -> [[go.Figure]]: + """ + Generalized compare of KPIs between scenarios. Creates a list-of-list of go.Figure, i.e. rows of figures, + for the PlotlyRowsVisualizationPage. + Each KPI gets its own bar-chart, comparing the scenarios. + + Supports 3 cases: + 1. Multi-scenario compare based on the Reference Scenarios multi-checkbox select on the Home page. + 2. Compare the current select scenario with the Reference Scenario selected on the Home page. + 3. Single scenario view based on the currently selected scenario + + Args: + figs_per_row: int - Maximum number of figures per row + orientation: str - `h' (horizontal) or `v` (vertical) + + Returns: + figures in rows ([[go.Figure]]) - bar-charts in rows + + """ + figs = [] + if self.get_multi_scenario_compare_selected(): + df = self.get_multi_scenario_table('kpis') + elif self.get_reference_scenario_compare_selected(): + ref_df = self.ref_dm.kpis.reset_index() + ref_df['scenario_name'] = 'Reference' + selected_df = self.dm.kpis.reset_index() + selected_df['scenario_name'] = 'Current' + df = pd.concat([selected_df, ref_df]) + else: + df = self.dm.kpis.reset_index() + df['scenario_name'] = 'Current' + + for kpi_name, group in df.groupby('NAME'): + labels = {'scenario_name': 'Scenario', 'VALUE': kpi_name} + title = f'{kpi_name}' + if orientation == 'v': + fig = px.bar(group, x='scenario_name', y='VALUE', orientation='v', color='scenario_name', labels=labels, + title=title) + else: + fig = px.bar(group, y='scenario_name', x='VALUE', orientation='h', color='scenario_name', + labels=labels) + fig.update_layout(xaxis_title=None) + fig.update_layout(yaxis_title=None) + fig.update_layout(showlegend=False) + figs.append(fig) + + # Split list of figures in list-of-lists with maximum size of n: + n = figs_per_row + figs = [figs[i:i + n] for i in range(0, len(figs), n)] + return figs + + def get_multi_scenario_compare_selected(self) -> bool: + """Returns True if the user has selected multi-scenario compare. + """ + ms_enabled = (isinstance(self.ms_outputs, dict) + and isinstance(self.ms_inputs, dict) + and 'Scenario' in self.ms_inputs.keys() + and self.ms_inputs['Scenario'].shape[0] > 0 + ) + return ms_enabled + + def get_reference_scenario_compare_selected(self) -> bool: + """Returns True if the user has selected (single) reference-scenario compare + """ + ms_selected = self.get_multi_scenario_compare_selected() + ref_selected = isinstance(self.ref_dm, DataManager) + return not ms_selected and ref_selected + + def get_multi_scenario_table(self, table_name: str) -> Optional[pd.DataFrame]: + """Gets the df from the table named `table_name` in either inputs or outputs. + If necessary (i.e. when using scenario_seq), merges the Scenario table, so it has the scenario_name as column. + DataFrame is NOT indexed! + """ + if table_name in self.ms_inputs.keys(): + df = self.ms_inputs[table_name] + elif table_name in self.ms_outputs.keys(): + df = self.ms_outputs[table_name] + else: + df = None + + if df is not None: + if "scenario_name" not in df.columns: + df = df.merge(self.ms_inputs['Scenario'], on='scenario_seq') # Requires scenario_seq. Merges-in the scenario_name. + + return df \ No newline at end of file From 1330253f9e85e72114262e6b7cbbbe8291aefed4 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Wed, 16 Oct 2024 14:15:25 -0400 Subject: [PATCH 07/12] Big sync of many projects --- .../core/core01_environment_manager.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dse_do_utils/core/core01_environment_manager.py b/dse_do_utils/core/core01_environment_manager.py index 935bbd2..9e2c422 100644 --- a/dse_do_utils/core/core01_environment_manager.py +++ b/dse_do_utils/core/core01_environment_manager.py @@ -205,3 +205,24 @@ def set_loggers(self, level: str = 'DEBUG', scope: Optional[tuple[str]] = None): while logger.hasHandlers(): logger.removeHandler(logger.handlers[0]) logger.addHandler(c_handler) + + def set_root_logger(self, level: Optional[str] = None) -> None: + """Sets the properties of the root logger. + In subsequent code, use `logger = logging.getLogger()`. + Valid values for level = [CRITICAL, ERROR, WARNING, INFO, DEBUG] + + Called from + """ + + logger = logging.getLogger() + logger.setLevel(level) + c_handler = logging.StreamHandler() + c_handler.setLevel(level) + + # Create formatters and add it to handlers + c_format = logging.Formatter('%(asctime)s %(levelname)s: %(module)s.%(funcName)s - %(message)s', + '%Y-%m-%d %H:%M:%S') + c_handler.setFormatter(c_format) + + # Add handlers to the logger + logger.addHandler(c_handler) \ No newline at end of file From dc53d7b9be8f6afc499f1b349f5a0012718128a2 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Mon, 28 Oct 2024 16:49:23 -0400 Subject: [PATCH 08/12] Core01 added parameter `mipGap` --- CHANGELOG.md | 1 + dse_do_utils/core/core01_data_manager.py | 7 +++++++ dse_do_utils/core/core01_optimization_engine.py | 3 +++ 3 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be5b42f..083116e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Introduces a slight backward incompatibility. Need to import as: `from dse_do_ut - CplexDot in core01_optimization_engine: generic function class to use groupby aggregation and the mdl.dot() function. - PlotlyManager - self.ref_dm, self.ms_inputs, self.ms_outputs property declarations and documentation - PlotlyManager.plotly_kpi_compare_bar_charts and .get_multi_scenario_table for scenario compare +- Core01DataManager and Core01OptimizationEngine: added support for parameter `mipGap`. Sets the `mdl.parameters.mip.tolerances.mipgap` if value > 0 ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/core/core01_data_manager.py b/dse_do_utils/core/core01_data_manager.py index af0738d..e173ee6 100644 --- a/dse_do_utils/core/core01_data_manager.py +++ b/dse_do_utils/core/core01_data_manager.py @@ -87,6 +87,13 @@ def set_parameters(self): self.param.threads = self.get_parameter_value(self.params, 'threads', param_type='int', default_value=0) # default 0 implies no limit + self.param.mip_gap = self.get_parameter_value( + self.params, + 'mipGap', + param_type='float', + default_value=0 + ) + self.param.enable_lp_names = self.get_parameter_value( self.params, param_name='enableLPNames', diff --git a/dse_do_utils/core/core01_optimization_engine.py b/dse_do_utils/core/core01_optimization_engine.py index 4f26467..548ed1a 100644 --- a/dse_do_utils/core/core01_optimization_engine.py +++ b/dse_do_utils/core/core01_optimization_engine.py @@ -90,6 +90,9 @@ def set_cplex_parameters(self) -> None: if int(self.dm.param.threads) > 0: self.mdl.parameters.threads = int(self.dm.param.threads) + if float(self.dm.param.mip_gap) > 0: + self.mdl.parameters.mip.tolerances.mipgap = float(self.dm.param.mip_gap) + if self.dm.param.handle_unscaled_infeasibilities: self._set_cplex_parameters_unscaled_infeasibilities() From 8f2568664d6b4e741de321b4c6d8d5e7e100745a Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Tue, 29 Oct 2024 12:00:38 -0400 Subject: [PATCH 09/12] DataManager.extract_solution adds option `allow_mixed_columns` --- CHANGELOG.md | 1 + dse_do_utils/datamanager.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083116e..ba0c340 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Introduces a slight backward incompatibility. Need to import as: `from dse_do_ut - PlotlyManager - self.ref_dm, self.ms_inputs, self.ms_outputs property declarations and documentation - PlotlyManager.plotly_kpi_compare_bar_charts and .get_multi_scenario_table for scenario compare - Core01DataManager and Core01OptimizationEngine: added support for parameter `mipGap`. Sets the `mdl.parameters.mip.tolerances.mipgap` if value > 0 +- DataManager.extract_solution adds option `allow_mixed_columns`. If True allows dvar/expr in column to be a regular Python value and not have the `solution_value` attribute ## [0.5.6.0]- 2023-05-13 ### Changed diff --git a/dse_do_utils/datamanager.py b/dse_do_utils/datamanager.py index 2719385..3e585d6 100644 --- a/dse_do_utils/datamanager.py +++ b/dse_do_utils/datamanager.py @@ -360,7 +360,8 @@ def my_function(my_input_value): @staticmethod def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | Dict[str, str]] = None, drop_column_names: List[str] = None, drop: bool = True, epsilon: float = None, round_decimals: int = None, - solution_column_name_post_fix: str = 'Sol') -> pd.DataFrame: + solution_column_name_post_fix: str = 'Sol', + allow_mixed_columns: bool = False) -> pd.DataFrame: """Generalized routine to extract a solution value. Can remove the dvar column from the df to be able to have a clean df for export into scenario. @@ -382,7 +383,7 @@ def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | round_decimals (int): round the solution value by number of decimals. If None, no rounding. If 0, rounding to integer value. solution_column_name_post_fix (str): Postfix for the name of the solution column. Default = 'Sol' - + allow_mixed_columns (bool): If True, will allow the column not to have the `solution_value` attribute, i.e. be a plain Python value, not a CPLEX dvar or expression """ @@ -397,7 +398,12 @@ def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | for xDVarName, solution_column_name in dvar_column_dict.items(): if xDVarName in df.columns: # solution_column_name = f'{xDVarName}Sol' - df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]] + # df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]] + if allow_mixed_columns: + df[solution_column_name] = [dvar.solution_value if hasattr(dvar, 'solution_value') else dvar for + dvar in df[xDVarName]] # VT_20241029: allow expression to be a constant + else: + df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]] if drop: df = df.drop([xDVarName], axis=1) if epsilon is not None: From a67b6b13b5ad2a4dc5541192614fbd9a42adf069 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Tue, 29 Oct 2024 14:56:14 -0400 Subject: [PATCH 10/12] DataManager.extract_solution adds option `allow_mixed_columns` --- dse_do_utils/datamanager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dse_do_utils/datamanager.py b/dse_do_utils/datamanager.py index 3e585d6..fde8d8e 100644 --- a/dse_do_utils/datamanager.py +++ b/dse_do_utils/datamanager.py @@ -361,7 +361,7 @@ def my_function(my_input_value): def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | Dict[str, str]] = None, drop_column_names: List[str] = None, drop: bool = True, epsilon: float = None, round_decimals: int = None, solution_column_name_post_fix: str = 'Sol', - allow_mixed_columns: bool = False) -> pd.DataFrame: + allow_mixed_type_columns: bool = False) -> pd.DataFrame: """Generalized routine to extract a solution value. Can remove the dvar column from the df to be able to have a clean df for export into scenario. @@ -383,7 +383,7 @@ def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | round_decimals (int): round the solution value by number of decimals. If None, no rounding. If 0, rounding to integer value. solution_column_name_post_fix (str): Postfix for the name of the solution column. Default = 'Sol' - allow_mixed_columns (bool): If True, will allow the column not to have the `solution_value` attribute, i.e. be a plain Python value, not a CPLEX dvar or expression + allow_mixed_type_columns (bool): If True, will allow the column not to have the `solution_value` attribute, i.e. be a plain Python value, not a CPLEX dvar or expression """ @@ -399,7 +399,7 @@ def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | if xDVarName in df.columns: # solution_column_name = f'{xDVarName}Sol' # df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]] - if allow_mixed_columns: + if allow_mixed_type_columns: df[solution_column_name] = [dvar.solution_value if hasattr(dvar, 'solution_value') else dvar for dvar in df[xDVarName]] # VT_20241029: allow expression to be a constant else: From cb3b61ea5fdf22d97ed8608d1b7ff76140cf79ef Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Tue, 29 Oct 2024 14:56:51 -0400 Subject: [PATCH 11/12] DataManager.extract_solution adds option `allow_mixed_type_columns` --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba0c340..7835154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ Introduces a slight backward incompatibility. Need to import as: `from dse_do_ut - PlotlyManager - self.ref_dm, self.ms_inputs, self.ms_outputs property declarations and documentation - PlotlyManager.plotly_kpi_compare_bar_charts and .get_multi_scenario_table for scenario compare - Core01DataManager and Core01OptimizationEngine: added support for parameter `mipGap`. Sets the `mdl.parameters.mip.tolerances.mipgap` if value > 0 -- DataManager.extract_solution adds option `allow_mixed_columns`. If True allows dvar/expr in column to be a regular Python value and not have the `solution_value` attribute +- DataManager.extract_solution adds option `allow_mixed_type_columns`. If True allows dvar/expr in column to be a regular Python value and not have the `solution_value` attribute ## [0.5.6.0]- 2023-05-13 ### Changed From 2a41a90b4f7644a8c483121dbc4dae2afac608c4 Mon Sep 17 00:00:00 2001 From: "vterpstra@us.ibm.com" Date: Tue, 26 Nov 2024 11:20:54 -0500 Subject: [PATCH 12/12] Releasing 0.5.7.0 --- CHANGELOG.md | 4 +- docs/doc_build/doctrees/dse_do_utils.doctree | Bin 1471596 -> 1496418 bytes docs/doc_build/doctrees/environment.pickle | Bin 660230 -> 680807 bytes docs/doc_build/html/.buildinfo | 2 +- .../doc_build/html/_modules/dse_do_utils.html | 185 ---------------- .../_modules/dse_do_utils/cpd25utilities.html | 10 +- .../_modules/dse_do_utils/datamanager.html | 29 ++- .../dse_do_utils/deployeddomodel.html | 12 +- .../dse_do_utils/domodeldeployer.html | 10 +- .../dse_do_utils/domodelexporter.html | 10 +- .../_modules/dse_do_utils/mapmanager.html | 10 +- .../dse_do_utils/multiscenariomanager.html | 10 +- .../dse_do_utils/optimizationengine.html | 48 ++++- .../_modules/dse_do_utils/plotlymanager.html | 117 +++++++++- .../dse_do_utils/scenariodbmanager.html | 202 ++++++++++++++++-- .../dse_do_utils/scenariomanager.html | 10 +- .../_modules/dse_do_utils/scenariopicker.html | 10 +- .../_modules/dse_do_utils/scenariorunner.html | 27 +-- .../html/_modules/dse_do_utils/utilities.html | 42 +++- docs/doc_build/html/_modules/index.html | 9 +- docs/doc_build/html/_static/bizstyle.js | 2 +- .../html/_static/documentation_options.js | 2 +- docs/doc_build/html/dse_do_utils.html | 163 ++++++++------ docs/doc_build/html/genindex.html | 28 ++- docs/doc_build/html/index.html | 6 +- docs/doc_build/html/modules.html | 19 +- docs/doc_build/html/objects.inv | Bin 2851 -> 2894 bytes docs/doc_build/html/py-modindex.html | 6 +- docs/doc_build/html/readme_link.html | 6 +- docs/doc_build/html/search.html | 6 +- docs/doc_build/html/searchindex.js | 2 +- dse_do_utils/version.py | 2 +- 32 files changed, 590 insertions(+), 399 deletions(-) delete mode 100644 docs/doc_build/html/_modules/dse_do_utils.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 7835154..c7dad87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -[Unreleased]## [0.5.7.0b0] +[Unreleased]## [0.5.7.1b0] + +## [0.5.7.0]- 2024-11-26 ### Changed - BACKWARD INCOMPATIBILITY - ScenarioDbManager.__init__: changed default values for db_type=DatabaseType.SQLite. For other uses (DB2 or PostgreSQL, always specify the db_type. - BACKWARD INCOMPATIBILITY - ScenarioDbManager.__init__: changed default values for enable_scenario_seq=True, future=True. This reflects the current best practices. diff --git a/docs/doc_build/doctrees/dse_do_utils.doctree b/docs/doc_build/doctrees/dse_do_utils.doctree index e59d652b50af4fc5e6e42523f104e22b31fc5f80..7988bbf4431be772f08ab6a3f3916ca3bbd0c45c 100644 GIT binary patch literal 1496418 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

YF#BEUDF_ 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

dV{-ziPMxbKu+Kz)Zg3a>8LrKJd2UB&)T$P! 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 K(x|>mPyK&Cu(CV= diff --git a/docs/doc_build/doctrees/environment.pickle b/docs/doc_build/doctrees/environment.pickle index 273110e63c6567bdb21ea2d3331c01ba0cb2c2bc..226abaf10f8ae0ceb54a0caf8abe3f899db975ba 100644 GIT binary patch delta 51735 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 delta 41813 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�Jdpe=B}_9Jz$mx_C`{gQya1L1f#tYTj4|D{g7 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 EAB1k>*#H0l diff --git a/docs/doc_build/html/.buildinfo b/docs/doc_build/html/.buildinfo index 05ce825..90b1aa1 100644 --- a/docs/doc_build/html/.buildinfo +++ b/docs/doc_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: a9df07955c95961d749fd73c1e7644d5 +config: ef4c938c6f3ee2a22e6bb6b81cef0c3d tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/doc_build/html/_modules/dse_do_utils.html b/docs/doc_build/html/_modules/dse_do_utils.html deleted file mode 100644 index 856634c..0000000 --- a/docs/doc_build/html/_modules/dse_do_utils.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - dse_do_utils — DSE DO Utils 0.5.6.0 documentation - - - - - - - - - - - - - - - -

- -
-
-
-
- -

Source code for dse_do_utils

-# Copyright IBM All Rights Reserved.
-# SPDX-License-Identifier: Apache-2.0
-
-from .version import __version__
-from .datamanager import DataManager
-from .optimizationengine import OptimizationEngine
-from .scenariomanager import ScenarioManager
-from .scenariodbmanager import ScenarioDbManager
-# from .scenariopicker import ScenarioPicker
-# from .deployeddomodel import DeployedDOModel
-# from .mapmanager import MapManager
-
-name = "dse_do_utils"
-
-
-
[docs]def module_reload(): - """DEPRECATED. Requires updates to Python 3.6 - Reloads all component modules. Use when you want to force a reload of this module with imp.reload(). - - This avoids having to code somewhat complex reloading logic in the notebook that is using this module. - - Challenge with imp.reload of dse-do_utils. The following is NOT (!) sufficient:: - - import imp - import dse_do_utils - imp.reload(dse_do_utils) - - The package dse_do_utils internally contains a number of sub modules that each contain a part of the code. - This keeps development easier and more organized. But to make importing easier, the classes are exposed - in the top level `init.py`, which allows for a simple import statement like from dse_do_utils import ScenarioManager. - Unfortunately, reloading the top-level module dse_do_utils doesn't force a reload of the internal modules. - - In case of subclassing, reloading needs to be done in the right order, i.e. first the parent classes. - - Usage:: - - import imp - import dse_do_utils # You have to do the import, otherwise not possible to do the next 2 steps - dse_do_utils.module_reload() #This function - imp.reload(dse_do_utils) # Necessary to ensure all following expressions `from dse_do_utils import class` are using the updated classes - from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager # This needs to be done AFTER the reload to refresh the definitions - - - Note that this function assumes that the set of classes and component modules is not part of the update. - If it is, you may need to add another reload:: - - import imp - import dse_do_utils # You have to do the import, otherwise not possible to do the next 2 steps - imp.reload(dse_do_utils) # To reload this function - dse_do_utils.module_reload() #This function - imp.reload(dse_do_utils) # Necessary to ensure all future expressions `from dse_do_utils import class` are using the updated classes - from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager # This needs to be done AFTER the reload to refresh the definitions - - - If not using this function, in the notebook you would need to do the following (or the relevant parts of it):: - - import imp - import dse_do_utils - imp.reload(dse_do_utils.datamanager) - imp.reload(dse_do_utils.optimizationengine) - imp.reload(dse_do_utils.scenariomanager) - imp.reload(dse_do_utils.scenariopicker) - imp.reload(dse_do_utils.deployeddomodel) - imp.reload(dse_do_utils.mapmanager) - imp.reload(dse_do_utils) - from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager - - Returns: - - """ - import importlib - import datamanager - import optimizationengine - import scenariomanager - import scenariopicker - import deployeddomodel - import mapmanager - import multiscenariomanager - importlib.reload(datamanager) - importlib.reload(optimizationengine) - importlib.reload(scenariomanager) - importlib.reload(scenariopicker) - importlib.reload(deployeddomodel) - importlib.reload(mapmanager) - importlib.reload(multiscenariomanager)
- - # The imports below cannot be done here. - # You need to redo the class imports from the notebook that is calling this function - - # from .version import __version__ - # from .datamanager import DataManager - # from .optimizationengine import OptimizationEngine - # from .scenariomanager import ScenarioManager - # from .scenariopicker import ScenarioPicker - # from .deployeddomodel import DeployedDOModel - # from .mapmanager import MapManager -
- -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/doc_build/html/_modules/dse_do_utils/cpd25utilities.html b/docs/doc_build/html/_modules/dse_do_utils/cpd25utilities.html index 2a5c215..438f96b 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/cpd25utilities.html +++ b/docs/doc_build/html/_modules/dse_do_utils/cpd25utilities.html @@ -6,7 +6,7 @@ - dse_do_utils.cpd25utilities — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.cpd25utilities — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

Navigation

  • modules |
  • - - - + + @@ -213,9 +212,8 @@

    Navigation

  • modules |
  • - + - diff --git a/docs/doc_build/html/_modules/dse_do_utils/datamanager.html b/docs/doc_build/html/_modules/dse_do_utils/datamanager.html index 4352009..ed6d990 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/datamanager.html +++ b/docs/doc_build/html/_modules/dse_do_utils/datamanager.html @@ -6,7 +6,7 @@ - dse_do_utils.datamanager — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.datamanager — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + + @@ -70,7 +69,7 @@

    Source code for dse_do_utils.datamanager

     
         It typically contains the input and output dictionaries with DataFrames that came from
         or will be inserted into a DO scenario.
    -    In addition it will hold any intermediate data.
    +    In addition, it will hold any intermediate data.
         It holds methods that operate on and convert the data.
         When used in combination with an optimization engine, it should not contain the
         docplex code that creates or interacts with the docplex Model. (That is the task of the OptimizationEngine.)
    @@ -86,7 +85,10 @@ 

    Source code for dse_do_utils.datamanager

         def __init__(self, inputs: Optional[Inputs] = None, outputs: Optional[Outputs] = None):
             self.inputs = inputs
             self.outputs = outputs
    -        return
    +
    +        # Parameters:
    +        self.params: Optional[pd.DataFrame] = None
    +        self.param = types.SimpleNamespace()
     
     
    [docs] def prepare_data_frames(self): if (self.inputs is not None) and (len(self.inputs) > 0): @@ -405,7 +407,8 @@

    Source code for dse_do_utils.datamanager

     
    [docs] @staticmethod def extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | Dict[str, str]] = None, drop_column_names: List[str] = None, drop: bool = True, epsilon: float = None, round_decimals: int = None, - solution_column_name_post_fix: str = 'Sol') -> pd.DataFrame: + solution_column_name_post_fix: str = 'Sol', + allow_mixed_type_columns: bool = False) -> pd.DataFrame: """Generalized routine to extract a solution value. Can remove the dvar column from the df to be able to have a clean df for export into scenario. @@ -427,7 +430,7 @@

    Source code for dse_do_utils.datamanager

                 round_decimals (int): round the solution value by number of decimals. If None, no rounding.
                 If 0, rounding to integer value.
                 solution_column_name_post_fix (str): Postfix for the name of the solution column. Default = 'Sol'
    -
    +            allow_mixed_type_columns (bool): If True, will allow the column not to have the `solution_value` attribute, i.e. be a plain Python value, not a CPLEX dvar or expression
             """
     
     
    @@ -442,7 +445,12 @@ 

    Source code for dse_do_utils.datamanager

                 for xDVarName, solution_column_name in dvar_column_dict.items():
                     if xDVarName in df.columns:
                         # solution_column_name = f'{xDVarName}Sol'
    -                    df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]]
    +                    # df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]]
    +                    if allow_mixed_type_columns:
    +                        df[solution_column_name] = [dvar.solution_value if hasattr(dvar, 'solution_value') else dvar for
    +                                                dvar in df[xDVarName]]  # VT_20241029: allow expression to be a constant
    +                    else:
    +                        df[solution_column_name] = [dvar.solution_value for dvar in df[xDVarName]]
                         if drop:
                             df = df.drop([xDVarName], axis=1)
                         if epsilon is not None:
    @@ -539,9 +547,8 @@ 

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/deployeddomodel.html b/docs/doc_build/html/_modules/dse_do_utils/deployeddomodel.html index 3e1d23a..e2aad61 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/deployeddomodel.html +++ b/docs/doc_build/html/_modules/dse_do_utils/deployeddomodel.html @@ -6,7 +6,7 @@ - dse_do_utils.deployeddomodel — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.deployeddomodel — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -289,7 +288,7 @@

    Source code for dse_do_utils.deployeddomodel

    #         self.outputs = self.get_outputs(job_details)
         #         self.solve_details = self.get_solve_details(job_details)
     
    -
    [docs] def solve_v2(self, inputs: Inputs, max_oaas_time_limit_sec: int = None, max_run_time_sec: int = None): +
    [docs] def solve_v2(self, inputs: Inputs, max_oaas_time_limit_sec: int = None, max_run_time_sec: int = None) -> dict: """Master routine. Initializes the job, starts the execution, monitors the results, post-processes the solution and cleans-up after. Args: @@ -498,9 +497,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/domodeldeployer.html b/docs/doc_build/html/_modules/dse_do_utils/domodeldeployer.html index a94713b..14be243 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/domodeldeployer.html +++ b/docs/doc_build/html/_modules/dse_do_utils/domodeldeployer.html @@ -6,7 +6,7 @@ - dse_do_utils.domodeldeployer — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.domodeldeployer — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -798,9 +797,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/domodelexporter.html b/docs/doc_build/html/_modules/dse_do_utils/domodelexporter.html index 777f775..c836f0e 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/domodelexporter.html +++ b/docs/doc_build/html/_modules/dse_do_utils/domodelexporter.html @@ -6,7 +6,7 @@ - dse_do_utils.domodelexporter — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.domodelexporter — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -344,9 +343,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/mapmanager.html b/docs/doc_build/html/_modules/dse_do_utils/mapmanager.html index d8264d3..7f42d6d 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/mapmanager.html +++ b/docs/doc_build/html/_modules/dse_do_utils/mapmanager.html @@ -6,7 +6,7 @@ - dse_do_utils.mapmanager — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.mapmanager — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -405,9 +404,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/multiscenariomanager.html b/docs/doc_build/html/_modules/dse_do_utils/multiscenariomanager.html index bfb28f6..270a995 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/multiscenariomanager.html +++ b/docs/doc_build/html/_modules/dse_do_utils/multiscenariomanager.html @@ -6,7 +6,7 @@ - dse_do_utils.multiscenariomanager — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.multiscenariomanager — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -334,9 +333,8 @@

    Navigation

  • modules |
  • - + - diff --git a/docs/doc_build/html/_modules/dse_do_utils/optimizationengine.html b/docs/doc_build/html/_modules/dse_do_utils/optimizationengine.html index 1b51d8d..72bec50 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/optimizationengine.html +++ b/docs/doc_build/html/_modules/dse_do_utils/optimizationengine.html @@ -6,7 +6,7 @@ - dse_do_utils.optimizationengine — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.optimizationengine — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + + @@ -171,7 +170,7 @@

    Source code for dse_do_utils.optimizationengine

    < """Returns pd.Series[SemiIntegerVarType].""" return pd.Series(mdl.semiinteger_var_list(df.index, lb, **kargs), index=df.index, dtype='object')
    -
    [docs] def solve(self, refine_conflict: bool = False, **kwargs) -> docplex.mp.solution.SolveSolution: +
    [docs] def solve(self, refine_conflict: Optional[bool] = False, **kwargs) -> docplex.mp.solution.SolveSolution: # TODO: enable export_as_lp_path()? # self.export_as_lp_path(lp_file_name=self.mdl.name) # TODO: use self.solve_kwargs if **kwargs is empty/None. Or merge them? @@ -384,9 +383,43 @@

    Source code for dse_do_utils.optimizationengine

    < integer_series = pd.Series(integer_list, index=df.index) return integer_series
    +
    [docs] @staticmethod + def cp_integer_var_series_s_v2(mdl: cp.CpoModel, df: pd.DataFrame, min=None, max=None, name=None, + domain=None) -> pd.Series: + """Returns pd.Series[docplex.cp.expression.CpoIntVar]. + If name is not None, will generate unique names based on pattern: '{name}_{index of df}' + If multi-index df, keys are separated by '_', e.g. 'xDvar_1_2_3' + """ + + if name is None: + integer_list = mdl.integer_var_list(df.shape[0], min, max, name, domain) + else: + integer_list = [] + for ix in df.index: + new_name = f"{name}_{OptimizationEngine._get_index_as_str(ix)}" + integer_list.append(mdl.integer_var(min, max, new_name, domain)) + integer_series = pd.Series(integer_list, index=df.index) + return integer_series
    + + @staticmethod + def _get_index_as_str(ix) -> str: + """Convert an index of a DF to a string. For naming dvars and constraints. + If df has a multi-index, the ix is a tuple.""" + if type(ix) is tuple: # If muli-index + name = '_'.join(map(str, ix)) + else: + name = str(ix) + # elif isinstance(ix, str): + # new_name = f"{name}_{ix}" + # elif isinstance(ix, int): + # new_name = f"{name}_{ix}" + # else: + # new_name = f"{name}_{str(ix)}" + return name +
    [docs] def cp_integer_var_series(self, df, **kwargs) -> pd.Series: """Returns pd.Series[docplex.cp.expression.CpoIntVar]""" - return OptimizationEngine.cp_integer_var_series_s(self.mdl, df=df, **kwargs)
    + return OptimizationEngine.cp_integer_var_series_s_v2(self.mdl, df=df, **kwargs)
    [docs] @staticmethod def cp_binary_var_series_s(mdl: cp.CpoModel, df: pd.DataFrame, **kwargs) -> pd.Series: @@ -459,9 +492,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/plotlymanager.html b/docs/doc_build/html/_modules/dse_do_utils/plotlymanager.html index 237bf80..5d5b54f 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/plotlymanager.html +++ b/docs/doc_build/html/_modules/dse_do_utils/plotlymanager.html @@ -6,7 +6,7 @@ - dse_do_utils.plotlymanager — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.plotlymanager — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -48,10 +47,13 @@

    Navigation

    Source code for dse_do_utils.plotlymanager

     # Copyright IBM All Rights Reserved.
     # SPDX-License-Identifier: Apache-2.0
    -from typing import Generic, TypeVar
    +from typing import Generic, TypeVar, Optional, Dict
     
    +import pandas as pd
    +import plotly.express as px
    +import plotly.graph_objs as go
     # from typing import List, Dict, Tuple, Optional
    -from dse_do_utils.datamanager import DataManager
    +from dse_do_utils.datamanager import DataManager, Inputs
     
     # import plotly
     # import plotly.graph_objs as go
    @@ -77,6 +79,15 @@ 

    Source code for dse_do_utils.plotlymanager

         def __init__(self, dm: DM):
             self.dm: DM = dm
     
    +        # Used by DoDashApp for scenario compare, when the Reference Scenario is selected
    +        # This supports scenario compare visualizations
    +        self.ref_dm: Optional[DM] = None  # A DataManager based on the reference scenario
    +        # Used by the DoDashApp for scenario compare, when multiple scenarios are selected for compare
    +        # These DataFrames are 'multi-scenario': they have an additional colum with the scenarioName.
    +        # One 'multi-scenario' df contains data for the same scenario table from multiple scenarios
    +        self.ms_inputs: Dict[str, pd.DataFrame] = None  # Dict[TableName, 'multi-scenario' dataframe]
    +        self.ms_outputs: Dict[str, pd.DataFrame] = None  # Dict[TableName, 'multi-scenario' dataframe]
    +
     
    [docs] def get_plotly_fig_m(self, id): """DEPRECATED. Not used in dse_do_dashboard package. On the instance `self`, call the method named by id['index'] @@ -90,7 +101,96 @@

    Source code for dse_do_utils.plotlymanager

             On the instance `self`, call the method named by get_tab_layout_{page_id}.
             Used in dse_do_dashboard Plotly-Dash dashboards
             """
    -        return getattr(self, f"get_tab_layout_{page_id}")()
    + return getattr(self, f"get_tab_layout_{page_id}")()
    + + ################################################################### + # For scenario-compare in dse-do-dashboard + ################################################################### +
    [docs] def plotly_kpi_compare_bar_charts(self, figs_per_row: int = 3, orientation: str = 'v') -> [[go.Figure]]: + """ + Generalized compare of KPIs between scenarios. Creates a list-of-list of go.Figure, i.e. rows of figures, + for the PlotlyRowsVisualizationPage. + Each KPI gets its own bar-chart, comparing the scenarios. + + Supports 3 cases: + 1. Multi-scenario compare based on the Reference Scenarios multi-checkbox select on the Home page. + 2. Compare the current select scenario with the Reference Scenario selected on the Home page. + 3. Single scenario view based on the currently selected scenario + + Args: + figs_per_row: int - Maximum number of figures per row + orientation: str - `h' (horizontal) or `v` (vertical) + + Returns: + figures in rows ([[go.Figure]]) - bar-charts in rows + + """ + figs = [] + if self.get_multi_scenario_compare_selected(): + df = self.get_multi_scenario_table('kpis') + elif self.get_reference_scenario_compare_selected(): + ref_df = self.ref_dm.kpis.reset_index() + ref_df['scenario_name'] = 'Reference' + selected_df = self.dm.kpis.reset_index() + selected_df['scenario_name'] = 'Current' + df = pd.concat([selected_df, ref_df]) + else: + df = self.dm.kpis.reset_index() + df['scenario_name'] = 'Current' + + for kpi_name, group in df.groupby('NAME'): + labels = {'scenario_name': 'Scenario', 'VALUE': kpi_name} + title = f'{kpi_name}' + if orientation == 'v': + fig = px.bar(group, x='scenario_name', y='VALUE', orientation='v', color='scenario_name', labels=labels, + title=title) + else: + fig = px.bar(group, y='scenario_name', x='VALUE', orientation='h', color='scenario_name', + labels=labels) + fig.update_layout(xaxis_title=None) + fig.update_layout(yaxis_title=None) + fig.update_layout(showlegend=False) + figs.append(fig) + + # Split list of figures in list-of-lists with maximum size of n: + n = figs_per_row + figs = [figs[i:i + n] for i in range(0, len(figs), n)] + return figs
    + +
    [docs] def get_multi_scenario_compare_selected(self) -> bool: + """Returns True if the user has selected multi-scenario compare. + """ + ms_enabled = (isinstance(self.ms_outputs, dict) + and isinstance(self.ms_inputs, dict) + and 'Scenario' in self.ms_inputs.keys() + and self.ms_inputs['Scenario'].shape[0] > 0 + ) + return ms_enabled
    + +
    [docs] def get_reference_scenario_compare_selected(self) -> bool: + """Returns True if the user has selected (single) reference-scenario compare + """ + ms_selected = self.get_multi_scenario_compare_selected() + ref_selected = isinstance(self.ref_dm, DataManager) + return not ms_selected and ref_selected
    + +
    [docs] def get_multi_scenario_table(self, table_name: str) -> Optional[pd.DataFrame]: + """Gets the df from the table named `table_name` in either inputs or outputs. + If necessary (i.e. when using scenario_seq), merges the Scenario table, so it has the scenario_name as column. + DataFrame is NOT indexed! + """ + if table_name in self.ms_inputs.keys(): + df = self.ms_inputs[table_name] + elif table_name in self.ms_outputs.keys(): + df = self.ms_outputs[table_name] + else: + df = None + + if df is not None: + if "scenario_name" not in df.columns: + df = df.merge(self.ms_inputs['Scenario'], on='scenario_seq') # Requires scenario_seq. Merges-in the scenario_name. + + return df
    @@ -122,9 +222,8 @@

    Navigation

  • modules |
  • - + - diff --git a/docs/doc_build/html/_modules/dse_do_utils/scenariodbmanager.html b/docs/doc_build/html/_modules/dse_do_utils/scenariodbmanager.html index a125c28..d5f6292 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/scenariodbmanager.html +++ b/docs/doc_build/html/_modules/dse_do_utils/scenariodbmanager.html @@ -6,7 +6,7 @@ - dse_do_utils.scenariodbmanager — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.scenariodbmanager — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + + @@ -78,6 +77,7 @@

    Source code for dse_do_utils.scenariodbmanager

    import re from sqlalchemy import exc, MetaData from sqlalchemy import Table, Column, String, Integer, Float, ForeignKey, ForeignKeyConstraint +import enum # Typing aliases from dse_do_utils import ScenarioManager @@ -85,7 +85,6 @@

    Source code for dse_do_utils.scenariodbmanager

    Inputs = Dict[str, pd.DataFrame] Outputs = Dict[str, pd.DataFrame] -import enum

    [docs]class DatabaseType(enum.Enum): """Used in ScenarioDbManager.__init__ to specify the type of DB it is connecting to.""" @@ -100,8 +99,8 @@

    Source code for dse_do_utils.scenariodbmanager

    """ def __init__(self, db_table_name: str, - columns_metadata: List[sqlalchemy.Column] = [], - constraints_metadata: List[ForeignKeyConstraint] = []): + columns_metadata=None, + constraints_metadata=None): """ Warning: Do not use mixed case names for the db_table_name. Supplying a mixed-case is not working well and is causing DB FK errors. @@ -114,9 +113,13 @@

    Source code for dse_do_utils.scenariodbmanager

    :param columns_metadata: :param constraints_metadata: """ + if constraints_metadata is None: + constraints_metadata = [] + if columns_metadata is None: + columns_metadata = [] self.db_table_name = db_table_name # ScenarioDbTable.camel_case_to_snake_case(db_table_name) # To make sure it is a proper DB table name. Also allows us to use the scenario table name. - self.columns_metadata = self.resolve_metadata_column_conflicts(columns_metadata) + self.columns_metadata: List[sqlalchemy.Column] = self.resolve_metadata_column_conflicts(columns_metadata) self.constraints_metadata = constraints_metadata self.dtype = None if not db_table_name.islower() and not db_table_name.isupper(): ## I.e. is mixed_case @@ -536,10 +539,10 @@

    Source code for dse_do_utils.scenariodbmanager

    def __init__(self, input_db_tables: Dict[str, ScenarioDbTable], output_db_tables: Dict[str, ScenarioDbTable], credentials=None, schema: str = None, echo: bool = False, multi_scenario: bool = True, enable_transactions: bool = True, enable_sqlite_fk: bool = True, enable_astype: bool = True, - enable_debug_print: bool = False, enable_scenario_seq: bool = False, - db_type: DatabaseType = DatabaseType.DB2, + enable_debug_print: bool = False, enable_scenario_seq: bool = True, + db_type: DatabaseType = DatabaseType.SQLite, use_custom_naming_convention: bool = False, - future: bool = False, + future: bool = True, ): """Create a ScenarioDbManager. @@ -2049,8 +2052,180 @@

    Source code for dse_do_utils.scenariodbmanager

    if 'scenario_seq' in df.columns: df = df.drop(columns=['scenario_seq']) new_outputs[scenario_table_name] = df - return new_inputs, new_outputs

    + return new_inputs, new_outputs
    + + ##################################################################################################### + # Insert, Update, Delete row + ##################################################################################################### +
    [docs] def insert_table_row(self, scenario_table_name: str, scenario_name: str, values): + if self.enable_transactions: + # print("Insert row scenario within a transaction") + with self.engine.begin() as connection: + self._insert_table_row(scenario_table_name, scenario_name, values, connection) + else: + self._insert_table_row(scenario_table_name, scenario_name, values, self.engine)
    + + def _insert_table_row(self, scenario_table_name: str, scenario_name: str, values, connection=None): + """DRAFT. Insert one row of data. + TODO: handle update if it already exists: 'upsert' + Args: + scenario_table_name (str): Name of scenario table (as used in Inputs/Outputs, not the name in the DB) + values (Dict): values of row to be inserted. Typically, a Dict or tuple (e.g. from df.itertuples(). + connection + """ + # raise NotImplementedError + + if scenario_table_name in self.db_tables: + db_table = self.db_tables[scenario_table_name] + else: + raise ValueError(f"Scenario table name '{scenario_table_name}' unknown. Cannot insert data into DB.") + + # TODO: add scenario_seq to values + # TODO: if values is a sequence, we need to convert to a Dict so that we can add a value? + scenario_seq = self._get_scenario_seq(scenario_name=scenario_name, connection=connection) + if scenario_seq is not None: + values['scenario_seq'] = scenario_seq + else: + raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot insert row.") + stmt = ( + sqlalchemy.insert(db_table.get_sa_table()).values(values) + ) + try: + if connection is None: + self.engine.execute(stmt) + else: + connection.execute(stmt) + + except exc.IntegrityError as e: + print("++++++++++++Integrity Error+++++++++++++") + print(e) + except exc.StatementError as e: + print("++++++++++++Statement Error+++++++++++++") + print(e) + +
    [docs] def update_table_row(self, scenario_table_name: str, scenario_name: str, values): + if self.enable_transactions: + # print("Insert row scenario within a transaction") + with self.engine.begin() as connection: + self._update_table_row(scenario_table_name, scenario_name, values, connection) + else: + self._update_table_row(scenario_table_name, scenario_name, values, self.engine)
    + + def _update_table_row(self, scenario_table_name: str, scenario_name: str, values, connection=None): + """DRAFT. Update one row of data. + Args: + scenario_table_name (str): Name of scenario table (as used in Inputs/Outputs, not the name in the DB) + values (Dict): values of row to be inserted. Typically, a Dict or tuple (e.g. from df.itertuples(). + connection + """ + if scenario_table_name in self.db_tables: + db_table = self.db_tables[scenario_table_name] + else: + raise ValueError(f"Scenario table name '{scenario_table_name}' unknown. Cannot insert data into DB.") + + scenario_seq = self._get_scenario_seq(scenario_name=scenario_name, connection=connection) + if scenario_seq is not None: + values['scenario_seq'] = scenario_seq + else: + raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot insert row.") + + # Split values in 2 parts: + # 1. The primary keys + # 2. The other columns + primary_keys = [c.name for c in db_table.columns_metadata if c.primary_key and c.name != 'scenario_seq'and c.name != 'scenario_name' ] + pk_values = {k: v for k,v in values.items() if k in primary_keys} + pk_conditions = [(db_table.get_sa_column(k) == v) for k, v in pk_values.items()] # TODO: + column_values = {k: v for k,v in values.items() if k not in primary_keys and k not in['scenario_seq', 'scenario_name']} # remove PK values + t: sqlalchemy.Table = db_table.get_sa_table() + + if self.enable_scenario_seq: + if (scenario_seq := self._get_scenario_seq(scenario_name, connection)) is not None: + # print(f"ScenarioSeq = {scenario_seq}") + sql = t.update().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)).values(column_values) + # connection.execute(sql) # VT20230204: Duplicate execute? Will be done anyway at the end of this method! + else: + raise ValueError(f"No scenario with name {scenario_name} exists") + else: + sql = t.update().where(sqlalchemy.and_((t.c.scenario_name == scenario_name), *pk_conditions)).values(column_values) + + # TODO: this does NOT fail if the row doesn't exist. It simply doesn;t do anything !? How can we have this fail, so we can do an insert? + connection.execute(sql) + + +
    [docs] def upsert_table_row(self, scenario_table_name: str, scenario_name: str, values): + if self.enable_transactions: + # print("Insert row scenario within a transaction") + with self.engine.begin() as connection: + self._upsert_table_row(scenario_table_name, scenario_name, values, connection) + else: + self._upsert_table_row(scenario_table_name, scenario_name, values, self.engine)
    + + def _upsert_table_row(self, scenario_table_name: str, scenario_name: str, values, connection=None): + """Updates or inserts a row in a DB table. + Assumes the values contain all primary key values. + Other columns are optional. + If row exists, will update the row. If row doesn't exist, will do an insert. + Update also supports partial updates of non-pk fields. + Beware that a None will result in a NULL. + + Args: + scenario_table_name (str): Name of scenario table (as used in Inputs/Outputs, not the name in the DB) + scenario_name (str): scenario_name + values (Dict): values of row to be inserted. Typically, a Dict or tuple (e.g. from df.itertuples(). Must include values for all PK columns. + connection + + Raises errors for: + Unknown scenario_name + Primary Key value not in values + """ + if scenario_table_name in self.db_tables: + db_table = self.db_tables[scenario_table_name] + else: + raise ValueError(f"Scenario table name '{scenario_table_name}' unknown. Cannot upsert data into DB.") + + # scenario_seq = self._get_scenario_seq(scenario_name=scenario_name, connection=connection) + # if scenario_seq is not None: + # values['scenario_seq'] = scenario_seq + # else: + # raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot upsert row.") + + # Split values in 2 parts: + # 1. The primary keys + # 2. The other columns + primary_keys = [c.name for c in db_table.columns_metadata if c.primary_key and c.name != 'scenario_seq'and c.name != 'scenario_name' ] + if not all(pk in values.keys() for pk in primary_keys): + raise ValueError(f"Not all required primary keys {primary_keys} specified in upsert request {values}") + # for pk in primary_keys: + # if pk not in values.keys(): + # raise ValueError(f"Primary key {pk} value not specified in upsert request") + pk_values = {k: v for k,v in values.items() if k in primary_keys} + pk_conditions = [(db_table.get_sa_column(k) == v) for k, v in pk_values.items()] + column_values = {k: v for k,v in values.items() if k not in primary_keys and k not in['scenario_seq', 'scenario_name']} # remove PK values + t: sqlalchemy.Table = db_table.get_sa_table() + + if self.enable_scenario_seq: + if (scenario_seq := self._get_scenario_seq(scenario_name, connection)) is not None: + # print(f"ScenarioSeq = {scenario_seq}") + # sql_exists = sqlalchemy.exists().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)) + sql_select = t.select().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)) #.exists() + res = connection.execute(sql_select) + count = res.rowcount + if count > 0: + # Update existing record + sql_update = t.update().where(sqlalchemy.and_((t.c.scenario_seq == scenario_seq), *pk_conditions)).values(column_values) + connection.execute(sql_update) + else: + # Insert new record + sql_insert = t.insert().values(values) + connection.execute(sql_insert) + else: + raise ValueError(f"Scenario name '{scenario_name}' is unknown. Cannot upsert row.") + else: + raise NotImplementedError(f"Upsert only supports enable_scenario_seq")
    + # TODO: implement. Easy to do. + # sql = t.update().where(sqlalchemy.and_((t.c.scenario_name == scenario_name), *pk_conditions)).values(column_values) + # connection.execute(sql) ####################################################################################################### # Input Tables ####################################################################################################### @@ -2131,9 +2306,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/scenariomanager.html b/docs/doc_build/html/_modules/dse_do_utils/scenariomanager.html index 1649a48..7360ca0 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/scenariomanager.html +++ b/docs/doc_build/html/_modules/dse_do_utils/scenariomanager.html @@ -6,7 +6,7 @@ - dse_do_utils.scenariomanager — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.scenariomanager — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -1318,9 +1317,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/scenariopicker.html b/docs/doc_build/html/_modules/dse_do_utils/scenariopicker.html index 5aa48ba..aa8d856 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/scenariopicker.html +++ b/docs/doc_build/html/_modules/dse_do_utils/scenariopicker.html @@ -6,7 +6,7 @@ - dse_do_utils.scenariopicker — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.scenariopicker — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + + @@ -259,9 +258,8 @@

    Navigation

  • modules |
  • - + - diff --git a/docs/doc_build/html/_modules/dse_do_utils/scenariorunner.html b/docs/doc_build/html/_modules/dse_do_utils/scenariorunner.html index 9e0335e..0431ffe 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/scenariorunner.html +++ b/docs/doc_build/html/_modules/dse_do_utils/scenariorunner.html @@ -6,7 +6,7 @@ - dse_do_utils.scenariorunner — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.scenariorunner — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + + @@ -59,9 +58,9 @@

    Source code for dse_do_utils.scenariorunner

     
     from dse_do_utils import ScenarioManager, OptimizationEngine
     from dse_do_utils.datamanager import Inputs, Outputs, DataManager
    -from dse_do_utils.scenariodbmanager import ScenarioDbManager
    +from dse_do_utils.scenariodbmanager import ScenarioDbManager, DatabaseType
     from logging import Logger, getLogger
    -from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union
    +from typing import Any, Dict, Optional, Tuple, NamedTuple, Type, List, Union, TypeVar, Generic
     
     from dse_do_utils.scenariomanager import Platform
     
    @@ -90,7 +89,10 @@ 

    Source code for dse_do_utils.scenariorunner

         template_scenario_name: Optional[str] = None  # 'TemplateScenario'
    -
    [docs]class ScenarioGenerator(): +SC = TypeVar('SC', bound='ScenarioConfig') + + +
    [docs]class ScenarioGenerator(Generic[SC]): """Generates a variation of a scenario, i.e. `inputs` dataset, driven by a ScenarioConfig. To be subclassed. This base class implements overrides of the Parameter table. @@ -108,10 +110,10 @@

    Source code for dse_do_utils.scenariorunner

     
         def __init__(self,
                      inputs: Inputs,
    -                 scenario_config: ScenarioConfig) -> None:
    +                 scenario_config: SC) -> None:
             self._logger: Logger = getLogger(__name__)
             self.inputs: Inputs = inputs.copy()  # Only copy of dict
    -        self.scenario_config: ScenarioConfig = scenario_config
    +        self.scenario_config: SC = scenario_config
     
     
    [docs] def generate_scenario(self): """Generate a variation of the base_inputs. To be overridden. @@ -392,7 +394,7 @@

    Source code for dse_do_utils.scenariorunner

             Set bulk to False to get more granular DB insert errors, i.e. per record.
             TODO: add a data_check() on the DataManager for additional checks."""
             self._logger.info('Checking input data via SQLite and DataManager')
    -        self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class()
    +        self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class(db_type=DatabaseType.SQLite)
             self.sqlite_scenario_db_manager.create_schema()
             self.sqlite_scenario_db_manager.replace_scenario_in_db(scenario_name, deepcopy(inputs), {}, bulk=bulk)
     
    @@ -409,7 +411,7 @@ 

    Source code for dse_do_utils.scenariorunner

             TODO: add a data_check() on the DataManager for additional checks."""
             self._logger.info('Checking output data via SQLite and DataManager')
             if self.sqlite_scenario_db_manager is None:
    -            self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class()
    +            self.sqlite_scenario_db_manager: ScenarioDbManager = self.scenario_db_manager_class(db_type=DatabaseType.SQLite)
                 self.sqlite_scenario_db_manager.create_schema()
                 self.sqlite_scenario_db_manager.replace_scenario_in_db(scenario_name, deepcopy(inputs), deepcopy(outputs), bulk=bulk)
             else:
    @@ -557,9 +559,8 @@ 

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/dse_do_utils/utilities.html b/docs/doc_build/html/_modules/dse_do_utils/utilities.html index a9c96a2..ed2e3bd 100644 --- a/docs/doc_build/html/_modules/dse_do_utils/utilities.html +++ b/docs/doc_build/html/_modules/dse_do_utils/utilities.html @@ -6,7 +6,7 @@ - dse_do_utils.utilities — DSE DO Utils 0.5.6.0 documentation + dse_do_utils.utilities — DSE DO Utils 0.5.7.0 documentation @@ -33,9 +33,8 @@

    Navigation

  • modules |
  • - - - + +
    @@ -166,10 +165,40 @@

    Source code for dse_do_utils.utilities

     
         Index columns are added at the tail of the tuple, so to be compatible with code that uses the position of the fields in the tuple.
         Inspired by https://stackoverflow.com/questions/46151666/iterate-over-pandas-dataframe-with-multiindex-by-index-names.
    +
    +    Notes:
    +        * Does NOT work when df.Index has no names
    +    TODO: does not work if only Index and no columns
    +    TODO: test the combinations where row or Index are not tuples. Is row always a tuple?
         """
         Row = namedtuple("Row", ['Index', *df.columns, *df.index.names])
         for row in df.itertuples():
    -        yield Row(*(row + row.Index))
    + # Option1 - Fails when Index is not a tuple + # yield Row(*(row + row.Index)) + + # Option 2 - In case the df has no columns? + if isinstance(row.Index, tuple): + yield Row(*(row + row.Index)) + else: + yield Row(*row, row.Index)
    + + # Option 3 - not necessary? + # if isinstance(row, tuple): + # if isinstance(row.Index, tuple): + # yield Row(*(row + row.Index)) + # else: + # yield Row(*row,row.Index) + # else: + # if isinstance(row.Index, tuple): + # yield Row(row, *row.Index) + # else: + # yield Row(row,row.Index) + + + # if isinstance(row, tuple): + # # + # yield Row(*((row) + (row.Index))) + # if isinstance(row, tuple):
    @@ -202,9 +231,8 @@

    Navigation

  • modules |
  • - + -
    diff --git a/docs/doc_build/html/_modules/index.html b/docs/doc_build/html/_modules/index.html index cd556db..16990d2 100644 --- a/docs/doc_build/html/_modules/index.html +++ b/docs/doc_build/html/_modules/index.html @@ -6,7 +6,7 @@ - Overview: module code — DSE DO Utils 0.5.6.0 documentation + Overview: module code — DSE DO Utils 0.5.7.0 documentation @@ -33,7 +33,7 @@

    Navigation

  • modules |
  • - +
    @@ -44,7 +44,6 @@

    Navigation

    @@ -90,7 +89,7 @@

    Navigation

  • modules |
  • - +
    diff --git a/docs/doc_build/html/_static/bizstyle.js b/docs/doc_build/html/_static/bizstyle.js index b084e74..8b9cd77 100644 --- a/docs/doc_build/html/_static/bizstyle.js +++ b/docs/doc_build/html/_static/bizstyle.js @@ -23,7 +23,7 @@ const initialiseBizStyle = () => { } window.addEventListener("resize", - () => (document.querySelector("li.nav-item-0 a").innerText = (window.innerWidth <= 776) ? "Top" : "DSE DO Utils 0.5.6.0 documentation") + () => (document.querySelector("li.nav-item-0 a").innerText = (window.innerWidth <= 776) ? "Top" : "DSE DO Utils 0.5.7.0 documentation") ) if (document.readyState !== "loading") initialiseBizStyle() diff --git a/docs/doc_build/html/_static/documentation_options.js b/docs/doc_build/html/_static/documentation_options.js index ef385b5..45c5bb1 100644 --- a/docs/doc_build/html/_static/documentation_options.js +++ b/docs/doc_build/html/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.5.6.0', + VERSION: '0.5.7.0', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/doc_build/html/dse_do_utils.html b/docs/doc_build/html/dse_do_utils.html index ba2862b..8a64a2b 100644 --- a/docs/doc_build/html/dse_do_utils.html +++ b/docs/doc_build/html/dse_do_utils.html @@ -7,7 +7,7 @@ - dse_do_utils package — DSE DO Utils 0.5.6.0 documentation + dse_do_utils package — DSE DO Utils 0.5.7.0 documentation @@ -38,7 +38,7 @@

    Navigation

  • previous |
  • - + @@ -194,7 +194,7 @@

    Submodules
    -static extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | Dict[str, str]] = None, drop_column_names: List[str] = None, drop: bool = True, epsilon: float = None, round_decimals: int = None, solution_column_name_post_fix: str = 'Sol') pd.DataFrame[source]¶
    +static extract_solution(df: pd.DataFrame, extract_dvar_names: Optional[List[str] | Dict[str, str]] = None, drop_column_names: List[str] = None, drop: bool = True, epsilon: float = None, round_decimals: int = None, solution_column_name_post_fix: str = 'Sol', allow_mixed_type_columns: bool = False) pd.DataFrame[source]¶

    Generalized routine to extract a solution value. Can remove the dvar column from the df to be able to have a clean df for export into scenario.

    In some cases, CPLEX extracted values for continuous dvars can have very small values instead of zeros. @@ -333,6 +333,7 @@

    Submodules
    -solve_v2(inputs: Dict[str, DataFrame], max_oaas_time_limit_sec: Optional[int] = None, max_run_time_sec: Optional[int] = None)[source]¶
    +solve_v2(inputs: Dict[str, DataFrame], max_oaas_time_limit_sec: Optional[int] = None, max_run_time_sec: Optional[int] = None) dict[source]¶

    Master routine. Initializes the job, starts the execution, monitors the results, post-processes the solution and cleans-up after.

    Parameters:
    @@ -1537,6 +1538,14 @@

    Submodules**kwargs, see docplex.cp.expression.integer_var_list (http://ibmdecisionoptimization.github.io/docplex-doc/cp/docplex.cp.expression.py.html#docplex.cp.expression.integer_var_list)

    +
    +
    +static cp_integer_var_series_s_v2(mdl: CpoModel, df: DataFrame, min=None, max=None, name=None, domain=None) Series[source]¶
    +

    Returns pd.Series[docplex.cp.expression.CpoIntVar]. +If name is not None, will generate unique names based on pattern: ‘{name}_{index of df}’ +If multi-index df, keys are separated by ‘_’, e.g. ‘xDvar_1_2_3’

    +
    +
    cp_interval_var_series(df, **kargs) Series[source]¶
    @@ -1725,7 +1734,7 @@

    Submodules
    -solve(refine_conflict: bool = False, **kwargs) SolveSolution[source]¶
    +solve(refine_conflict: Optional[bool] = False, **kwargs) SolveSolution[source]¶

    @@ -1750,6 +1759,20 @@

    Submodules +
    +get_multi_scenario_compare_selected() bool[source]¶
    +

    Returns True if the user has selected multi-scenario compare.

    +
    + +
    +
    +get_multi_scenario_table(table_name: str) Optional[DataFrame][source]¶
    +

    Gets the df from the table named table_name in either inputs or outputs. +If necessary (i.e. when using scenario_seq), merges the Scenario table, so it has the scenario_name as column. +DataFrame is NOT indexed!

    +
    +
    get_plotly_fig_m(id)[source]¶
    @@ -1759,6 +1782,39 @@

    Submodules +
    +get_reference_scenario_compare_selected() bool[source]¶
    +

    Returns True if the user has selected (single) reference-scenario compare

    +

    + +
    +
    +plotly_kpi_compare_bar_charts(figs_per_row: int = 3, orientation: str = 'v') [[<class 'plotly.graph_objs._figure.Figure'>]][source]¶
    +

    Generalized compare of KPIs between scenarios. Creates a list-of-list of go.Figure, i.e. rows of figures, +for the PlotlyRowsVisualizationPage. +Each KPI gets its own bar-chart, comparing the scenarios.

    +
    +
    Supports 3 cases:
      +
    1. Multi-scenario compare based on the Reference Scenarios multi-checkbox select on the Home page.

    2. +
    3. Compare the current select scenario with the Reference Scenario selected on the Home page.

    4. +
    5. Single scenario view based on the currently selected scenario

    6. +
    +
    +
    +
    +
    Parameters:
    +
      +
    • figs_per_row – int - Maximum number of figures per row

    • +
    • orientation – str - h’ (horizontal) or `v (vertical)

    • +
    +
    +
    Returns:
    +

    figures in rows ([[go.Figure]]) - bar-charts in rows

    +
    +
    +
    + @@ -1907,7 +1963,7 @@

    Submodules
    -class dse_do_utils.scenariodbmanager.ScenarioDbManager(input_db_tables: Dict[str, ScenarioDbTable], output_db_tables: Dict[str, ScenarioDbTable], credentials=None, schema: Optional[str] = None, echo: bool = False, multi_scenario: bool = True, enable_transactions: bool = True, enable_sqlite_fk: bool = True, enable_astype: bool = True, enable_debug_print: bool = False, enable_scenario_seq: bool = False, db_type: DatabaseType = DatabaseType.DB2, use_custom_naming_convention: bool = False, future: bool = False)[source]¶
    +class dse_do_utils.scenariodbmanager.ScenarioDbManager(input_db_tables: Dict[str, ScenarioDbTable], output_db_tables: Dict[str, ScenarioDbTable], credentials=None, schema: Optional[str] = None, echo: bool = False, multi_scenario: bool = True, enable_transactions: bool = True, enable_sqlite_fk: bool = True, enable_astype: bool = True, enable_debug_print: bool = False, enable_scenario_seq: bool = True, db_type: DatabaseType = DatabaseType.SQLite, use_custom_naming_convention: bool = False, future: bool = True)[source]¶

    Bases: object

    TODO: documentation!

    @@ -2016,6 +2072,11 @@

    Submodules +
    +insert_table_row(scenario_table_name: str, scenario_name: str, values)[source]¶
    +

    +
    insert_tables_in_db(inputs: Dict[str, DataFrame] = {}, outputs: Dict[str, DataFrame] = {}, bulk: bool = True, auto_insert: bool = False, connection=None) int[source]¶
    @@ -2136,11 +2197,21 @@

    Submodules +
    +update_table_row(scenario_table_name: str, scenario_name: str, values)[source]¶
    +

    + +
    +
    +upsert_table_row(scenario_table_name: str, scenario_name: str, values)[source]¶
    +
    +
    -class dse_do_utils.scenariodbmanager.ScenarioDbTable(db_table_name: str, columns_metadata: List[Column] = [], constraints_metadata: List[ForeignKeyConstraint] = [])[source]¶
    +class dse_do_utils.scenariodbmanager.ScenarioDbTable(db_table_name: str, columns_metadata=None, constraints_metadata=None)[source]¶

    Bases: ABC

    Abstract class. Subclass to be able to define table schema definition, i.e. column name, data types, primary and foreign keys. Only columns that are specified and included in the DB insert.

    @@ -3242,8 +3313,8 @@

    Submodules
    -class dse_do_utils.scenariorunner.ScenarioGenerator(inputs: Dict[str, DataFrame], scenario_config: ScenarioConfig)[source]¶
    -

    Bases: object

    +class dse_do_utils.scenariorunner.ScenarioGenerator(inputs: Dict[str, DataFrame], scenario_config: SC)[source]¶ +

    Bases: Generic[SC]

    Generates a variation of a scenario, i.e. inputs dataset, driven by a ScenarioConfig. To be subclassed. This base class implements overrides of the Parameter table. @@ -3421,6 +3492,12 @@

    Submoduleshttps://stackoverflow.com/questions/46151666/iterate-over-pandas-dataframe-with-multiindex-by-index-names.

    +

    Notes

    +
      +
    • Does NOT work when df.Index has no names

    • +
    +

    TODO: does not work if only Index and no columns +TODO: test the combinations where row or Index are not tuples. Is row always a tuple?

    @@ -3454,57 +3531,6 @@

    Submodules

    Module contents¶

    -
    -
    -dse_do_utils.module_reload()[source]¶
    -

    DEPRECATED. Requires updates to Python 3.6 -Reloads all component modules. Use when you want to force a reload of this module with imp.reload().

    -

    This avoids having to code somewhat complex reloading logic in the notebook that is using this module.

    -

    Challenge with imp.reload of dse-do_utils. The following is NOT (!) sufficient:

    -
    import imp
    -import dse_do_utils
    -imp.reload(dse_do_utils)
    -
    -
    -

    The package dse_do_utils internally contains a number of sub modules that each contain a part of the code. -This keeps development easier and more organized. But to make importing easier, the classes are exposed -in the top level init.py, which allows for a simple import statement like from dse_do_utils import ScenarioManager. -Unfortunately, reloading the top-level module dse_do_utils doesn’t force a reload of the internal modules.

    -

    In case of subclassing, reloading needs to be done in the right order, i.e. first the parent classes.

    -

    Usage:

    -
    import imp
    -import dse_do_utils  # You have to do the import, otherwise not possible to do the next 2 steps
    -dse_do_utils.module_reload()  #This function
    -imp.reload(dse_do_utils)  # Necessary to ensure all following expressions `from dse_do_utils import class` are using the updated classes
    -from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager  # This needs to be done AFTER the reload to refresh the definitions
    -
    -
    -

    Note that this function assumes that the set of classes and component modules is not part of the update. -If it is, you may need to add another reload:

    -
    import imp
    -import dse_do_utils  # You have to do the import, otherwise not possible to do the next 2 steps
    -imp.reload(dse_do_utils)  # To reload this function
    -dse_do_utils.module_reload()  #This function
    -imp.reload(dse_do_utils)  # Necessary to ensure all future expressions `from dse_do_utils import class` are using the updated classes
    -from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager  # This needs to be done AFTER the reload to refresh the definitions
    -
    -
    -

    If not using this function, in the notebook you would need to do the following (or the relevant parts of it):

    -
    import imp
    -import dse_do_utils
    -imp.reload(dse_do_utils.datamanager)
    -imp.reload(dse_do_utils.optimizationengine)
    -imp.reload(dse_do_utils.scenariomanager)
    -imp.reload(dse_do_utils.scenariopicker)
    -imp.reload(dse_do_utils.deployeddomodel)
    -imp.reload(dse_do_utils.mapmanager)
    -imp.reload(dse_do_utils)
    -from dse_do_utils import DataManager, OptimizationEngine, ScenarioManager, ScenarioPicker, DeployedDOModel, MapManager
    -
    -
    -

    Returns:

    -
    - @@ -3671,6 +3697,7 @@

    Table of Contents

  • OptimizationEngine.cp_binary_var_series_s()
  • OptimizationEngine.cp_integer_var_series()
  • OptimizationEngine.cp_integer_var_series_s()
  • +
  • OptimizationEngine.cp_integer_var_series_s_v2()
  • OptimizationEngine.cp_interval_var_series()
  • OptimizationEngine.cp_interval_var_series_s()
  • OptimizationEngine.create_do_model()
  • @@ -3695,7 +3722,11 @@

    Table of Contents

  • dse_do_utils.plotlymanager module @@ -3741,6 +3772,7 @@

    Table of Contents

  • ScenarioDbManager.get_scenarios_df()
  • ScenarioDbManager.insert_scenarios_from_zip()
  • ScenarioDbManager.insert_scenarios_in_db()
  • +
  • ScenarioDbManager.insert_table_row()
  • ScenarioDbManager.insert_tables_in_db()
  • ScenarioDbManager.read_multi_scenario_tables_from_db()
  • ScenarioDbManager.read_scenario_from_db()
  • @@ -3752,6 +3784,8 @@

    Table of Contents

  • ScenarioDbManager.replace_scenario_tables_in_db()
  • ScenarioDbManager.update_cell_changes_in_db()
  • ScenarioDbManager.update_scenario_output_tables_in_db()
  • +
  • ScenarioDbManager.update_table_row()
  • +
  • ScenarioDbManager.upsert_table_row()
  • ScenarioDbTable
  • dse_do_utils.version module
  • -
  • Module contents -
  • +
  • Module contents
  • @@ -3953,7 +3984,7 @@

    Navigation

  • previous |
  • - + diff --git a/docs/doc_build/html/genindex.html b/docs/doc_build/html/genindex.html index a972b5e..c68cdb5 100644 --- a/docs/doc_build/html/genindex.html +++ b/docs/doc_build/html/genindex.html @@ -6,7 +6,7 @@ - Index — DSE DO Utils 0.5.6.0 documentation + Index — DSE DO Utils 0.5.7.0 documentation @@ -33,7 +33,7 @@

    Navigation

  • modules |
  • - + @@ -158,6 +158,8 @@

    C

  • cp_integer_var_series() (dse_do_utils.optimizationengine.OptimizationEngine method)
  • cp_integer_var_series_s() (dse_do_utils.optimizationengine.OptimizationEngine static method) +
  • +
  • cp_integer_var_series_s_v2() (dse_do_utils.optimizationengine.OptimizationEngine static method)
  • cp_interval_var_series() (dse_do_utils.optimizationengine.OptimizationEngine method)
  • @@ -545,8 +547,12 @@

    G

  • get_log() (dse_do_utils.deployeddomodel.DeployedDOModel static method)
  • get_model_py() (dse_do_utils.domodeldeployer.DOModelDeployerLocal method) +
  • +
  • get_multi_scenario_compare_selected() (dse_do_utils.plotlymanager.PlotlyManager method)
  • get_multi_scenario_data() (dse_do_utils.multiscenariomanager.MultiScenarioManager method) +
  • +
  • get_multi_scenario_table() (dse_do_utils.plotlymanager.PlotlyManager method)
  • get_outputs() (dse_do_utils.deployeddomodel.DeployedDOModel static method)
  • @@ -563,6 +569,8 @@

    G

  • get_project_id() (dse_do_utils.domodelexporter.DOModelExporter static method)
  • get_raw_table_by_name() (dse_do_utils.datamanager.DataManager method) +
  • +
  • get_reference_scenario_compare_selected() (dse_do_utils.plotlymanager.PlotlyManager method)
  • get_root_directory() (dse_do_utils.multiscenariomanager.MultiScenarioManager method) @@ -664,6 +672,8 @@

    I

  • (dse_do_utils.scenariodbmanager.ScenarioDbTable method)
  • +
  • insert_table_row() (dse_do_utils.scenariodbmanager.ScenarioDbManager method) +
  • insert_tables_in_db() (dse_do_utils.scenariodbmanager.ScenarioDbManager method)
  • integer_var_series() (dse_do_utils.optimizationengine.OptimizationEngine method) @@ -775,8 +785,6 @@

    M

  • diff --git a/docs/doc_build/html/index.html b/docs/doc_build/html/index.html index 2cd42a3..d0065db 100644 --- a/docs/doc_build/html/index.html +++ b/docs/doc_build/html/index.html @@ -7,7 +7,7 @@ - Welcome to DSE DO Utils documentation! — DSE DO Utils 0.5.6.0 documentation + Welcome to DSE DO Utils documentation! — DSE DO Utils 0.5.7.0 documentation @@ -38,7 +38,7 @@

    Navigation

  • next |
  • - + @@ -134,7 +134,7 @@

    Navigation

  • next |
  • - + diff --git a/docs/doc_build/html/modules.html b/docs/doc_build/html/modules.html index 42907ae..70c6914 100644 --- a/docs/doc_build/html/modules.html +++ b/docs/doc_build/html/modules.html @@ -7,7 +7,7 @@ - dse_do_utils — DSE DO Utils 0.5.6.0 documentation + dse_do_utils — DSE DO Utils 0.5.7.0 documentation @@ -42,7 +42,7 @@

    Navigation

  • previous |
  • - + @@ -209,6 +209,7 @@

    dse_do_utilsOptimizationEngine.cp_binary_var_series_s()
  • OptimizationEngine.cp_integer_var_series()
  • OptimizationEngine.cp_integer_var_series_s()
  • +
  • OptimizationEngine.cp_integer_var_series_s_v2()
  • OptimizationEngine.cp_interval_var_series()
  • OptimizationEngine.cp_interval_var_series_s()
  • OptimizationEngine.create_do_model()
  • @@ -233,7 +234,11 @@

    dse_do_utilsdse_do_utils.plotlymanager module @@ -279,6 +284,7 @@

    dse_do_utilsScenarioDbManager.get_scenarios_df()
  • ScenarioDbManager.insert_scenarios_from_zip()
  • ScenarioDbManager.insert_scenarios_in_db()
  • +
  • ScenarioDbManager.insert_table_row()
  • ScenarioDbManager.insert_tables_in_db()
  • ScenarioDbManager.read_multi_scenario_tables_from_db()
  • ScenarioDbManager.read_scenario_from_db()
  • @@ -290,6 +296,8 @@

    dse_do_utilsScenarioDbManager.replace_scenario_tables_in_db()
  • ScenarioDbManager.update_cell_changes_in_db()
  • ScenarioDbManager.update_scenario_output_tables_in_db()
  • +
  • ScenarioDbManager.update_table_row()
  • +
  • ScenarioDbManager.upsert_table_row()
  • ScenarioDbTable
  • @@ -507,7 +512,7 @@

    Navigation

  • previous |
  • - + diff --git a/docs/doc_build/html/objects.inv b/docs/doc_build/html/objects.inv index e05ba4190c29cf79c6ef29ef17bbede2be6058a4..2e2d79a21a39471c5a56e35796042300390addba 100644 GIT binary patch delta 2744 zcmV;p3P<&$7S0xsL;*LEMRI?PDC&LKAkf|TB1=tBDNt=F(<^!WwGw5`$m*9>+4~~f znu`53eD&^ct9K8BFAG_||EK$x8cNcLWVkHRnlgg0MkO}b{?)`Ff0iSxYhD;C`0DQ? zjLG5>o9*I+gDz(49~3pDFKQ8XtESDaoqBR<%4KaJ0irfw z1j-HC62?SYNna+qxpIGvbX`?g9aAxMzmDHu7(_C0BxNbATO};k^$u0C$L90n*QZwX z9vA$!n)Mc>sBP%+-=h8dnKqB;54{lp!g-HyPDNY|DIoygMUJ$=rq;0PK;^^4212%J zh7i)W!tCu&h{0{13<*FY|4wX%wI^^WiH}U+5)J@YKefaK0cd|&mEhC}g@PA?aSy(1 zKty9MHt03-(b@S>C2Owgv8Q@ZhrSV3btZmM$WahG`Vr zRCYF*uyxuHu45ALX&f!q=HRk8ElEMw)b^v`U_YsZH!OSsRS6pPQ)-q_+xy6ZaIC0+ z&^}ZQHFu(y=~#aXMp6l>ftlJim$vx;LTg&uZiuLwa1+%DyulbPNC-%;$db$Zv7!o7 z?uUqANLQSbb*>cVSGROKj zH`Em~nsYdU$h@><;A zixSe%ivIK?D1>h)Cz1a2QYd>mJ}a?NHo^W(wITd&Uph%M zb%lR2@4_!NeE_K3$Wn9VXeTMmU0fAgXN_j2Zf(KxmMp0mP zNwmY54EE%>@PNdA2K>52AJmwNOccTDlN=QG!>Dx3&T_|hG+``tLO+J5lfnd2L ztf;lImBHR7$~SJk$KFPth()ebd8Zk&JXQ901C%b!d>a%qp*e-oB(f)rZ@oXMTm%MI z`3Cv9jqcD4KvS&yE=RlG8q(8x>Jlz}2nr7uSlYZ$O_s$0o981VypvZ%GF<#ABpXPW+{3ies%+TLC#(v{O-F6vU*QhrrqoE7SesaasuM7}Y`3+}f zW0~$%G@ah0HGTbp`4_>-mzuHk`hK#d$@ru8Fik`ZE5afW^d1Id`z?Rzd$JIt?~9GR zpMw+$kJD)VReM`(OIh1aG(NM4c&045x-o*~jO{ z@W8~#A=EL!fBceI5aXAWirudFnS%4SHr!CVx}gC@H^6BmHxak#V2tKV;0}6O5?~?P zR6;~AjgO8&XkachL;Y$Ldd2&q0N2e5lz660E=>_vc-^38Up?g_du z+95UoXqWmGNI7zY*G=`XT(fz8NzCfgTZH)=xh4@}w{J}nhjXRPQdZrh)Qt=B4_<{p z&D#w&g-~<)qb9+jasVrmPnlc;b=%Cqgu|s5dJj)XAI;7fQ5%2NVi@3-NUUrHHp@`J zt%34eS1{oAxTiLO)aURh>C+%qazHzU(j?Accjk-(nxMB6Cw{1=nKc3JdGvP2{wbXF zML68=3lI!00MIsogn|(Sv>iZ!U=#vv%WStPX|bCBN!OMUJ%BL=KSwYrbr$XXG- z{ZJbd);lF5lw^O6Yc_neYvc&tI3P)H=DKv}$-*h9rhp6;ZUf4@`v3$AJ4ldU#8-*~ z1ghDiGCSmqBYc{3!I;(m7zZ6_Y0c3ys;#OypX~~QNcOGf9|d32O=KHAm&w9h(UufD zKQVrAjW^ZHrE< ztnogjYBL1lre6h!u78bAx9lmgeEXW7lSQi_J5^mg%nDpf-&H-LV&mOdpR zq<`%~wq8;`56}ja6i$1nl?~sql=3pO#HHM-|JyyP2pgf<U+H^9}zWnVoCAL74MW zt1I%~y2O8AeqjWy{)ASU&)h{bPUuC%;P}AgBVUa4wmwuT0Ma5}9a^v?K$utM0x z!HCu4%cs@j*VXTyV$ZDIll1*VTK@82FM9+gkMG(qg4$CsJYa*V1JjyAmsUOWq;4>t ykG3o^@FB|Wf~g2%l<)eu-r?}uZ}z~dA`hCln>+-CW8u7)@cpwZ=l=ssT?XhCZA^p! delta 2684 zcmV-?3WN2|7NZuBL;*IDMRI@4P@MN+gFtt)0Z^qTs1&F+lw1SO*<mo`Ok$o#0EmP z8HNzjw!`f0zYv4lJQ)&zME;%F3~Nu|P!b=Rz$F|2u77HY3j%*IvMRx;5efw_1mhlj z+klA1Tx`&5HY3d>VEWs$LvLjtYBn{Ij zcBt%ZGGY6)Aza5K;L|u-tj)n?aaxjsuBm;Ff`k2}65g=z0aPbw)K95dLT&FO3&OFY z0z&&xG1T0NUZ#IzDHus5qy}bcJ6zh~0|>2YX&*yG)r6aL)s{Kk+{~7;e%TMEfL{PB)BlwFhGA}U7s;G;E`7;l$rZT*Q&Hv z`l+XSf5g0|mW2=8`TjgT)8-3(H_mWT5Ur6BJHk;>D+UfZkQ{>1wi0Su4a$~t4v;z4 z$GK8hOf~0*dNYaHnqfrLc&f0RH+Ojw$eyr_o4Fj-@RQ6rR;buw<)$L6W0LXaohz?v zW*w^a-GqOq6J^-?IXBH}lwfIOo9L1=%y;Qpz>j97#6hRi%ZYs;=bLnb?))%InNCv* zSm9mW^Y+`)*Ap625;&RJ$c5Ow=VD#}8%i%ffM=>}pt^ zZ^`IKYnu$jam0WUW@x5!h|%mqCb5BhVTvLB+{Q=3T02nXC*eu=I5WOHiX~pODAb&To}4O zI`4n!kI!#`>}&7Pr>;@vUHGM@4*-=bOf^@Ic9OzeewI_)agJzjb5~6iB}-ut5Xj}T zl-I(omjJeD6a{9NL<`-jF%qCvlpC_~%Lc*Cxb<9u}%;s;R$|$`vMrC#&WrzjdOqP($lEt(`lroT+VX-Mw5yz82PT^AnjY~ zu8p(6EQ?u#CYdno=r)+3gHSuHM9s^{^gL+IE13*5vS?F-Lx`*8sZr(HIF?D|$ z%0KGkI5$6yK)D^dO(1b4`7%d&&35x)A8KufuGasRG|jDW8x3--$!|xQRxEq`@IIm# zdqebDXk(vCU;g(wy|xvlhNRKWKN7}%m$nZlXw{yWeez><#k-mMq*t01wNh@uL${AA zt-MrZPearO(O2StX!!~x%u50wJt%)irRL{U}^FL5Y?_aDz>D;5CAthZ+hitU-T~XB~bn@1&_G|&fO?LniA5_VEHi( z(ih5FGPm%tXOmA}AXqL5D{5_QXRx=4@{L;$u(#1CViDw2-f0RXPnG@M0HuFRGv5Zq z%veofG>Pm9<45mLDi?u)b-sRn4v4X?wLG6OZJ2;w&{LOiw?k0a7{0W5A;DP|2W*~? zTJR275y{-5-#>u_J??6s{G!6Wma7n8M7nBKpv zND>b3~jfObqKyGFf2gNAM_`Qw=oeh>2%vX9S?;U#gAWx+AQfBceI5aXAWirr4%nS%4yW8YA_x(XXb55Q?8H@URwV2tKV z;0}6O5?~|RR6<0r=Z&MlSabQ#&1ER*ttl9B3n}KTeZGkZsXiwMuzOz;<3^GdNI7y>%1!mKrmcBrL(CGrTZH+$PbLv!_nb@;hjXRPdOzKy z)Qt=BFPnrw&D+80D&}N zt}5Xdrj_CVf%1O@QqB%J;|QPTTrg%me~g0;w6x~v8QoUZoX>UzK_vTD^N)hB=_YcF zp37umu4qe&ou8OO;c;=cwS7YS{-&8rnJi>4{SHVW8H0{vI*?hzQ zMrP+4ZxH5ukaC~6$kzWS$wmwu>Y2?pC4S@16 z7$gT=gqxF33I$ERglujhe4JyC#=U1`f~?ySAmdkxT~`*oNUS;tX|sw=bH5sN__dn) zsJq1RzV|hrbo_=RmnqVpWR6a`Mz)cZsij--eV}F=c8i`$lc5R}e>cnD-RvuE%3n)S ztlo{V21i!SyX+sVcMO|l-M=!N+pc2&xjh>G@jvd@htp{dp?Ag~gcZUj4o0jVUp}oK zzpj4w6nkdv-X8AXWbu~=d)Xr}d3@J?5Y(Q6;Q<>=9hlY}y0q${Cv}7Ie6)js4^eLS qNJS8%eAmbI4u}8!8fFiyD)OL-yU9aPI2O)(37 - Python Module Index — DSE DO Utils 0.5.6.0 documentation + Python Module Index — DSE DO Utils 0.5.7.0 documentation @@ -36,7 +36,7 @@

    Navigation

  • modules |
  • - + @@ -175,7 +175,7 @@

    Navigation

  • modules |
  • - + diff --git a/docs/doc_build/html/readme_link.html b/docs/doc_build/html/readme_link.html index bc26979..bada7ea 100644 --- a/docs/doc_build/html/readme_link.html +++ b/docs/doc_build/html/readme_link.html @@ -7,7 +7,7 @@ - Read me — DSE DO Utils 0.5.6.0 documentation + Read me — DSE DO Utils 0.5.7.0 documentation @@ -42,7 +42,7 @@

    Navigation

  • previous |
  • - + @@ -235,7 +235,7 @@

    Navigation

  • previous |
  • - + diff --git a/docs/doc_build/html/search.html b/docs/doc_build/html/search.html index fb83390..49f4cdc 100644 --- a/docs/doc_build/html/search.html +++ b/docs/doc_build/html/search.html @@ -6,7 +6,7 @@ - Search — DSE DO Utils 0.5.6.0 documentation + Search — DSE DO Utils 0.5.7.0 documentation @@ -39,7 +39,7 @@

    Navigation

  • modules |
  • - + @@ -99,7 +99,7 @@

    Navigation

  • modules |
  • - + diff --git a/docs/doc_build/html/searchindex.js b/docs/doc_build/html/searchindex.js index f4d393d..61f9b70 100644 --- a/docs/doc_build/html/searchindex.js +++ b/docs/doc_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["dse_do_utils", "index", "modules", "readme_link"], "filenames": ["dse_do_utils.rst", "index.rst", "modules.rst", "readme_link.rst"], "titles": ["dse_do_utils package", "Welcome to DSE DO Utils documentation!", "dse_do_utils", "Read me"], "terms": {"add_file_as_data_asset_cpd25": [0, 2], "file_nam": 0, "str": 0, "none": [0, 3], "sourc": [0, 3], "add": [0, 3], "file": [0, 3], "locat": [0, 3], "project_data": [0, 3], "data_asset": [0, 3], "data": [0, 3], "asset": [0, 3], "watson": 0, "studio": 0, "project": [0, 3], "so": 0, "appear": 0, "ui": 0, "can": [0, 3], "export": [0, 3], "paramet": [0, 2], "name": 0, "includ": 0, "extens": 0, "add_file_path_as_data_asset_cpd25": [0, 2], "file_path": 0, "asset_nam": 0, "option": 0, "appli": 0, "cpdv2": 0, "5": [0, 1], "work": [0, 3], "ani": [0, 3], "allow": [0, 3], "view": 0, "download": [0, 3], "from": [0, 3], "need": 0, "call": 0, "after": 0, "ha": 0, "been": 0, "save": 0, "regularli": 0, "system": [0, 3], "typic": [0, 3], "would": 0, "ensur": 0, "i": [0, 3], "visibl": 0, "usag": [0, 3], "write": [0, 3], "some": [0, 3], "an": [0, 3], "exampl": 0, "myfil": 0, "csv": [0, 3], "open": 0, "w": [0, 3], "f": 0, "hello": 0, "world": 0, "bewar": 0, "same": 0, "now": 0, "exist": [0, 3], "2": 0, "differ": [0, 3], "place": [0, 3], "In": 0, "cloud": [0, 3], "object": 0, "storag": 0, "co": 0, "As": 0, "chang": 0, "independ": 0, "caus": 0, "inconsist": 0, "full": 0, "path": 0, "default": [0, 3], "If": 0, "extract": 0, "add_file_path_as_data_asset_wsc": [0, 2], "home": 0, "dsxuser": 0, "o": 0, "environ": [0, 1], "pwd": 0, "project_lib": 0, "requir": [0, 1], "write_data_asset_as_file_cpd25": [0, 2], "assum": 0, "make": 0, "access": [0, 3], "thing": 0, "like": [0, 3], "load": 0, "disk": 0, "pip": [0, 3], "instal": [0, 1], "import": [0, 1], "us": [0, 3], "current": 0, "directori": 0, "write_data_asset_as_file_wsc": [0, 2], "For": [0, 3], "cpd": [0, 3], "leav": 0, "class": [0, 1], "input": 0, "dict": 0, "datafram": 0, "output": 0, "base": 0, "A": [0, 3], "contain": [0, 3], "origin": 0, "scenario": [0, 3], "intermedi": 0, "It": 0, "dictionari": 0, "came": 0, "insert": 0, "do": 0, "addit": 0, "hold": 0, "method": 0, "oper": 0, "convert": 0, "when": [0, 3], "combin": [0, 3], "optim": [0, 3], "engin": [0, 3], "should": 0, "docplex": [0, 3], "code": [0, 3], "creat": [0, 3], "interact": [0, 3], "model": [0, 1], "That": 0, "task": 0, "One": 0, "reason": 0, "separ": 0, "re": 0, "e": [0, 3], "g": [0, 3], "visual": [0, 3], "notebook": [0, 3], "prepar": 0, "select": 0, "renam": 0, "column": 0, "index": [0, 1], "assign": 0, "them": 0, "direct": 0, "attribut": 0, "set": 0, "pre": [0, 3], "process": [0, 3], "also": [0, 3], "member": 0, "properti": 0, "static": 0, "apply_and_concat": [0, 2], "field": 0, "func": 0, "column_nam": [0, 2], "multipl": [0, 3], "one": 0, "lambda": 0, "function": [0, 3], "http": 0, "stackoverflow": 0, "com": 0, "question": 0, "23690284": 0, "panda": 0, "return": 0, "valu": 0, "row": 0, "def": 0, "my_funct": 0, "my_input_valu": 0, "my_output_value_1": 0, "1": [0, 3], "my_output_value_2": 0, "my_output_value1": 0, "df": 0, "my_input_column_nam": 0, "my_output_column_name_1": 0, "my_output_column_name_2": 0, "have": [0, 3], "result": 0, "new": 0, "deprec": 0, "sinc": 0, "0": [0, 3], "done": 0, "plain": 0, "altern": 0, "pd": 0, "seri": 0, "axi": 0, "The": [0, 3], "argument": 0, "tupl": 0, "n": 0, "element": 0, "list": 0, "match": 0, "number": 0, "modifi": 0, "df_crossjoin_ai": [0, 2], "df1": 0, "df2": 0, "kwarg": 0, "cross": 0, "join": 0, "cartesian": 0, "product": 0, "between": [0, 3], "two": 0, "constant": 0, "temporari": 0, "kei": 0, "accept": 0, "ar": [0, 3], "singl": 0, "multi": 0, "un": 0, "indic": 0, "merg": 0, "keyword": 0, "pass": 0, "df_crossjoin_mi": [0, 2], "both": [0, 3], "multiindex": 0, "otherwis": 0, "unnam": 0, "df_crossjoin_si": [0, 2], "see": [0, 3], "github": [0, 3], "pydata": 0, "issu": 0, "5401": 0, "mkonrad": 0, "net": 0, "2016": 0, "04": 0, "16": 0, "html": 0, "extract_solut": [0, 2], "extract_dvar_nam": 0, "drop_column_nam": 0, "drop": [0, 3], "bool": 0, "true": 0, "epsilon": 0, "float": 0, "round_decim": 0, "int": 0, "solution_column_name_post_fix": 0, "sol": 0, "gener": 0, "routin": 0, "solut": 0, "remov": 0, "dvar": [0, 3], "abl": [0, 3], "clean": 0, "case": [0, 3], "cplex": [0, 3], "continu": 0, "veri": 0, "small": 0, "instead": 0, "zero": 0, "thi": [0, 3], "And": 0, "posit": 0, "clip": 0, "neg": 0, "integ": 0, "round": 0, "nearest": 0, "larger": 0, "than": 0, "precis": 0, "where": 0, "all": [0, 3], "below": 0, "threshold": 0, "decim": 0, "postfix": 0, "get_parameter_valu": [0, 2], "param": 0, "param_nam": 0, "param_typ": 0, "default_valu": 0, "value_format": 0, "y": 0, "m": 0, "d": [0, 3], "h": 0, "": 0, "get": 0, "tabl": [0, 3], "note": 0, "mix": 0, "type": 0, "depend": [0, 3], "what": 0, "other": [0, 3], "explicit": 0, "convers": 0, "expect": 0, "valid": 0, "datetim": 0, "format": 0, "get_raw_table_by_nam": [0, 2], "table_nam": [0, 2], "raw": 0, "non": 0, "prep_paramet": [0, 2], "blank": 0, "instanc": 0, "prepare_data_fram": [0, 2], "prepare_input_data_fram": [0, 2], "placehold": 0, "frame": 0, "particular": [0, 3], "sure": 0, "test": 0, "we": 0, "dashenterpris": 0, "app": 0, "whole": 0, "mytabl": 0, "self": 0, "my_tabl": 0, "set_index": 0, "id": 0, "verify_integr": 0, "prepare_output_data_fram": [0, 2], "kpi": 0, "print_hello": [0, 2], "FOR": 0, "print": 0, "string": 0, "messag": 0, "To": [0, 3], "reload": 0, "cell": [0, 3], "dm": 0, "upload": [0, 3], "wsl": 0, "autoreload": 0, "rerun": 0, "second": 0, "onli": [0, 3], "verifi": 0, "updat": 0, "imp": 0, "start": 0, "print_inputs_outputs_summari": [0, 2], "summari": 0, "along": 0, "set_paramet": [0, 2], "easi": [0, 3], "time_limit": 0, "overridden": 0, "super": 0, "simplenamespac": 0, "individu": 0, "easili": 0, "wml_credenti": 0, "space_nam": 0, "deployed_model_nam": 0, "deployment_id": 0, "default_max_oaas_time_limit_sec": 0, "default_max_run_time_sec": 0, "600": 0, "monitor_loop_delay_sec": 0, "cpd3": [0, 3], "ibm_watson_machine_learn": 0, "apicli": 0, "major": 0, "step": 0, "configur": [0, 3], "intern": 0, "former": [0, 3], "watsonmachinelearningapicli": 0, "commun": 0, "deploi": 0, "solv": [0, 2], "job": 0, "monitor": 0, "run": [0, 3], "loop": 0, "state": 0, "onc": 0, "complet": 0, "mdl": 0, "solve_payload": 0, "get_solve_payload": [0, 2], "payload": 0, "job_detail": 0, "job_uid": 0, "execute_model_v1": 0, "monitor_execution_v1": 0, "extract_solution_v1": 0, "simplest": 0, "statu": 0, "solve_statu": 0, "todo": 0, "debug": 0, "mode": 0, "log": 0, "kill": 0, "stop": 0, "poll": 0, "interv": 0, "execute_model_v2": [0, 2], "max_oaas_time_limit_sec": 0, "wml": [0, 1], "time": 0, "limit": 0, "extract_solution_v2": [0, 2], "get_deployment_id": [0, 2], "model_nam": 0, "find": 0, "get_job_statu": [0, 2], "job_statu": 0, "queu": 0, "fail": 0, "cancel": 0, "rtype": 0, "get_job_status_v2": [0, 2], "retriev": 0, "either": 0, "get_log": [0, 2], "txt": 0, "line": 0, "log_lin": 0, "get_output": [0, 2], "get_solve_detail": [0, 2], "get_solve_details_object": [0, 2], "progress_current_object": 0, "progress_best_object": 0, "get_solve_statu": [0, 2], "retreiv": 0, "get_space_id": [0, 2], "space_id": 0, "monitor_execution_v2": [0, 2], "max_run_time_sec": 0, "execut": 0, "period": 0, "api": [0, 3], "store": [0, 3], "execution_status_json": 0, "execution_statu": 0, "out": 0, "delet": 0, "total": 0, "exce": 0, "maximum": 0, "befor": 0, "must": 0, "master": 0, "initi": 0, "post": [0, 3], "up": [0, 3], "overrid": 0, "constructor": 0, "follow": [0, 3], "order": 0, "retrieve_solve_configur": 0, "set_output_settings_in_solve_configur": 0, "retrieve_debug_materi": 0, "cleanup": 0, "solve_v2": [0, 2], "scenario_nam": [0, 2], "package_path": 0, "deployment_nam": 0, "xxx": 0, "deployment_descript": 0, "tmp_dir": 0, "4": [0, 3], "builder": [0, 1], "md": [0, 3], "deployment_uid": 0, "deploy_model": [0, 2], "how": 0, "python": [0, 3], "root": 0, "specifi": 0, "py": 0, "These": 0, "my_modul": 0, "myclass": 0, "similar": 0, "experi": 0, "anywher": 0, "jupyterlab": [0, 3], "conda": [0, 3], "create_arch": [0, 2], "main_file_path": 0, "archiv": 0, "folder": 0, "main": [0, 1], "written": 0, "create_model_arch": [0, 2], "surround": 0, "boilerpl": 0, "3": [0, 3], "create_model_directori": [0, 2], "Will": 0, "clear": 0, "first": 0, "create_package_extens": [0, 2], "yaml_file_path": 0, "create_software_specif": [0, 2], "pkg_ext_id": 0, "package_extens": 0, "create_zip_package_extens": [0, 2], "package_zip_filepath": 0, "githubusercont": 0, "ipynb": 0, "browser": 0, "chrome": 0, "color_mod": 0, "auto": 0, "commit": 0, "37188b1a8b48be2bef34b35b55f01cba0d29ed19": 0, "devic": 0, "unknown": 0, "enc_url": 0, "68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f49424d2f776174736f6e2d6d616368696e652d6c6561726e696e672d73616d706c65732f333731383862316138623438626532626566333462333562353566303163626130643239656431392f637064342e302f6e6f7465626f6f6b732f707974686f6e5f73646b2f6465706c6f796d656e74732f637573746f6d5f6c6962726172792f5573652532307363696b69742d6c6561726e253230616e64253230637573746f6d2532306c696272617279253230746f2532307072656469637425323074656d70657261747572652e6970796e62": 0, "logged_in": 0, "fals": 0, "nwo": 0, "ibm": [0, 3], "2fwatson": 0, "machin": 0, "learn": 0, "sampl": 0, "cpd4": [0, 3], "2fnotebook": 0, "2fpython_sdk": 0, "2fdeploy": 0, "2fcustom_librari": 0, "2fuse": 0, "scikit": 0, "custom": 0, "librari": 0, "predict": 0, "temperatur": 0, "platform": [0, 2], "android": 0, "repository_id": 0, "277618282": 0, "repository_typ": 0, "repositori": [0, 3], "98": 0, "deploy_arch": [0, 2], "model_archive_file_path": 0, "Then": [0, 3], "deploy": [0, 3], "uid": 0, "necessari": 0, "get_scenario": [0, 2], "get_wml_create_deployment_meta_prop": [0, 2], "meta_prop": 0, "creation": 0, "get_wml_create_store_model_meta_prop": [0, 2], "sw_spec_id": 0, "guid_from_space_nam": [0, 2], "space": 0, "handl": 0, "except": 0, "found": 0, "wml_create_deploy": [0, 2], "model_uid": 0, "wml_store_model": [0, 2], "write_main_fil": [0, 2], "templat": 0, "header": 0, "footer": 0, "write_yaml_fil": [0, 2], "yml": 0, "domodeldeployerloc": [0, 2], "experiment": 0, "pleas": 0, "There": 0, "aspect": 0, "hard": 0, "review": 0, "saa": 0, "pip_zip": 0, "zip": [0, 3], "dataplatform": 0, "doc": 0, "wsj": 0, "analyz": 0, "ml": 0, "softwar": 0, "spec": 0, "context": 0, "cpdaa": [0, 2], "get_model_pi": [0, 2], "usual": 0, "node": 0, "too": 0, "slow": 0, "somehow": 0, "extend": 0, "overhead": 0, "itself": 0, "quickli": 0, "still": 0, "give": 0, "thread": 0, "do_model_nam": [0, 2], "longer": [0, 3], "avail": [0, 3], "cpdv3": [0, 3], "cpd2": 0, "curl": 0, "web": 0, "request": 0, "By": 0, "stamp": 0, "wai": 0, "anoth": 0, "cluster": 0, "command": 0, "copi": 0, "past": 0, "termin": 0, "support": 0, "me": [0, 1], "export_do_model": [0, 2], "pattern": 0, "_export_": 0, "yyyymmdd_hhmm": 0, "model1": 0, "model2": 0, "project_id": 0, "user": 0, "collabor": 0, "next": 0, "productionplan": 0, "ef365b2c": 0, "9f28": 0, "447a": 0, "a933": 0, "5de6560a1cfa": 0, "access_tok": 0, "user_nam": 0, "password": 0, "accesstoken": 0, "cpd_cluster_host": 0, "dse": [0, 3], "cp4d25": 0, "cluster4": 0, "cpolab": 0, "access_token": 0, "b7bf7fd8": 0, "aa50": 0, "4bd2": 0, "8364": 0, "02ea6d480895": 0, "cluster_nam": 0, "token": 0, "get_access_token_curl": [0, 2], "get_do_model_export_curl": [0, 2], "xxxxxx": 0, "abov": 0, "git": 0, "bash": 0, "part": 0, "window": 0, "automat": [0, 3], "variabl": 0, "target": [0, 1], "pars": 0, "page": [0, 1], "manual": 0, "show": 0, "firefox": 0, "menu": [0, 3], "develop": [0, 3], "control": 0, "just": 0, "data_id": 0, "21c8ac71": 0, "26c1": 0, "49a5": 0, "a567": 0, "d4c69a0d8158": 0, "mai": 0, "search": [0, 1], "get_project_id": [0, 2], "project_nam": 0, "page_sourc": 0, "full_project_nam": 0, "provid": [0, 3], "entri": 0, "user_access_token": 0, "NOT": [0, 3], "runtime_env_apsx_url": 0, "remot": 0, "url": 0, "alia": 0, "datascienceelit": 0, "within": [0, 3], "br": 0, "end": 0, "get_access_token_web": [0, 2], "respons": 0, "person": 0, "get_do_model_export_web": [0, 2], "write_do_model_to_fil": [0, 2], "data_manag": 0, "zoom_start": 0, "width": 0, "100": 0, "height": 0, "layer_control_posit": 0, "topleft": 0, "build": 0, "folium": [0, 3], "map": [0, 3], "futur": 0, "around": [0, 3], "popup": 0, "469": 0, "speed": 0, "km": 0, "strftime": 0, "spd": 0, "tooltip": 0, "doesn": 0, "t": 0, "yet": 0, "50": 0, "785": 0, "6": [0, 3], "wsl1": 0, "doe": 0, "seem": 0, "add_bar_chart_in_map": [0, 2], "coord": 0, "quantiti": 0, "bar_width": 0, "20": 0, "bar_height_per_unit": 0, "border_color": 0, "background_color": 0, "draw": 0, "bar": 0, "chart": 0, "anchor": 0, "botton": 0, "left": 0, "expand": 0, "right": 0, "mani": [0, 3], "cycl": 0, "through": 0, "defin": 0, "color": 0, "60131314": 0, "star": 0, "marker": 0, "io": 0, "plugin": 0, "beautifyicon": 0, "add_full_screen": [0, 2], "screen": 0, "button": 0, "top": 0, "corner": 0, "unfortun": 0, "jupyt": 0, "ok": 0, "here": 0, "nbviewer": 0, "org": 0, "blob": 0, "add_layer_control": [0, 2], "create_blank_map": [0, 2], "get_arrow": [0, 2], "blue": 0, "size": 0, "n_arrow": 0, "add_to": 0, "arrow": 0, "hypothet": 0, "correctli": 0, "rotat": 0, "plot": 0, "lat": 0, "lon": 0, "repres": 0, "eg": 0, "41": 0, "1132": 0, "96": 0, "1993": 0, "3810": 0, "95": 0, "8021": 0, "polylin": 0, "whatev": 0, "featuregroup": 0, "ad": 0, "medium": 0, "bobhaffn": 0, "25a0fe88e4": 0, "get_bear": [0, 2], "p1": 0, "p2": 0, "compass": 0, "bear": 0, "namedtupl": 0, "gist": 0, "jerom": 0, "2005586": 0, "get_html_tabl": [0, 2], "sequenc": 0, "each": 0, "get_popup_t": [0, 2], "child": 0, "popup_t": 0, "property_1": 0, "value_1": 0, "property_2": 0, "value_2": 0, "icon": 0, "Or": 0, "counti": 0, "add_child": 0, "quot": 0, "text": 0, "problem": 0, "avoid": 0, "replac": 0, "someth": 0, "els": 0, "parse_html": 0, "prevent": 0, "despit": 0, "suggest": 0, "get_tooltip_t": [0, 2], "definit": 0, "conveni": 0, "tooltip_t": 0, "pair": 0, "kansas_city_coord": [0, 2], "39": 0, "085594": 0, "94": 0, "585241": 0, "local_root": 0, "project_access_token": 0, "manag": 0, "excel": [0, 3], "spreadsheet": 0, "look": 0, "relev": 0, "filter": 0, "cogno": 0, "dataset": 0, "_multi_output": 0, "xlsx": 0, "my": 0, "msm": 0, "get_multi_scenario_data": [0, 2], "write_data_to_excel": [0, 2], "add_data_file_to_project": [0, 2], "cp4dv2": 0, "env_is_wscloud": [0, 2], "get_all_scenario_nam": [0, 2], "get_scenarios_df": [0, 2], "get_data_directori": [0, 2], "get_dd_client": [0, 2], "client": [0, 3], "dd_scenario": 0, "get_root_directori": [0, 2], "dsx": 0, "rais": 0, "valueerror": 0, "ones": 0, "more": [0, 3], "later": 0, "load_data_from_scenario": [0, 2], "faster": 0, "merge_scenario_data": [0, 2], "data_by_scenario": 0, "excel_file_nam": 0, "myprogresslisten": [0, 2], "mp": 0, "c": 0, "common": 0, "dse_do_utils_publicgithub": 0, "decis": [0, 3], "utilities_v3": 0, "venv": 0, "lib": 0, "site": 0, "solutionlisten": 0, "notify_progress": [0, 2], "progress_data": 0, "progressdata": 0, "about": 0, "point": 0, "tree": 0, "myoptimizationengin": 0, "solve_kwarg": 0, "export_lp": [0, 2], "export_sav": [0, 2], "export_lp_path": [0, 2], "is_cpo_model": 0, "add_mip_progress_kpi": [0, 2], "mip_gap_kpi_nam": 0, "gap": [0, 3], "solve_time_kpi_nam": 0, "best_bound_kpi_nam": 0, "best": 0, "bound": 0, "solution_count_kpi_nam": 0, "count": 0, "solve_phase_kpi_nam": 0, "phase": 0, "binary_var_seri": [0, 2], "karg": 0, "binaryvartyp": 0, "binary_var_series_": [0, 2], "core": 0, "continuous_var_seri": [0, 2], "continuousvartyp": 0, "continuous_var_series_": [0, 2], "cp_binary_var_seri": [0, 2], "cp": [0, 3], "express": 0, "cpointvar": 0, "cp_binary_var_series_": [0, 2], "cpomodel": 0, "integer_var_list": 0, "ibmdecisionoptim": 0, "binary_var_list": 0, "cp_integer_var_seri": [0, 2], "cp_integer_var_series_": [0, 2], "cp_interval_var_seri": [0, 2], "cpointervalvar": 0, "cp_interval_var_series_": [0, 2], "interval_var_list": 0, "highlight": 0, "create_do_model": [0, 2], "union": 0, "kwag": 0, "export_as_cpo": [0, 2], "copy_to_csv": 0, "cpo": 0, "dsx_project_dir": 0, "local": [0, 2], "filenam": 0, "lp": [0, 3], "establish": 0, "export_as_cpo_": [0, 2], "export_model": 0, "export_as_lp": [0, 2], "export_as_lp_path": [0, 2], "lp_file_nam": 0, "my_lp_fil": 0, "conflict": 0, "which": 0, "signatur": 0, "export_as_lp_": [0, 2], "get_kpi_output_t": [0, 2], "integer_var_seri": [0, 2], "most": 0, "effect": 0, "practic": 0, "xdvar": 0, "integervartyp": 0, "integer_var_series_": [0, 2], "semicontinuous_var_seri": [0, 2], "lb": 0, "semicontinuousvartyp": 0, "semicontinuous_var_series_": [0, 2], "semiinteger_var_seri": [0, 2], "semiintegervartyp": 0, "semiinteger_var_series_": [0, 2], "refine_conflict": 0, "solvesolut": 0, "plotli": 0, "get_dash_tab_layout_m": [0, 2], "page_id": 0, "Not": 0, "dse_do_dashboard": 0, "On": 0, "get_tab_layout_": 0, "dash": 0, "dashboard": 0, "get_plotly_fig_m": [0, 2], "callback": 0, "fig": 0, "autoscenariodbt": [0, 2], "db_table_nam": 0, "scenariodbt": [0, 2], "design": [0, 3], "regular": 0, "At": 0, "create_schema": [0, 2], "insert_table_in_db_bulk": [0, 2], "sqlalchemi": 0, "advantag": 0, "No": 0, "per": 0, "disadvantag": 0, "primari": 0, "foreign": 0, "relat": 0, "thu": 0, "check": 0, "miss": 0, "relationship": 0, "mean": 0, "cannot": 0, "happen": 0, "structur": 0, "create_table_metadata": [0, 2], "metadata": 0, "schema": 0, "multi_scenario": 0, "reflect": 0, "dure": 0, "get_sa_t": [0, 2], "mgr": 0, "connect": [0, 3], "being": 0, "transact": 0, "businesskpit": [0, 2], "business_kpi": 0, "extended_columns_metadata": 0, "databasetyp": [0, 2], "enum": 0, "__init__": 0, "db": 0, "db2": [0, 2], "postgresql": [0, 2], "sqlite": [0, 2], "dbcellupd": [0, 2], "row_index": [0, 2], "current_valu": [0, 2], "previous_valu": [0, 2], "row_idx": [0, 2], "kpitabl": [0, 2], "parametert": [0, 2], "input_db_t": 0, "output_db_t": 0, "credenti": 0, "echo": 0, "enable_transact": 0, "enable_sqlite_fk": 0, "enable_astyp": 0, "enable_debug_print": 0, "enable_scenario_seq": [0, 2], "db_type": 0, "use_custom_naming_convent": 0, "document": [0, 3], "add_scenario_name_to_df": [0, 2], "overwrit": 0, "alreadi": 0, "add_scenario_seq_to_df": [0, 2], "scenario_seq": 0, "scenarioseq": 0, "delete_scenario_from_db": [0, 2], "enabl": 0, "delete_scenario_name_column": [0, 2], "delete_scenario_seq_column": [0, 2], "drop_all_t": [0, 2], "duplicate_scenario_in_db": [0, 2], "source_scenario_nam": 0, "target_scenario_nam": 0, "duplic": 0, "get_custom_naming_convent": [0, 2], "convent": 0, "en": 0, "constraint": 0, "get_scenario_db_t": [0, 2], "get_scenario_sa_t": [0, 2], "cach": 0, "procedur": 0, "dodashapp": 0, "insert_scenarios_from_zip": [0, 2], "filepath": 0, "skip": 0, "insert_scenarios_in_db": [0, 2], "bulk": 0, "back": 0, "evalu": 0, "insert_tables_in_db": [0, 2], "auto_insert": 0, "wa": 0, "attempt": 0, "without": 0, "you": 0, "want": 0, "read_multi_scenario_tables_from_db": [0, 2], "input_table_nam": 0, "output_table_nam": 0, "read": [0, 1], "empti": 0, "read_scenario_from_db": [0, 2], "multi_thread": 0, "lead": 0, "perform": 0, "improv": 0, "fix": 0, "omit": 0, "read_scenario_input_tables_from_db": [0, 2], "alwai": 0, "read_scenario_table_from_db": [0, 2], "scenario_table_nam": 0, "read_scenario_tables_from_db": [0, 2], "rename_scenario_in_db": [0, 2], "replace_scenario_in_db": [0, 2], "ordereddict": 0, "replace_scenario_tables_in_db": [0, 2], "untest": 0, "update_cell_changes_in_db": [0, 2], "db_cell_upd": 0, "update_scenario_output_tables_in_db": [0, 2], "given": 0, "touch": 0, "effici": 0, "columns_metadata": 0, "constraints_metadata": 0, "foreignkeyconstraint": 0, "abc": 0, "abstract": 0, "subclass": [0, 3], "add_scenario_name_to_fk_constraint": [0, 2], "fkc": 0, "add_scenario_seq_to_fk_constraint": [0, 2], "camel_case_to_snake_cas": [0, 2], "dbm": [0, 2], "df_column_names_to_snake_cas": [0, 2], "camelcas": 0, "snake_cas": 0, "extend_columns_constraint": [0, 2], "sql": 0, "columns_ext": 0, "constraints_ext": 0, "scenariodbtablesubclass": 0, "help": 0, "mutabl": 0, "mykei": 0, "primary_kei": 0, "myvalu": 0, "fixnannonenul": [0, 2], "nan": 0, "turn": 0, "null": 0, "vt20230106": 0, "incarn": 0, "potenti": 0, "na": 0, "get_db_table_nam": [0, 2], "get_df_column_nam": [0, 2], "present": 0, "get_df_column_names_2": [0, 2], "vt": 0, "20220829": 0, "db_tabl": 0, "table_metadata": 0, "properli": 0, "simpli": 0, "truncat": 0, "length": 0, "less": 0, "proper": 0, "reduc": 0, "get_sa_column": [0, 2], "db_column_nam": 0, "astyp": 0, "datatyp": 0, "sqlachemi": 0, "resolve_metadata_column_conflict": [0, 2], "sqlcol": [0, 2], "scenarioseqt": [0, 2], "scenariot": [0, 2], "enumer": 0, "cpd25": [0, 2], "cpd40": [0, 2], "template_scenario_nam": [0, 2], "local_relative_data_path": 0, "data_directori": 0, "sheet": 0, "__index__": 0, "keep": 0, "track": 0, "restor": 0, "31": 0, "mymodel": 0, "myexcelfil": 0, "overwritten": 0, "sm": 0, "scenario_1": 0, "load_data_from_excel": [0, 2], "write_data_into_scenario": [0, 2], "dd": [0, 3], "ignor": [0, 3], "excel_test": 0, "excel_output_file_nam": 0, "csv_directori": 0, "load_data_from_csv": [0, 2], "myexcelfileoutput": 0, "add_data_file_to_project_": [0, 2], "never": 0, "cp4daa": [0, 3], "add_data_file_using_project_lib": [0, 2], "wsuser": 0, "add_data_file_using_ws_lib": [0, 2], "ibm_watson_studio_lib": 0, "cp4dv4": 0, "add_data_file_using_ws_lib_": [0, 2], "add_data_into_scenario": [0, 2], "add_data_into_scenario_": [0, 2], "explicitli": 0, "could": 0, "add_file_as_data_asset": [0, 2], "regist": 0, "add_file_as_data_asset_": [0, 2], "2022": 0, "01": 0, "21": 0, "incorrect": 0, "cpsaa": 0, "autodetect": 0, "clear_scenario_data": [0, 2], "categori": 0, "create_new_scenario": [0, 2], "model_build": 0, "new_scenario_nam": 0, "therebi": 0, "decision_optimization_cli": 0, "detect_platform": [0, 2], "env_is_cpd25": [0, 2], "env_is_cpd40": [0, 2], "cpdv4": [0, 1], "access_project_or_spac": 0, "wslib": 0, "howev": [0, 3], "ugli": 0, "error": 0, "warn": 0, "env_is_dsx": [0, 2], "export_model_as_lp": [0, 2], "exclud": 0, "modelbuild": 0, "get_do_scenario": [0, 2], "entiti": 0, "get_kpis_table_as_datafram": [0, 2], "compat": 0, "represent": 0, "do4w": 0, "get_unique_file_nam": [0, 2], "load_data": [0, 2], "load_from_excel": 0, "input_csv_name_pattern": 0, "output_csv_name_pattern": 0, "glob": 0, "rel": 0, "read_csv": 0, "load_data_from_csv_": [0, 2], "csv_name_pattern": 0, "root_dir": 0, "load_data_from_excel_": [0, 2], "xl": 0, "excelfil": 0, "table_index_sheet": 0, "_table_index_": 0, "df_dict": 0, "driven": 0, "off": 0, "certain": 0, "applic": 0, "restrict": 0, "wil": 0, "those": 0, "categor": 0, "accordingli": 0, "thei": 0, "refer": 0, "translat": 0, "abbrevi": 0, "load_data_from_parquet": [0, 2], "input_name_pattern": 0, "parquet": 0, "output_name_pattern": 0, "read_parquet": 0, "load_data_from_parquet_": [0, 2], "file_name_pattern": 0, "load_data_from_scenario_": [0, 2], "load_data_from_zip_csv_": [0, 2], "zip_file_path": 0, "file_size_limit": 0, "byte": 0, "impli": 0, "print_table_nam": [0, 2], "replace_data_in_scenario": [0, 2], "replace_data_into_scenario_": [0, 2], "update_solve_output_into_scenario": [0, 2], "write_data_into_scenario_": [0, 2], "reliabl": 0, "write_data_to_csv": [0, 2], "arg": 0, "write_data_to_csv_": [0, 2], "unique_file_nam": 0, "_": 0, "_output": 0, "throw": 0, "permissionerror": 0, "flag": 0, "uniqu": 0, "write_data_to_excel_": [0, 2], "writer": 0, "excelwrit": 0, "due": 0, "charact": 0, "record": 0, "write_data_to_parquet": [0, 2], "write_data_to_parquet_": [0, 2], "write_data_to_zip_csv_": [0, 2], "to_csv": 0, "widget": [0, 2], "sp": 0, "my_do_model": 0, "get_scenario_picker_ui": [0, 2], "load_selected_scenario_data": [0, 2], "down": [0, 3], "box": 0, "refresh": 0, "maintain": 0, "default_scenario": [0, 2], "therefor": 0, "last": 0, "my_default_scenario": 0, "picker": 0, "forc": 0, "scenariorefreshbutton": [0, 2], "inner": 0, "get_scenario_refresh_button": [0, 2], "get_scenario_select_drop_down": [0, 2], "dropdown": 0, "get_selected_scenario": [0, 2], "ipywidget": 0, "runconfig": [0, 2], "insert_inputs_in_db": [0, 2], "insert_outputs_in_db": [0, 2], "new_schema": [0, 2], "insert_in_do": [0, 2], "write_output_to_excel": [0, 2], "enable_data_check": [0, 2], "enable_data_check_output": [0, 2], "data_check_bulk_insert": [0, 2], "log_level": [0, 2], "enable_refine_conflict": [0, 2], "scenarioconfig": [0, 2], "scenario_x": 0, "scenariogener": [0, 2], "scenario_config": 0, "variat": 0, "implement": 0, "myscenariogener": 0, "generate_scenario": [0, 2], "new_input": 0, "mytable1": 0, "generate_my_table1": 0, "reset_index": 0, "mytable2": 0, "generate_my_table2": 0, "base_input": 0, "generate_my_t": 0, "get_paramet": [0, 2], "scenario_db_manag": 0, "optimization_engine_class": 0, "core01optimizationengin": 0, "data_manager_class": 0, "core01datamanag": 0, "scenario_db_manager_class": 0, "scenario_generator_class": 0, "my_model": 0, "local_platform": 0, "fine": 0, "though": 0, "create_new_db_schema": [0, 2], "data_check_input": [0, 2], "data_check": 0, "deepcopi": 0, "alter": 0, "basic": [0, 3], "resolv": 0, "granular": 0, "data_check_output": [0, 2], "deriv": 0, "baselin": 0, "specif": 0, "run_config": 0, "load_input_data_from_excel": [0, 2], "run_model": [0, 2], "run_multipl": [0, 2], "run_onc": [0, 2], "write_output_data_to_excel": [0, 2], "add_sys_path": [0, 2], "new_path": 0, "sy": 0, "www": 0, "oreilli": 0, "cookbook": 0, "0596001673": 0, "ch04s23": 0, "challeng": 0, "better": 0, "do_util": 0, "convert_s": [0, 2], "size_byt": 0, "describ": 0, "5194057": 0, "df_itertuples_with_index_nam": [0, 2], "itertupl": 0, "much": 0, "easier": 0, "normal": 0, "index_a": 0, "index_b": 0, "know": 0, "from_product": 0, "rang": 0, "my_column": 0, "len": 0, "over": 0, "tail": 0, "inspir": 0, "46151666": 0, "iter": 0, "list_file_hierarchi": [0, 2], "startpath": 0, "hierarch": 0, "current_dir": 0, "getcwd": 0, "parent_dir": 0, "abspath": 0, "pardir": 0, "parent_dir_2": 0, "grand": 0, "parent": 0, "truth": 0, "setup": 0, "conf": 0, "popul": 0, "458550": 0, "standard": 0, "emb": 0, "module_reload": [0, 2], "compon": 0, "somewhat": 0, "complex": 0, "logic": 0, "suffici": 0, "sub": 0, "organ": 0, "But": 0, "expos": 0, "level": 0, "init": 0, "simpl": 0, "statement": 0, "possibl": 0, "dse_do_util": 1, "scope": 1, "modul": [1, 2], "packag": [1, 2, 3], "submodul": 2, "cpd25util": 2, "datamanag": [2, 3], "deployeddomodel": 2, "domodeldeploy": 2, "domodelexport": 2, "mapmanag": [2, 3], "multiscenariomanag": 2, "optimizationengin": [2, 3], "plotly_cpd_workaround": 2, "plotlymanag": 2, "scenariodbmanag": 2, "scenariomanag": [2, 3], "scenariopick": [2, 3], "scenariorunn": 2, "util": [2, 3], "version": [2, 3], "content": 2, "pak": 3, "githubpag": 3, "v0": 3, "neither": 3, "spreadhseet": 3, "mostli": 3, "script": 3, "share": 3, "manipul": 3, "crossjoin": 3, "pick": 3, "v4": 3, "channel": 3, "pypi": 3, "air": 3, "internet": 3, "wheel": 3, "yaml": 3, "userf": 3, "5b4": 3, "py3": 3, "whl": 3, "put": 3, "move": 3, "installationreadm": 3, "detail": 3, "ore": 3, "cp4d": 3, "prem": 3, "might": 3, "intend": 3, "outsid": 3, "interfac": 3}, "objects": {"": [[0, 0, 0, "-", "dse_do_utils"]], "dse_do_utils": [[0, 0, 0, "-", "cpd25utilities"], [0, 0, 0, "-", "datamanager"], [0, 0, 0, "-", "deployeddomodel"], [0, 0, 0, "-", "domodeldeployer"], [0, 0, 0, "-", "domodelexporter"], [0, 0, 0, "-", "mapmanager"], [0, 1, 1, "", "module_reload"], [0, 0, 0, "-", "multiscenariomanager"], [0, 0, 0, "-", "optimizationengine"], [0, 0, 0, "-", "plotly_cpd_workaround"], [0, 0, 0, "-", "plotlymanager"], [0, 0, 0, "-", "scenariodbmanager"], [0, 0, 0, "-", "scenariomanager"], [0, 0, 0, "-", "scenariopicker"], [0, 0, 0, "-", "scenariorunner"], [0, 0, 0, "-", "utilities"], [0, 0, 0, "-", "version"]], "dse_do_utils.cpd25utilities": [[0, 1, 1, "", "add_file_as_data_asset_cpd25"], [0, 1, 1, "", "add_file_path_as_data_asset_cpd25"], [0, 1, 1, "", "add_file_path_as_data_asset_wsc"], [0, 1, 1, "", "write_data_asset_as_file_cpd25"], [0, 1, 1, "", "write_data_asset_as_file_wsc"]], "dse_do_utils.datamanager": [[0, 2, 1, "", "DataManager"]], "dse_do_utils.datamanager.DataManager": [[0, 3, 1, "", "apply_and_concat"], [0, 3, 1, "", "df_crossjoin_ai"], [0, 3, 1, "", "df_crossjoin_mi"], [0, 3, 1, "", "df_crossjoin_si"], [0, 3, 1, "", "extract_solution"], [0, 3, 1, "", "get_parameter_value"], [0, 3, 1, "", "get_raw_table_by_name"], [0, 3, 1, "", "prep_parameters"], [0, 3, 1, "", "prepare_data_frames"], [0, 3, 1, "", "prepare_input_data_frames"], [0, 3, 1, "", "prepare_output_data_frames"], [0, 3, 1, "", "print_hello"], [0, 3, 1, "", "print_inputs_outputs_summary"], [0, 3, 1, "", "set_parameters"]], "dse_do_utils.deployeddomodel": [[0, 2, 1, "", "DeployedDOModel"]], "dse_do_utils.deployeddomodel.DeployedDOModel": [[0, 3, 1, "", "execute_model_v2"], [0, 3, 1, "", "extract_solution_v2"], [0, 3, 1, "", "get_deployment_id"], [0, 3, 1, "", "get_job_status"], [0, 3, 1, "", "get_job_status_v2"], [0, 3, 1, "", "get_log"], [0, 3, 1, "", "get_outputs"], [0, 3, 1, "", "get_solve_details"], [0, 3, 1, "", "get_solve_details_objective"], [0, 3, 1, "", "get_solve_payload"], [0, 3, 1, "", "get_solve_status"], [0, 3, 1, "", "get_space_id"], [0, 3, 1, "", "monitor_execution_v2"], [0, 3, 1, "", "solve"], [0, 3, 1, "", "solve_v2"]], "dse_do_utils.domodeldeployer": [[0, 2, 1, "", "DOModelDeployer"], [0, 2, 1, "", "DOModelDeployerLocal"]], "dse_do_utils.domodeldeployer.DOModelDeployer": [[0, 3, 1, "", "create_archive"], [0, 3, 1, "", "create_model_archive"], [0, 3, 1, "", "create_model_directory"], [0, 3, 1, "", "create_package_extension"], [0, 3, 1, "", "create_software_specification"], [0, 3, 1, "", "create_zip_package_extension"], [0, 3, 1, "", "deploy_archive"], [0, 3, 1, "", "deploy_model"], [0, 3, 1, "", "get_scenario"], [0, 3, 1, "", "get_wml_create_deployment_meta_props"], [0, 3, 1, "", "get_wml_create_store_model_meta_props"], [0, 3, 1, "", "guid_from_space_name"], [0, 3, 1, "", "wml_create_deployment"], [0, 3, 1, "", "wml_store_model"], [0, 3, 1, "", "write_main_file"], [0, 3, 1, "", "write_yaml_file"]], "dse_do_utils.domodeldeployer.DOModelDeployerLocal": [[0, 3, 1, "", "create_archive"], [0, 3, 1, "", "create_model_archive"], [0, 3, 1, "", "create_model_directory"], [0, 3, 1, "", "create_package_extension"], [0, 3, 1, "", "create_software_specification"], [0, 3, 1, "", "create_zip_package_extension"], [0, 3, 1, "", "deploy_archive"], [0, 3, 1, "", "deploy_model"], [0, 3, 1, "", "get_model_py"], [0, 3, 1, "", "get_wml_create_deployment_meta_props"], [0, 3, 1, "", "get_wml_create_store_model_meta_props"], [0, 3, 1, "", "guid_from_space_name"], [0, 3, 1, "", "wml_create_deployment"], [0, 3, 1, "", "wml_store_model"], [0, 3, 1, "", "write_main_file"], [0, 3, 1, "", "write_yaml_file"]], "dse_do_utils.domodelexporter": [[0, 2, 1, "", "DOModelExporter"]], "dse_do_utils.domodelexporter.DOModelExporter": [[0, 3, 1, "", "export_do_models"], [0, 3, 1, "", "get_access_token_curl"], [0, 3, 1, "", "get_access_token_web"], [0, 3, 1, "", "get_do_model_export_curl"], [0, 3, 1, "", "get_do_model_export_web"], [0, 3, 1, "", "get_project_id"], [0, 3, 1, "", "write_do_model_to_file"]], "dse_do_utils.mapmanager": [[0, 2, 1, "", "MapManager"]], "dse_do_utils.mapmanager.MapManager": [[0, 3, 1, "", "add_bar_chart_in_map"], [0, 3, 1, "", "add_full_screen"], [0, 3, 1, "", "add_layer_control"], [0, 3, 1, "", "create_blank_map"], [0, 3, 1, "", "get_arrows"], [0, 3, 1, "", "get_bearing"], [0, 3, 1, "", "get_html_table"], [0, 3, 1, "", "get_popup_table"], [0, 3, 1, "", "get_tooltip_table"], [0, 4, 1, "", "kansas_city_coord"]], "dse_do_utils.multiscenariomanager": [[0, 2, 1, "", "MultiScenarioManager"]], "dse_do_utils.multiscenariomanager.MultiScenarioManager": [[0, 3, 1, "", "add_data_file_to_project"], [0, 3, 1, "", "env_is_wscloud"], [0, 3, 1, "", "get_all_scenario_names"], [0, 3, 1, "", "get_data_directory"], [0, 3, 1, "", "get_dd_client"], [0, 3, 1, "", "get_multi_scenario_data"], [0, 3, 1, "", "get_root_directory"], [0, 3, 1, "", "get_scenarios_df"], [0, 3, 1, "", "load_data_from_scenario"], [0, 3, 1, "", "merge_scenario_data"], [0, 3, 1, "", "write_data_to_excel"]], "dse_do_utils.optimizationengine": [[0, 2, 1, "", "MyProgressListener"], [0, 2, 1, "", "OptimizationEngine"]], "dse_do_utils.optimizationengine.MyProgressListener": [[0, 3, 1, "", "notify_progress"]], "dse_do_utils.optimizationengine.OptimizationEngine": [[0, 3, 1, "", "add_mip_progress_kpis"], [0, 3, 1, "", "binary_var_series"], [0, 3, 1, "", "binary_var_series_s"], [0, 3, 1, "", "continuous_var_series"], [0, 3, 1, "", "continuous_var_series_s"], [0, 3, 1, "", "cp_binary_var_series"], [0, 3, 1, "", "cp_binary_var_series_s"], [0, 3, 1, "", "cp_integer_var_series"], [0, 3, 1, "", "cp_integer_var_series_s"], [0, 3, 1, "", "cp_interval_var_series"], [0, 3, 1, "", "cp_interval_var_series_s"], [0, 3, 1, "", "create_do_model"], [0, 3, 1, "", "export_as_cpo"], [0, 3, 1, "", "export_as_cpo_s"], [0, 3, 1, "", "export_as_lp"], [0, 3, 1, "", "export_as_lp_path"], [0, 3, 1, "", "export_as_lp_s"], [0, 3, 1, "", "get_kpi_output_table"], [0, 3, 1, "", "integer_var_series"], [0, 3, 1, "", "integer_var_series_s"], [0, 3, 1, "", "semicontinuous_var_series"], [0, 3, 1, "", "semicontinuous_var_series_s"], [0, 3, 1, "", "semiinteger_var_series"], [0, 3, 1, "", "semiinteger_var_series_s"], [0, 3, 1, "", "solve"]], "dse_do_utils.plotlymanager": [[0, 2, 1, "", "PlotlyManager"]], "dse_do_utils.plotlymanager.PlotlyManager": [[0, 3, 1, "", "get_dash_tab_layout_m"], [0, 3, 1, "", "get_plotly_fig_m"]], "dse_do_utils.scenariodbmanager": [[0, 2, 1, "", "AutoScenarioDbTable"], [0, 2, 1, "", "BusinessKpiTable"], [0, 2, 1, "", "DatabaseType"], [0, 2, 1, "", "DbCellUpdate"], [0, 2, 1, "", "KpiTable"], [0, 2, 1, "", "ParameterTable"], [0, 2, 1, "", "ScenarioDbManager"], [0, 2, 1, "", "ScenarioDbTable"], [0, 2, 1, "", "ScenarioSeqTable"], [0, 2, 1, "", "ScenarioTable"]], "dse_do_utils.scenariodbmanager.AutoScenarioDbTable": [[0, 3, 1, "", "create_table_metadata"], [0, 3, 1, "", "get_sa_table"], [0, 3, 1, "", "insert_table_in_db_bulk"]], "dse_do_utils.scenariodbmanager.DatabaseType": [[0, 4, 1, "", "DB2"], [0, 4, 1, "", "PostgreSQL"], [0, 4, 1, "", "SQLite"]], "dse_do_utils.scenariodbmanager.DbCellUpdate": [[0, 4, 1, "", "column_name"], [0, 4, 1, "", "current_value"], [0, 4, 1, "", "previous_value"], [0, 4, 1, "", "row_idx"], [0, 4, 1, "", "row_index"], [0, 4, 1, "", "scenario_name"], [0, 4, 1, "", "table_name"]], "dse_do_utils.scenariodbmanager.ScenarioDbManager": [[0, 3, 1, "", "add_scenario_name_to_dfs"], [0, 3, 1, "", "add_scenario_seq_to_dfs"], [0, 3, 1, "", "create_schema"], [0, 3, 1, "", "delete_scenario_from_db"], [0, 3, 1, "", "delete_scenario_name_column"], [0, 3, 1, "", "delete_scenario_seq_column"], [0, 3, 1, "", "drop_all_tables"], [0, 3, 1, "", "duplicate_scenario_in_db"], [0, 3, 1, "", "get_custom_naming_convention"], [0, 3, 1, "", "get_scenario_db_table"], [0, 3, 1, "", "get_scenario_sa_table"], [0, 3, 1, "", "get_scenarios_df"], [0, 3, 1, "", "insert_scenarios_from_zip"], [0, 3, 1, "", "insert_scenarios_in_db"], [0, 3, 1, "", "insert_tables_in_db"], [0, 3, 1, "", "read_multi_scenario_tables_from_db"], [0, 3, 1, "", "read_scenario_from_db"], [0, 3, 1, "", "read_scenario_input_tables_from_db"], [0, 3, 1, "", "read_scenario_table_from_db"], [0, 3, 1, "", "read_scenario_tables_from_db"], [0, 3, 1, "", "rename_scenario_in_db"], [0, 3, 1, "", "replace_scenario_in_db"], [0, 3, 1, "", "replace_scenario_tables_in_db"], [0, 3, 1, "", "update_cell_changes_in_db"], [0, 3, 1, "", "update_scenario_output_tables_in_db"]], "dse_do_utils.scenariodbmanager.ScenarioDbTable": [[0, 3, 1, "", "add_scenario_name_to_fk_constraint"], [0, 3, 1, "", "add_scenario_seq_to_fk_constraint"], [0, 3, 1, "", "camel_case_to_snake_case"], [0, 3, 1, "", "create_table_metadata"], [0, 5, 1, "", "dbm"], [0, 3, 1, "", "df_column_names_to_snake_case"], [0, 5, 1, "", "enable_scenario_seq"], [0, 3, 1, "", "extend_columns_constraints"], [0, 3, 1, "", "fixNanNoneNull"], [0, 3, 1, "", "get_db_table_name"], [0, 3, 1, "", "get_df_column_names"], [0, 3, 1, "", "get_df_column_names_2"], [0, 3, 1, "", "get_sa_column"], [0, 3, 1, "", "get_sa_table"], [0, 3, 1, "", "insert_table_in_db_bulk"], [0, 3, 1, "", "resolve_metadata_column_conflicts"], [0, 3, 1, "", "sqlcol"]], "dse_do_utils.scenariomanager": [[0, 2, 1, "", "Platform"], [0, 2, 1, "", "ScenarioManager"]], "dse_do_utils.scenariomanager.Platform": [[0, 4, 1, "", "CPD25"], [0, 4, 1, "", "CPD40"], [0, 4, 1, "", "CPDaaS"], [0, 4, 1, "", "Local"]], "dse_do_utils.scenariomanager.ScenarioManager": [[0, 3, 1, "", "add_data_file_to_project_s"], [0, 3, 1, "", "add_data_file_using_project_lib"], [0, 3, 1, "", "add_data_file_using_ws_lib"], [0, 3, 1, "", "add_data_file_using_ws_lib_s"], [0, 3, 1, "", "add_data_into_scenario"], [0, 3, 1, "", "add_data_into_scenario_s"], [0, 3, 1, "", "add_file_as_data_asset"], [0, 3, 1, "", "add_file_as_data_asset_s"], [0, 3, 1, "", "clear_scenario_data"], [0, 3, 1, "", "create_new_scenario"], [0, 3, 1, "", "detect_platform"], [0, 3, 1, "", "env_is_cpd25"], [0, 3, 1, "", "env_is_cpd40"], [0, 3, 1, "", "env_is_dsx"], [0, 3, 1, "", "env_is_wscloud"], [0, 3, 1, "", "export_model_as_lp"], [0, 3, 1, "", "get_data_directory"], [0, 3, 1, "", "get_dd_client"], [0, 3, 1, "", "get_do_scenario"], [0, 3, 1, "", "get_kpis_table_as_dataframe"], [0, 3, 1, "", "get_root_directory"], [0, 3, 1, "", "get_unique_file_name"], [0, 3, 1, "", "insert_scenarios_from_zip"], [0, 3, 1, "", "load_data"], [0, 3, 1, "", "load_data_from_csv"], [0, 3, 1, "", "load_data_from_csv_s"], [0, 3, 1, "", "load_data_from_excel"], [0, 3, 1, "", "load_data_from_excel_s"], [0, 3, 1, "", "load_data_from_parquet"], [0, 3, 1, "", "load_data_from_parquet_s"], [0, 3, 1, "", "load_data_from_scenario"], [0, 3, 1, "", "load_data_from_scenario_s"], [0, 3, 1, "", "load_data_from_zip_csv_s"], [0, 3, 1, "", "print_table_names"], [0, 3, 1, "", "replace_data_in_scenario"], [0, 3, 1, "", "replace_data_into_scenario_s"], [0, 3, 1, "", "update_solve_output_into_scenario"], [0, 3, 1, "", "write_data_into_scenario"], [0, 3, 1, "", "write_data_into_scenario_s"], [0, 3, 1, "", "write_data_to_csv"], [0, 3, 1, "", "write_data_to_csv_s"], [0, 3, 1, "", "write_data_to_excel"], [0, 3, 1, "", "write_data_to_excel_s"], [0, 3, 1, "", "write_data_to_parquet"], [0, 3, 1, "", "write_data_to_parquet_s"], [0, 3, 1, "", "write_data_to_zip_csv_s"]], "dse_do_utils.scenariopicker": [[0, 2, 1, "", "ScenarioPicker"]], "dse_do_utils.scenariopicker.ScenarioPicker": [[0, 2, 1, "", "ScenarioRefreshButton"], [0, 4, 1, "", "default_scenario"], [0, 3, 1, "", "get_dd_client"], [0, 3, 1, "", "get_scenario_picker_ui"], [0, 3, 1, "", "get_scenario_refresh_button"], [0, 3, 1, "", "get_scenario_select_drop_down"], [0, 3, 1, "", "get_selected_scenario"], [0, 3, 1, "", "load_selected_scenario_data"], [0, 4, 1, "", "widgets"]], "dse_do_utils.scenariorunner": [[0, 2, 1, "", "RunConfig"], [0, 2, 1, "", "ScenarioConfig"], [0, 2, 1, "", "ScenarioGenerator"], [0, 2, 1, "", "ScenarioRunner"]], "dse_do_utils.scenariorunner.RunConfig": [[0, 4, 1, "", "data_check_bulk_insert"], [0, 4, 1, "", "do_model_name"], [0, 4, 1, "", "enable_data_check"], [0, 4, 1, "", "enable_data_check_outputs"], [0, 4, 1, "", "enable_refine_conflict"], [0, 4, 1, "", "export_lp"], [0, 4, 1, "", "export_lp_path"], [0, 4, 1, "", "export_sav"], [0, 4, 1, "", "insert_in_do"], [0, 4, 1, "", "insert_inputs_in_db"], [0, 4, 1, "", "insert_outputs_in_db"], [0, 4, 1, "", "log_level"], [0, 4, 1, "", "new_schema"], [0, 4, 1, "", "template_scenario_name"], [0, 4, 1, "", "write_output_to_excel"]], "dse_do_utils.scenariorunner.ScenarioConfig": [[0, 4, 1, "", "parameters"], [0, 4, 1, "", "scenario_name"]], "dse_do_utils.scenariorunner.ScenarioGenerator": [[0, 3, 1, "", "generate_scenario"], [0, 3, 1, "", "get_parameters"]], "dse_do_utils.scenariorunner.ScenarioRunner": [[0, 3, 1, "", "create_new_db_schema"], [0, 3, 1, "", "data_check_inputs"], [0, 3, 1, "", "data_check_outputs"], [0, 3, 1, "", "generate_scenario"], [0, 3, 1, "", "insert_in_do"], [0, 3, 1, "", "insert_inputs_in_db"], [0, 3, 1, "", "insert_outputs_in_db"], [0, 3, 1, "", "load_input_data_from_excel"], [0, 3, 1, "", "run_model"], [0, 3, 1, "", "run_multiple"], [0, 3, 1, "", "run_once"], [0, 3, 1, "", "write_output_data_to_excel"]], "dse_do_utils.utilities": [[0, 1, 1, "", "add_sys_path"], [0, 1, 1, "", "convert_size"], [0, 1, 1, "", "df_itertuples_with_index_names"], [0, 1, 1, "", "list_file_hierarchy"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"]}, "titleterms": {"dse_do_util": [0, 2, 3], "packag": 0, "submodul": 0, "cpd25util": 0, "modul": [0, 3], "datamanag": 0, "deployeddomodel": 0, "domodeldeploy": 0, "domodelexport": 0, "mapmanag": 0, "multiscenariomanag": 0, "optimizationengin": 0, "plotly_cpd_workaround": 0, "plotlymanag": 0, "scenariodbmanag": 0, "scenariomanag": 0, "scenariopick": 0, "scenariorunn": 0, "util": [0, 1], "version": 0, "content": [0, 1], "welcom": 1, "dse": 1, "do": [1, 3], "document": 1, "indic": 1, "tabl": 1, "read": 3, "me": 3, "import": 3, "main": 3, "class": 3, "instal": 3, "cpdv4": 3, "5": 3, "custom": 3, "environ": 3, "target": 3, "model": 3, "builder": 3, "wml": 3, "scope": 3, "requir": 3}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"dse_do_utils package": [[0, "dse-do-utils-package"]], "Submodules": [[0, "submodules"]], "dse_do_utils.cpd25utilities module": [[0, "module-dse_do_utils.cpd25utilities"]], "dse_do_utils.datamanager module": [[0, "module-dse_do_utils.datamanager"]], "dse_do_utils.deployeddomodel module": [[0, "module-dse_do_utils.deployeddomodel"]], "dse_do_utils.domodeldeployer module": [[0, "module-dse_do_utils.domodeldeployer"]], "dse_do_utils.domodelexporter module": [[0, "module-dse_do_utils.domodelexporter"]], "dse_do_utils.mapmanager module": [[0, "module-dse_do_utils.mapmanager"]], "dse_do_utils.multiscenariomanager module": [[0, "module-dse_do_utils.multiscenariomanager"]], "dse_do_utils.optimizationengine module": [[0, "module-dse_do_utils.optimizationengine"]], "dse_do_utils.plotly_cpd_workaround module": [[0, "module-dse_do_utils.plotly_cpd_workaround"]], "dse_do_utils.plotlymanager module": [[0, "module-dse_do_utils.plotlymanager"]], "dse_do_utils.scenariodbmanager module": [[0, "module-dse_do_utils.scenariodbmanager"]], "dse_do_utils.scenariomanager module": [[0, "module-dse_do_utils.scenariomanager"]], "dse_do_utils.scenariopicker module": [[0, "module-dse_do_utils.scenariopicker"]], "dse_do_utils.scenariorunner module": [[0, "module-dse_do_utils.scenariorunner"]], "dse_do_utils.utilities module": [[0, "module-dse_do_utils.utilities"]], "dse_do_utils.version module": [[0, "module-dse_do_utils.version"]], "Module contents": [[0, "module-dse_do_utils"]], "Welcome to DSE DO Utils documentation!": [[1, "welcome-to-dse-do-utils-documentation"]], "Contents:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]], "dse_do_utils": [[2, "dse-do-utils"]], "Read me": [[3, "read-me"]], "DSE_DO_Utils": [[3, "dse-do-utils"]], "Important": [[3, "important"]], "Main classes:": [[3, "main-classes"]], "Installation on CPDv4.5": [[3, "installation-on-cpdv4-5"]], "Install in customized environment": [[3, "install-in-customized-environment"]], "Import": [[3, "import"]], "Target environments": [[3, "target-environments"]], "DO Model Builder and WML environments": [[3, "do-model-builder-and-wml-environments"]], "Scope of classes/modules": [[3, "scope-of-classes-modules"]], "Requirements": [[3, "requirements"]]}, "indexentries": {"autoscenariodbtable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable"]], "businesskpitable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.BusinessKpiTable"]], "cpd25 (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.CPD25"]], "cpd40 (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.CPD40"]], "cpdaas (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.CPDaaS"]], "db2 (dse_do_utils.scenariodbmanager.databasetype attribute)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType.DB2"]], "domodeldeployer (class in dse_do_utils.domodeldeployer)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer"]], "domodeldeployerlocal (class in dse_do_utils.domodeldeployer)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal"]], "domodelexporter (class in dse_do_utils.domodelexporter)": [[0, "dse_do_utils.domodelexporter.DOModelExporter"]], "datamanager (class in dse_do_utils.datamanager)": [[0, "dse_do_utils.datamanager.DataManager"]], "databasetype (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType"]], "dbcellupdate (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate"]], "deployeddomodel (class in dse_do_utils.deployeddomodel)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel"]], "kpitable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.KpiTable"]], "local (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.Local"]], "mapmanager (class in dse_do_utils.mapmanager)": [[0, "dse_do_utils.mapmanager.MapManager"]], "multiscenariomanager (class in dse_do_utils.multiscenariomanager)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager"]], "myprogresslistener (class in dse_do_utils.optimizationengine)": [[0, "dse_do_utils.optimizationengine.MyProgressListener"]], "optimizationengine (class in dse_do_utils.optimizationengine)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine"]], "parametertable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ParameterTable"]], "platform (class in dse_do_utils.scenariomanager)": [[0, "dse_do_utils.scenariomanager.Platform"]], "plotlymanager (class in dse_do_utils.plotlymanager)": [[0, "dse_do_utils.plotlymanager.PlotlyManager"]], "postgresql (dse_do_utils.scenariodbmanager.databasetype attribute)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType.PostgreSQL"]], "runconfig (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.RunConfig"]], "sqlite (dse_do_utils.scenariodbmanager.databasetype attribute)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType.SQLite"]], "scenarioconfig (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.ScenarioConfig"]], "scenariodbmanager (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager"]], "scenariodbtable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable"]], "scenariogenerator (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.ScenarioGenerator"]], "scenariomanager (class in dse_do_utils.scenariomanager)": [[0, "dse_do_utils.scenariomanager.ScenarioManager"]], "scenariopicker (class in dse_do_utils.scenariopicker)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker"]], "scenariopicker.scenariorefreshbutton (class in dse_do_utils.scenariopicker)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.ScenarioRefreshButton"]], "scenariorunner (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner"]], "scenarioseqtable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioSeqTable"]], "scenariotable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioTable"]], "add_bar_chart_in_map() (dse_do_utils.mapmanager.mapmanager method)": [[0, "dse_do_utils.mapmanager.MapManager.add_bar_chart_in_map"]], "add_data_file_to_project() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.add_data_file_to_project"]], "add_data_file_to_project_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_to_project_s"]], "add_data_file_using_project_lib() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_using_project_lib"]], "add_data_file_using_ws_lib() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_using_ws_lib"]], "add_data_file_using_ws_lib_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_using_ws_lib_s"]], "add_data_into_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_into_scenario"]], "add_data_into_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_into_scenario_s"]], "add_file_as_data_asset() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_file_as_data_asset"]], "add_file_as_data_asset_cpd25() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.add_file_as_data_asset_cpd25"]], "add_file_as_data_asset_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_file_as_data_asset_s"]], "add_file_path_as_data_asset_cpd25() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.add_file_path_as_data_asset_cpd25"]], "add_file_path_as_data_asset_wsc() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.add_file_path_as_data_asset_wsc"]], "add_full_screen() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.add_full_screen"]], "add_layer_control() (dse_do_utils.mapmanager.mapmanager method)": [[0, "dse_do_utils.mapmanager.MapManager.add_layer_control"]], "add_mip_progress_kpis() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.add_mip_progress_kpis"]], "add_scenario_name_to_dfs() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.add_scenario_name_to_dfs"]], "add_scenario_name_to_fk_constraint() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.add_scenario_name_to_fk_constraint"]], "add_scenario_seq_to_dfs() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.add_scenario_seq_to_dfs"]], "add_scenario_seq_to_fk_constraint() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.add_scenario_seq_to_fk_constraint"]], "add_sys_path() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.add_sys_path"]], "apply_and_concat() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.apply_and_concat"]], "binary_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.binary_var_series"]], "binary_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.binary_var_series_s"]], "camel_case_to_snake_case() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.camel_case_to_snake_case"]], "clear_scenario_data() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.clear_scenario_data"]], "column_name (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.column_name"]], "continuous_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.continuous_var_series"]], "continuous_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.continuous_var_series_s"]], "convert_size() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.convert_size"]], "cp_binary_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_binary_var_series"]], "cp_binary_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_binary_var_series_s"]], "cp_integer_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_integer_var_series"]], "cp_integer_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_integer_var_series_s"]], "cp_interval_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_interval_var_series"]], "cp_interval_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_interval_var_series_s"]], "create_archive() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_archive"]], "create_archive() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_archive"]], "create_blank_map() (dse_do_utils.mapmanager.mapmanager method)": [[0, "dse_do_utils.mapmanager.MapManager.create_blank_map"]], "create_do_model() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.create_do_model"]], "create_model_archive() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_model_archive"]], "create_model_archive() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_model_archive"]], "create_model_directory() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_model_directory"]], "create_model_directory() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_model_directory"]], "create_new_db_schema() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.create_new_db_schema"]], "create_new_scenario() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.create_new_scenario"]], "create_package_extension() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_package_extension"]], "create_package_extension() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_package_extension"]], "create_schema() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.create_schema"]], "create_software_specification() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_software_specification"]], "create_software_specification() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_software_specification"]], "create_table_metadata() (dse_do_utils.scenariodbmanager.autoscenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable.create_table_metadata"]], "create_table_metadata() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.create_table_metadata"]], "create_zip_package_extension() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_zip_package_extension"]], "create_zip_package_extension() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_zip_package_extension"]], "current_value (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.current_value"]], "data_check_bulk_insert (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.data_check_bulk_insert"]], "data_check_inputs() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.data_check_inputs"]], "data_check_outputs() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.data_check_outputs"]], "dbm (dse_do_utils.scenariodbmanager.scenariodbtable property)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.dbm"]], "default_scenario (dse_do_utils.scenariopicker.scenariopicker attribute)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.default_scenario"]], "delete_scenario_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.delete_scenario_from_db"]], "delete_scenario_name_column() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.delete_scenario_name_column"]], "delete_scenario_seq_column() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.delete_scenario_seq_column"]], "deploy_archive() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.deploy_archive"]], "deploy_archive() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.deploy_archive"]], "deploy_model() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.deploy_model"]], "deploy_model() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.deploy_model"]], "detect_platform() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.detect_platform"]], "df_column_names_to_snake_case() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.df_column_names_to_snake_case"]], "df_crossjoin_ai() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.df_crossjoin_ai"]], "df_crossjoin_mi() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.df_crossjoin_mi"]], "df_crossjoin_si() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.df_crossjoin_si"]], "df_itertuples_with_index_names() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.df_itertuples_with_index_names"]], "do_model_name (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.do_model_name"]], "drop_all_tables() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.drop_all_tables"]], "dse_do_utils": [[0, "module-dse_do_utils"]], "dse_do_utils.cpd25utilities": [[0, "module-dse_do_utils.cpd25utilities"]], "dse_do_utils.datamanager": [[0, "module-dse_do_utils.datamanager"]], "dse_do_utils.deployeddomodel": [[0, "module-dse_do_utils.deployeddomodel"]], "dse_do_utils.domodeldeployer": [[0, "module-dse_do_utils.domodeldeployer"]], "dse_do_utils.domodelexporter": [[0, "module-dse_do_utils.domodelexporter"]], "dse_do_utils.mapmanager": [[0, "module-dse_do_utils.mapmanager"]], "dse_do_utils.multiscenariomanager": [[0, "module-dse_do_utils.multiscenariomanager"]], "dse_do_utils.optimizationengine": [[0, "module-dse_do_utils.optimizationengine"]], "dse_do_utils.plotly_cpd_workaround": [[0, "module-dse_do_utils.plotly_cpd_workaround"]], "dse_do_utils.plotlymanager": [[0, "module-dse_do_utils.plotlymanager"]], "dse_do_utils.scenariodbmanager": [[0, "module-dse_do_utils.scenariodbmanager"]], "dse_do_utils.scenariomanager": [[0, "module-dse_do_utils.scenariomanager"]], "dse_do_utils.scenariopicker": [[0, "module-dse_do_utils.scenariopicker"]], "dse_do_utils.scenariorunner": [[0, "module-dse_do_utils.scenariorunner"]], "dse_do_utils.utilities": [[0, "module-dse_do_utils.utilities"]], "dse_do_utils.version": [[0, "module-dse_do_utils.version"]], "duplicate_scenario_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.duplicate_scenario_in_db"]], "enable_data_check (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.enable_data_check"]], "enable_data_check_outputs (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.enable_data_check_outputs"]], "enable_refine_conflict (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.enable_refine_conflict"]], "enable_scenario_seq (dse_do_utils.scenariodbmanager.scenariodbtable property)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.enable_scenario_seq"]], "env_is_cpd25() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_cpd25"]], "env_is_cpd40() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_cpd40"]], "env_is_dsx() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_dsx"]], "env_is_wscloud() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.env_is_wscloud"]], "env_is_wscloud() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_wscloud"]], "execute_model_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.execute_model_v2"]], "export_as_cpo() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_cpo"]], "export_as_cpo_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_cpo_s"]], "export_as_lp() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_lp"]], "export_as_lp_path() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_lp_path"]], "export_as_lp_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_lp_s"]], "export_do_models() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.export_do_models"]], "export_lp (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.export_lp"]], "export_lp_path (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.export_lp_path"]], "export_model_as_lp() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.export_model_as_lp"]], "export_sav (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.export_sav"]], "extend_columns_constraints() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.extend_columns_constraints"]], "extract_solution() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.extract_solution"]], "extract_solution_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.extract_solution_v2"]], "fixnannonenull() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.fixNanNoneNull"]], "generate_scenario() (dse_do_utils.scenariorunner.scenariogenerator method)": [[0, "dse_do_utils.scenariorunner.ScenarioGenerator.generate_scenario"]], "generate_scenario() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.generate_scenario"]], "get_access_token_curl() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_access_token_curl"]], "get_access_token_web() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_access_token_web"]], "get_all_scenario_names() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_all_scenario_names"]], "get_arrows() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_arrows"]], "get_bearing() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_bearing"]], "get_custom_naming_convention() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_custom_naming_convention"]], "get_dash_tab_layout_m() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_dash_tab_layout_m"]], "get_data_directory() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_data_directory"]], "get_data_directory() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_data_directory"]], "get_db_table_name() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_db_table_name"]], "get_dd_client() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_dd_client"]], "get_dd_client() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_dd_client"]], "get_dd_client() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_dd_client"]], "get_deployment_id() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_deployment_id"]], "get_df_column_names() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_df_column_names"]], "get_df_column_names_2() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_df_column_names_2"]], "get_do_model_export_curl() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_do_model_export_curl"]], "get_do_model_export_web() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_do_model_export_web"]], "get_do_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_do_scenario"]], "get_html_table() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_html_table"]], "get_job_status() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_job_status"]], "get_job_status_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_job_status_v2"]], "get_kpi_output_table() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.get_kpi_output_table"]], "get_kpis_table_as_dataframe() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_kpis_table_as_dataframe"]], "get_log() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_log"]], "get_model_py() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.get_model_py"]], "get_multi_scenario_data() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_multi_scenario_data"]], "get_outputs() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_outputs"]], "get_parameter_value() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.get_parameter_value"]], "get_parameters() (dse_do_utils.scenariorunner.scenariogenerator method)": [[0, "dse_do_utils.scenariorunner.ScenarioGenerator.get_parameters"]], "get_plotly_fig_m() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_plotly_fig_m"]], "get_popup_table() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_popup_table"]], "get_project_id() (dse_do_utils.domodelexporter.domodelexporter static method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_project_id"]], "get_raw_table_by_name() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.get_raw_table_by_name"]], "get_root_directory() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_root_directory"]], "get_root_directory() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_root_directory"]], "get_sa_column() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_sa_column"]], "get_sa_table() (dse_do_utils.scenariodbmanager.autoscenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable.get_sa_table"]], "get_sa_table() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_sa_table"]], "get_scenario() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.get_scenario"]], "get_scenario_db_table() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_scenario_db_table"]], "get_scenario_picker_ui() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_scenario_picker_ui"]], "get_scenario_refresh_button() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_scenario_refresh_button"]], "get_scenario_sa_table() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_scenario_sa_table"]], "get_scenario_select_drop_down() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_scenario_select_drop_down"]], "get_scenarios_df() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_scenarios_df"]], "get_scenarios_df() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_scenarios_df"]], "get_selected_scenario() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_selected_scenario"]], "get_solve_details() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_details"]], "get_solve_details_objective() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_details_objective"]], "get_solve_payload() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_payload"]], "get_solve_status() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_status"]], "get_space_id() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_space_id"]], "get_tooltip_table() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_tooltip_table"]], "get_unique_file_name() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_unique_file_name"]], "get_wml_create_deployment_meta_props() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.get_wml_create_deployment_meta_props"]], "get_wml_create_deployment_meta_props() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.get_wml_create_deployment_meta_props"]], "get_wml_create_store_model_meta_props() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.get_wml_create_store_model_meta_props"]], "get_wml_create_store_model_meta_props() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.get_wml_create_store_model_meta_props"]], "guid_from_space_name() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.guid_from_space_name"]], "guid_from_space_name() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.guid_from_space_name"]], "insert_in_do (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.insert_in_do"]], "insert_in_do() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.insert_in_do"]], "insert_inputs_in_db (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.insert_inputs_in_db"]], "insert_inputs_in_db() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.insert_inputs_in_db"]], "insert_outputs_in_db (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.insert_outputs_in_db"]], "insert_outputs_in_db() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.insert_outputs_in_db"]], "insert_scenarios_from_zip() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_scenarios_from_zip"]], "insert_scenarios_from_zip() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.insert_scenarios_from_zip"]], "insert_scenarios_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_scenarios_in_db"]], "insert_table_in_db_bulk() (dse_do_utils.scenariodbmanager.autoscenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable.insert_table_in_db_bulk"]], "insert_table_in_db_bulk() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.insert_table_in_db_bulk"]], "insert_tables_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_tables_in_db"]], "integer_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.integer_var_series"]], "integer_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.integer_var_series_s"]], "kansas_city_coord (dse_do_utils.mapmanager.mapmanager attribute)": [[0, "dse_do_utils.mapmanager.MapManager.kansas_city_coord"]], "list_file_hierarchy() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.list_file_hierarchy"]], "load_data() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data"]], "load_data_from_csv() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_csv"]], "load_data_from_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_csv_s"]], "load_data_from_excel() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_excel"]], "load_data_from_excel_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_excel_s"]], "load_data_from_parquet() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_parquet"]], "load_data_from_parquet_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_parquet_s"]], "load_data_from_scenario() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.load_data_from_scenario"]], "load_data_from_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_scenario"]], "load_data_from_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_scenario_s"]], "load_data_from_zip_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_zip_csv_s"]], "load_input_data_from_excel() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.load_input_data_from_excel"]], "load_selected_scenario_data() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.load_selected_scenario_data"]], "log_level (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.log_level"]], "merge_scenario_data() (dse_do_utils.multiscenariomanager.multiscenariomanager static method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.merge_scenario_data"]], "module": [[0, "module-dse_do_utils"], [0, "module-dse_do_utils.cpd25utilities"], [0, "module-dse_do_utils.datamanager"], [0, "module-dse_do_utils.deployeddomodel"], [0, "module-dse_do_utils.domodeldeployer"], [0, "module-dse_do_utils.domodelexporter"], [0, "module-dse_do_utils.mapmanager"], [0, "module-dse_do_utils.multiscenariomanager"], [0, "module-dse_do_utils.optimizationengine"], [0, "module-dse_do_utils.plotly_cpd_workaround"], [0, "module-dse_do_utils.plotlymanager"], [0, "module-dse_do_utils.scenariodbmanager"], [0, "module-dse_do_utils.scenariomanager"], [0, "module-dse_do_utils.scenariopicker"], [0, "module-dse_do_utils.scenariorunner"], [0, "module-dse_do_utils.utilities"], [0, "module-dse_do_utils.version"]], "module_reload() (in module dse_do_utils)": [[0, "dse_do_utils.module_reload"]], "monitor_execution_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.monitor_execution_v2"]], "new_schema (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.new_schema"]], "notify_progress() (dse_do_utils.optimizationengine.myprogresslistener method)": [[0, "dse_do_utils.optimizationengine.MyProgressListener.notify_progress"]], "parameters (dse_do_utils.scenariorunner.scenarioconfig attribute)": [[0, "dse_do_utils.scenariorunner.ScenarioConfig.parameters"]], "prep_parameters() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prep_parameters"]], "prepare_data_frames() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prepare_data_frames"]], "prepare_input_data_frames() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prepare_input_data_frames"]], "prepare_output_data_frames() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prepare_output_data_frames"]], "previous_value (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.previous_value"]], "print_hello() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.print_hello"]], "print_inputs_outputs_summary() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.print_inputs_outputs_summary"]], "print_table_names() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.print_table_names"]], "read_multi_scenario_tables_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_multi_scenario_tables_from_db"]], "read_scenario_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_from_db"]], "read_scenario_input_tables_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_input_tables_from_db"]], "read_scenario_table_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_table_from_db"]], "read_scenario_tables_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_tables_from_db"]], "rename_scenario_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.rename_scenario_in_db"]], "replace_data_in_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.replace_data_in_scenario"]], "replace_data_into_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.replace_data_into_scenario_s"]], "replace_scenario_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.replace_scenario_in_db"]], "replace_scenario_tables_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.replace_scenario_tables_in_db"]], "resolve_metadata_column_conflicts() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.resolve_metadata_column_conflicts"]], "row_idx (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.row_idx"]], "row_index (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.row_index"]], "run_model() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.run_model"]], "run_multiple() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.run_multiple"]], "run_once() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.run_once"]], "scenario_name (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.scenario_name"]], "scenario_name (dse_do_utils.scenariorunner.scenarioconfig attribute)": [[0, "dse_do_utils.scenariorunner.ScenarioConfig.scenario_name"]], "semicontinuous_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semicontinuous_var_series"]], "semicontinuous_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semicontinuous_var_series_s"]], "semiinteger_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semiinteger_var_series"]], "semiinteger_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semiinteger_var_series_s"]], "set_parameters() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.set_parameters"]], "solve() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.solve"]], "solve() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.solve"]], "solve_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.solve_v2"]], "sqlcol() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.sqlcol"]], "table_name (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.table_name"]], "template_scenario_name (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.template_scenario_name"]], "update_cell_changes_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.update_cell_changes_in_db"]], "update_scenario_output_tables_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.update_scenario_output_tables_in_db"]], "update_solve_output_into_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.update_solve_output_into_scenario"]], "widgets (dse_do_utils.scenariopicker.scenariopicker attribute)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.widgets"]], "wml_create_deployment() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.wml_create_deployment"]], "wml_create_deployment() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.wml_create_deployment"]], "wml_store_model() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.wml_store_model"]], "wml_store_model() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.wml_store_model"]], "write_data_asset_as_file_cpd25() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.write_data_asset_as_file_cpd25"]], "write_data_asset_as_file_wsc() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.write_data_asset_as_file_wsc"]], "write_data_into_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_into_scenario"]], "write_data_into_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_into_scenario_s"]], "write_data_to_csv() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_csv"]], "write_data_to_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_csv_s"]], "write_data_to_excel() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.write_data_to_excel"]], "write_data_to_excel() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_excel"]], "write_data_to_excel_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_excel_s"]], "write_data_to_parquet() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_parquet"]], "write_data_to_parquet_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_parquet_s"]], "write_data_to_zip_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_zip_csv_s"]], "write_do_model_to_file() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.write_do_model_to_file"]], "write_main_file() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.write_main_file"]], "write_main_file() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.write_main_file"]], "write_output_data_to_excel() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.write_output_data_to_excel"]], "write_output_to_excel (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.write_output_to_excel"]], "write_yaml_file() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.write_yaml_file"]], "write_yaml_file() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.write_yaml_file"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["dse_do_utils", "index", "modules", "readme_link"], "filenames": ["dse_do_utils.rst", "index.rst", "modules.rst", "readme_link.rst"], "titles": ["dse_do_utils package", "Welcome to DSE DO Utils documentation!", "dse_do_utils", "Read me"], "terms": {"add_file_as_data_asset_cpd25": [0, 2], "file_nam": 0, "str": 0, "none": [0, 3], "sourc": [0, 3], "add": [0, 3], "file": [0, 3], "locat": [0, 3], "project_data": [0, 3], "data_asset": [0, 3], "data": [0, 3], "asset": [0, 3], "watson": 0, "studio": 0, "project": [0, 3], "so": 0, "appear": 0, "ui": 0, "can": [0, 3], "export": [0, 3], "paramet": [0, 2], "name": 0, "includ": 0, "extens": 0, "add_file_path_as_data_asset_cpd25": [0, 2], "file_path": 0, "asset_nam": 0, "option": 0, "appli": 0, "cpdv2": 0, "5": [0, 1], "work": [0, 3], "ani": [0, 3], "allow": [0, 3], "view": 0, "download": [0, 3], "from": [0, 3], "need": 0, "call": 0, "after": 0, "ha": 0, "been": 0, "save": 0, "regularli": 0, "system": [0, 3], "typic": [0, 3], "would": 0, "ensur": 0, "i": [0, 3], "visibl": 0, "usag": [0, 3], "write": [0, 3], "some": [0, 3], "an": [0, 3], "exampl": 0, "myfil": 0, "csv": [0, 3], "open": 0, "w": [0, 3], "f": 0, "hello": 0, "world": 0, "bewar": 0, "same": 0, "now": 0, "exist": [0, 3], "2": 0, "differ": [0, 3], "place": [0, 3], "In": 0, "cloud": [0, 3], "object": 0, "storag": 0, "co": 0, "As": 0, "chang": 0, "independ": 0, "caus": 0, "inconsist": 0, "full": 0, "path": 0, "default": [0, 3], "If": 0, "extract": 0, "add_file_path_as_data_asset_wsc": [0, 2], "home": 0, "dsxuser": 0, "o": 0, "environ": [0, 1], "pwd": 0, "project_lib": 0, "requir": [0, 1], "write_data_asset_as_file_cpd25": [0, 2], "assum": 0, "make": 0, "access": [0, 3], "thing": 0, "like": [0, 3], "load": 0, "disk": 0, "pip": [0, 3], "instal": [0, 1], "import": [0, 1], "us": [0, 3], "current": 0, "directori": 0, "write_data_asset_as_file_wsc": [0, 2], "For": [0, 3], "cpd": [0, 3], "leav": 0, "class": [0, 1], "input": 0, "dict": 0, "datafram": 0, "output": 0, "base": 0, "A": [0, 3], "contain": [0, 3], "origin": 0, "scenario": [0, 3], "intermedi": 0, "It": 0, "dictionari": 0, "came": 0, "insert": 0, "do": 0, "addit": 0, "hold": 0, "method": 0, "oper": 0, "convert": 0, "when": [0, 3], "combin": [0, 3], "optim": [0, 3], "engin": [0, 3], "should": 0, "docplex": [0, 3], "code": [0, 3], "creat": [0, 3], "interact": [0, 3], "model": [0, 1], "That": 0, "task": 0, "One": 0, "reason": 0, "separ": 0, "re": 0, "e": [0, 3], "g": [0, 3], "visual": [0, 3], "notebook": [0, 3], "prepar": 0, "select": 0, "renam": 0, "column": 0, "index": [0, 1], "assign": 0, "them": 0, "direct": 0, "attribut": 0, "set": 0, "pre": [0, 3], "process": [0, 3], "also": [0, 3], "member": 0, "properti": 0, "static": 0, "apply_and_concat": [0, 2], "field": 0, "func": 0, "column_nam": [0, 2], "multipl": [0, 3], "one": 0, "lambda": 0, "function": [0, 3], "http": 0, "stackoverflow": 0, "com": 0, "question": 0, "23690284": 0, "panda": 0, "return": 0, "valu": 0, "row": 0, "def": 0, "my_funct": 0, "my_input_valu": 0, "my_output_value_1": 0, "1": [0, 3], "my_output_value_2": 0, "my_output_value1": 0, "df": 0, "my_input_column_nam": 0, "my_output_column_name_1": 0, "my_output_column_name_2": 0, "have": [0, 3], "result": 0, "new": 0, "deprec": 0, "sinc": 0, "0": [0, 3], "done": 0, "plain": 0, "altern": 0, "pd": 0, "seri": 0, "axi": 0, "The": [0, 3], "argument": 0, "tupl": 0, "n": 0, "element": 0, "list": 0, "match": 0, "number": 0, "modifi": 0, "df_crossjoin_ai": [0, 2], "df1": 0, "df2": 0, "kwarg": 0, "cross": 0, "join": 0, "cartesian": 0, "product": 0, "between": [0, 3], "two": 0, "constant": 0, "temporari": 0, "kei": 0, "accept": 0, "ar": [0, 3], "singl": 0, "multi": 0, "un": 0, "indic": 0, "merg": 0, "keyword": 0, "pass": 0, "df_crossjoin_mi": [0, 2], "both": [0, 3], "multiindex": 0, "otherwis": 0, "unnam": 0, "df_crossjoin_si": [0, 2], "see": [0, 3], "github": [0, 3], "pydata": 0, "issu": 0, "5401": 0, "mkonrad": 0, "net": 0, "2016": 0, "04": 0, "16": 0, "html": 0, "extract_solut": [0, 2], "extract_dvar_nam": 0, "drop_column_nam": 0, "drop": [0, 3], "bool": 0, "true": 0, "epsilon": 0, "float": 0, "round_decim": 0, "int": 0, "solution_column_name_post_fix": 0, "sol": 0, "allow_mixed_type_column": 0, "fals": 0, "gener": 0, "routin": 0, "solut": 0, "remov": 0, "dvar": [0, 3], "abl": [0, 3], "clean": 0, "case": [0, 3], "cplex": [0, 3], "continu": 0, "veri": 0, "small": 0, "instead": 0, "zero": 0, "thi": [0, 3], "And": 0, "posit": 0, "clip": 0, "neg": 0, "integ": 0, "round": 0, "nearest": 0, "larger": 0, "than": 0, "precis": 0, "where": 0, "all": [0, 3], "below": 0, "threshold": 0, "decim": 0, "postfix": 0, "solution_valu": 0, "python": [0, 3], "express": 0, "get_parameter_valu": [0, 2], "param": 0, "param_nam": 0, "param_typ": 0, "default_valu": 0, "value_format": 0, "y": 0, "m": 0, "d": [0, 3], "h": 0, "": 0, "get": 0, "tabl": [0, 3], "note": 0, "mix": 0, "type": 0, "depend": [0, 3], "what": 0, "other": [0, 3], "explicit": 0, "convers": 0, "expect": 0, "valid": 0, "datetim": 0, "format": 0, "get_raw_table_by_nam": [0, 2], "table_nam": [0, 2], "raw": 0, "non": 0, "prep_paramet": [0, 2], "blank": 0, "instanc": 0, "prepare_data_fram": [0, 2], "prepare_input_data_fram": [0, 2], "placehold": 0, "frame": 0, "particular": [0, 3], "sure": 0, "test": 0, "we": 0, "dashenterpris": 0, "app": 0, "whole": 0, "mytabl": 0, "self": 0, "my_tabl": 0, "set_index": 0, "id": 0, "verify_integr": 0, "prepare_output_data_fram": [0, 2], "kpi": 0, "print_hello": [0, 2], "FOR": 0, "print": 0, "string": 0, "messag": 0, "To": [0, 3], "reload": 0, "cell": [0, 3], "dm": 0, "upload": [0, 3], "wsl": 0, "autoreload": 0, "rerun": 0, "second": 0, "onli": [0, 3], "verifi": 0, "updat": 0, "imp": 0, "start": 0, "print_inputs_outputs_summari": [0, 2], "summari": 0, "along": 0, "set_paramet": [0, 2], "easi": [0, 3], "time_limit": 0, "overridden": 0, "super": 0, "simplenamespac": 0, "individu": 0, "easili": 0, "wml_credenti": 0, "space_nam": 0, "deployed_model_nam": 0, "deployment_id": 0, "default_max_oaas_time_limit_sec": 0, "default_max_run_time_sec": 0, "600": 0, "monitor_loop_delay_sec": 0, "cpd3": [0, 3], "ibm_watson_machine_learn": 0, "apicli": 0, "major": 0, "step": 0, "configur": [0, 3], "intern": 0, "former": [0, 3], "watsonmachinelearningapicli": 0, "commun": 0, "deploi": 0, "solv": [0, 2], "job": 0, "monitor": 0, "run": [0, 3], "loop": 0, "state": 0, "onc": 0, "complet": 0, "mdl": 0, "solve_payload": 0, "get_solve_payload": [0, 2], "payload": 0, "job_detail": 0, "job_uid": 0, "execute_model_v1": 0, "monitor_execution_v1": 0, "extract_solution_v1": 0, "simplest": 0, "statu": 0, "solve_statu": 0, "todo": 0, "debug": 0, "mode": 0, "log": 0, "kill": 0, "stop": 0, "poll": 0, "interv": 0, "execute_model_v2": [0, 2], "max_oaas_time_limit_sec": 0, "wml": [0, 1], "time": 0, "limit": 0, "extract_solution_v2": [0, 2], "get_deployment_id": [0, 2], "model_nam": 0, "find": 0, "get_job_statu": [0, 2], "job_statu": 0, "queu": 0, "fail": 0, "cancel": 0, "rtype": 0, "get_job_status_v2": [0, 2], "retriev": 0, "either": 0, "get_log": [0, 2], "txt": 0, "line": 0, "log_lin": 0, "get_output": [0, 2], "get_solve_detail": [0, 2], "get_solve_details_object": [0, 2], "progress_current_object": 0, "progress_best_object": 0, "get_solve_statu": [0, 2], "retreiv": 0, "get_space_id": [0, 2], "space_id": 0, "monitor_execution_v2": [0, 2], "max_run_time_sec": 0, "execut": 0, "period": 0, "api": [0, 3], "store": [0, 3], "execution_status_json": 0, "execution_statu": 0, "out": 0, "delet": 0, "total": 0, "exce": 0, "maximum": 0, "befor": 0, "must": 0, "master": 0, "initi": 0, "post": [0, 3], "up": [0, 3], "overrid": 0, "constructor": 0, "follow": [0, 3], "order": 0, "retrieve_solve_configur": 0, "set_output_settings_in_solve_configur": 0, "retrieve_debug_materi": 0, "cleanup": 0, "solve_v2": [0, 2], "scenario_nam": [0, 2], "package_path": 0, "deployment_nam": 0, "xxx": 0, "deployment_descript": 0, "tmp_dir": 0, "4": [0, 3], "builder": [0, 1], "md": [0, 3], "deployment_uid": 0, "deploy_model": [0, 2], "how": 0, "root": 0, "specifi": 0, "py": 0, "These": 0, "my_modul": 0, "myclass": 0, "similar": 0, "experi": 0, "anywher": 0, "jupyterlab": [0, 3], "conda": [0, 3], "create_arch": [0, 2], "main_file_path": 0, "archiv": 0, "folder": 0, "main": [0, 1], "written": 0, "create_model_arch": [0, 2], "surround": 0, "boilerpl": 0, "3": [0, 3], "create_model_directori": [0, 2], "Will": 0, "clear": 0, "first": 0, "create_package_extens": [0, 2], "yaml_file_path": 0, "create_software_specif": [0, 2], "pkg_ext_id": 0, "package_extens": 0, "create_zip_package_extens": [0, 2], "package_zip_filepath": 0, "githubusercont": 0, "ipynb": 0, "browser": 0, "chrome": 0, "color_mod": 0, "auto": 0, "commit": 0, "37188b1a8b48be2bef34b35b55f01cba0d29ed19": 0, "devic": 0, "unknown": 0, "enc_url": 0, "68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f49424d2f776174736f6e2d6d616368696e652d6c6561726e696e672d73616d706c65732f333731383862316138623438626532626566333462333562353566303163626130643239656431392f637064342e302f6e6f7465626f6f6b732f707974686f6e5f73646b2f6465706c6f796d656e74732f637573746f6d5f6c6962726172792f5573652532307363696b69742d6c6561726e253230616e64253230637573746f6d2532306c696272617279253230746f2532307072656469637425323074656d70657261747572652e6970796e62": 0, "logged_in": 0, "nwo": 0, "ibm": [0, 3], "2fwatson": 0, "machin": 0, "learn": 0, "sampl": 0, "cpd4": [0, 3], "2fnotebook": 0, "2fpython_sdk": 0, "2fdeploy": 0, "2fcustom_librari": 0, "2fuse": 0, "scikit": 0, "custom": 0, "librari": 0, "predict": 0, "temperatur": 0, "platform": [0, 2], "android": 0, "repository_id": 0, "277618282": 0, "repository_typ": 0, "repositori": [0, 3], "98": 0, "deploy_arch": [0, 2], "model_archive_file_path": 0, "Then": [0, 3], "deploy": [0, 3], "uid": 0, "necessari": 0, "get_scenario": [0, 2], "get_wml_create_deployment_meta_prop": [0, 2], "meta_prop": 0, "creation": 0, "get_wml_create_store_model_meta_prop": [0, 2], "sw_spec_id": 0, "guid_from_space_nam": [0, 2], "space": 0, "handl": 0, "except": 0, "found": 0, "wml_create_deploy": [0, 2], "model_uid": 0, "wml_store_model": [0, 2], "write_main_fil": [0, 2], "templat": 0, "header": 0, "footer": 0, "write_yaml_fil": [0, 2], "yml": 0, "domodeldeployerloc": [0, 2], "experiment": 0, "pleas": 0, "There": 0, "aspect": 0, "hard": 0, "review": 0, "saa": 0, "pip_zip": 0, "zip": [0, 3], "dataplatform": 0, "doc": 0, "wsj": 0, "analyz": 0, "ml": 0, "softwar": 0, "spec": 0, "context": 0, "cpdaa": [0, 2], "get_model_pi": [0, 2], "usual": 0, "node": 0, "too": 0, "slow": 0, "somehow": 0, "extend": 0, "overhead": 0, "itself": 0, "quickli": 0, "still": 0, "give": 0, "thread": 0, "do_model_nam": [0, 2], "longer": [0, 3], "avail": [0, 3], "cpdv3": [0, 3], "cpd2": 0, "curl": 0, "web": 0, "request": 0, "By": 0, "stamp": 0, "wai": 0, "anoth": 0, "cluster": 0, "command": 0, "copi": 0, "past": 0, "termin": 0, "support": 0, "me": [0, 1], "export_do_model": [0, 2], "pattern": 0, "_export_": 0, "yyyymmdd_hhmm": 0, "model1": 0, "model2": 0, "project_id": 0, "user": 0, "collabor": 0, "next": 0, "productionplan": 0, "ef365b2c": 0, "9f28": 0, "447a": 0, "a933": 0, "5de6560a1cfa": 0, "access_tok": 0, "user_nam": 0, "password": 0, "accesstoken": 0, "cpd_cluster_host": 0, "dse": [0, 3], "cp4d25": 0, "cluster4": 0, "cpolab": 0, "access_token": 0, "b7bf7fd8": 0, "aa50": 0, "4bd2": 0, "8364": 0, "02ea6d480895": 0, "cluster_nam": 0, "token": 0, "get_access_token_curl": [0, 2], "get_do_model_export_curl": [0, 2], "xxxxxx": 0, "abov": 0, "git": 0, "bash": 0, "part": 0, "window": 0, "automat": [0, 3], "variabl": 0, "target": [0, 1], "pars": 0, "page": [0, 1], "manual": 0, "show": 0, "firefox": 0, "menu": [0, 3], "develop": [0, 3], "control": 0, "just": 0, "data_id": 0, "21c8ac71": 0, "26c1": 0, "49a5": 0, "a567": 0, "d4c69a0d8158": 0, "mai": 0, "search": [0, 1], "get_project_id": [0, 2], "project_nam": 0, "page_sourc": 0, "full_project_nam": 0, "provid": [0, 3], "entri": 0, "user_access_token": 0, "NOT": [0, 3], "runtime_env_apsx_url": 0, "remot": 0, "url": 0, "alia": 0, "datascienceelit": 0, "within": [0, 3], "br": 0, "end": 0, "get_access_token_web": [0, 2], "respons": 0, "person": 0, "get_do_model_export_web": [0, 2], "write_do_model_to_fil": [0, 2], "data_manag": 0, "zoom_start": 0, "width": 0, "100": 0, "height": 0, "layer_control_posit": 0, "topleft": 0, "build": 0, "folium": [0, 3], "map": [0, 3], "futur": 0, "around": [0, 3], "popup": 0, "469": 0, "speed": 0, "km": 0, "strftime": 0, "spd": 0, "tooltip": 0, "doesn": 0, "t": 0, "yet": 0, "50": 0, "785": 0, "6": [0, 3], "wsl1": 0, "doe": 0, "seem": 0, "add_bar_chart_in_map": [0, 2], "coord": 0, "quantiti": 0, "bar_width": 0, "20": 0, "bar_height_per_unit": 0, "border_color": 0, "background_color": 0, "draw": 0, "bar": 0, "chart": 0, "anchor": 0, "botton": 0, "left": 0, "expand": 0, "right": 0, "mani": [0, 3], "cycl": 0, "through": 0, "defin": 0, "color": 0, "60131314": 0, "star": 0, "marker": 0, "io": 0, "plugin": 0, "beautifyicon": 0, "add_full_screen": [0, 2], "screen": 0, "button": 0, "top": 0, "corner": 0, "unfortun": 0, "jupyt": 0, "ok": 0, "here": 0, "nbviewer": 0, "org": 0, "blob": 0, "add_layer_control": [0, 2], "create_blank_map": [0, 2], "get_arrow": [0, 2], "blue": 0, "size": 0, "n_arrow": 0, "add_to": 0, "arrow": 0, "hypothet": 0, "correctli": 0, "rotat": 0, "plot": 0, "lat": 0, "lon": 0, "repres": 0, "eg": 0, "41": 0, "1132": 0, "96": 0, "1993": 0, "3810": 0, "95": 0, "8021": 0, "polylin": 0, "whatev": 0, "featuregroup": 0, "ad": 0, "medium": 0, "bobhaffn": 0, "25a0fe88e4": 0, "get_bear": [0, 2], "p1": 0, "p2": 0, "compass": 0, "bear": 0, "namedtupl": 0, "gist": 0, "jerom": 0, "2005586": 0, "get_html_tabl": [0, 2], "sequenc": 0, "each": 0, "get_popup_t": [0, 2], "child": 0, "popup_t": 0, "property_1": 0, "value_1": 0, "property_2": 0, "value_2": 0, "icon": 0, "Or": 0, "counti": 0, "add_child": 0, "quot": 0, "text": 0, "problem": 0, "avoid": 0, "replac": 0, "someth": 0, "els": 0, "parse_html": 0, "prevent": 0, "despit": 0, "suggest": 0, "get_tooltip_t": [0, 2], "definit": 0, "conveni": 0, "tooltip_t": 0, "pair": 0, "kansas_city_coord": [0, 2], "39": 0, "085594": 0, "94": 0, "585241": 0, "local_root": 0, "project_access_token": 0, "manag": 0, "excel": [0, 3], "spreadsheet": 0, "look": 0, "relev": 0, "filter": 0, "cogno": 0, "dataset": 0, "_multi_output": 0, "xlsx": 0, "my": 0, "msm": 0, "get_multi_scenario_data": [0, 2], "write_data_to_excel": [0, 2], "add_data_file_to_project": [0, 2], "cp4dv2": 0, "env_is_wscloud": [0, 2], "get_all_scenario_nam": [0, 2], "get_scenarios_df": [0, 2], "get_data_directori": [0, 2], "get_dd_client": [0, 2], "client": [0, 3], "dd_scenario": 0, "get_root_directori": [0, 2], "dsx": 0, "rais": 0, "valueerror": 0, "ones": 0, "more": [0, 3], "later": 0, "load_data_from_scenario": [0, 2], "faster": 0, "merge_scenario_data": [0, 2], "data_by_scenario": 0, "excel_file_nam": 0, "myprogresslisten": [0, 2], "mp": 0, "c": 0, "common": 0, "dse_do_utils_publicgithub": 0, "decis": [0, 3], "utilities_v3": 0, "venv": 0, "lib": 0, "site": 0, "solutionlisten": 0, "notify_progress": [0, 2], "progress_data": 0, "progressdata": 0, "about": 0, "point": 0, "tree": 0, "myoptimizationengin": 0, "solve_kwarg": 0, "export_lp": [0, 2], "export_sav": [0, 2], "export_lp_path": [0, 2], "is_cpo_model": 0, "add_mip_progress_kpi": [0, 2], "mip_gap_kpi_nam": 0, "gap": [0, 3], "solve_time_kpi_nam": 0, "best_bound_kpi_nam": 0, "best": 0, "bound": 0, "solution_count_kpi_nam": 0, "count": 0, "solve_phase_kpi_nam": 0, "phase": 0, "binary_var_seri": [0, 2], "karg": 0, "binaryvartyp": 0, "binary_var_series_": [0, 2], "core": 0, "continuous_var_seri": [0, 2], "continuousvartyp": 0, "continuous_var_series_": [0, 2], "cp_binary_var_seri": [0, 2], "cp": [0, 3], "cpointvar": 0, "cp_binary_var_series_": [0, 2], "cpomodel": 0, "integer_var_list": 0, "ibmdecisionoptim": 0, "binary_var_list": 0, "cp_integer_var_seri": [0, 2], "cp_integer_var_series_": [0, 2], "cp_integer_var_series_s_v2": [0, 2], "min": 0, "max": 0, "domain": 0, "uniqu": 0, "_": 0, "xdvar_1_2_3": 0, "cp_interval_var_seri": [0, 2], "cpointervalvar": 0, "cp_interval_var_series_": [0, 2], "interval_var_list": 0, "highlight": 0, "create_do_model": [0, 2], "union": 0, "kwag": 0, "export_as_cpo": [0, 2], "copy_to_csv": 0, "cpo": 0, "dsx_project_dir": 0, "local": [0, 2], "filenam": 0, "lp": [0, 3], "establish": 0, "export_as_cpo_": [0, 2], "export_model": 0, "export_as_lp": [0, 2], "export_as_lp_path": [0, 2], "lp_file_nam": 0, "my_lp_fil": 0, "conflict": 0, "which": 0, "signatur": 0, "export_as_lp_": [0, 2], "get_kpi_output_t": [0, 2], "integer_var_seri": [0, 2], "most": 0, "effect": 0, "practic": 0, "xdvar": 0, "integervartyp": 0, "integer_var_series_": [0, 2], "semicontinuous_var_seri": [0, 2], "lb": 0, "semicontinuousvartyp": 0, "semicontinuous_var_series_": [0, 2], "semiinteger_var_seri": [0, 2], "semiintegervartyp": 0, "semiinteger_var_series_": [0, 2], "refine_conflict": 0, "solvesolut": 0, "plotli": 0, "get_dash_tab_layout_m": [0, 2], "page_id": 0, "Not": 0, "dse_do_dashboard": 0, "On": 0, "get_tab_layout_": 0, "dash": 0, "dashboard": 0, "get_multi_scenario_compare_select": [0, 2], "compar": 0, "get_multi_scenario_t": [0, 2], "scenario_seq": 0, "get_plotly_fig_m": [0, 2], "callback": 0, "fig": 0, "get_reference_scenario_compare_select": [0, 2], "refer": 0, "plotly_kpi_compare_bar_chart": [0, 2], "figs_per_row": 0, "orient": 0, "v": 0, "graph_obj": 0, "_figur": 0, "figur": 0, "go": 0, "plotlyrowsvisualizationpag": 0, "its": 0, "own": 0, "checkbox": 0, "per": 0, "horizont": 0, "vertic": 0, "autoscenariodbt": [0, 2], "db_table_nam": 0, "scenariodbt": [0, 2], "design": [0, 3], "regular": 0, "At": 0, "create_schema": [0, 2], "insert_table_in_db_bulk": [0, 2], "sqlalchemi": 0, "advantag": 0, "No": 0, "disadvantag": 0, "primari": 0, "foreign": 0, "relat": 0, "thu": 0, "check": 0, "miss": 0, "relationship": 0, "mean": 0, "cannot": 0, "happen": 0, "structur": 0, "create_table_metadata": [0, 2], "metadata": 0, "schema": 0, "multi_scenario": 0, "reflect": 0, "dure": 0, "get_sa_t": [0, 2], "mgr": 0, "connect": [0, 3], "being": 0, "transact": 0, "businesskpit": [0, 2], "business_kpi": 0, "extended_columns_metadata": 0, "databasetyp": [0, 2], "enum": 0, "__init__": 0, "db": 0, "db2": [0, 2], "postgresql": [0, 2], "sqlite": [0, 2], "dbcellupd": [0, 2], "row_index": [0, 2], "current_valu": [0, 2], "previous_valu": [0, 2], "row_idx": [0, 2], "kpitabl": [0, 2], "parametert": [0, 2], "input_db_t": 0, "output_db_t": 0, "credenti": 0, "echo": 0, "enable_transact": 0, "enable_sqlite_fk": 0, "enable_astyp": 0, "enable_debug_print": 0, "enable_scenario_seq": [0, 2], "db_type": 0, "use_custom_naming_convent": 0, "document": [0, 3], "add_scenario_name_to_df": [0, 2], "overwrit": 0, "alreadi": 0, "add_scenario_seq_to_df": [0, 2], "scenarioseq": 0, "delete_scenario_from_db": [0, 2], "enabl": 0, "delete_scenario_name_column": [0, 2], "delete_scenario_seq_column": [0, 2], "drop_all_t": [0, 2], "duplicate_scenario_in_db": [0, 2], "source_scenario_nam": 0, "target_scenario_nam": 0, "duplic": 0, "get_custom_naming_convent": [0, 2], "convent": 0, "en": 0, "constraint": 0, "get_scenario_db_t": [0, 2], "get_scenario_sa_t": [0, 2], "cach": 0, "procedur": 0, "dodashapp": 0, "insert_scenarios_from_zip": [0, 2], "filepath": 0, "skip": 0, "insert_scenarios_in_db": [0, 2], "bulk": 0, "back": 0, "evalu": 0, "insert_table_row": [0, 2], "scenario_table_nam": 0, "insert_tables_in_db": [0, 2], "auto_insert": 0, "wa": 0, "attempt": 0, "without": 0, "you": 0, "want": 0, "read_multi_scenario_tables_from_db": [0, 2], "input_table_nam": 0, "output_table_nam": 0, "read": [0, 1], "empti": 0, "read_scenario_from_db": [0, 2], "multi_thread": 0, "lead": 0, "perform": 0, "improv": 0, "fix": 0, "omit": 0, "read_scenario_input_tables_from_db": [0, 2], "alwai": 0, "read_scenario_table_from_db": [0, 2], "read_scenario_tables_from_db": [0, 2], "rename_scenario_in_db": [0, 2], "replace_scenario_in_db": [0, 2], "ordereddict": 0, "replace_scenario_tables_in_db": [0, 2], "untest": 0, "update_cell_changes_in_db": [0, 2], "db_cell_upd": 0, "update_scenario_output_tables_in_db": [0, 2], "given": 0, "touch": 0, "effici": 0, "update_table_row": [0, 2], "upsert_table_row": [0, 2], "columns_metadata": 0, "constraints_metadata": 0, "abc": 0, "abstract": 0, "subclass": [0, 3], "add_scenario_name_to_fk_constraint": [0, 2], "fkc": 0, "foreignkeyconstraint": 0, "add_scenario_seq_to_fk_constraint": [0, 2], "camel_case_to_snake_cas": [0, 2], "dbm": [0, 2], "df_column_names_to_snake_cas": [0, 2], "camelcas": 0, "snake_cas": 0, "extend_columns_constraint": [0, 2], "sql": 0, "columns_ext": 0, "constraints_ext": 0, "scenariodbtablesubclass": 0, "help": 0, "mutabl": 0, "mykei": 0, "primary_kei": 0, "myvalu": 0, "fixnannonenul": [0, 2], "nan": 0, "turn": 0, "null": 0, "vt20230106": 0, "incarn": 0, "potenti": 0, "na": 0, "get_db_table_nam": [0, 2], "get_df_column_nam": [0, 2], "present": 0, "get_df_column_names_2": [0, 2], "vt": 0, "20220829": 0, "db_tabl": 0, "table_metadata": 0, "properli": 0, "simpli": 0, "truncat": 0, "length": 0, "less": 0, "proper": 0, "reduc": 0, "get_sa_column": [0, 2], "db_column_nam": 0, "astyp": 0, "datatyp": 0, "sqlachemi": 0, "resolve_metadata_column_conflict": [0, 2], "sqlcol": [0, 2], "scenarioseqt": [0, 2], "scenariot": [0, 2], "enumer": 0, "cpd25": [0, 2], "cpd40": [0, 2], "template_scenario_nam": [0, 2], "local_relative_data_path": 0, "data_directori": 0, "sheet": 0, "__index__": 0, "keep": 0, "track": 0, "restor": 0, "31": 0, "mymodel": 0, "myexcelfil": 0, "overwritten": 0, "sm": 0, "scenario_1": 0, "load_data_from_excel": [0, 2], "write_data_into_scenario": [0, 2], "dd": [0, 3], "ignor": [0, 3], "excel_test": 0, "excel_output_file_nam": 0, "csv_directori": 0, "load_data_from_csv": [0, 2], "myexcelfileoutput": 0, "add_data_file_to_project_": [0, 2], "never": 0, "cp4daa": [0, 3], "add_data_file_using_project_lib": [0, 2], "wsuser": 0, "add_data_file_using_ws_lib": [0, 2], "ibm_watson_studio_lib": 0, "cp4dv4": 0, "add_data_file_using_ws_lib_": [0, 2], "add_data_into_scenario": [0, 2], "add_data_into_scenario_": [0, 2], "explicitli": 0, "could": 0, "add_file_as_data_asset": [0, 2], "regist": 0, "add_file_as_data_asset_": [0, 2], "2022": 0, "01": 0, "21": 0, "incorrect": 0, "cpsaa": 0, "autodetect": 0, "clear_scenario_data": [0, 2], "categori": 0, "create_new_scenario": [0, 2], "model_build": 0, "new_scenario_nam": 0, "therebi": 0, "decision_optimization_cli": 0, "detect_platform": [0, 2], "env_is_cpd25": [0, 2], "env_is_cpd40": [0, 2], "cpdv4": [0, 1], "access_project_or_spac": 0, "wslib": 0, "howev": [0, 3], "ugli": 0, "error": 0, "warn": 0, "env_is_dsx": [0, 2], "export_model_as_lp": [0, 2], "exclud": 0, "modelbuild": 0, "get_do_scenario": [0, 2], "entiti": 0, "get_kpis_table_as_datafram": [0, 2], "compat": 0, "represent": 0, "do4w": 0, "get_unique_file_nam": [0, 2], "load_data": [0, 2], "load_from_excel": 0, "input_csv_name_pattern": 0, "output_csv_name_pattern": 0, "glob": 0, "rel": 0, "read_csv": 0, "load_data_from_csv_": [0, 2], "csv_name_pattern": 0, "root_dir": 0, "load_data_from_excel_": [0, 2], "xl": 0, "excelfil": 0, "table_index_sheet": 0, "_table_index_": 0, "df_dict": 0, "driven": 0, "off": 0, "certain": 0, "applic": 0, "restrict": 0, "wil": 0, "those": 0, "categor": 0, "accordingli": 0, "thei": 0, "translat": 0, "abbrevi": 0, "load_data_from_parquet": [0, 2], "input_name_pattern": 0, "parquet": 0, "output_name_pattern": 0, "read_parquet": 0, "load_data_from_parquet_": [0, 2], "file_name_pattern": 0, "load_data_from_scenario_": [0, 2], "load_data_from_zip_csv_": [0, 2], "zip_file_path": 0, "file_size_limit": 0, "byte": 0, "impli": 0, "print_table_nam": [0, 2], "replace_data_in_scenario": [0, 2], "replace_data_into_scenario_": [0, 2], "update_solve_output_into_scenario": [0, 2], "write_data_into_scenario_": [0, 2], "reliabl": 0, "write_data_to_csv": [0, 2], "arg": 0, "write_data_to_csv_": [0, 2], "unique_file_nam": 0, "_output": 0, "throw": 0, "permissionerror": 0, "flag": 0, "write_data_to_excel_": [0, 2], "writer": 0, "excelwrit": 0, "due": 0, "charact": 0, "record": 0, "write_data_to_parquet": [0, 2], "write_data_to_parquet_": [0, 2], "write_data_to_zip_csv_": [0, 2], "to_csv": 0, "widget": [0, 2], "sp": 0, "my_do_model": 0, "get_scenario_picker_ui": [0, 2], "load_selected_scenario_data": [0, 2], "down": [0, 3], "box": 0, "refresh": 0, "maintain": 0, "default_scenario": [0, 2], "therefor": 0, "last": 0, "my_default_scenario": 0, "picker": 0, "forc": 0, "scenariorefreshbutton": [0, 2], "inner": 0, "get_scenario_refresh_button": [0, 2], "get_scenario_select_drop_down": [0, 2], "dropdown": 0, "get_selected_scenario": [0, 2], "ipywidget": 0, "runconfig": [0, 2], "insert_inputs_in_db": [0, 2], "insert_outputs_in_db": [0, 2], "new_schema": [0, 2], "insert_in_do": [0, 2], "write_output_to_excel": [0, 2], "enable_data_check": [0, 2], "enable_data_check_output": [0, 2], "data_check_bulk_insert": [0, 2], "log_level": [0, 2], "enable_refine_conflict": [0, 2], "scenarioconfig": [0, 2], "scenario_x": 0, "scenariogener": [0, 2], "scenario_config": 0, "sc": 0, "variat": 0, "implement": 0, "myscenariogener": 0, "generate_scenario": [0, 2], "new_input": 0, "mytable1": 0, "generate_my_table1": 0, "reset_index": 0, "mytable2": 0, "generate_my_table2": 0, "base_input": 0, "generate_my_t": 0, "get_paramet": [0, 2], "scenario_db_manag": 0, "optimization_engine_class": 0, "core01optimizationengin": 0, "data_manager_class": 0, "core01datamanag": 0, "scenario_db_manager_class": 0, "scenario_generator_class": 0, "my_model": 0, "local_platform": 0, "fine": 0, "though": 0, "create_new_db_schema": [0, 2], "data_check_input": [0, 2], "data_check": 0, "deepcopi": 0, "alter": 0, "basic": [0, 3], "resolv": 0, "granular": 0, "data_check_output": [0, 2], "deriv": 0, "baselin": 0, "specif": 0, "run_config": 0, "load_input_data_from_excel": [0, 2], "run_model": [0, 2], "run_multipl": [0, 2], "run_onc": [0, 2], "write_output_data_to_excel": [0, 2], "add_sys_path": [0, 2], "new_path": 0, "sy": 0, "www": 0, "oreilli": 0, "cookbook": 0, "0596001673": 0, "ch04s23": 0, "challeng": 0, "better": 0, "do_util": 0, "convert_s": [0, 2], "size_byt": 0, "describ": 0, "5194057": 0, "df_itertuples_with_index_nam": [0, 2], "itertupl": 0, "much": 0, "easier": 0, "normal": 0, "index_a": 0, "index_b": 0, "know": 0, "from_product": 0, "rang": 0, "my_column": 0, "len": 0, "over": 0, "tail": 0, "inspir": 0, "46151666": 0, "iter": 0, "list_file_hierarchi": [0, 2], "startpath": 0, "hierarch": 0, "current_dir": 0, "getcwd": 0, "parent_dir": 0, "abspath": 0, "pardir": 0, "parent_dir_2": 0, "grand": 0, "parent": 0, "truth": 0, "setup": 0, "conf": 0, "popul": 0, "458550": 0, "standard": 0, "emb": 0, "dse_do_util": 1, "scope": 1, "modul": [1, 2], "packag": [1, 2, 3], "submodul": 2, "cpd25util": 2, "datamanag": [2, 3], "deployeddomodel": 2, "domodeldeploy": 2, "domodelexport": 2, "mapmanag": [2, 3], "multiscenariomanag": 2, "optimizationengin": [2, 3], "plotly_cpd_workaround": 2, "plotlymanag": 2, "scenariodbmanag": 2, "scenariomanag": [2, 3], "scenariopick": [2, 3], "scenariorunn": 2, "util": [2, 3], "version": [2, 3], "content": 2, "pak": 3, "githubpag": 3, "v0": 3, "neither": 3, "spreadhseet": 3, "mostli": 3, "script": 3, "share": 3, "manipul": 3, "crossjoin": 3, "pick": 3, "v4": 3, "channel": 3, "pypi": 3, "air": 3, "internet": 3, "wheel": 3, "yaml": 3, "userf": 3, "5b4": 3, "py3": 3, "whl": 3, "put": 3, "move": 3, "installationreadm": 3, "detail": 3, "ore": 3, "cp4d": 3, "prem": 3, "might": 3, "intend": 3, "outsid": 3, "interfac": 3}, "objects": {"": [[0, 0, 0, "-", "dse_do_utils"]], "dse_do_utils": [[0, 0, 0, "-", "cpd25utilities"], [0, 0, 0, "-", "datamanager"], [0, 0, 0, "-", "deployeddomodel"], [0, 0, 0, "-", "domodeldeployer"], [0, 0, 0, "-", "domodelexporter"], [0, 0, 0, "-", "mapmanager"], [0, 0, 0, "-", "multiscenariomanager"], [0, 0, 0, "-", "optimizationengine"], [0, 0, 0, "-", "plotly_cpd_workaround"], [0, 0, 0, "-", "plotlymanager"], [0, 0, 0, "-", "scenariodbmanager"], [0, 0, 0, "-", "scenariomanager"], [0, 0, 0, "-", "scenariopicker"], [0, 0, 0, "-", "scenariorunner"], [0, 0, 0, "-", "utilities"], [0, 0, 0, "-", "version"]], "dse_do_utils.cpd25utilities": [[0, 1, 1, "", "add_file_as_data_asset_cpd25"], [0, 1, 1, "", "add_file_path_as_data_asset_cpd25"], [0, 1, 1, "", "add_file_path_as_data_asset_wsc"], [0, 1, 1, "", "write_data_asset_as_file_cpd25"], [0, 1, 1, "", "write_data_asset_as_file_wsc"]], "dse_do_utils.datamanager": [[0, 2, 1, "", "DataManager"]], "dse_do_utils.datamanager.DataManager": [[0, 3, 1, "", "apply_and_concat"], [0, 3, 1, "", "df_crossjoin_ai"], [0, 3, 1, "", "df_crossjoin_mi"], [0, 3, 1, "", "df_crossjoin_si"], [0, 3, 1, "", "extract_solution"], [0, 3, 1, "", "get_parameter_value"], [0, 3, 1, "", "get_raw_table_by_name"], [0, 3, 1, "", "prep_parameters"], [0, 3, 1, "", "prepare_data_frames"], [0, 3, 1, "", "prepare_input_data_frames"], [0, 3, 1, "", "prepare_output_data_frames"], [0, 3, 1, "", "print_hello"], [0, 3, 1, "", "print_inputs_outputs_summary"], [0, 3, 1, "", "set_parameters"]], "dse_do_utils.deployeddomodel": [[0, 2, 1, "", "DeployedDOModel"]], "dse_do_utils.deployeddomodel.DeployedDOModel": [[0, 3, 1, "", "execute_model_v2"], [0, 3, 1, "", "extract_solution_v2"], [0, 3, 1, "", "get_deployment_id"], [0, 3, 1, "", "get_job_status"], [0, 3, 1, "", "get_job_status_v2"], [0, 3, 1, "", "get_log"], [0, 3, 1, "", "get_outputs"], [0, 3, 1, "", "get_solve_details"], [0, 3, 1, "", "get_solve_details_objective"], [0, 3, 1, "", "get_solve_payload"], [0, 3, 1, "", "get_solve_status"], [0, 3, 1, "", "get_space_id"], [0, 3, 1, "", "monitor_execution_v2"], [0, 3, 1, "", "solve"], [0, 3, 1, "", "solve_v2"]], "dse_do_utils.domodeldeployer": [[0, 2, 1, "", "DOModelDeployer"], [0, 2, 1, "", "DOModelDeployerLocal"]], "dse_do_utils.domodeldeployer.DOModelDeployer": [[0, 3, 1, "", "create_archive"], [0, 3, 1, "", "create_model_archive"], [0, 3, 1, "", "create_model_directory"], [0, 3, 1, "", "create_package_extension"], [0, 3, 1, "", "create_software_specification"], [0, 3, 1, "", "create_zip_package_extension"], [0, 3, 1, "", "deploy_archive"], [0, 3, 1, "", "deploy_model"], [0, 3, 1, "", "get_scenario"], [0, 3, 1, "", "get_wml_create_deployment_meta_props"], [0, 3, 1, "", "get_wml_create_store_model_meta_props"], [0, 3, 1, "", "guid_from_space_name"], [0, 3, 1, "", "wml_create_deployment"], [0, 3, 1, "", "wml_store_model"], [0, 3, 1, "", "write_main_file"], [0, 3, 1, "", "write_yaml_file"]], "dse_do_utils.domodeldeployer.DOModelDeployerLocal": [[0, 3, 1, "", "create_archive"], [0, 3, 1, "", "create_model_archive"], [0, 3, 1, "", "create_model_directory"], [0, 3, 1, "", "create_package_extension"], [0, 3, 1, "", "create_software_specification"], [0, 3, 1, "", "create_zip_package_extension"], [0, 3, 1, "", "deploy_archive"], [0, 3, 1, "", "deploy_model"], [0, 3, 1, "", "get_model_py"], [0, 3, 1, "", "get_wml_create_deployment_meta_props"], [0, 3, 1, "", "get_wml_create_store_model_meta_props"], [0, 3, 1, "", "guid_from_space_name"], [0, 3, 1, "", "wml_create_deployment"], [0, 3, 1, "", "wml_store_model"], [0, 3, 1, "", "write_main_file"], [0, 3, 1, "", "write_yaml_file"]], "dse_do_utils.domodelexporter": [[0, 2, 1, "", "DOModelExporter"]], "dse_do_utils.domodelexporter.DOModelExporter": [[0, 3, 1, "", "export_do_models"], [0, 3, 1, "", "get_access_token_curl"], [0, 3, 1, "", "get_access_token_web"], [0, 3, 1, "", "get_do_model_export_curl"], [0, 3, 1, "", "get_do_model_export_web"], [0, 3, 1, "", "get_project_id"], [0, 3, 1, "", "write_do_model_to_file"]], "dse_do_utils.mapmanager": [[0, 2, 1, "", "MapManager"]], "dse_do_utils.mapmanager.MapManager": [[0, 3, 1, "", "add_bar_chart_in_map"], [0, 3, 1, "", "add_full_screen"], [0, 3, 1, "", "add_layer_control"], [0, 3, 1, "", "create_blank_map"], [0, 3, 1, "", "get_arrows"], [0, 3, 1, "", "get_bearing"], [0, 3, 1, "", "get_html_table"], [0, 3, 1, "", "get_popup_table"], [0, 3, 1, "", "get_tooltip_table"], [0, 4, 1, "", "kansas_city_coord"]], "dse_do_utils.multiscenariomanager": [[0, 2, 1, "", "MultiScenarioManager"]], "dse_do_utils.multiscenariomanager.MultiScenarioManager": [[0, 3, 1, "", "add_data_file_to_project"], [0, 3, 1, "", "env_is_wscloud"], [0, 3, 1, "", "get_all_scenario_names"], [0, 3, 1, "", "get_data_directory"], [0, 3, 1, "", "get_dd_client"], [0, 3, 1, "", "get_multi_scenario_data"], [0, 3, 1, "", "get_root_directory"], [0, 3, 1, "", "get_scenarios_df"], [0, 3, 1, "", "load_data_from_scenario"], [0, 3, 1, "", "merge_scenario_data"], [0, 3, 1, "", "write_data_to_excel"]], "dse_do_utils.optimizationengine": [[0, 2, 1, "", "MyProgressListener"], [0, 2, 1, "", "OptimizationEngine"]], "dse_do_utils.optimizationengine.MyProgressListener": [[0, 3, 1, "", "notify_progress"]], "dse_do_utils.optimizationengine.OptimizationEngine": [[0, 3, 1, "", "add_mip_progress_kpis"], [0, 3, 1, "", "binary_var_series"], [0, 3, 1, "", "binary_var_series_s"], [0, 3, 1, "", "continuous_var_series"], [0, 3, 1, "", "continuous_var_series_s"], [0, 3, 1, "", "cp_binary_var_series"], [0, 3, 1, "", "cp_binary_var_series_s"], [0, 3, 1, "", "cp_integer_var_series"], [0, 3, 1, "", "cp_integer_var_series_s"], [0, 3, 1, "", "cp_integer_var_series_s_v2"], [0, 3, 1, "", "cp_interval_var_series"], [0, 3, 1, "", "cp_interval_var_series_s"], [0, 3, 1, "", "create_do_model"], [0, 3, 1, "", "export_as_cpo"], [0, 3, 1, "", "export_as_cpo_s"], [0, 3, 1, "", "export_as_lp"], [0, 3, 1, "", "export_as_lp_path"], [0, 3, 1, "", "export_as_lp_s"], [0, 3, 1, "", "get_kpi_output_table"], [0, 3, 1, "", "integer_var_series"], [0, 3, 1, "", "integer_var_series_s"], [0, 3, 1, "", "semicontinuous_var_series"], [0, 3, 1, "", "semicontinuous_var_series_s"], [0, 3, 1, "", "semiinteger_var_series"], [0, 3, 1, "", "semiinteger_var_series_s"], [0, 3, 1, "", "solve"]], "dse_do_utils.plotlymanager": [[0, 2, 1, "", "PlotlyManager"]], "dse_do_utils.plotlymanager.PlotlyManager": [[0, 3, 1, "", "get_dash_tab_layout_m"], [0, 3, 1, "", "get_multi_scenario_compare_selected"], [0, 3, 1, "", "get_multi_scenario_table"], [0, 3, 1, "", "get_plotly_fig_m"], [0, 3, 1, "", "get_reference_scenario_compare_selected"], [0, 3, 1, "", "plotly_kpi_compare_bar_charts"]], "dse_do_utils.scenariodbmanager": [[0, 2, 1, "", "AutoScenarioDbTable"], [0, 2, 1, "", "BusinessKpiTable"], [0, 2, 1, "", "DatabaseType"], [0, 2, 1, "", "DbCellUpdate"], [0, 2, 1, "", "KpiTable"], [0, 2, 1, "", "ParameterTable"], [0, 2, 1, "", "ScenarioDbManager"], [0, 2, 1, "", "ScenarioDbTable"], [0, 2, 1, "", "ScenarioSeqTable"], [0, 2, 1, "", "ScenarioTable"]], "dse_do_utils.scenariodbmanager.AutoScenarioDbTable": [[0, 3, 1, "", "create_table_metadata"], [0, 3, 1, "", "get_sa_table"], [0, 3, 1, "", "insert_table_in_db_bulk"]], "dse_do_utils.scenariodbmanager.DatabaseType": [[0, 4, 1, "", "DB2"], [0, 4, 1, "", "PostgreSQL"], [0, 4, 1, "", "SQLite"]], "dse_do_utils.scenariodbmanager.DbCellUpdate": [[0, 4, 1, "", "column_name"], [0, 4, 1, "", "current_value"], [0, 4, 1, "", "previous_value"], [0, 4, 1, "", "row_idx"], [0, 4, 1, "", "row_index"], [0, 4, 1, "", "scenario_name"], [0, 4, 1, "", "table_name"]], "dse_do_utils.scenariodbmanager.ScenarioDbManager": [[0, 3, 1, "", "add_scenario_name_to_dfs"], [0, 3, 1, "", "add_scenario_seq_to_dfs"], [0, 3, 1, "", "create_schema"], [0, 3, 1, "", "delete_scenario_from_db"], [0, 3, 1, "", "delete_scenario_name_column"], [0, 3, 1, "", "delete_scenario_seq_column"], [0, 3, 1, "", "drop_all_tables"], [0, 3, 1, "", "duplicate_scenario_in_db"], [0, 3, 1, "", "get_custom_naming_convention"], [0, 3, 1, "", "get_scenario_db_table"], [0, 3, 1, "", "get_scenario_sa_table"], [0, 3, 1, "", "get_scenarios_df"], [0, 3, 1, "", "insert_scenarios_from_zip"], [0, 3, 1, "", "insert_scenarios_in_db"], [0, 3, 1, "", "insert_table_row"], [0, 3, 1, "", "insert_tables_in_db"], [0, 3, 1, "", "read_multi_scenario_tables_from_db"], [0, 3, 1, "", "read_scenario_from_db"], [0, 3, 1, "", "read_scenario_input_tables_from_db"], [0, 3, 1, "", "read_scenario_table_from_db"], [0, 3, 1, "", "read_scenario_tables_from_db"], [0, 3, 1, "", "rename_scenario_in_db"], [0, 3, 1, "", "replace_scenario_in_db"], [0, 3, 1, "", "replace_scenario_tables_in_db"], [0, 3, 1, "", "update_cell_changes_in_db"], [0, 3, 1, "", "update_scenario_output_tables_in_db"], [0, 3, 1, "", "update_table_row"], [0, 3, 1, "", "upsert_table_row"]], "dse_do_utils.scenariodbmanager.ScenarioDbTable": [[0, 3, 1, "", "add_scenario_name_to_fk_constraint"], [0, 3, 1, "", "add_scenario_seq_to_fk_constraint"], [0, 3, 1, "", "camel_case_to_snake_case"], [0, 3, 1, "", "create_table_metadata"], [0, 5, 1, "", "dbm"], [0, 3, 1, "", "df_column_names_to_snake_case"], [0, 5, 1, "", "enable_scenario_seq"], [0, 3, 1, "", "extend_columns_constraints"], [0, 3, 1, "", "fixNanNoneNull"], [0, 3, 1, "", "get_db_table_name"], [0, 3, 1, "", "get_df_column_names"], [0, 3, 1, "", "get_df_column_names_2"], [0, 3, 1, "", "get_sa_column"], [0, 3, 1, "", "get_sa_table"], [0, 3, 1, "", "insert_table_in_db_bulk"], [0, 3, 1, "", "resolve_metadata_column_conflicts"], [0, 3, 1, "", "sqlcol"]], "dse_do_utils.scenariomanager": [[0, 2, 1, "", "Platform"], [0, 2, 1, "", "ScenarioManager"]], "dse_do_utils.scenariomanager.Platform": [[0, 4, 1, "", "CPD25"], [0, 4, 1, "", "CPD40"], [0, 4, 1, "", "CPDaaS"], [0, 4, 1, "", "Local"]], "dse_do_utils.scenariomanager.ScenarioManager": [[0, 3, 1, "", "add_data_file_to_project_s"], [0, 3, 1, "", "add_data_file_using_project_lib"], [0, 3, 1, "", "add_data_file_using_ws_lib"], [0, 3, 1, "", "add_data_file_using_ws_lib_s"], [0, 3, 1, "", "add_data_into_scenario"], [0, 3, 1, "", "add_data_into_scenario_s"], [0, 3, 1, "", "add_file_as_data_asset"], [0, 3, 1, "", "add_file_as_data_asset_s"], [0, 3, 1, "", "clear_scenario_data"], [0, 3, 1, "", "create_new_scenario"], [0, 3, 1, "", "detect_platform"], [0, 3, 1, "", "env_is_cpd25"], [0, 3, 1, "", "env_is_cpd40"], [0, 3, 1, "", "env_is_dsx"], [0, 3, 1, "", "env_is_wscloud"], [0, 3, 1, "", "export_model_as_lp"], [0, 3, 1, "", "get_data_directory"], [0, 3, 1, "", "get_dd_client"], [0, 3, 1, "", "get_do_scenario"], [0, 3, 1, "", "get_kpis_table_as_dataframe"], [0, 3, 1, "", "get_root_directory"], [0, 3, 1, "", "get_unique_file_name"], [0, 3, 1, "", "insert_scenarios_from_zip"], [0, 3, 1, "", "load_data"], [0, 3, 1, "", "load_data_from_csv"], [0, 3, 1, "", "load_data_from_csv_s"], [0, 3, 1, "", "load_data_from_excel"], [0, 3, 1, "", "load_data_from_excel_s"], [0, 3, 1, "", "load_data_from_parquet"], [0, 3, 1, "", "load_data_from_parquet_s"], [0, 3, 1, "", "load_data_from_scenario"], [0, 3, 1, "", "load_data_from_scenario_s"], [0, 3, 1, "", "load_data_from_zip_csv_s"], [0, 3, 1, "", "print_table_names"], [0, 3, 1, "", "replace_data_in_scenario"], [0, 3, 1, "", "replace_data_into_scenario_s"], [0, 3, 1, "", "update_solve_output_into_scenario"], [0, 3, 1, "", "write_data_into_scenario"], [0, 3, 1, "", "write_data_into_scenario_s"], [0, 3, 1, "", "write_data_to_csv"], [0, 3, 1, "", "write_data_to_csv_s"], [0, 3, 1, "", "write_data_to_excel"], [0, 3, 1, "", "write_data_to_excel_s"], [0, 3, 1, "", "write_data_to_parquet"], [0, 3, 1, "", "write_data_to_parquet_s"], [0, 3, 1, "", "write_data_to_zip_csv_s"]], "dse_do_utils.scenariopicker": [[0, 2, 1, "", "ScenarioPicker"]], "dse_do_utils.scenariopicker.ScenarioPicker": [[0, 2, 1, "", "ScenarioRefreshButton"], [0, 4, 1, "", "default_scenario"], [0, 3, 1, "", "get_dd_client"], [0, 3, 1, "", "get_scenario_picker_ui"], [0, 3, 1, "", "get_scenario_refresh_button"], [0, 3, 1, "", "get_scenario_select_drop_down"], [0, 3, 1, "", "get_selected_scenario"], [0, 3, 1, "", "load_selected_scenario_data"], [0, 4, 1, "", "widgets"]], "dse_do_utils.scenariorunner": [[0, 2, 1, "", "RunConfig"], [0, 2, 1, "", "ScenarioConfig"], [0, 2, 1, "", "ScenarioGenerator"], [0, 2, 1, "", "ScenarioRunner"]], "dse_do_utils.scenariorunner.RunConfig": [[0, 4, 1, "", "data_check_bulk_insert"], [0, 4, 1, "", "do_model_name"], [0, 4, 1, "", "enable_data_check"], [0, 4, 1, "", "enable_data_check_outputs"], [0, 4, 1, "", "enable_refine_conflict"], [0, 4, 1, "", "export_lp"], [0, 4, 1, "", "export_lp_path"], [0, 4, 1, "", "export_sav"], [0, 4, 1, "", "insert_in_do"], [0, 4, 1, "", "insert_inputs_in_db"], [0, 4, 1, "", "insert_outputs_in_db"], [0, 4, 1, "", "log_level"], [0, 4, 1, "", "new_schema"], [0, 4, 1, "", "template_scenario_name"], [0, 4, 1, "", "write_output_to_excel"]], "dse_do_utils.scenariorunner.ScenarioConfig": [[0, 4, 1, "", "parameters"], [0, 4, 1, "", "scenario_name"]], "dse_do_utils.scenariorunner.ScenarioGenerator": [[0, 3, 1, "", "generate_scenario"], [0, 3, 1, "", "get_parameters"]], "dse_do_utils.scenariorunner.ScenarioRunner": [[0, 3, 1, "", "create_new_db_schema"], [0, 3, 1, "", "data_check_inputs"], [0, 3, 1, "", "data_check_outputs"], [0, 3, 1, "", "generate_scenario"], [0, 3, 1, "", "insert_in_do"], [0, 3, 1, "", "insert_inputs_in_db"], [0, 3, 1, "", "insert_outputs_in_db"], [0, 3, 1, "", "load_input_data_from_excel"], [0, 3, 1, "", "run_model"], [0, 3, 1, "", "run_multiple"], [0, 3, 1, "", "run_once"], [0, 3, 1, "", "write_output_data_to_excel"]], "dse_do_utils.utilities": [[0, 1, 1, "", "add_sys_path"], [0, 1, 1, "", "convert_size"], [0, 1, 1, "", "df_itertuples_with_index_names"], [0, 1, 1, "", "list_file_hierarchy"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"]}, "titleterms": {"dse_do_util": [0, 2, 3], "packag": 0, "submodul": 0, "cpd25util": 0, "modul": [0, 3], "datamanag": 0, "deployeddomodel": 0, "domodeldeploy": 0, "domodelexport": 0, "mapmanag": 0, "multiscenariomanag": 0, "optimizationengin": 0, "plotly_cpd_workaround": 0, "plotlymanag": 0, "scenariodbmanag": 0, "scenariomanag": 0, "scenariopick": 0, "scenariorunn": 0, "util": [0, 1], "version": 0, "content": [0, 1], "welcom": 1, "dse": 1, "do": [1, 3], "document": 1, "indic": 1, "tabl": 1, "read": 3, "me": 3, "import": 3, "main": 3, "class": 3, "instal": 3, "cpdv4": 3, "5": 3, "custom": 3, "environ": 3, "target": 3, "model": 3, "builder": 3, "wml": 3, "scope": 3, "requir": 3}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"dse_do_utils package": [[0, "dse-do-utils-package"]], "Submodules": [[0, "submodules"]], "dse_do_utils.cpd25utilities module": [[0, "module-dse_do_utils.cpd25utilities"]], "dse_do_utils.datamanager module": [[0, "module-dse_do_utils.datamanager"]], "dse_do_utils.deployeddomodel module": [[0, "module-dse_do_utils.deployeddomodel"]], "dse_do_utils.domodeldeployer module": [[0, "module-dse_do_utils.domodeldeployer"]], "dse_do_utils.domodelexporter module": [[0, "module-dse_do_utils.domodelexporter"]], "dse_do_utils.mapmanager module": [[0, "module-dse_do_utils.mapmanager"]], "dse_do_utils.multiscenariomanager module": [[0, "module-dse_do_utils.multiscenariomanager"]], "dse_do_utils.optimizationengine module": [[0, "module-dse_do_utils.optimizationengine"]], "dse_do_utils.plotly_cpd_workaround module": [[0, "module-dse_do_utils.plotly_cpd_workaround"]], "dse_do_utils.plotlymanager module": [[0, "module-dse_do_utils.plotlymanager"]], "dse_do_utils.scenariodbmanager module": [[0, "module-dse_do_utils.scenariodbmanager"]], "dse_do_utils.scenariomanager module": [[0, "module-dse_do_utils.scenariomanager"]], "dse_do_utils.scenariopicker module": [[0, "module-dse_do_utils.scenariopicker"]], "dse_do_utils.scenariorunner module": [[0, "module-dse_do_utils.scenariorunner"]], "dse_do_utils.utilities module": [[0, "module-dse_do_utils.utilities"]], "dse_do_utils.version module": [[0, "module-dse_do_utils.version"]], "Module contents": [[0, "module-dse_do_utils"]], "Welcome to DSE DO Utils documentation!": [[1, "welcome-to-dse-do-utils-documentation"]], "Contents:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]], "dse_do_utils": [[2, "dse-do-utils"]], "Read me": [[3, "read-me"]], "DSE_DO_Utils": [[3, "dse-do-utils"]], "Important": [[3, "important"]], "Main classes:": [[3, "main-classes"]], "Installation on CPDv4.5": [[3, "installation-on-cpdv4-5"]], "Install in customized environment": [[3, "install-in-customized-environment"]], "Import": [[3, "import"]], "Target environments": [[3, "target-environments"]], "DO Model Builder and WML environments": [[3, "do-model-builder-and-wml-environments"]], "Scope of classes/modules": [[3, "scope-of-classes-modules"]], "Requirements": [[3, "requirements"]]}, "indexentries": {"autoscenariodbtable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable"]], "businesskpitable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.BusinessKpiTable"]], "cpd25 (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.CPD25"]], "cpd40 (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.CPD40"]], "cpdaas (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.CPDaaS"]], "db2 (dse_do_utils.scenariodbmanager.databasetype attribute)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType.DB2"]], "domodeldeployer (class in dse_do_utils.domodeldeployer)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer"]], "domodeldeployerlocal (class in dse_do_utils.domodeldeployer)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal"]], "domodelexporter (class in dse_do_utils.domodelexporter)": [[0, "dse_do_utils.domodelexporter.DOModelExporter"]], "datamanager (class in dse_do_utils.datamanager)": [[0, "dse_do_utils.datamanager.DataManager"]], "databasetype (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType"]], "dbcellupdate (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate"]], "deployeddomodel (class in dse_do_utils.deployeddomodel)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel"]], "kpitable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.KpiTable"]], "local (dse_do_utils.scenariomanager.platform attribute)": [[0, "dse_do_utils.scenariomanager.Platform.Local"]], "mapmanager (class in dse_do_utils.mapmanager)": [[0, "dse_do_utils.mapmanager.MapManager"]], "multiscenariomanager (class in dse_do_utils.multiscenariomanager)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager"]], "myprogresslistener (class in dse_do_utils.optimizationengine)": [[0, "dse_do_utils.optimizationengine.MyProgressListener"]], "optimizationengine (class in dse_do_utils.optimizationengine)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine"]], "parametertable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ParameterTable"]], "platform (class in dse_do_utils.scenariomanager)": [[0, "dse_do_utils.scenariomanager.Platform"]], "plotlymanager (class in dse_do_utils.plotlymanager)": [[0, "dse_do_utils.plotlymanager.PlotlyManager"]], "postgresql (dse_do_utils.scenariodbmanager.databasetype attribute)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType.PostgreSQL"]], "runconfig (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.RunConfig"]], "sqlite (dse_do_utils.scenariodbmanager.databasetype attribute)": [[0, "dse_do_utils.scenariodbmanager.DatabaseType.SQLite"]], "scenarioconfig (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.ScenarioConfig"]], "scenariodbmanager (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager"]], "scenariodbtable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable"]], "scenariogenerator (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.ScenarioGenerator"]], "scenariomanager (class in dse_do_utils.scenariomanager)": [[0, "dse_do_utils.scenariomanager.ScenarioManager"]], "scenariopicker (class in dse_do_utils.scenariopicker)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker"]], "scenariopicker.scenariorefreshbutton (class in dse_do_utils.scenariopicker)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.ScenarioRefreshButton"]], "scenariorunner (class in dse_do_utils.scenariorunner)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner"]], "scenarioseqtable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioSeqTable"]], "scenariotable (class in dse_do_utils.scenariodbmanager)": [[0, "dse_do_utils.scenariodbmanager.ScenarioTable"]], "add_bar_chart_in_map() (dse_do_utils.mapmanager.mapmanager method)": [[0, "dse_do_utils.mapmanager.MapManager.add_bar_chart_in_map"]], "add_data_file_to_project() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.add_data_file_to_project"]], "add_data_file_to_project_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_to_project_s"]], "add_data_file_using_project_lib() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_using_project_lib"]], "add_data_file_using_ws_lib() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_using_ws_lib"]], "add_data_file_using_ws_lib_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_file_using_ws_lib_s"]], "add_data_into_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_into_scenario"]], "add_data_into_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_data_into_scenario_s"]], "add_file_as_data_asset() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_file_as_data_asset"]], "add_file_as_data_asset_cpd25() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.add_file_as_data_asset_cpd25"]], "add_file_as_data_asset_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.add_file_as_data_asset_s"]], "add_file_path_as_data_asset_cpd25() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.add_file_path_as_data_asset_cpd25"]], "add_file_path_as_data_asset_wsc() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.add_file_path_as_data_asset_wsc"]], "add_full_screen() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.add_full_screen"]], "add_layer_control() (dse_do_utils.mapmanager.mapmanager method)": [[0, "dse_do_utils.mapmanager.MapManager.add_layer_control"]], "add_mip_progress_kpis() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.add_mip_progress_kpis"]], "add_scenario_name_to_dfs() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.add_scenario_name_to_dfs"]], "add_scenario_name_to_fk_constraint() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.add_scenario_name_to_fk_constraint"]], "add_scenario_seq_to_dfs() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.add_scenario_seq_to_dfs"]], "add_scenario_seq_to_fk_constraint() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.add_scenario_seq_to_fk_constraint"]], "add_sys_path() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.add_sys_path"]], "apply_and_concat() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.apply_and_concat"]], "binary_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.binary_var_series"]], "binary_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.binary_var_series_s"]], "camel_case_to_snake_case() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.camel_case_to_snake_case"]], "clear_scenario_data() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.clear_scenario_data"]], "column_name (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.column_name"]], "continuous_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.continuous_var_series"]], "continuous_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.continuous_var_series_s"]], "convert_size() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.convert_size"]], "cp_binary_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_binary_var_series"]], "cp_binary_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_binary_var_series_s"]], "cp_integer_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_integer_var_series"]], "cp_integer_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_integer_var_series_s"]], "cp_integer_var_series_s_v2() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_integer_var_series_s_v2"]], "cp_interval_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_interval_var_series"]], "cp_interval_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.cp_interval_var_series_s"]], "create_archive() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_archive"]], "create_archive() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_archive"]], "create_blank_map() (dse_do_utils.mapmanager.mapmanager method)": [[0, "dse_do_utils.mapmanager.MapManager.create_blank_map"]], "create_do_model() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.create_do_model"]], "create_model_archive() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_model_archive"]], "create_model_archive() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_model_archive"]], "create_model_directory() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_model_directory"]], "create_model_directory() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_model_directory"]], "create_new_db_schema() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.create_new_db_schema"]], "create_new_scenario() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.create_new_scenario"]], "create_package_extension() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_package_extension"]], "create_package_extension() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_package_extension"]], "create_schema() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.create_schema"]], "create_software_specification() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_software_specification"]], "create_software_specification() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_software_specification"]], "create_table_metadata() (dse_do_utils.scenariodbmanager.autoscenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable.create_table_metadata"]], "create_table_metadata() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.create_table_metadata"]], "create_zip_package_extension() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.create_zip_package_extension"]], "create_zip_package_extension() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.create_zip_package_extension"]], "current_value (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.current_value"]], "data_check_bulk_insert (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.data_check_bulk_insert"]], "data_check_inputs() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.data_check_inputs"]], "data_check_outputs() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.data_check_outputs"]], "dbm (dse_do_utils.scenariodbmanager.scenariodbtable property)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.dbm"]], "default_scenario (dse_do_utils.scenariopicker.scenariopicker attribute)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.default_scenario"]], "delete_scenario_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.delete_scenario_from_db"]], "delete_scenario_name_column() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.delete_scenario_name_column"]], "delete_scenario_seq_column() (dse_do_utils.scenariodbmanager.scenariodbmanager static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.delete_scenario_seq_column"]], "deploy_archive() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.deploy_archive"]], "deploy_archive() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.deploy_archive"]], "deploy_model() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.deploy_model"]], "deploy_model() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.deploy_model"]], "detect_platform() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.detect_platform"]], "df_column_names_to_snake_case() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.df_column_names_to_snake_case"]], "df_crossjoin_ai() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.df_crossjoin_ai"]], "df_crossjoin_mi() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.df_crossjoin_mi"]], "df_crossjoin_si() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.df_crossjoin_si"]], "df_itertuples_with_index_names() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.df_itertuples_with_index_names"]], "do_model_name (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.do_model_name"]], "drop_all_tables() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.drop_all_tables"]], "dse_do_utils": [[0, "module-dse_do_utils"]], "dse_do_utils.cpd25utilities": [[0, "module-dse_do_utils.cpd25utilities"]], "dse_do_utils.datamanager": [[0, "module-dse_do_utils.datamanager"]], "dse_do_utils.deployeddomodel": [[0, "module-dse_do_utils.deployeddomodel"]], "dse_do_utils.domodeldeployer": [[0, "module-dse_do_utils.domodeldeployer"]], "dse_do_utils.domodelexporter": [[0, "module-dse_do_utils.domodelexporter"]], "dse_do_utils.mapmanager": [[0, "module-dse_do_utils.mapmanager"]], "dse_do_utils.multiscenariomanager": [[0, "module-dse_do_utils.multiscenariomanager"]], "dse_do_utils.optimizationengine": [[0, "module-dse_do_utils.optimizationengine"]], "dse_do_utils.plotly_cpd_workaround": [[0, "module-dse_do_utils.plotly_cpd_workaround"]], "dse_do_utils.plotlymanager": [[0, "module-dse_do_utils.plotlymanager"]], "dse_do_utils.scenariodbmanager": [[0, "module-dse_do_utils.scenariodbmanager"]], "dse_do_utils.scenariomanager": [[0, "module-dse_do_utils.scenariomanager"]], "dse_do_utils.scenariopicker": [[0, "module-dse_do_utils.scenariopicker"]], "dse_do_utils.scenariorunner": [[0, "module-dse_do_utils.scenariorunner"]], "dse_do_utils.utilities": [[0, "module-dse_do_utils.utilities"]], "dse_do_utils.version": [[0, "module-dse_do_utils.version"]], "duplicate_scenario_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.duplicate_scenario_in_db"]], "enable_data_check (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.enable_data_check"]], "enable_data_check_outputs (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.enable_data_check_outputs"]], "enable_refine_conflict (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.enable_refine_conflict"]], "enable_scenario_seq (dse_do_utils.scenariodbmanager.scenariodbtable property)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.enable_scenario_seq"]], "env_is_cpd25() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_cpd25"]], "env_is_cpd40() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_cpd40"]], "env_is_dsx() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_dsx"]], "env_is_wscloud() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.env_is_wscloud"]], "env_is_wscloud() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.env_is_wscloud"]], "execute_model_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.execute_model_v2"]], "export_as_cpo() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_cpo"]], "export_as_cpo_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_cpo_s"]], "export_as_lp() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_lp"]], "export_as_lp_path() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_lp_path"]], "export_as_lp_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.export_as_lp_s"]], "export_do_models() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.export_do_models"]], "export_lp (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.export_lp"]], "export_lp_path (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.export_lp_path"]], "export_model_as_lp() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.export_model_as_lp"]], "export_sav (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.export_sav"]], "extend_columns_constraints() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.extend_columns_constraints"]], "extract_solution() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.extract_solution"]], "extract_solution_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.extract_solution_v2"]], "fixnannonenull() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.fixNanNoneNull"]], "generate_scenario() (dse_do_utils.scenariorunner.scenariogenerator method)": [[0, "dse_do_utils.scenariorunner.ScenarioGenerator.generate_scenario"]], "generate_scenario() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.generate_scenario"]], "get_access_token_curl() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_access_token_curl"]], "get_access_token_web() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_access_token_web"]], "get_all_scenario_names() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_all_scenario_names"]], "get_arrows() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_arrows"]], "get_bearing() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_bearing"]], "get_custom_naming_convention() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_custom_naming_convention"]], "get_dash_tab_layout_m() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_dash_tab_layout_m"]], "get_data_directory() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_data_directory"]], "get_data_directory() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_data_directory"]], "get_db_table_name() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_db_table_name"]], "get_dd_client() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_dd_client"]], "get_dd_client() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_dd_client"]], "get_dd_client() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_dd_client"]], "get_deployment_id() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_deployment_id"]], "get_df_column_names() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_df_column_names"]], "get_df_column_names_2() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_df_column_names_2"]], "get_do_model_export_curl() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_do_model_export_curl"]], "get_do_model_export_web() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_do_model_export_web"]], "get_do_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_do_scenario"]], "get_html_table() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_html_table"]], "get_job_status() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_job_status"]], "get_job_status_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_job_status_v2"]], "get_kpi_output_table() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.get_kpi_output_table"]], "get_kpis_table_as_dataframe() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_kpis_table_as_dataframe"]], "get_log() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_log"]], "get_model_py() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.get_model_py"]], "get_multi_scenario_compare_selected() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_multi_scenario_compare_selected"]], "get_multi_scenario_data() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_multi_scenario_data"]], "get_multi_scenario_table() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_multi_scenario_table"]], "get_outputs() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_outputs"]], "get_parameter_value() (dse_do_utils.datamanager.datamanager static method)": [[0, "dse_do_utils.datamanager.DataManager.get_parameter_value"]], "get_parameters() (dse_do_utils.scenariorunner.scenariogenerator method)": [[0, "dse_do_utils.scenariorunner.ScenarioGenerator.get_parameters"]], "get_plotly_fig_m() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_plotly_fig_m"]], "get_popup_table() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_popup_table"]], "get_project_id() (dse_do_utils.domodelexporter.domodelexporter static method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.get_project_id"]], "get_raw_table_by_name() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.get_raw_table_by_name"]], "get_reference_scenario_compare_selected() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.get_reference_scenario_compare_selected"]], "get_root_directory() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_root_directory"]], "get_root_directory() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_root_directory"]], "get_sa_column() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_sa_column"]], "get_sa_table() (dse_do_utils.scenariodbmanager.autoscenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable.get_sa_table"]], "get_sa_table() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.get_sa_table"]], "get_scenario() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.get_scenario"]], "get_scenario_db_table() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_scenario_db_table"]], "get_scenario_picker_ui() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_scenario_picker_ui"]], "get_scenario_refresh_button() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_scenario_refresh_button"]], "get_scenario_sa_table() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_scenario_sa_table"]], "get_scenario_select_drop_down() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_scenario_select_drop_down"]], "get_scenarios_df() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.get_scenarios_df"]], "get_scenarios_df() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.get_scenarios_df"]], "get_selected_scenario() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.get_selected_scenario"]], "get_solve_details() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_details"]], "get_solve_details_objective() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_details_objective"]], "get_solve_payload() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_payload"]], "get_solve_status() (dse_do_utils.deployeddomodel.deployeddomodel static method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_solve_status"]], "get_space_id() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.get_space_id"]], "get_tooltip_table() (dse_do_utils.mapmanager.mapmanager static method)": [[0, "dse_do_utils.mapmanager.MapManager.get_tooltip_table"]], "get_unique_file_name() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.get_unique_file_name"]], "get_wml_create_deployment_meta_props() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.get_wml_create_deployment_meta_props"]], "get_wml_create_deployment_meta_props() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.get_wml_create_deployment_meta_props"]], "get_wml_create_store_model_meta_props() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.get_wml_create_store_model_meta_props"]], "get_wml_create_store_model_meta_props() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.get_wml_create_store_model_meta_props"]], "guid_from_space_name() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.guid_from_space_name"]], "guid_from_space_name() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.guid_from_space_name"]], "insert_in_do (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.insert_in_do"]], "insert_in_do() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.insert_in_do"]], "insert_inputs_in_db (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.insert_inputs_in_db"]], "insert_inputs_in_db() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.insert_inputs_in_db"]], "insert_outputs_in_db (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.insert_outputs_in_db"]], "insert_outputs_in_db() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.insert_outputs_in_db"]], "insert_scenarios_from_zip() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_scenarios_from_zip"]], "insert_scenarios_from_zip() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.insert_scenarios_from_zip"]], "insert_scenarios_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_scenarios_in_db"]], "insert_table_in_db_bulk() (dse_do_utils.scenariodbmanager.autoscenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.AutoScenarioDbTable.insert_table_in_db_bulk"]], "insert_table_in_db_bulk() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.insert_table_in_db_bulk"]], "insert_table_row() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_table_row"]], "insert_tables_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.insert_tables_in_db"]], "integer_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.integer_var_series"]], "integer_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.integer_var_series_s"]], "kansas_city_coord (dse_do_utils.mapmanager.mapmanager attribute)": [[0, "dse_do_utils.mapmanager.MapManager.kansas_city_coord"]], "list_file_hierarchy() (in module dse_do_utils.utilities)": [[0, "dse_do_utils.utilities.list_file_hierarchy"]], "load_data() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data"]], "load_data_from_csv() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_csv"]], "load_data_from_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_csv_s"]], "load_data_from_excel() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_excel"]], "load_data_from_excel_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_excel_s"]], "load_data_from_parquet() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_parquet"]], "load_data_from_parquet_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_parquet_s"]], "load_data_from_scenario() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.load_data_from_scenario"]], "load_data_from_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_scenario"]], "load_data_from_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_scenario_s"]], "load_data_from_zip_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.load_data_from_zip_csv_s"]], "load_input_data_from_excel() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.load_input_data_from_excel"]], "load_selected_scenario_data() (dse_do_utils.scenariopicker.scenariopicker method)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.load_selected_scenario_data"]], "log_level (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.log_level"]], "merge_scenario_data() (dse_do_utils.multiscenariomanager.multiscenariomanager static method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.merge_scenario_data"]], "module": [[0, "module-dse_do_utils"], [0, "module-dse_do_utils.cpd25utilities"], [0, "module-dse_do_utils.datamanager"], [0, "module-dse_do_utils.deployeddomodel"], [0, "module-dse_do_utils.domodeldeployer"], [0, "module-dse_do_utils.domodelexporter"], [0, "module-dse_do_utils.mapmanager"], [0, "module-dse_do_utils.multiscenariomanager"], [0, "module-dse_do_utils.optimizationengine"], [0, "module-dse_do_utils.plotly_cpd_workaround"], [0, "module-dse_do_utils.plotlymanager"], [0, "module-dse_do_utils.scenariodbmanager"], [0, "module-dse_do_utils.scenariomanager"], [0, "module-dse_do_utils.scenariopicker"], [0, "module-dse_do_utils.scenariorunner"], [0, "module-dse_do_utils.utilities"], [0, "module-dse_do_utils.version"]], "monitor_execution_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.monitor_execution_v2"]], "new_schema (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.new_schema"]], "notify_progress() (dse_do_utils.optimizationengine.myprogresslistener method)": [[0, "dse_do_utils.optimizationengine.MyProgressListener.notify_progress"]], "parameters (dse_do_utils.scenariorunner.scenarioconfig attribute)": [[0, "dse_do_utils.scenariorunner.ScenarioConfig.parameters"]], "plotly_kpi_compare_bar_charts() (dse_do_utils.plotlymanager.plotlymanager method)": [[0, "dse_do_utils.plotlymanager.PlotlyManager.plotly_kpi_compare_bar_charts"]], "prep_parameters() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prep_parameters"]], "prepare_data_frames() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prepare_data_frames"]], "prepare_input_data_frames() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prepare_input_data_frames"]], "prepare_output_data_frames() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.prepare_output_data_frames"]], "previous_value (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.previous_value"]], "print_hello() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.print_hello"]], "print_inputs_outputs_summary() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.print_inputs_outputs_summary"]], "print_table_names() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.print_table_names"]], "read_multi_scenario_tables_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_multi_scenario_tables_from_db"]], "read_scenario_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_from_db"]], "read_scenario_input_tables_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_input_tables_from_db"]], "read_scenario_table_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_table_from_db"]], "read_scenario_tables_from_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.read_scenario_tables_from_db"]], "rename_scenario_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.rename_scenario_in_db"]], "replace_data_in_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.replace_data_in_scenario"]], "replace_data_into_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.replace_data_into_scenario_s"]], "replace_scenario_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.replace_scenario_in_db"]], "replace_scenario_tables_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.replace_scenario_tables_in_db"]], "resolve_metadata_column_conflicts() (dse_do_utils.scenariodbmanager.scenariodbtable method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.resolve_metadata_column_conflicts"]], "row_idx (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.row_idx"]], "row_index (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.row_index"]], "run_model() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.run_model"]], "run_multiple() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.run_multiple"]], "run_once() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.run_once"]], "scenario_name (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.scenario_name"]], "scenario_name (dse_do_utils.scenariorunner.scenarioconfig attribute)": [[0, "dse_do_utils.scenariorunner.ScenarioConfig.scenario_name"]], "semicontinuous_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semicontinuous_var_series"]], "semicontinuous_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semicontinuous_var_series_s"]], "semiinteger_var_series() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semiinteger_var_series"]], "semiinteger_var_series_s() (dse_do_utils.optimizationengine.optimizationengine static method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.semiinteger_var_series_s"]], "set_parameters() (dse_do_utils.datamanager.datamanager method)": [[0, "dse_do_utils.datamanager.DataManager.set_parameters"]], "solve() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.solve"]], "solve() (dse_do_utils.optimizationengine.optimizationengine method)": [[0, "dse_do_utils.optimizationengine.OptimizationEngine.solve"]], "solve_v2() (dse_do_utils.deployeddomodel.deployeddomodel method)": [[0, "dse_do_utils.deployeddomodel.DeployedDOModel.solve_v2"]], "sqlcol() (dse_do_utils.scenariodbmanager.scenariodbtable static method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbTable.sqlcol"]], "table_name (dse_do_utils.scenariodbmanager.dbcellupdate attribute)": [[0, "dse_do_utils.scenariodbmanager.DbCellUpdate.table_name"]], "template_scenario_name (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.template_scenario_name"]], "update_cell_changes_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.update_cell_changes_in_db"]], "update_scenario_output_tables_in_db() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.update_scenario_output_tables_in_db"]], "update_solve_output_into_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.update_solve_output_into_scenario"]], "update_table_row() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.update_table_row"]], "upsert_table_row() (dse_do_utils.scenariodbmanager.scenariodbmanager method)": [[0, "dse_do_utils.scenariodbmanager.ScenarioDbManager.upsert_table_row"]], "widgets (dse_do_utils.scenariopicker.scenariopicker attribute)": [[0, "dse_do_utils.scenariopicker.ScenarioPicker.widgets"]], "wml_create_deployment() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.wml_create_deployment"]], "wml_create_deployment() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.wml_create_deployment"]], "wml_store_model() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.wml_store_model"]], "wml_store_model() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.wml_store_model"]], "write_data_asset_as_file_cpd25() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.write_data_asset_as_file_cpd25"]], "write_data_asset_as_file_wsc() (in module dse_do_utils.cpd25utilities)": [[0, "dse_do_utils.cpd25utilities.write_data_asset_as_file_wsc"]], "write_data_into_scenario() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_into_scenario"]], "write_data_into_scenario_s() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_into_scenario_s"]], "write_data_to_csv() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_csv"]], "write_data_to_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_csv_s"]], "write_data_to_excel() (dse_do_utils.multiscenariomanager.multiscenariomanager method)": [[0, "dse_do_utils.multiscenariomanager.MultiScenarioManager.write_data_to_excel"]], "write_data_to_excel() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_excel"]], "write_data_to_excel_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_excel_s"]], "write_data_to_parquet() (dse_do_utils.scenariomanager.scenariomanager method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_parquet"]], "write_data_to_parquet_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_parquet_s"]], "write_data_to_zip_csv_s() (dse_do_utils.scenariomanager.scenariomanager static method)": [[0, "dse_do_utils.scenariomanager.ScenarioManager.write_data_to_zip_csv_s"]], "write_do_model_to_file() (dse_do_utils.domodelexporter.domodelexporter method)": [[0, "dse_do_utils.domodelexporter.DOModelExporter.write_do_model_to_file"]], "write_main_file() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.write_main_file"]], "write_main_file() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.write_main_file"]], "write_output_data_to_excel() (dse_do_utils.scenariorunner.scenariorunner method)": [[0, "dse_do_utils.scenariorunner.ScenarioRunner.write_output_data_to_excel"]], "write_output_to_excel (dse_do_utils.scenariorunner.runconfig attribute)": [[0, "dse_do_utils.scenariorunner.RunConfig.write_output_to_excel"]], "write_yaml_file() (dse_do_utils.domodeldeployer.domodeldeployer method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployer.write_yaml_file"]], "write_yaml_file() (dse_do_utils.domodeldeployer.domodeldeployerlocal method)": [[0, "dse_do_utils.domodeldeployer.DOModelDeployerLocal.write_yaml_file"]]}}) \ No newline at end of file diff --git a/dse_do_utils/version.py b/dse_do_utils/version.py index 226edc5..732adff 100644 --- a/dse_do_utils/version.py +++ b/dse_do_utils/version.py @@ -9,4 +9,4 @@ See https://stackoverflow.com/questions/458550/standard-way-to-embed-version-into-python-package """ -__version__ = "0.5.7.0b0" +__version__ = "0.5.7.0"