desdeo 1.2__py3-none-any.whl → 2.0.0__py3-none-any.whl

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 (122) hide show
  1. desdeo/__init__.py +8 -8
  2. desdeo/api/README.md +73 -0
  3. desdeo/api/__init__.py +15 -0
  4. desdeo/api/app.py +40 -0
  5. desdeo/api/config.py +69 -0
  6. desdeo/api/config.toml +53 -0
  7. desdeo/api/db.py +25 -0
  8. desdeo/api/db_init.py +79 -0
  9. desdeo/api/db_models.py +164 -0
  10. desdeo/api/malaga_db_init.py +27 -0
  11. desdeo/api/models/__init__.py +66 -0
  12. desdeo/api/models/archive.py +34 -0
  13. desdeo/api/models/preference.py +90 -0
  14. desdeo/api/models/problem.py +507 -0
  15. desdeo/api/models/reference_point_method.py +18 -0
  16. desdeo/api/models/session.py +46 -0
  17. desdeo/api/models/state.py +96 -0
  18. desdeo/api/models/user.py +51 -0
  19. desdeo/api/routers/_NAUTILUS.py +245 -0
  20. desdeo/api/routers/_NAUTILUS_navigator.py +233 -0
  21. desdeo/api/routers/_NIMBUS.py +762 -0
  22. desdeo/api/routers/__init__.py +5 -0
  23. desdeo/api/routers/problem.py +110 -0
  24. desdeo/api/routers/reference_point_method.py +117 -0
  25. desdeo/api/routers/session.py +76 -0
  26. desdeo/api/routers/test.py +16 -0
  27. desdeo/api/routers/user_authentication.py +366 -0
  28. desdeo/api/schema.py +94 -0
  29. desdeo/api/tests/__init__.py +0 -0
  30. desdeo/api/tests/conftest.py +59 -0
  31. desdeo/api/tests/test_models.py +701 -0
  32. desdeo/api/tests/test_routes.py +216 -0
  33. desdeo/api/utils/database.py +274 -0
  34. desdeo/api/utils/logger.py +29 -0
  35. desdeo/core.py +27 -0
  36. desdeo/emo/__init__.py +29 -0
  37. desdeo/emo/hooks/archivers.py +172 -0
  38. desdeo/emo/methods/EAs.py +418 -0
  39. desdeo/emo/methods/__init__.py +0 -0
  40. desdeo/emo/methods/bases.py +59 -0
  41. desdeo/emo/operators/__init__.py +1 -0
  42. desdeo/emo/operators/crossover.py +780 -0
  43. desdeo/emo/operators/evaluator.py +118 -0
  44. desdeo/emo/operators/generator.py +356 -0
  45. desdeo/emo/operators/mutation.py +1053 -0
  46. desdeo/emo/operators/selection.py +1036 -0
  47. desdeo/emo/operators/termination.py +178 -0
  48. desdeo/explanations/__init__.py +6 -0
  49. desdeo/explanations/explainer.py +100 -0
  50. desdeo/explanations/utils.py +90 -0
  51. desdeo/mcdm/__init__.py +19 -0
  52. desdeo/mcdm/nautili.py +345 -0
  53. desdeo/mcdm/nautilus.py +477 -0
  54. desdeo/mcdm/nautilus_navigator.py +655 -0
  55. desdeo/mcdm/nimbus.py +417 -0
  56. desdeo/mcdm/pareto_navigator.py +269 -0
  57. desdeo/mcdm/reference_point_method.py +116 -0
  58. desdeo/problem/__init__.py +79 -0
  59. desdeo/problem/evaluator.py +561 -0
  60. desdeo/problem/gurobipy_evaluator.py +562 -0
  61. desdeo/problem/infix_parser.py +341 -0
  62. desdeo/problem/json_parser.py +944 -0
  63. desdeo/problem/pyomo_evaluator.py +468 -0
  64. desdeo/problem/schema.py +1808 -0
  65. desdeo/problem/simulator_evaluator.py +298 -0
  66. desdeo/problem/sympy_evaluator.py +244 -0
  67. desdeo/problem/testproblems/__init__.py +73 -0
  68. desdeo/problem/testproblems/binh_and_korn_problem.py +88 -0
  69. desdeo/problem/testproblems/dtlz2_problem.py +102 -0
  70. desdeo/problem/testproblems/forest_problem.py +275 -0
  71. desdeo/problem/testproblems/knapsack_problem.py +163 -0
  72. desdeo/problem/testproblems/mcwb_problem.py +831 -0
  73. desdeo/problem/testproblems/mixed_variable_dimenrions_problem.py +83 -0
  74. desdeo/problem/testproblems/momip_problem.py +172 -0
  75. desdeo/problem/testproblems/nimbus_problem.py +143 -0
  76. desdeo/problem/testproblems/pareto_navigator_problem.py +89 -0
  77. desdeo/problem/testproblems/re_problem.py +492 -0
  78. desdeo/problem/testproblems/river_pollution_problem.py +434 -0
  79. desdeo/problem/testproblems/rocket_injector_design_problem.py +140 -0
  80. desdeo/problem/testproblems/simple_problem.py +351 -0
  81. desdeo/problem/testproblems/simulator_problem.py +92 -0
  82. desdeo/problem/testproblems/spanish_sustainability_problem.py +945 -0
  83. desdeo/problem/testproblems/zdt_problem.py +271 -0
  84. desdeo/problem/utils.py +245 -0
  85. desdeo/tools/GenerateReferencePoints.py +181 -0
  86. desdeo/tools/__init__.py +102 -0
  87. desdeo/tools/generics.py +145 -0
  88. desdeo/tools/gurobipy_solver_interfaces.py +258 -0
  89. desdeo/tools/indicators_binary.py +11 -0
  90. desdeo/tools/indicators_unary.py +375 -0
  91. desdeo/tools/interaction_schema.py +38 -0
  92. desdeo/tools/intersection.py +54 -0
  93. desdeo/tools/iterative_pareto_representer.py +99 -0
  94. desdeo/tools/message.py +234 -0
  95. desdeo/tools/ng_solver_interfaces.py +199 -0
  96. desdeo/tools/non_dominated_sorting.py +133 -0
  97. desdeo/tools/patterns.py +281 -0
  98. desdeo/tools/proximal_solver.py +99 -0
  99. desdeo/tools/pyomo_solver_interfaces.py +464 -0
  100. desdeo/tools/reference_vectors.py +462 -0
  101. desdeo/tools/scalarization.py +3138 -0
  102. desdeo/tools/scipy_solver_interfaces.py +454 -0
  103. desdeo/tools/score_bands.py +464 -0
  104. desdeo/tools/utils.py +320 -0
  105. desdeo/utopia_stuff/__init__.py +0 -0
  106. desdeo/utopia_stuff/data/1.json +15 -0
  107. desdeo/utopia_stuff/data/2.json +13 -0
  108. desdeo/utopia_stuff/data/3.json +15 -0
  109. desdeo/utopia_stuff/data/4.json +17 -0
  110. desdeo/utopia_stuff/data/5.json +15 -0
  111. desdeo/utopia_stuff/from_json.py +40 -0
  112. desdeo/utopia_stuff/reinit_user.py +38 -0
  113. desdeo/utopia_stuff/utopia_db_init.py +212 -0
  114. desdeo/utopia_stuff/utopia_problem.py +403 -0
  115. desdeo/utopia_stuff/utopia_problem_old.py +415 -0
  116. desdeo/utopia_stuff/utopia_reference_solutions.py +79 -0
  117. desdeo-2.0.0.dist-info/LICENSE +21 -0
  118. desdeo-2.0.0.dist-info/METADATA +168 -0
  119. desdeo-2.0.0.dist-info/RECORD +120 -0
  120. {desdeo-1.2.dist-info → desdeo-2.0.0.dist-info}/WHEEL +1 -1
  121. desdeo-1.2.dist-info/METADATA +0 -16
  122. desdeo-1.2.dist-info/RECORD +0 -4
