Skip to content

Commit b218f34

Browse files
authored
Merge pull request #132 from equinor/create-decision-tree
Create decision tree
2 parents 54d6c6b + 8046915 commit b218f34

13 files changed

Lines changed: 880 additions & 21 deletions

poetry.lock

Lines changed: 22 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ asgi-lifespan = "^2.1.0"
3333
pyagrum = "^2.2.1"
3434
black = "^25.9.0"
3535
flake8 = "^7.3.0"
36+
networkx = "^3.5"
3637

3738
[tool.pytest.ini_options]
3839
asyncio_mode = "strict"

src/dependencies.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from src.services.option_service import OptionService
2020
from src.services.user_service import UserService
2121
from src.services.solver_service import SolverService
22+
from src.services.structure_service import StructureService
2223
from src.config import config
2324
from src.database import get_connection_string_and_token, build_connection_url
2425

@@ -110,3 +111,7 @@ async def get_user_service() -> UserService:
110111

111112
async def get_solver_service() -> SolverService:
112113
return SolverService(await get_scenario_service())
114+
115+
116+
async def get_structure_service() -> StructureService:
117+
return StructureService(await get_scenario_service())

src/dtos/decision_tree_dtos.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import uuid
2+
from typing import List, Optional
3+
from pydantic import BaseModel, Field
4+
from src.dtos.issue_dtos import IssueOutgoingDto
5+
6+
7+
class EdgeUUIDDto(BaseModel):
8+
tail: uuid.UUID
9+
head: uuid.UUID | None
10+
11+
12+
class EndPointNodeDto(BaseModel):
13+
id: uuid.UUID = Field(default_factory=uuid.uuid4)
14+
scenario_id: uuid.UUID
15+
type: str = "EndPoint"
16+
17+
18+
class DecisionTreeDTO(BaseModel):
19+
tree_node: IssueOutgoingDto | EndPointNodeDto
20+
children: Optional[List["DecisionTreeDTO"]] = None

src/dtos/edge_dtos.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ class EdgeIncomingDto(EdgeDto):
1818
class EdgeOutgoingDto(EdgeDto):
1919
head_node: NodeOutgoingDto
2020
tail_node: NodeOutgoingDto
21+
head_issue_id: uuid.UUID
22+
tail_issue_id: uuid.UUID
2123

2224

2325
class EdgeMapper:
@@ -28,6 +30,8 @@ def to_outgoing_dto(entity: Edge) -> EdgeOutgoingDto:
2830
tail_id=entity.tail_id,
2931
head_id=entity.head_id,
3032
scenario_id=entity.scenario_id,
33+
head_issue_id=entity.head_node.issue_id,
34+
tail_issue_id=entity.tail_node.issue_id,
3135
head_node=NodeMapper.to_outgoing_dto(entity.head_node),
3236
tail_node=NodeMapper.to_outgoing_dto(entity.tail_node),
3337
)

src/dtos/issue_dtos.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
NodeOutgoingDto,
3030
NodeViaIssueOutgoingDto,
3131
)
32+
3233
from src.constants import DatabaseConstants, DepricatedIssueTypes
3334

3435

src/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import src.routes.outcome_routes as outcome_routes
1919
import src.routes.option_routes as option_routes
2020
import src.routes.solver_routes as solver_routes
21+
import src.routes.structure_routes as structure_routes
2122
from src.config import config
2223
from src.session_manager import sessionmanager
2324
from fastapi.middleware.cors import CORSMiddleware
@@ -71,6 +72,7 @@ async def root():
7172
app.include_router(edge_routes.router, dependencies=[Depends(verify_token)])
7273
app.include_router(outcome_routes.router, dependencies=[Depends(verify_token)])
7374
app.include_router(option_routes.router, dependencies=[Depends(verify_token)])
75+
app.include_router(structure_routes.router, dependencies=[Depends(verify_token)])
7476

7577
if __name__ == "__main__":
7678
uvicorn.run("src.main:app", port=8080)

src/routes/structure_routes.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import uuid
2+
from typing import Optional
3+
from fastapi import APIRouter, Depends, HTTPException
4+
from src.services.structure_service import StructureService
5+
from src.dependencies import get_structure_service
6+
from src.dtos.decision_tree_dtos import DecisionTreeDTO
7+
8+
9+
router = APIRouter(tags=["structure"])
10+
11+
@router.get("/structure/{scenario_id}/decision_tree")
12+
async def get_decision_tree(
13+
scenario_id: uuid.UUID,
14+
structure_service: StructureService = Depends(get_structure_service)
15+
) -> Optional[DecisionTreeDTO]:
16+
try:
17+
return await structure_service.create_decision_tree_dtos(scenario_id)
18+
except Exception as e:
19+
raise HTTPException(status_code=500, detail=str(e))

0 commit comments

Comments
 (0)