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.
Files changed (180) hide show
  1. {desdeo-2.1.0 → desdeo-2.1.1}/PKG-INFO +3 -4
  2. {desdeo-2.1.0 → desdeo-2.1.1}/README.md +2 -3
  3. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/__init__.py +12 -11
  4. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/evaluator.py +4 -5
  5. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/gurobipy_evaluator.py +37 -12
  6. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/infix_parser.py +1 -16
  7. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/json_parser.py +7 -11
  8. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/schema.py +6 -9
  9. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/utils.py +1 -1
  10. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/pyomo_solver_interfaces.py +1 -1
  11. {desdeo-2.1.0 → desdeo-2.1.1}/pyproject.toml +27 -48
  12. {desdeo-2.1.0 → desdeo-2.1.1}/LICENSE +0 -0
  13. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/__init__.py +0 -0
  14. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/ADMAfsar.py +0 -0
  15. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/ADMChen.py +0 -0
  16. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/BaseADM.py +0 -0
  17. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/adm/__init__.py +0 -0
  18. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/README.md +0 -0
  19. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/__init__.py +0 -0
  20. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/app.py +0 -0
  21. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/config.py +0 -0
  22. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/config.toml +0 -0
  23. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/db.py +0 -0
  24. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/db_init.py +0 -0
  25. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/db_models.py +0 -0
  26. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/malaga_db_init.py +0 -0
  27. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/__init__.py +0 -0
  28. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/archive.py +0 -0
  29. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/emo.py +0 -0
  30. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/enautilus.py +0 -0
  31. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gdm_aggregate.py +0 -0
  32. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gdm_base.py +0 -0
  33. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gdm_score_bands.py +0 -0
  34. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/gdm/gnimbus.py +0 -0
  35. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/generic.py +0 -0
  36. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/generic_states.py +0 -0
  37. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/nimbus.py +0 -0
  38. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/preference.py +0 -0
  39. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/problem.py +0 -0
  40. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/reference_point_method.py +0 -0
  41. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/session.py +0 -0
  42. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/state.py +0 -0
  43. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/user.py +0 -0
  44. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/models/utopia.py +0 -0
  45. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_EMO.backup +0 -0
  46. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_NAUTILUS.py +0 -0
  47. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_NAUTILUS_navigator.py +0 -0
  48. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/_NIMBUS.py +0 -0
  49. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/__init__.py +0 -0
  50. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/emo.py +0 -0
  51. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/enautilus.py +0 -0
  52. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_aggregate.py +0 -0
  53. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_base.py +0 -0
  54. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_score_bands/gdm_score_bands_manager.py +0 -0
  55. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gdm_score_bands/gdm_score_bands_routers.py +0 -0
  56. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gnimbus/gnimbus_manager.py +0 -0
  57. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/gdm/gnimbus/gnimbus_routers.py +0 -0
  58. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/generic.py +0 -0
  59. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/nimbus.py +0 -0
  60. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/problem.py +0 -0
  61. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/reference_point_method.py +0 -0
  62. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/session.py +0 -0
  63. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/test.py +0 -0
  64. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/user_authentication.py +0 -0
  65. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/utils.py +0 -0
  66. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/routers/utopia.py +0 -0
  67. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/schema.py +0 -0
  68. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/__init__.py +0 -0
  69. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/conftest.py +0 -0
  70. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/test_enautilus.py +0 -0
  71. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/test_models.py +0 -0
  72. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/tests/test_routes.py +0 -0
  73. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/_database.py +0 -0
  74. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/_logger.py +0 -0
  75. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/database.py +0 -0
  76. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/api/utils/emo_database.py +0 -0
  77. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/core.py +0 -0
  78. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/__init__.py +0 -0
  79. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/hooks/archivers.py +0 -0
  80. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/EAs.py +0 -0
  81. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/__init__.py +0 -0
  82. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/bases.py +0 -0
  83. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/methods/templates.py +0 -0
  84. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/__init__.py +0 -0
  85. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/crossover.py +0 -0
  86. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/evaluator.py +0 -0
  87. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/generator.py +0 -0
  88. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/mutation.py +0 -0
  89. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/scalar_selection.py +0 -0
  90. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/selection.py +0 -0
  91. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/operators/termination.py +0 -0
  92. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/__init__.py +0 -0
  93. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/algorithms.py +0 -0
  94. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/crossover.py +0 -0
  95. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/generator.py +0 -0
  96. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/mutation.py +0 -0
  97. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/repair.py +0 -0
  98. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/scalar_selection.py +0 -0
  99. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/selection.py +0 -0
  100. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/templates.py +0 -0
  101. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/emo/options/termination.py +0 -0
  102. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/explanations/__init__.py +0 -0
  103. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/explanations/explainer.py +0 -0
  104. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/explanations/utils.py +0 -0
  105. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/__init__.py +0 -0
  106. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/gdmtools.py +0 -0
  107. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/score_bands.py +0 -0
  108. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/gdm/voting_rules.py +0 -0
  109. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/__init__.py +0 -0
  110. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/enautilus.py +0 -0
  111. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/gnimbus.py +0 -0
  112. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nautili.py +0 -0
  113. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nautilus.py +0 -0
  114. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nautilus_navigator.py +0 -0
  115. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/nimbus.py +0 -0
  116. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/pareto_navigator.py +0 -0
  117. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/mcdm/reference_point_method.py +0 -0
  118. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/__init__.py +0 -0
  119. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/core.py +0 -0
  120. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/pymoo_provider.py +0 -0
  121. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/external/runtime.py +0 -0
  122. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/pyomo_evaluator.py +0 -0
  123. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/simulator_evaluator.py +0 -0
  124. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/sympy_evaluator.py +0 -0
  125. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/__init__.py +0 -0
  126. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/benchmarks_server.py +0 -0
  127. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/binh_and_korn_problem.py +0 -0
  128. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/cake_problem.py +0 -0
  129. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/dmitry_forest_problem_discrete.py +0 -0
  130. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/dtlz2_problem.py +0 -0
  131. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/forest_problem.py +0 -0
  132. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/knapsack_problem.py +0 -0
  133. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/mcwb_problem.py +0 -0
  134. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/mixed_variable_dimenrions_problem.py +0 -0
  135. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/momip_problem.py +0 -0
  136. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/multi_valued_constraints.py +0 -0
  137. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/nimbus_problem.py +0 -0
  138. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/pareto_navigator_problem.py +0 -0
  139. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/re_problem.py +0 -0
  140. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/river_pollution_problems.py +0 -0
  141. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/rocket_injector_design_problem.py +0 -0
  142. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/simple_problem.py +0 -0
  143. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/simulator_problem.py +0 -0
  144. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/single_objective.py +0 -0
  145. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/spanish_sustainability_problem.py +0 -0
  146. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/problem/testproblems/zdt_problem.py +0 -0
  147. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/GenerateReferencePoints.py +0 -0
  148. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/__init__.py +0 -0
  149. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/desc_gen.py +0 -0
  150. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/generics.py +0 -0
  151. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/group_scalarization.py +0 -0
  152. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/gurobipy_solver_interfaces.py +0 -0
  153. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/indicators_binary.py +0 -0
  154. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/indicators_unary.py +0 -0
  155. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/interaction_schema.py +0 -0
  156. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/intersection.py +0 -0
  157. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/iterative_pareto_representer.py +0 -0
  158. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/message.py +0 -0
  159. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/ng_solver_interfaces.py +0 -0
  160. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/non_dominated_sorting.py +0 -0
  161. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/patterns.py +0 -0
  162. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/proximal_solver.py +0 -0
  163. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/reference_vectors.py +0 -0
  164. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/scalarization.py +0 -0
  165. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/scipy_solver_interfaces.py +0 -0
  166. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/score_bands.py +0 -0
  167. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/utils.py +0 -0
  168. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/tools/visualizations.py +0 -0
  169. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/__init__.py +0 -0
  170. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/1.json +0 -0
  171. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/2.json +0 -0
  172. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/3.json +0 -0
  173. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/4.json +0 -0
  174. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/data/5.json +0 -0
  175. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/from_json.py +0 -0
  176. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/reinit_user.py +0 -0
  177. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_db_init.py +0 -0
  178. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_problem.py +0 -0
  179. {desdeo-2.1.0 → desdeo-2.1.1}/desdeo/utopia_stuff/utopia_problem_old.py +0 -0
  180. {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.0
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
+ [![Discord](https://img.shields.io/discord/1382614276409266206?style=flat&label=Join%20our%20Discord&labelColor=%237289da)](https://discord.gg/uGCEgQTJyY) [![Documentation Status](https://img.shields.io/readthedocs/desdeo.svg?version=desdeo2&label=Documentation)](https://desdeo.readthedocs.io/en/latest/) ![Tests](https://img.shields.io/github/actions/workflow/status/industrial-optimization-group/DESDEO/unit_tests.yaml?branch=master&label=Tests)
44
+
43
45
  # DESDEO: the open-source software framework for interactive multiobjective optimization
44
-
45
- [![Discord](https://img.shields.io/discord/1382614276409266206?style=flat&label=Join%20our%20Discord&labelColor=%237289da)](https://discord.gg/uGCEgQTJyY) [![Documentation Status](https://img.shields.io/readthedocs/desdeo.svg?version=desdeo2&label=Documentation)](https://desdeo.readthedocs.io/en/latest/) ![Tests](https://img.shields.io/github/actions/workflow/status/industrial-optimization-group/DESDEO/unit_tests.yaml?branch=desdeo2&label=Tests)
46
-
47
46
  ## Introduction
48
47
 
49
48
  DESDEO is an open-source framework for interactive multiobjective optimization
@@ -1,7 +1,6 @@
1
+ [![Discord](https://img.shields.io/discord/1382614276409266206?style=flat&label=Join%20our%20Discord&labelColor=%237289da)](https://discord.gg/uGCEgQTJyY) [![Documentation Status](https://img.shields.io/readthedocs/desdeo.svg?version=desdeo2&label=Documentation)](https://desdeo.readthedocs.io/en/latest/) ![Tests](https://img.shields.io/github/actions/workflow/status/industrial-optimization-group/DESDEO/unit_tests.yaml?branch=master&label=Tests)
2
+
1
3
  # DESDEO: the open-source software framework for interactive multiobjective optimization
2
-
3
- [![Discord](https://img.shields.io/discord/1382614276409266206?style=flat&label=Join%20our%20Discord&labelColor=%237289da)](https://discord.gg/uGCEgQTJyY) [![Documentation Status](https://img.shields.io/readthedocs/desdeo.svg?version=desdeo2&label=Documentation)](https://desdeo.readthedocs.io/en/latest/) ![Tests](https://img.shields.io/github/actions/workflow/status/industrial-optimization-group/DESDEO/unit_tests.yaml?branch=desdeo2&label=Tests)
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-bsed objectives,
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, PLR0912
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 = var.get_lowerbound_values() if var.lowerbounds is not None else np.full(var.shape, float("-inf")).tolist()
129
- upperbounds = var.get_upperbound_values() if var.upperbounds is not None else np.full(var.shape, float("inf")).tolist()
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(shape=tuple(var.shape), lb=np.array(lowerbounds), ub=np.array(upperbounds), vtype=domain, name=var.symbol)
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 = var.get_lowerbound_values() if var.lowerbounds is not None else np.full(var.shape, float("-inf")).tolist()
417
- upperbounds = var.get_upperbound_values() if var.upperbounds is not None else np.full(var.shape, float("inf")).tolist()
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(shape=tuple(var.shape), lb=np.array(lowerbounds), ub=np.array(upperbounds), vtype=domain, name=var.symbol)
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: # noqa: PLR0911, PLR0912
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, TypeAliasType
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 = TypeAliasType(
65
- "Tensor",
66
- Annotated[
67
- list["Tensor"] | list[VariableType] | VariableType | Literal["List"] | None,
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. A URL to the simulator. A GET request to this URL should be used to evaluate solutions in batches."
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{["...", *var_array[array_i:]]}"
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
- sec: int = Field(
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.0"
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", email="giovanni.a.misitano@jyu.fi"},
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
- "tests",
13
- "desdeo/api",
14
- "desdeo/utopia_stuff"
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
- "default::RuntimeWarning",
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