desdeo/api/schema.py ADDED
@@ -0,0 +1,94 @@
1
+ """Pydantic schemas for the API."""
2
+
3
+ from enum import Enum
4
+
5
+ from pydantic import BaseModel, ConfigDict, Field
6
+
7
+
8
+ class UserRole(str, Enum):
9
+ """Enum of user roles."""
10
+
11
+ GUEST = "guest"
12
+ DM = "dm"
13
+ ANALYST = "analyst"
14
+
15
+
16
+ class UserPrivileges(str, Enum):
17
+ """Enum of user privileges."""
18
+
19
+ CREATE_PROBLEMS = "Create problems"
20
+ CREATE_USERS = "Create users"
21
+ ACCESS_ALL_PROBLEMS = "Access all problems"
22
+ EDIT_USERS = "Change user privileges, roles, groups, etc."
23
+
24
+
25
+ class ProblemKind(str, Enum):
26
+ """Enum of problem kinds."""
27
+
28
+ CONTINUOUS = "continuous"
29
+ DISCRETE = "discrete"
30
+ MIXED = "mixed"
31
+ BINARY = "binary"
32
+
33
+
34
+ class ObjectiveKind(str, Enum):
35
+ """Enum of objective kinds."""
36
+
37
+ ANALYTICAL = "analytical"
38
+ DATABASED = "databased"
39
+ SIMULATED = "simulated"
40
+ SURROGATE = "surrogate"
41
+
42
+
43
+ class Methods(str, Enum):
44
+ """Enum of methods."""
45
+
46
+ NIMBUS = "nimbus"
47
+ NAUTILUS = "nautilus"
48
+ NAUT_NAVIGATOR = "NAUTILUS navigator"
49
+ NAUTILUSII = "nautilusII"
50
+ RVEA = "RVEA"
51
+ NSGAIII = "NSGAIII"
52
+
53
+
54
+ class MethodProperties(str, Enum):
55
+ """Enum of method properties."""
56
+
57
+ INTERACTIVE = "interactive"
58
+ REFERENCE_POINT = "reference_point"
59
+ CLASSIFICATION = "classification"
60
+ # TODO: Add more properties as needed.
61
+
62
+
63
+ class User(BaseModel):
64
+ """Model for a user. Temporary."""
65
+
66
+ username: str = Field(description="Username of the user.")
67
+ index: int | None = Field(
68
+ description=(
69
+ "Index of the user in the database. "
70
+ "Supposed to be automatically generated by the database. "
71
+ "So the programmer should not have to worry about it."
72
+ )
73
+ )
74
+ password_hash: str = Field(description="SHA256 Hash of the user's password.")
75
+ role: UserRole = Field(description="Role of the user.")
76
+ privileges: list[UserPrivileges] = Field(description="List of privileges the user has.")
77
+ user_group: str = Field(description="User group of the user. Used for group decision making.")
78
+ # To allows for User to be initialized from database instead of just dicts.
79
+ model_config = ConfigDict(from_attributes=True)
80
+
81
+
82
+ class Solvers(Enum):
83
+ """Enum of available solvers."""
84
+
85
+ # These should match available_solvers in desdeo.tools.utils
86
+
87
+ SCIPY_MIN = "scipy_minimize"
88
+ SCIPY_DE = "scipy_de"
89
+ PROXIMAL = "proximal"
90
+ NEVERGRAD = "nevergrad"
91
+ PYOMO_BONMIN = "pyomo_bonmin"
92
+ PYOMO_IPOPT = "pyomo_ipopt"
93
+ PYOMO_GUROBI = "pyomo_gurobi"
94
+ GUROBIPY = "gurobipy"
File without changes
@@ -0,0 +1,59 @@
1
+ """General fixtures for API tests are defined here."""
2
+
3
+ import pytest
4
+ from fastapi.testclient import TestClient
5
+ from sqlmodel import Session, SQLModel, create_engine
6
+ from sqlmodel.pool import StaticPool
7
+
8
+ from desdeo.api.app import app
9
+ from desdeo.api.db import get_session
10
+ from desdeo.api.models import ProblemDB, User, UserRole
11
+ from desdeo.api.routers.user_authentication import get_password_hash
12
+ from desdeo.problem.testproblems import dtlz2, river_pollution_problem
13
+
14
+
15
+ @pytest.fixture(name="session_and_user", scope="function")
16
+ def session_fixture():
17
+ """Create a session for testing."""
18
+ engine = create_engine("sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool)
19
+
20
+ SQLModel.metadata.create_all(engine)
21
+
22
+ with Session(engine) as session:
23
+ user_analyst = User(
24
+ username="analyst",
25
+ password_hash=get_password_hash("analyst"),
26
+ role=UserRole.analyst,
27
+ group="test",
28
+ )
29
+ session.add(user_analyst)
30
+ session.commit()
31
+ session.refresh(user_analyst)
32
+
33
+ problem_db = ProblemDB.from_problem(dtlz2(5, 3), user=user_analyst)
34
+ session.add(problem_db)
35
+ session.commit()
36
+ session.refresh(problem_db)
37
+
38
+ problem_db_river = ProblemDB.from_problem(river_pollution_problem(), user=user_analyst)
39
+ session.add(problem_db_river)
40
+ session.commit()
41
+ session.refresh(problem_db_river)
42
+
43
+ yield {"session": session, "user": user_analyst}
44
+ session.rollback()
45
+
46
+
47
+ @pytest.fixture(name="client", scope="function")
48
+ def client_fixture(session_and_user):
49
+ """Create a client for testing."""
50
+
51
+ def get_session_override():
52
+ return session_and_user["session"]
53
+
54
+ app.dependency_overrides[get_session] = get_session_override
55
+ client = TestClient(app)
56
+
57
+ yield client
58
+
59
+ app.dependency_overrides.clear()