From d76dc768b04fc2c7ab734b796adffc5c45e2704c Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Wed, 7 Apr 2021 15:31:39 -0500 Subject: [PATCH] Add CHANGELOG.md --- CHANGELOG.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dd7ce2e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,53 @@ +# MIPLearn: Changelog + +## [Unreleased] + +### Added + +- **Added two new machine learning components:** + - Added `StaticLazyConstraintComponent`, which allows the user to mark some constraints in the formulation as lazy, instead of constructing them in a callback. ML predicts which static lazy constraints should be kept in the formulation, and which should be removed. + - Added `UserCutComponents`, which predicts which user cuts should be generated and added to the formulation as constraints ahead-of-time, before solving the MIP. +- **Added support to additional MILP solvers:** + - Added support for CPLEX and XPRESS, through the Pyomo modeling language, in addition to (existing) Gurobi. The solver classes are named `CplexPyomoSolver`, `XpressPyomoSolver` and `GurobiPyomoSolver`. + - Added support for Gurobi without any modeling language. The solver class is named `GurobiSolver`. In this case, `instance.to_model` should return ` gp.Model` object. + - Added support to direct MPS files, produced externally, through the `GurobiSolver` class mentioned above. +- **Added dynamic thresholds:** + - In previous versions of the package, it was necessary to manually adjust component aggressiveness to reach a desired precision/recall. This can now be done automatically with `MinProbabilityThreshold`, `MinPrecisionThreshold` and `MinRecallThreshold`. +- **Reduced memory requirements:** + - Previous versions of the package required all training instances to be kept in memory at all times, which was prohibitive for large-scale problems. It is now possible to store instances in file until they are needed, using `PickledGzInstance`. +- **Refactoring:** + - Added static types to all classes (with mypy). + +### Changed + +- **Variables are now referenced by their names,** instead of tuples `(var_name, index)`. This change was required to improve the compatibility with other modeling languages, which do not follow this convention. The functions `get_variable_category` and `get_variable_features` now have the following signature: + ````python + def get_variable_features(self, var_name: str) -> List[float]: + pass + + def get_variable_category(self, var_name: str) -> Optional[Hashable]: + pass + ```` +- **Features are now represented as a list of floating point numbers,** as indicated in the snipped above. This change was required for performance reasons. Returning numpy arrays is no longer supported. + +- **Internal solvers must now be specified as objects, instead of strings.** For example, + ```python + solver = LearningSolver( + solver=GurobiPyomoSolver( + params={ + "TimeLimit": 300, + "Threads": 4, + } + ) + ) + ``` +- `LazyConstraintComponent` has been renamed to `DynamicLazyConstraintsComponent`. + +### Removed + +- Temporarily remove the experimental `BranchPriorityComponent`. This component will be re-added in the Julia version of the package. +- Removed `solver.add` methods, previously used to add components to an existing solver. Use `LearningSolver(components=[...])` instead. + +## [0.1.0] - 2020-11-23 + +- Initial public release \ No newline at end of file