|
2 | 2 |
|
3 | 3 | ## Unreleased changes |
4 | 4 |
|
5 | | -### Breaking changes |
6 | | - |
7 | | -- **`twoPhaseSimplex` signature changed**: |
8 | | - - Old: `ObjectiveFunction -> [PolyConstraint] -> m (Maybe Result)` |
9 | | - - New: `VarDomainMap -> [ObjectiveFunction] -> [PolyConstraint] -> m SimplexResult` |
10 | | - - The first argument is now a `VarDomainMap` specifying variable domains |
11 | | - - The second argument is now a **list** of `ObjectiveFunction`; pass an empty list to check |
12 | | - feasibility only (Phase 1) without optimising |
13 | | - - The return type is now `SimplexResult` (see below) |
14 | | -- **`VarDomain` type restructured** to support upper bounds: |
15 | | - - Replaced `NonNegative`, `LowerBound SimplexNum`, and `Unbounded` constructors with |
16 | | - a single `Bounded { lowerBound :: Maybe SimplexNum, upperBound :: Maybe SimplexNum }` record |
17 | | - - `Bounded Nothing Nothing` is equivalent to the old `Unbounded` |
18 | | - - `Bounded (Just 0) Nothing` is equivalent to the old `NonNegative` |
19 | | - - Added smart constructors: `unbounded`, `nonNegative`, `lowerBoundOnly`, `upperBoundOnly`, |
20 | | - and `boundedRange` |
21 | | -- **`Result` and `SimplexMeta` types removed**; replaced by: |
22 | | - - `SimplexResult { feasibleSystem :: Maybe FeasibleSystem, objectiveResults :: [ObjectiveResult] }` |
23 | | - — the top-level return from `twoPhaseSimplex` |
24 | | - - `ObjectiveResult { objectiveFunction :: ObjectiveFunction, outcome :: OptimisationOutcome }` |
25 | | - — the result for each objective function |
26 | | - - `OptimisationOutcome` — describes the outcome of optimising a single objective (optimal |
27 | | - value found, unbounded, or infeasible) |
28 | | - |
29 | | -### New features |
30 | | - |
31 | | -- Upper bounds on variables are now supported: use `upperBoundOnly` or `boundedRange` in the |
32 | | - `VarDomainMap`; upper bounds are automatically added as LEQ constraints |
33 | | -- `twoPhaseSimplex` can optimise multiple objective functions in a single call against one |
34 | | - constraint set; results are returned in the same order as the input list |
35 | | -- Added `VarDomainMap` type for mapping variables to their domains; variables not present are |
36 | | - assumed `unbounded` |
37 | | - |
38 | | -### Infrastructure |
39 | | - |
40 | | -- Added Nix flake (`flake.nix`) for a reproducible dev environment via `nix develop` (GHC 9.6, |
41 | | - cabal, stack, fourmolu, hlint, HLS) |
42 | | -- Added `Makefile` with `make build`, `make test`, `make ci`, etc.; supports both cabal and |
43 | | - stack via `BUILD_TOOL=cabal|stack` (default: cabal) |
44 | | -- CI now tests GHC 9.2–9.12 across ubuntu, macos, and windows (cabal); Stack LTS 22.44 on |
45 | | - ubuntu and macos; and a Nix-based job running both cabal and stack |
46 | | -- Replaced HUnit golden tests with HSpec (`hspec-discover`) |
| 5 | +- `twoPhaseSimplex` now takes a `VarDomainMap` as its first argument |
| 6 | + - Specify each variable's domain using smart constructors: `nonNegative`, `unbounded`, `lowerBoundOnly`, `upperBoundOnly`, or `boundedRange` |
| 7 | + - Variables not in the `VarDomainMap` are assumed to be `unbounded` |
| 8 | + - To keep the same behaviour as before (all vars non-negative), use `nonNegative` for all variables |
| 9 | +- `twoPhaseSimplex` now takes a list of `ObjectiveFunction`s instead of a single one |
| 10 | + - Optimise multiple variables against one constraint set in a single call |
| 11 | + - Pass an empty list to run Phase 1 only (feasibility check) |
| 12 | +- `twoPhaseSimplex` now returns `SimplexResult` instead of `Maybe Result` |
| 13 | + - `SimplexResult` contains `Maybe FeasibleSystem` and `[ObjectiveResult]` |
| 14 | + - Each `ObjectiveResult` pairs an `ObjectiveFunction` with its `OptimisationOutcome` |
| 15 | + - `OptimisationOutcome` is either `Optimal { varValMap }` or `Unbounded` |
| 16 | +- `optimizeFeasibleSystem` now returns `OptimisationOutcome` instead of `Maybe Result` |
| 17 | +- Restructured `VarDomain` type to support upper bounds |
| 18 | + - Replaced `NonNegative`, `LowerBound SimplexNum`, and `Unbounded` constructors with a single `Bounded { lowerBound :: Maybe SimplexNum, upperBound :: Maybe SimplexNum }` record |
| 19 | + - Added smart constructors: `unbounded`, `nonNegative`, `lowerBoundOnly`, `upperBoundOnly`, and `boundedRange` |
| 20 | +- Added `VarDomainMap` newtype for mapping variables to their domains |
| 21 | +- Added `VarTransform` type with `AddLowerBound`, `AddUpperBound`, `Shift`, and `Split` constructors |
| 22 | +- Removed `Result`, `SimplexMeta`, `SystemWithSlackVarRow`, `Equation` types |
| 23 | +- Removed `extractObjectiveValue` and `foldDictValue` utility functions |
| 24 | +- Renamed `prettyShowVarConstMap` to `prettyShowVarLitMapSum` |
| 25 | +- Widened dependency version bounds (supports GHC 9.2–9.12) |
| 26 | +- Removed `package.yaml`; `simplex-method.cabal` is now maintained directly |
| 27 | +- Use HSpec for tests |
| 28 | +- Add Nix flake |
| 29 | +- Add Makefile with cabal and stack support |
| 30 | +- Add CI for cabal (GHC 9.2–9.12), stack (LTS 22.44), and Nix |
| 31 | +- Explicit import lists on all modules |
| 32 | +- Bump Stackage LTS to 22.44 |
47 | 33 |
|
48 | 34 | ## [v0.2.0.0](https://github.com/rasheedja/LPPaver/tree/v0.2.0.0) |
49 | 35 |
|
|
0 commit comments