Skip to content

DESDEO 2.4.0

Choose a tag to compare

@gialmisi gialmisi released this 14 Apr 10:38
· 65 commits to master since this release

[2.4.0] - 14.4.2026

Core logic

Added

  • Added CVXPY solver support with full integration into the problem/solver
    stack (#466).
  • Updated guess_best_solver to include CVXPY and to check for a valid Gurobi
    license (#468).

Changed

  • Updated gurobipy implementation: tensor constants can now be used without
    errors (#464).

Fixed

  • Fixed infinite loop in dmitry_forest_problem_disc() (use relative path
    instead of walking up to the DESDEO folder), which also caused
    conftest.py to hang.

Web API

Added

  • Added NAUTILUS Navigator endpoints /initialize and /navigate, with
    NautilusNavigatorInitializationState and NautilusNavigatorNavigationState
    states and unit tests.
  • Added constrained variant endpoint
    POST /problem/{problem_id}/constrained_variant with VariableFixing,
    ConstrainedVariantRequest, and ConstrainedVariantResponse models.
  • Added is_temporary and parent_problem_id fields to ProblemDB for
    variant tracking.
  • Added site-selection endpoints POST /site-selection/load_metadata and
    POST /site-selection/map, backed by a new SiteSelectionMetaData DB model
    (follows the ForestProblemMetaData pattern).
  • Added E-NAUTILUS what-if simulation endpoint
    POST /method/enautilus/simulate (ephemeral, no DB writes) with
    ENautilusSimulateRequest/Response/StepResult models and a
    deprioritize flag for worst-case selection.
  • Added endpoint returning the list of DM users.
  • Added /add_new_dm endpoint (restricted to analyst/admin) and enabled
    analysts/admins to create and manage problems and interactive sessions on
    behalf of DMs.
  • Added fetch_problem_with_role_check and
    fetch_interactive_session_with_role_check helpers in utils.py for
    role-aware ownership bypass.
  • Added ?target_user_id= parameter on POST /session/new for analysts to
    create sessions on behalf of DMs.
  • Added endpoint returning an HTTP exception based on an error code.
  • Added tests for the constrained-variant endpoint, the site-selection
    endpoint, and DM-user/problem-ownership behavior.

Changed

  • Refactored NAUTILUS Navigator to follow the E-NAUTILUS patterns: replaced
    legacy manual auth/problem loading with SessionContextGuard, moved
    request/response models from schemas/ to models/ as SQLModel, used
    Problem.from_problemdb(), and walked StateDB.parent for session-scoped
    parent-chain traversal.
  • Deleted desdeo/api/schemas/ (no longer needed after the model migration).
  • Session/problem listing endpoints now return all sessions/problems for
    analysts (own only for DMs); empty lists return 200 + [] instead of 404.
  • Problem action endpoints (delete, solver, JSON, representative sets) now
    allow analyst access to any problem.
  • Simplified DELETE /problem/{problem_id}: owners can delete any of their
    problems.
  • Restricted POST /add_new_dm to analyst/admin (was previously public).
  • Removed the legacy /clinic/ router, ClinicMapRequest/Response models,
    and clinic_map.py in favor of the metadata-driven site-selection map.
  • Added 401 and 500 login responses to the API/OpenAPI generator.

Fixed

  • Fixed SessionContextGuard HTTP status codes: 404 for missing resources,
    403 for ownership failures (previously 400 for both).
  • Fixed InteractiveSessionBase missing from_attributes=True, which caused
    POST /session/new to return {}.
  • Fixed swapped arguments in fetch_interactive_session (utils.py).
  • Fixed test_delete_problem_unauthorized and test_constraint_variant to
    expect the correct 403/404 status codes.

Web GUI

Added

  • Added rudimentary Manage Users page (/manage-users) for analysts and
    admins to create DM and analyst accounts; route is server-side guarded and nav
    visibility is role-based (auth store populated on topbar mount).
  • Added analyst/admin management of other users' interactive sessions and
    problems: user filter dropdown (default "Myself"), Owner column/field, and
    "Create for" / DM selectors on session and problem creation.
  • Added map metadata upload dialog on the Problems page (JSON file
    upload); renamed clinic-map.svelte to site-selection-map.svelte which
    now accepts a problem_id prop.
  • Added map interaction in E-NAUTILUS: click site markers to cycle
    free → restricted → forced; multiple sites per city node are constrained
    together; re-solve with RPM using E-NAUTILUS final objectives as aspiration
    levels; constrained variant inherits the parent problem's solver metadata.
  • Added comparison bottom panel with tabbed Parallel Coordinates /
    Comparison Table
    views; solution tab shows the constrained solution with
    the original as a dashed comparison line; "Use this solution" accepts the
    constrained result, "Reset" reverts to the original.
  • Added what-if scenario simulation in the Decision Journey view: "best"
    (blue) and "worst" (red) buttons per objective, dashed-line overlays with
    hollow-circle markers, and an actual-vs-what-if comparison table with
    colored deltas.
  • Added catch-all proxy route /api/[...path] that forwards browser API
    calls through event.fetch so handleFetch intercepts for cookie
    injection and 401/token-refresh handling.
  • Added generated Orval endpoints for NAUTILUS Navigator and enabled Orval
    Zod body-schema generation.
  • Added login error display after unsuccessful login attempts.

Changed

  • Replaced the hardcoded clinic map system with the new metadata-driven
    site-selection map.
  • Unrolled tensor variables in RPM results for frontend compatibility
    (e.g. svsv_1..sv_60).
  • Updated API client to use correct URLs for debug/deploy; getUrl now
    returns a relative /api/<path> on the browser side, with a
    http://localhost:8000 fallback detected via typeof window === 'undefined'
    on the server side.
  • Removed client-side 401 retry logic from customFetch — now handled
    server-side by handleFetch via the proxy; removed the dead Vite /api
    proxy config from vite.config.ts.
  • Replaced $effect with an explicit oninput handler for clearing login
    errors and removed a debug console.log from the login server action.
  • Default Decision Journey visualization pane height raised to 65% for more
    chart room; selected iteration highlighted with a vertical band.
  • Regenerated Orval clients multiple times to pick up new endpoints.

Fixed

  • Fixed various URL-resolving and access-token cookie issues affecting
    deployment.
  • Fixed Orval import mismatches after regeneration
    (getProblemProblemGetPost, addRepresentativeSolutionSet).

Documentation

Added

  • Added a guide on how to deploy the fullstack on OpenShift using the
    oc tool from a terminal.

Changed

  • Updated deployment documentation and polished deployment files.
  • Updated the webui README (including the API_BASE_URL fix).

Tooling, CI, and deployment

Added

  • Added a justfile and the rust-just dependency — just is a
    drop-in cross-platform replacement for make and is available on PyPI.
  • Added a Python version of run_fullstack.sh so it runs on all
    Python-compatible platforms.
  • Added a GitHub workflow for running the Web GUI tests with Vite.
  • Added secrets to .gitignore.

Changed

  • Updated docs so that references to make/Makefile now point to
    just/justfile.
  • Updated build and Dockerfiles; switched npm ci to npm install in
    webui/Dockerfile.
  • General Rahti deployment testing and configuration updates.

Full Changelog: v2.3.0...v2.4.0