[2.5.0] - 9.6.2026
Core logic
Added
- Added scenario-based optimization support: a new
ScenarioModel/Scenario
model (desdeo/problem/scenario.py) that references pooled
constants/variables/constraints/objectives by index, and tools in
desdeo/tools/scenarios.pyfor constructing and solving scenario problems
(build_scenario_problem,build_combined_scenario_problem,
solve_scenario,solve_all_scenarios) (#472). - Added stochastic optimization tools (
desdeo/tools/stochastic.py):
add_expected_asf,add_expected_value, andadd_weighted_scenariosfor
aggregating objectives over probability-weighted scenarios (#472). - Added worst-case robust optimization (
desdeo/tools/robust.py):
add_worst_case_robust, using the standard epigraph reformulation over a
combined scenario problem (#472). - Added partial scalarization (
desdeo/tools/partial_scalarization.py):
add_asf_partial_diff, a differentiable ASF that scalarizes only the subset
of objectives present in the reference point (#472). - Added a summer cabin electricity test problem family
(summer_cabin_electricity.py):summer_cabin_battery_problem,
summer_cabin_battery_problem_split,
summer_cabin_battery_problem_split_scenario, plus
generate_solar_profileandgenerate_summer_cabin_electricity_data
helpers (#472). - Added native polars vector operations to the math parser: matrix/array
random access (extract/exclude with 1-based and end-relative indices),
matmul, summation, and unary UDFs, with a new
tests/test_json_parser_vectors.pysuite (#472). - Added matrix random access to gurobipy expression parsing (#472).
Changed
- Refactored scenario handling: replaced the legacy
scenario_keys/get_scenario_problemmechanism inschema.pywith the new
ScenarioModel, which adds per-scenario probabilities and anticipation info
for scenario variables (#472). - Changed evaluator ordering so scalarization functions are evaluated before
constraints, allowing scalarization symbols to be used inside constraints
(useful when aggregating over multiple scenarios) (#472). - Updated the math parser and evaluators to support polars >= 1.41: native
polars arithmetic for+,-,*,/;powvia a unary UDF for constant
exponents; matmul/extract/exclude/summation/unary viamap_batches;
reshape-based tensor unflattening; and a_safe_hstackthat tolerates an
empty frame in the simulator evaluator. - Updated SCORE Bands visualization (
desdeo/tools/score_bands.py):
scaling now based onscore_jsoninstead of the raw data, added axis-color
and cluster-name customization, support for visualizing individual
solutions, and a new tick value/position calculation.
Removed
- Removed the legacy
scenario_keyshandling from the problem schema,
includingparse_scenario_key_singleton_to_listand
Problem.get_scenario_problem, superseded byScenarioModel(#472).
Fixed
- Fixed type hints and minor issues in
interaction_schema.py. - Fixed the Metallurgical application JSON problem file (
MetallAppl.json).
Web GUI
Added
- Added automatic breadcrumbs to the topbar (
topbar-breadcrumbs
component), driven by a path-to-label map and shown across the groups,
interactive-methods, manage-users, methods, and problems layouts. - Added a Solution Comparison Table component
(solution-comparison.svelte) that highlights whether each candidate
objective value is better than the reference solution.
Documentation
Added
- Added a scenario-based optimization explanation guide
(docs/explanation/scenarios.md) and a standalone scenarios notebook,
inlined/fetched to avoid a heavy notebook in the docs build (#476, #477,
#478).
Changed
- Fixed broken and incorrect links and various typos across the tutorials and
documentation, and reordered the Explanation navigation (Models/schema,
Group decision making, Websockets) to match the index order. - Updated the Discord invite links, which were incorrect.
Tooling, CI, and deployment
Added
- Added an optional
stochasticdependency group (mpi-sppy), kept out of
the default install so the automated tests keep working, at least for now.
Changed
- Bumped dependencies:
cvxpy[scip]to>= 1.8.0, < 1.9, pinnednumpy
(>= 2.2.0, < 2.4) andcmafor compatibility, and refresheduv.lock. - Set the notebook
executeoption tofalseinmkdocs.rtd.yml, moved the
scenarios notebook out of the docs build, cleaned notebook outputs, and
updatedpre-commit.
Rumor has it (automatically generated)
- Breadcrumbs by @MajoMartinco in #463
- Solution Comparison Table component added by @MajoMartinco in #470
- Stochastic optimization stuff by @juropo in #472
- Update the scenario example and cvxpy version by @juropo in #476
- Get scenarios.ipynb from github instead of building it by @juropo in #477
- Inline the scenario example to get rid of heavy notebook by @juropo in #478
- Updating Discord invites and improving grammar by @Mastereeli in #488
- fixed a typo by @lukarantalainen in #494
- added typing by @lukarantalainen in #495
- fixed typing by @lukarantalainen in #497
- fixed a few links and typos by @lukarantalainen in #506
- Fixed links in the "Explanation" section of the documentation by @Mastereeli in #507
- Fixing links by @Ukez1 in #498
- Fixing some typos in DESDEO/docs/home/about.md by @Ukez1 in #496
- Added tests for river pollution and binh and korn problems. by @Mastereeli in #509
New Contributors
- @lukarantalainen made their first contribution in #494
- @Ukez1 made their first contribution in #498
Full Changelog: v2.4.0...v2.5.0