desdeo 2.1.0__tar.gz → 2.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {desdeo-2.1.0 → desdeo-2.1.1}/PKG-INFO +3 -4
- {desdeo-2.1.0 → desdeo-2.1.1}/README.md +2 -3
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/__init__.py +12 -11
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/evaluator.py +4 -5
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/gurobipy_evaluator.py +37 -12
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/infix_parser.py +1 -16
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/json_parser.py +7 -11
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/schema.py +6 -9
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/utils.py +1 -1
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/pyomo_solver_interfaces.py +1 -1
- {desdeo-2.1.0 → desdeo-2.1.1}/pyproject.toml +27 -48
- {desdeo-2.1.0 → desdeo-2.1.1}/LICENSE +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/ADMAfsar.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/ADMChen.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/BaseADM.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/README.md +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/app.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/config.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/config.toml +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/db.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/db_init.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/db_models.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/malaga_db_init.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/archive.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/emo.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/enautilus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gdm_aggregate.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gdm_base.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gdm_score_bands.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gnimbus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/generic.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/generic_states.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/nimbus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/preference.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/reference_point_method.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/session.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/state.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/user.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/utopia.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_EMO.backup +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_NAUTILUS.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_NAUTILUS_navigator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_NIMBUS.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/emo.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/enautilus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_aggregate.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_base.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_score_bands/gdm_score_bands_manager.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_score_bands/gdm_score_bands_routers.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gnimbus/gnimbus_manager.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gnimbus/gnimbus_routers.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/generic.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/nimbus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/reference_point_method.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/session.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/test.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/user_authentication.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/utils.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/utopia.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/schema.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/conftest.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/test_enautilus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/test_models.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/test_routes.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/_database.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/_logger.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/database.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/emo_database.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/core.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/hooks/archivers.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/EAs.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/bases.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/templates.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/crossover.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/evaluator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/generator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/mutation.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/scalar_selection.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/selection.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/termination.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/algorithms.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/crossover.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/generator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/mutation.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/repair.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/scalar_selection.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/selection.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/templates.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/termination.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/explanations/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/explanations/explainer.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/explanations/utils.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/gdmtools.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/score_bands.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/voting_rules.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/enautilus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/gnimbus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nautili.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nautilus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nautilus_navigator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nimbus.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/pareto_navigator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/reference_point_method.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/core.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/pymoo_provider.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/runtime.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/pyomo_evaluator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/simulator_evaluator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/sympy_evaluator.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/benchmarks_server.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/binh_and_korn_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/cake_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/dmitry_forest_problem_discrete.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/dtlz2_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/forest_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/knapsack_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/mcwb_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/mixed_variable_dimenrions_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/momip_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/multi_valued_constraints.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/nimbus_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/pareto_navigator_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/re_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/river_pollution_problems.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/rocket_injector_design_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/simple_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/simulator_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/single_objective.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/spanish_sustainability_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/zdt_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/GenerateReferencePoints.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/desc_gen.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/generics.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/group_scalarization.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/gurobipy_solver_interfaces.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/indicators_binary.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/indicators_unary.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/interaction_schema.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/intersection.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/iterative_pareto_representer.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/message.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/ng_solver_interfaces.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/non_dominated_sorting.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/patterns.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/proximal_solver.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/reference_vectors.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/scalarization.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/scipy_solver_interfaces.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/score_bands.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/utils.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/visualizations.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/__init__.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/1.json +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/2.json +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/3.json +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/4.json +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/5.json +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/from_json.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/reinit_user.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_db_init.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_problem.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_problem_old.py +0 -0
- {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_reference_solutions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: desdeo
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.1
|
|
4
4
|
Summary: DESDEO is a modular and open source framework for interactive multiobjective optimization.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -40,10 +40,9 @@ Project-URL: Homepage, https://github.com/industrial-optimization-group/DESDEO
|
|
|
40
40
|
Project-URL: Repository, https://github.com/industrial-optimization-group/DESDEO
|
|
41
41
|
Description-Content-Type: text/markdown
|
|
42
42
|
|
|
43
|
+
[](https://discord.gg/uGCEgQTJyY) [](https://desdeo.readthedocs.io/en/latest/) 
|
|
44
|
+
|
|
43
45
|
# DESDEO: the open-source software framework for interactive multiobjective optimization
|
|
44
|
-
|
|
45
|
-
[](https://discord.gg/uGCEgQTJyY) [](https://desdeo.readthedocs.io/en/latest/) 
|
|
46
|
-
|
|
47
46
|
## Introduction
|
|
48
47
|
|
|
49
48
|
DESDEO is an open-source framework for interactive multiobjective optimization
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
+
[](https://discord.gg/uGCEgQTJyY) [](https://desdeo.readthedocs.io/en/latest/) 
|
|
2
|
+
|
|
1
3
|
# DESDEO: the open-source software framework for interactive multiobjective optimization
|
|
2
|
-
|
|
3
|
-
[](https://discord.gg/uGCEgQTJyY) [](https://desdeo.readthedocs.io/en/latest/) 
|
|
4
|
-
|
|
5
4
|
## Introduction
|
|
6
5
|
|
|
7
6
|
DESDEO is an open-source framework for interactive multiobjective optimization
|
|
@@ -7,35 +7,36 @@ __all__ = [
|
|
|
7
7
|
"DiscreteRepresentation",
|
|
8
8
|
"Evaluator",
|
|
9
9
|
"ExtraFunction",
|
|
10
|
-
"flatten_variable_dict",
|
|
11
10
|
"FormatEnum",
|
|
12
11
|
"GurobipyEvaluator",
|
|
13
|
-
"get_nadir_dict",
|
|
14
|
-
"get_ideal_dict",
|
|
15
12
|
"InfixExpressionParser",
|
|
16
13
|
"MathParser",
|
|
17
|
-
"numpy_array_to_objective_dict",
|
|
18
|
-
"objective_dict_to_numpy_array",
|
|
19
14
|
"Objective",
|
|
20
15
|
"ObjectiveTypeEnum",
|
|
21
|
-
"Problem",
|
|
22
|
-
"PyomoEvaluator",
|
|
23
|
-
"SympyEvaluator",
|
|
24
|
-
"tensor_constant_from_dataframe",
|
|
25
16
|
"PolarsEvaluator",
|
|
26
17
|
"PolarsEvaluatorModesEnum",
|
|
18
|
+
"Problem",
|
|
19
|
+
"PyomoEvaluator",
|
|
27
20
|
"ScalarizationFunction",
|
|
28
21
|
"Simulator",
|
|
22
|
+
"SimulatorEvaluator",
|
|
23
|
+
"SympyEvaluator",
|
|
24
|
+
"Tensor",
|
|
29
25
|
"TensorConstant",
|
|
30
26
|
"TensorVariable",
|
|
31
27
|
"Url",
|
|
32
|
-
"unflatten_variable_array",
|
|
33
28
|
"Variable",
|
|
34
29
|
"VariableDimensionEnum",
|
|
35
30
|
"VariableDomainTypeEnum",
|
|
36
31
|
"VariableType",
|
|
37
|
-
"Tensor",
|
|
38
32
|
"VariableTypeEnum",
|
|
33
|
+
"flatten_variable_dict",
|
|
34
|
+
"get_ideal_dict",
|
|
35
|
+
"get_nadir_dict",
|
|
36
|
+
"numpy_array_to_objective_dict",
|
|
37
|
+
"objective_dict_to_numpy_array",
|
|
38
|
+
"tensor_constant_from_dataframe",
|
|
39
|
+
"unflatten_variable_array",
|
|
39
40
|
"variable_dimension_enumerate",
|
|
40
41
|
]
|
|
41
42
|
|
|
@@ -33,7 +33,7 @@ class PolarsEvaluatorModesEnum(str, Enum):
|
|
|
33
33
|
mixed = "mixed"
|
|
34
34
|
"""Indicates that the problem has analytical and simulator and/or surrogate
|
|
35
35
|
based objectives, constraints and extra functions. In this mode, the evaluator
|
|
36
|
-
only handles data-based and analytical functions. For data-
|
|
36
|
+
only handles data-based and analytical functions. For data-based objectives,
|
|
37
37
|
it assumes that the variables are to be evaluated by finding the closest
|
|
38
38
|
variables values in the data compare to the input, and evaluating the result
|
|
39
39
|
to be the matching objective function values that match to the closest
|
|
@@ -74,7 +74,7 @@ def variable_dimension_enumerate(problem: Problem) -> VariableDimensionEnum:
|
|
|
74
74
|
enum = VariableDimensionEnum.scalar
|
|
75
75
|
for var in problem.variables:
|
|
76
76
|
if isinstance(var, TensorVariable):
|
|
77
|
-
if len(var.shape) == 1 or len(var.shape) == 2 and not (var.shape[0] > 1 and var.shape[1] > 1): # noqa: PLR2004
|
|
77
|
+
if len(var.shape) == 1 or (len(var.shape) == 2 and not (var.shape[0] > 1 and var.shape[1] > 1)): # noqa: PLR2004
|
|
78
78
|
enum = VariableDimensionEnum.vector
|
|
79
79
|
else:
|
|
80
80
|
return VariableDimensionEnum.tensor
|
|
@@ -187,7 +187,7 @@ class PolarsEvaluator:
|
|
|
187
187
|
f"Provided 'evaluator_mode' {evaluator_mode} not supported. Must be one of {PolarsEvaluatorModesEnum}."
|
|
188
188
|
)
|
|
189
189
|
|
|
190
|
-
def _polars_init(self): # noqa: C901
|
|
190
|
+
def _polars_init(self): # noqa: C901
|
|
191
191
|
"""Initialization of the evaluator for parser type 'polars'."""
|
|
192
192
|
# If any constants are defined in problem, replace their symbol with the defined numerical
|
|
193
193
|
# value in all the function expressions found in the Problem.
|
|
@@ -211,8 +211,7 @@ class PolarsEvaluator:
|
|
|
211
211
|
parsed_obj_funcs[f"{obj.symbol}"] = None
|
|
212
212
|
else:
|
|
213
213
|
msg = (
|
|
214
|
-
f"Incorrect objective-type {obj.objective_type} encountered. "
|
|
215
|
-
f"Must be one of {ObjectiveTypeEnum}"
|
|
214
|
+
f"Incorrect objective-type {obj.objective_type} encountered. Must be one of {ObjectiveTypeEnum}"
|
|
216
215
|
)
|
|
217
216
|
raise PolarsEvaluatorError(msg)
|
|
218
217
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Defines an evaluator compatible with the Problem JSON format and transforms it into a GurobipyModel."""
|
|
2
2
|
|
|
3
|
+
import warnings
|
|
3
4
|
from operator import eq as _eq
|
|
4
5
|
from operator import le as _le
|
|
5
|
-
import warnings
|
|
6
6
|
|
|
7
7
|
import gurobipy as gp
|
|
8
8
|
import numpy as np
|
|
@@ -18,8 +18,7 @@ from desdeo.problem.schema import (
|
|
|
18
18
|
TensorConstant,
|
|
19
19
|
TensorVariable,
|
|
20
20
|
Variable,
|
|
21
|
-
VariableTypeEnum
|
|
22
|
-
|
|
21
|
+
VariableTypeEnum,
|
|
23
22
|
)
|
|
24
23
|
|
|
25
24
|
|
|
@@ -125,8 +124,16 @@ class GurobipyEvaluator:
|
|
|
125
124
|
|
|
126
125
|
elif isinstance(var, TensorVariable):
|
|
127
126
|
# handle tensor variables, i.e., vectors etc..
|
|
128
|
-
lowerbounds =
|
|
129
|
-
|
|
127
|
+
lowerbounds = (
|
|
128
|
+
var.get_lowerbound_values()
|
|
129
|
+
if var.lowerbounds is not None
|
|
130
|
+
else np.full(var.shape, float("-inf")).tolist()
|
|
131
|
+
)
|
|
132
|
+
upperbounds = (
|
|
133
|
+
var.get_upperbound_values()
|
|
134
|
+
if var.upperbounds is not None
|
|
135
|
+
else np.full(var.shape, float("inf")).tolist()
|
|
136
|
+
)
|
|
130
137
|
|
|
131
138
|
# figure out the variable type
|
|
132
139
|
match var.variable_type:
|
|
@@ -143,13 +150,18 @@ class GurobipyEvaluator:
|
|
|
143
150
|
raise GurobipyEvaluatorError(msg)
|
|
144
151
|
|
|
145
152
|
# add the variable to the model
|
|
146
|
-
gvar = self.model.addMVar(
|
|
153
|
+
gvar = self.model.addMVar(
|
|
154
|
+
shape=tuple(var.shape),
|
|
155
|
+
lb=np.array(lowerbounds),
|
|
156
|
+
ub=np.array(upperbounds),
|
|
157
|
+
vtype=domain,
|
|
158
|
+
name=var.symbol,
|
|
159
|
+
)
|
|
147
160
|
# set the initial value, if one has been defined
|
|
148
161
|
if var.initial_values is not None:
|
|
149
162
|
gvar.setAttr("Start", np.array(var.get_initial_values()))
|
|
150
163
|
self.mvars[var.symbol] = gvar
|
|
151
164
|
|
|
152
|
-
|
|
153
165
|
# update the model before returning, so that other expressions can reference the variables
|
|
154
166
|
self.model.update()
|
|
155
167
|
|
|
@@ -413,8 +425,16 @@ class GurobipyEvaluator:
|
|
|
413
425
|
gvar.setAttr("Start", var.initial_value)
|
|
414
426
|
elif isinstance(var, TensorVariable):
|
|
415
427
|
# handle tensor variables, i.e., vectors etc..
|
|
416
|
-
lowerbounds =
|
|
417
|
-
|
|
428
|
+
lowerbounds = (
|
|
429
|
+
var.get_lowerbound_values()
|
|
430
|
+
if var.lowerbounds is not None
|
|
431
|
+
else np.full(var.shape, float("-inf")).tolist()
|
|
432
|
+
)
|
|
433
|
+
upperbounds = (
|
|
434
|
+
var.get_upperbound_values()
|
|
435
|
+
if var.upperbounds is not None
|
|
436
|
+
else np.full(var.shape, float("inf")).tolist()
|
|
437
|
+
)
|
|
418
438
|
|
|
419
439
|
# figure out the variable type
|
|
420
440
|
match var.variable_type:
|
|
@@ -431,7 +451,13 @@ class GurobipyEvaluator:
|
|
|
431
451
|
raise GurobipyEvaluatorError(msg)
|
|
432
452
|
|
|
433
453
|
# add the variable to the model
|
|
434
|
-
gvar = self.model.addMVar(
|
|
454
|
+
gvar = self.model.addMVar(
|
|
455
|
+
shape=tuple(var.shape),
|
|
456
|
+
lb=np.array(lowerbounds),
|
|
457
|
+
ub=np.array(upperbounds),
|
|
458
|
+
vtype=domain,
|
|
459
|
+
name=var.symbol,
|
|
460
|
+
)
|
|
435
461
|
# set the initial value, if one has been defined
|
|
436
462
|
if var.initial_values is not None:
|
|
437
463
|
gvar.setAttr("Start", np.array(var.get_initial_values()))
|
|
@@ -470,8 +496,7 @@ class GurobipyEvaluator:
|
|
|
470
496
|
expression = self.constants[name]
|
|
471
497
|
return expression
|
|
472
498
|
|
|
473
|
-
|
|
474
|
-
def get_values(self) -> dict[str, float | int | bool | list[float] | list[int]]: # noqa: C901
|
|
499
|
+
def get_values(self) -> dict[str, float | int | bool | list[float] | list[int]]:
|
|
475
500
|
"""Get the values from the Gurobipy Model in a dict.
|
|
476
501
|
|
|
477
502
|
The keys of the dict will be the symbols defined in the problem utilized to initialize the evaluator.
|
|
@@ -193,7 +193,7 @@ class InfixExpressionParser:
|
|
|
193
193
|
def _is_number_or_variable(self, c):
|
|
194
194
|
return isinstance(c, int | float) or (isinstance(c, str) and c not in self.reserved_symbols)
|
|
195
195
|
|
|
196
|
-
def _to_math_json(self, parsed: list | str) -> list:
|
|
196
|
+
def _to_math_json(self, parsed: list | str) -> list:
|
|
197
197
|
"""Converts a list of expressions into a MathJSON compliant format.
|
|
198
198
|
|
|
199
199
|
The conversion happens recursively. Each list of recursed until a terminal character is reached.
|
|
@@ -324,18 +324,3 @@ class InfixExpressionParser:
|
|
|
324
324
|
# simple expressions, like 'x_1', are parsed into just a string after removing any extra
|
|
325
325
|
# brackets, so we add them back there in case it is needed
|
|
326
326
|
return expr if isinstance(expr, list) else [expr]
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
if __name__ == "__main__":
|
|
330
|
-
# Parse and convert
|
|
331
|
-
test = "(x_1 - c_2) ** 2 + x_2 ** 2 - 25"
|
|
332
|
-
|
|
333
|
-
ohh_no = "['Add', ['Negate', ['Square', ['Subtract', 'x_1', 8]]], ['Negate', ['Square', ['Add', 'x_2', 3]]], 7.7]"
|
|
334
|
-
|
|
335
|
-
to_json_parser = InfixExpressionParser(target="MathJSON")
|
|
336
|
-
|
|
337
|
-
parsed_expression = to_json_parser.parse(test)
|
|
338
|
-
|
|
339
|
-
print(f"Expresion:\n{test}")
|
|
340
|
-
print(f"Parsed:\n{to_json_parser._pre_parse(test)}")
|
|
341
|
-
print(f"MathJSON:\n{parsed_expression}")
|
|
@@ -35,7 +35,7 @@ class MathParser:
|
|
|
35
35
|
Currently only parses MathJSON to polars expressions. Pyomo WIP.
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
|
-
def __init__(self, to_format: FormatEnum = "polars"):
|
|
38
|
+
def __init__(self, to_format: FormatEnum = "polars"): # noqa: C901
|
|
39
39
|
"""Create a parser instance for parsing MathJSON notation into polars expressions.
|
|
40
40
|
|
|
41
41
|
Args:
|
|
@@ -135,7 +135,7 @@ class MathParser:
|
|
|
135
135
|
acc = acc.to_numpy()
|
|
136
136
|
x = x.to_numpy()
|
|
137
137
|
|
|
138
|
-
if len(acc.shape) == 2 and len(x.shape) == 2:
|
|
138
|
+
if len(acc.shape) == 2 and len(x.shape) == 2: # noqa: PLR2004
|
|
139
139
|
# Row vectors, just return the dot product, polars does not handle
|
|
140
140
|
# "column" vectors anyway
|
|
141
141
|
return pl.Series(values=np.einsum("ij,ij->i", acc, x, optimize=True))
|
|
@@ -373,7 +373,7 @@ class MathParser:
|
|
|
373
373
|
hasattr(x, "is_indexed")
|
|
374
374
|
and x.is_indexed()
|
|
375
375
|
and x.dim() > 0
|
|
376
|
-
and (not hasattr(y, "is_indexed") or not y.is_indexed() or y.is_indexed() and y.dim() == 0)
|
|
376
|
+
and (not hasattr(y, "is_indexed") or not y.is_indexed() or (y.is_indexed() and y.dim() == 0))
|
|
377
377
|
):
|
|
378
378
|
# x is a tensor, y is scalar
|
|
379
379
|
expr = pyomo.Expression(
|
|
@@ -385,7 +385,7 @@ class MathParser:
|
|
|
385
385
|
hasattr(y, "is_indexed")
|
|
386
386
|
and y.is_indexed()
|
|
387
387
|
and y.dim() > 0
|
|
388
|
-
and (not hasattr(x, "is_indexed") or not x.is_indexed() or x.is_indexed() and x.dim() == 0)
|
|
388
|
+
and (not hasattr(x, "is_indexed") or not x.is_indexed() or (x.is_indexed() and x.dim() == 0))
|
|
389
389
|
):
|
|
390
390
|
# y is a tensor, x is scalar
|
|
391
391
|
expr = pyomo.Expression(
|
|
@@ -534,16 +534,13 @@ class MathParser:
|
|
|
534
534
|
def _sympy_matmul(*args):
|
|
535
535
|
"""Sympy matrix multiplication."""
|
|
536
536
|
msg = (
|
|
537
|
-
"Matrix multiplication '@' has not been implemented for the Sympy parser yet."
|
|
538
|
-
" Feel free to contribute!"
|
|
537
|
+
"Matrix multiplication '@' has not been implemented for the Sympy parser yet. Feel free to contribute!"
|
|
539
538
|
)
|
|
540
539
|
raise NotImplementedError(msg)
|
|
541
540
|
|
|
542
541
|
def _sympy_summation(summand):
|
|
543
542
|
"""Sympy matrix summation."""
|
|
544
|
-
msg =
|
|
545
|
-
"Matrix summation 'Sum' has not been implemented for the Sympy parser yet." " Feel free to contribute!"
|
|
546
|
-
)
|
|
543
|
+
msg = "Matrix summation 'Sum' has not been implemented for the Sympy parser yet. Feel free to contribute!"
|
|
547
544
|
raise NotImplementedError(msg)
|
|
548
545
|
|
|
549
546
|
def _sympy_random_access(*args):
|
|
@@ -627,8 +624,7 @@ class MathParser:
|
|
|
627
624
|
|
|
628
625
|
return _sum(summand)
|
|
629
626
|
msg = (
|
|
630
|
-
"Matrix summation 'Sum' has not been implemented for the Gurobipy parser yet."
|
|
631
|
-
" Feel free to contribute!"
|
|
627
|
+
"Matrix summation 'Sum' has not been implemented for the Gurobipy parser yet. Feel free to contribute!"
|
|
632
628
|
)
|
|
633
629
|
raise NotImplementedError(msg)
|
|
634
630
|
|
|
@@ -16,7 +16,7 @@ from collections.abc import Iterable
|
|
|
16
16
|
from enum import Enum
|
|
17
17
|
from itertools import product
|
|
18
18
|
from pathlib import Path
|
|
19
|
-
from typing import TYPE_CHECKING, Annotated, Any, Literal, Self
|
|
19
|
+
from typing import TYPE_CHECKING, Annotated, Any, Literal, Self
|
|
20
20
|
|
|
21
21
|
import numpy as np
|
|
22
22
|
from pydantic import (
|
|
@@ -61,13 +61,10 @@ def tensor_custom_error_validator(value: Any, handler: ValidatorFunctionWrapHand
|
|
|
61
61
|
raise PydanticCustomError("invalid tensor", "Input is not a valid tensor") from exc
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
Tensor =
|
|
65
|
-
"Tensor",
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
WrapValidator(tensor_custom_error_validator),
|
|
69
|
-
],
|
|
70
|
-
)
|
|
64
|
+
type Tensor = Annotated[
|
|
65
|
+
list["Tensor"] | list[VariableType] | VariableType | Literal["List"] | None,
|
|
66
|
+
WrapValidator(tensor_custom_error_validator),
|
|
67
|
+
]
|
|
71
68
|
|
|
72
69
|
|
|
73
70
|
def parse_infix_to_func(cls: "Problem", v: str | list) -> list:
|
|
@@ -756,7 +753,7 @@ class Simulator(BaseModel):
|
|
|
756
753
|
"""Path to a python file with the connection to simulators."""
|
|
757
754
|
url: Url | None = Field(
|
|
758
755
|
description=(
|
|
759
|
-
"Optional.
|
|
756
|
+
"Optional. URL to the simulator. A GET request to this URL should be used to evaluate solutions in batches."
|
|
760
757
|
),
|
|
761
758
|
default=None,
|
|
762
759
|
)
|
|
@@ -115,7 +115,7 @@ def unflatten_variable_array(problem: Problem, var_array: np.ndarray) -> dict[st
|
|
|
115
115
|
# check if values remain in var_array
|
|
116
116
|
if array_i < len(var_array):
|
|
117
117
|
# some values remain, warn user, but do not raise an error
|
|
118
|
-
msg = f"Warning, the variable array had some values that were not unflattened: f{[
|
|
118
|
+
msg = f"Warning, the variable array had some values that were not unflattened: f{['...', *var_array[array_i:]]}"
|
|
119
119
|
warnings.warn(msg, stacklevel=2)
|
|
120
120
|
|
|
121
121
|
# return the variable dict
|
|
@@ -99,7 +99,7 @@ class CbcOptions(BaseModel):
|
|
|
99
99
|
|
|
100
100
|
model_config = ConfigDict(frozen=True, populate_by_name=True)
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
seconds: int = Field(
|
|
103
103
|
description="The maximum amount of time (in seconds) the solver should run. Defaults to 600.", default=600
|
|
104
104
|
)
|
|
105
105
|
"""The maximum amount of time (in seconds) the solver should run. Defaults to 600."""
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "desdeo"
|
|
3
|
-
version = "2.1.
|
|
3
|
+
version = "2.1.1"
|
|
4
4
|
description = "DESDEO is a modular and open source framework for interactive multiobjective optimization."
|
|
5
5
|
authors = [
|
|
6
|
-
{name="Giovanni Misitano",
|
|
7
|
-
{name="Bhupinder Saini", email="bhupinder.s.saini@jyu.fi"},
|
|
6
|
+
{ name = "Giovanni Misitano", email = "giovanni.a.misitano@jyu.fi" },
|
|
7
|
+
{ name = "Bhupinder Saini", email = "bhupinder.s.saini@jyu.fi" },
|
|
8
8
|
]
|
|
9
9
|
license = "MIT"
|
|
10
10
|
readme = "README.md"
|
|
11
|
-
exclude = [
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
"
|
|
11
|
+
exclude = ["tests", "desdeo/api", "desdeo/utopia_stuff"]
|
|
12
|
+
keywords = [
|
|
13
|
+
"optimization",
|
|
14
|
+
"decision-support",
|
|
15
|
+
"multiobjective optimization",
|
|
16
|
+
"evolutionary optimization",
|
|
17
|
+
"interactive methods",
|
|
15
18
|
]
|
|
16
|
-
keywords=["optimization", "decision-support", "multiobjective optimization", "evolutionary optimization", "interactive methods"]
|
|
17
19
|
requires-python = ">=3.12,<3.14"
|
|
18
20
|
dependencies = [
|
|
19
21
|
"numpy >= 2.2.0",
|
|
@@ -42,21 +44,21 @@ dependencies = [
|
|
|
42
44
|
]
|
|
43
45
|
|
|
44
46
|
[project.urls]
|
|
45
|
-
homepage="https://github.com/industrial-optimization-group/DESDEO"
|
|
46
|
-
repository="https://github.com/industrial-optimization-group/DESDEO"
|
|
47
|
-
documentation="https://desdeo.readthedocs.io/en/latest/"
|
|
48
|
-
"Bug tracker"="https://github.com/industrial-optimization-group/DESDEO/issues"
|
|
47
|
+
homepage = "https://github.com/industrial-optimization-group/DESDEO"
|
|
48
|
+
repository = "https://github.com/industrial-optimization-group/DESDEO"
|
|
49
|
+
documentation = "https://desdeo.readthedocs.io/en/latest/"
|
|
50
|
+
"Bug tracker" = "https://github.com/industrial-optimization-group/DESDEO/issues"
|
|
49
51
|
|
|
50
52
|
[dependency-groups]
|
|
51
53
|
dev = [
|
|
52
54
|
"ruff>=0.11",
|
|
53
|
-
"isort>=6.0",
|
|
54
55
|
"mypy>=1.0",
|
|
55
56
|
"pytest>=8.0",
|
|
56
57
|
"pytest-xdist>=3.5.0",
|
|
57
58
|
"pytest-testmon>=2.1.1",
|
|
58
59
|
"pytest-asyncio>=0.26.0",
|
|
59
60
|
"snakeviz>=2.2.0",
|
|
61
|
+
"pre-commit>=0.14.14",
|
|
60
62
|
]
|
|
61
63
|
|
|
62
64
|
docs = [
|
|
@@ -71,11 +73,7 @@ docs = [
|
|
|
71
73
|
"python-markdown-math>=0.9",
|
|
72
74
|
]
|
|
73
75
|
|
|
74
|
-
jupyter = [
|
|
75
|
-
"jupyter>=1.0",
|
|
76
|
-
"jupyterlab>=4.0",
|
|
77
|
-
"jupytext>=1.16.4"
|
|
78
|
-
]
|
|
76
|
+
jupyter = ["jupyter>=1.0", "jupyterlab>=4.0", "jupytext>=1.16.4"]
|
|
79
77
|
|
|
80
78
|
web = [
|
|
81
79
|
"httpx>=0.28.1",
|
|
@@ -89,20 +87,13 @@ web = [
|
|
|
89
87
|
"websockets>=15.0.1",
|
|
90
88
|
]
|
|
91
89
|
|
|
92
|
-
viz = [
|
|
93
|
-
"seaborn>=0.13.0",
|
|
94
|
-
"scienceplots>=2.1.1",
|
|
95
|
-
"pyparsing[diagrams]>=3.1.1"
|
|
96
|
-
]
|
|
90
|
+
viz = ["seaborn>=0.13.0", "scienceplots>=2.1.1", "pyparsing[diagrams]>=3.1.1"]
|
|
97
91
|
|
|
98
|
-
tools = [
|
|
99
|
-
"djlint>=1.34.1",
|
|
100
|
-
"eralchemy>=1.5.0"
|
|
101
|
-
]
|
|
92
|
+
tools = ["djlint>=1.34.1", "eralchemy>=1.5.0"]
|
|
102
93
|
|
|
103
94
|
server = [ # production!
|
|
104
95
|
"gunicorn>=23.0.0",
|
|
105
|
-
"psycopg2>=2.9.10"
|
|
96
|
+
"psycopg2>=2.9.10",
|
|
106
97
|
]
|
|
107
98
|
|
|
108
99
|
all-dev = [
|
|
@@ -142,8 +133,6 @@ lint.select = [
|
|
|
142
133
|
"PIE",
|
|
143
134
|
"RET",
|
|
144
135
|
"PTH",
|
|
145
|
-
"TD", # Comment this out if too annoying
|
|
146
|
-
"FIX", # Comment this out if too annoying
|
|
147
136
|
"SIM",
|
|
148
137
|
"PL",
|
|
149
138
|
"TRY",
|
|
@@ -156,15 +145,16 @@ lint.select = [
|
|
|
156
145
|
]
|
|
157
146
|
lint.ignore = [
|
|
158
147
|
"COM812", # Enforcing trailing commas is too annoying.
|
|
148
|
+
"PLR0911", # "too many return statements (>6)"
|
|
149
|
+
"PLR0912", # "too many branches"
|
|
159
150
|
"PLR0915", # "too many statements (>50)"
|
|
160
|
-
"T201", # TODO: remove? it allow print statements
|
|
161
151
|
"TRY003", # allow long error messages
|
|
162
152
|
]
|
|
163
153
|
lint.pydocstyle.convention = "google"
|
|
164
154
|
|
|
165
155
|
|
|
166
156
|
# Allow autofix for all enabled rules (when `--fix`) is provided.
|
|
167
|
-
lint.fixable = []
|
|
157
|
+
lint.fixable = ["ALL"]
|
|
168
158
|
lint.unfixable = []
|
|
169
159
|
|
|
170
160
|
# Allow unused variables when underscore-prefixed.
|
|
@@ -203,7 +193,6 @@ target-version = "py312"
|
|
|
203
193
|
[tool.ruff.lint.mccabe]
|
|
204
194
|
max-complexity = 15
|
|
205
195
|
|
|
206
|
-
[tool.ruff.per-file-ignores]
|
|
207
196
|
[tool.ruff.lint.per-file-ignores]
|
|
208
197
|
# Ignore certain rules in test files
|
|
209
198
|
"**/tests/**/*.py" = [
|
|
@@ -219,18 +208,13 @@ quote-style = "double"
|
|
|
219
208
|
[tool.djlint]
|
|
220
209
|
profile = "jinja"
|
|
221
210
|
|
|
222
|
-
[tool.isort]
|
|
223
|
-
profile = "black"
|
|
224
|
-
|
|
225
211
|
[tool.mypy]
|
|
226
212
|
ignore_missing_imports = true
|
|
227
213
|
|
|
228
214
|
[tool.pytest.ini_options]
|
|
229
215
|
markers = [
|
|
230
|
-
"skip: stests marked to be skipped",
|
|
231
216
|
"slow: mark test as slow",
|
|
232
217
|
"nautilus_navigator: tests related to the NAUTILUS Navigator method",
|
|
233
|
-
"performance: tests that are related to performance. Skipped by default",
|
|
234
218
|
"infix_parser: tests related to the infix parser",
|
|
235
219
|
"pyomo: tests related to pyomo models, their parsing, and evaluation",
|
|
236
220
|
"sympy: tests related to sympy expressions, their parsing, and evaluatio.",
|
|
@@ -252,7 +236,6 @@ markers = [
|
|
|
252
236
|
"json: tests related to the Math JSON parser.",
|
|
253
237
|
"schema: tests related to the Problem schema.",
|
|
254
238
|
"utils: tests related to various utilities.",
|
|
255
|
-
"nogithub: tests that should not be run in GitHub actions.",
|
|
256
239
|
"simulator_support: tests related to simulator and surrogate support",
|
|
257
240
|
"explainer: tests related to explainers and related functionalities.",
|
|
258
241
|
"explanation_utils: tests related to explanations module utilities.",
|
|
@@ -262,18 +245,14 @@ markers = [
|
|
|
262
245
|
"enautilus: tests related to the E-NAUTILUS method.",
|
|
263
246
|
"gdmtools: tests related to group decision making.",
|
|
264
247
|
"gnimbus: tests related to group nimbus method.",
|
|
265
|
-
"external: tests related to providers interfacing to external problems."
|
|
248
|
+
"external: tests related to providers interfacing to external problems.",
|
|
249
|
+
"fixme: tests that are not passing, but maybe should, yet are ignored.",
|
|
250
|
+
"githubskip: skip these tests on GitHub workflows.",
|
|
266
251
|
]
|
|
267
252
|
pythonpath = "."
|
|
268
253
|
asyncio_default_fixture_loop_scope = "function"
|
|
269
|
-
filterwarnings = [
|
|
270
|
-
|
|
271
|
-
"default::UserWarning",
|
|
272
|
-
]
|
|
273
|
-
testpaths = [
|
|
274
|
-
"tests",
|
|
275
|
-
"desdeo/api/tests",
|
|
276
|
-
]
|
|
254
|
+
filterwarnings = ["default::RuntimeWarning", "default::UserWarning"]
|
|
255
|
+
testpaths = ["tests", "desdeo/api/tests"]
|
|
277
256
|
|
|
278
257
|
[build-system]
|
|
279
258
|
requires = ["poetry-core"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|