Skip to content

Latest commit

 

History

History
1050 lines (910 loc) · 38.6 KB

File metadata and controls

1050 lines (910 loc) · 38.6 KB

Changelog

All notable changes to this project will be documented in this file.

To see info about this project, please refer to the Readme.

Versions

[3.1.10] - 2026/06/09

➕ Added

  • Added GZD, BD and GZD+BD tie-breaking policies for LM-Cut

[3.1.9] - 2026/06/04

☑️ Fixed

  • [3.1.9.2] If we computed LM-Cut but CPLEX couldn't solve the root node due to time limit breaching, CPLEXs lower bound (0) would overwrite LM-Cuts (>0)
  • [3.1.9.3] Executing the VDM tie-breaking policy first in LM-cut used unitialized vector

➕ Added

  • Option to just execute LM-Cut
  • [3.1.9.1] Additional statistics for LM-cut execution

[3.1.8] - 2026/05/07

☑️ Fixed

  • Better time/memory limit handling

➕ Added

  • Gathering LP bounds (Issue #5) with consistent reporting

[3.1.7] - 2026/04/28

☑️ Fixed

  • [3.1.7.1] Uncaught exception in lmcut computation
  • [3.1.7.2] Added integrity check in reading CPLEX solution
  • [3.1.7.3] Fixed issues #1,#2 and #4
  • [3.1.7.4] Swapped unordered set, which were iterated upon, for a set (determinism across platforms where possible)
  • [3.1.7.5] Fixed issue #3 and removed unreliable statistic on root node relaxation (kept relaxation and cutloop lower bounds on custom cutloop)

➕ Added

  • Added option to add fractional callbacks to complete (TL and VE) models (aswell as custom cutloop)

[3.1.6] - 2026/04/09

☑️ Fixed

  • [3.1.6.1] Patch applied to candidate callback: sometimes CPLEX takes too much to realize that a posted solution is the optimal one... if we figure it out before it, we terminate the execution
  • [3.1.6.2] Patch applied to vertex elimination model: warm start posted was infeasible (unchecked, so still accepted) due to a wrong construction of vertex elimination graph variables

❗ Changed

  • Updated defaults for new best model

🚀 Performance Improvements

  • lmcC_flmcG_lmcC_hadd with vs without cutloop (3.1.5.1):
    • Solved: 2646 -> 2646
    • Nodes: +19,-34,-38,-44%
    • Time: -5,-10,-0,+4%
  • lmcC_lmcC_hadd vs lmcC_flmcG_lmcC_hadd with no cutloop (3.1.5.1):
    • Solved: 2619 -> 2648
    • Nodes: -33,-72,-80,-97%
    • Time: -0,-1,-10,-40%
  • New best model is lmcC_flmcG_lmcC_hadd with no cutloop (default values have been updated)

[3.1.5] - 2026/03/29

☑️ Fixed

  • [3.1.5.1] Missing epsilon in fractional landmark violation check
  • [3.1.5.1] Using CPX_USECUT_FILTER in relaxation callback
  • [3.1.5.2] Wrong imports in cutloop functions
  • [3.1.5.2] Missing error checks in cutloop functions

❗ Changed

  • Updated greedy implementation

🚀 Performance Improvements

  • 3.1.4.1 vs 3.1.5 on compC_lmcutC_hadd:
    • Heuristic Time: -39,-27,-21,-28%
    • Solved: 2566 -> 2566
    • Nodes: -0, -0, -0, -0%
    • Time: -2,-4,-5,-2%

[3.1.4] - 2026/03/28

☑️ Fixed

  • [3.1.4.1] Timelimit implementation slowed down fast instances

❗ Changed

  • Optimized parsing implementation
  • Optimized preprocessing implementation

🚀 Performance Improvements

  • 3.1.3 vs 3.1.4.1 on compC_lmcutC_hadd:
    • File Parsing Time: -18,-20,-18,-24%
    • Preprocessing Time: -33,-28,-17,-11%
    • Solved: 2566 -> 2566
    • Nodes: -0, -0, -0, -0%
    • Time: -17,-16,-4,-0%

[3.1.3] - 2026/03/27

❗ Changed

  • Updated greedy implementation
  • Updated hmax/hadd greedy choice implementation

[3.1.2] - 2026/03/26

⚠️ Known issues

  • Execution on MacOS is (sometimes) non-deterministic (this is a CPLEX bug for ARM MacOS)

☑️ Fixed

  • Wrong time measurements mess up results for fastest runs

[3.1.1] - 2026/03/21

⚠️ Known issues

  • Execution on MacOS is (sometimes) non-deterministic

☑️ Fixed

  • When int separator based on LMcut didn't find any solution, the callback didn't fallback to exact method
  • Logger in async mode doesn't print error or success messages being too close to code termination
  • Un-handled CPLEX solution status (CPXMIP_FEASIBLE)

❗ Changed

  • Updated version of logger for bugfixes

[3.1.0] - 2026/03/20

☑️ Fixed

  • Minor bug fixes and dead/no-op code removed

❗ Changed

  • Using watch-preconditions (inspired from watch literals in sat solvers) for reachability analysis in landmark minimalization

➕ Added

  • Added TODOs on possible future improvements

🚀 Performance Improvements

  • Implementation improvements on landmark minimalization algorithm
  • Old LMC (just LMcut on integer solutions with minimalization (both greedy and extensive)) vs with new minimalization
    • Solved: 2624 -> 2625
    • Nodes: -0, -0, -0, -0%
    • Time: -4,-0,-5,-4%

[3.0.0] - 2026/03/19

❗ Changed

  • Removed suboptimal use of BinarySet
  • Updated BinarySet, Logger implementations

➕ Added

  • Using StatsRegistry for timing and statistics
  • Landmark minimization in LMcut

❌ Removed

  • BinarySet pre and eff from actions

🚀 Performance Improvements

  • Landmark minimization in LMcut (compared with test run):
    • Solved: 2564 -> 2594
    • Nodes: -11,-50,-57,-38%
    • Time: +57,-30,-40,-24%
  • Implementation adjustments (compared with LM min):
    • Solved: 2594 -> 2600
    • Nodes: -3,-0,-5,-12%
    • Time: -31,-21,-33,-14%
  • Old baselines are now outdated... need to run new benchmarks to find the best model

[2.6.1] - 2026/03/10

☑️ Fixed

  • Fixed precision errors for close-to-0 values in fractional LMcut separator

❗ Changed

  • Smarter landmark selection in LMcut

[2.6.0] - 2026/03/05

☑️ Fixed

  • Additional init() removed 0ing of used actions in lmcut int separator

❗ Changed

  • Updated LMcut implementation

➕ Added

  • Precise time measuring for LMcut in preprocessing

🚀 Performance Improvements

  • Unchanged performances

[2.5.1] - 2026/02/18

➕ Added

  • Option to use LMcut to separate violated landmark constraints from integer solutions

🚀 Performance Improvements

  • Violated landmark constraints can now be separated using the LMcut algorithm, by setting the reduced costs of used actions to 0 (note that this separation procedure is not complete when there are 0-cost actions, so it will be complemented by the complementary landmark separation procedure)
  • Old LMC (just comp) vs new LMC (comp + lmc, no separation on fractional solutions):
    • Solved: 2520 -> 2582
    • Nodes: -58,-3,-56,-17%
    • Time: -36,+15,-41,-28%
  • Best (FLM with minimalization) vs new LMC (comp + lmc, no separation on fractional solutions):
    • Solved: 2559 -> 2582
    • Nodes: -32,+45,+5,+75%
    • Time: -20,-7,-26,-32%
  • Our Best method now uses both "comp" and "lmc" separation procedures on integer solutions, and doesn't separate landmarks on fractional solutions

[2.5.0] - 2026/02/16

☑️ Fixed

  • Couldn't properly set the build type
  • Lower Bound after cutloop didn't get updated correctly when reaching time limit
  • Wrong vector sizes in basic model construction

❗ Changed

  • Updated list of best known solutions (both structure and added new values)

➕ Added

  • Minimalization of (violated) landmark found in relax callback
  • Cutoff CLI parameter to be passed to CPLEX as upper cutoff
  • Statistic about lower bound before starting the cutloop
  • Statistics about LM size in fractional
  • Compile time in executable output

🚀 Performance Improvements

  • Violated landmarks from fractional solutions are now improved through a local search strategy (minimalization of the landmark)
  • Old vs new FLM (Fractional LandMark):
    • Solved: 2524 -> 2559
    • Nodes: -36,-27,-36,-14%
    • Time: -6,-11,-13,-23%
  • Best vs new FLM:
    • Solved: 2520 -> 2559
    • Nodes: -45,-35,-49,-65%
    • Time: -2,+2,-16,-10%
  • Our Best method now uses FLM with minimalization

[2.4.2] - 2025/11/24

☑️ Fixed

  • Bug in fractional SEC where we didn't select the smallest-weight edge in the graph construction

❗ Changed

  • Minor aestetic changes in output

[2.4.1] - 2025/11/20

❗ Changed

  • LM-cut CLI parameter is now a string, so that it's possible to choose how many times to repeat LM-cut and with which pcf each time

➕ Added

  • Added missing warnings in CLI parsing

❌ Removed

  • Removed unused cutval calculation in landmark fract separation

[2.4.0] - 2025/11/19

☑️ Fixed

  • Little bug with cutloop pruning of non-tight constraints

❗ Changed

  • Minor code aestetics changes
  • Fractional Landmark Separator is now an heuristic: choice of a PCF (thus, an heuristic) and max-flow algorithm to detect violated landmark

➕ Added

  • Added random seed choice for reproducibility
  • Added LM-cut flag to toggle the use of LM-cut in preprocessing phase

🚀 Performance Improvements

  • Fractional Landmarks Separator is now an heuristic with a 95+% accuracy (before it was an exact algorithm, looking for the maximal violated landmark)
  • Old vs new FLS:
    • Solved: 2516 -> 2522
    • Nodes: +26,+27,+69,+50%
    • Time: -16,-7,-7,-20%
  • Best vs new FLS:
    • Solved: 2518 -> 2522
    • Nodes: -13,-12,-25,-51%
    • Time: +9,+9,+1,+16%

[2.3.0] - 2025/10/15

Tested all features added in 2.2.*

❗ Changed

  • Removed frontier landmarks from default option (candidate callback)

[2.2.12] - 2025/10/14

☑️ Fixed

  • Issue with SEC cuts of fractional solution... it was generating cuts that weren't violated (a missing -1 basically T^T)

❗ Changed

  • Testing sorting of neighbor list for better cycle detection

[2.2.11] - 2025/10/11

❗ Changed

  • Optimizations and other options in candidate callback for SEC cycle detection

[2.2.10] - 2025/10/09

❗ Changed

  • Optimizations in candidate callback for complementary landmarks

[2.2.9] - 2025/10/01

☑️ Fixed

  • Bug with choice of fractional cuts to use, both in the cutloop or in CPLEX callbacks

➕ Added

  • Option to remove fractional cuts at nodes

[2.2.8] - 2025/09/25

❗ Changed

  • Relaxation callback now executes at most once per node, except for nodes with depth 0 (root nodes, either at the start or after a restart)

[2.2.7] - 2025/09/16

☑️ Fixed

  • Fixed issue with landmark generated from the relaxed solutions
  • Bug where lower bound for the cutloop didn't get updated for timelimit termination

➕ Added

  • Added insightful comments throughout the codebase

[2.2.6] - 2025/08/22

☑️ Fixed

  • Fixed bug with LMCUT in version 2.2.6:4 [:5] (25/08/21)

➕ Added

  • LM-CUT disjunctive action landmarks for preprocessing (25/08/17)
  • Testing random LMCUT preprocessing [:1] (25/08/20)
  • Reverting random LMCUT preprocessing to arbitrary [:2] (25/08/20)
  • Testing combination of multiple tie breaking in LMCUT [:3] (25/08/21)
  • Randomization as second level tie-breaking for VDM in LMCUT [:4] (25/08/21)
  • Testing another combination of tie-breaking in LMCUT [:6] (25/08/22)

[2.2.5] - 2025/08/14

This is the Master Thesis version (results of this version shown in my Master's Thesis)

[2.2.4] - 2025/07/19

❗ Changed

  • Added parameters for cutloop (25/07/17)

➕ Added

  • Added test script for testing on small sets of instances (25/07/17)
  • Added test scripts for results analysis

[2.2.3] - 2025/07/15

☑️ Fixed

  • Missing cutloop time in batch test results script

❗ Changed

  • Improved Readme
  • Improved help output
  • Changed cutloop termination policies priorities

[2.2.2] - 2025/07/15

➕ Added

  • First implementation of custom cutloop -> only landmarks and basic termination condition (25/07/09)
  • Added questions for Salvagnin and TODOs (25/07/09)
  • Added S.E.C. detection for custom cutloop (25/07/14)
  • Added In-Out strategy (25/07/14)
  • Parametrized Cutloop and In-Out parameters

[2.2.1] - 2025/07/08

☑️ Fixed

  • Bug with the closing of flmdet model (25/06/28)
  • Removed some magic numbers for better code clarity

❗ Changed

  • Now compiling with a specific version of CPLEX just needs the root directory of CPLEX

[2.2.0] - 2025/06/08

☑️ Fixed

  • Fixed bug where if memory limit is reached inside CPLEX, an error is thrown
  • Fixed bug where if memory limit is reached and no error is thrown (^), the lower bound is not properly updated
  • Fixed bug where in some cases, even with optimal solutions the lowerbound and the incumbent, didn't match
  • Fixed bug with memory limit in jobs for cluster
  • Fixed bug with showing statistics
  • Fixed bug with userhandle in callbacks

❗ Changed

  • Complete code refactoring

[2.1.2] - 2025/06/01

☑️ Fixed

  • MIP model inside relaxation callback is now set on single thread
  • Bug where an infinite loop might occur in the relaxation callback

❗ Changed

  • Using justification graph to separate SEC in candidate callback
  • Separating SEC in fractionary solution

[2.1.1] - 2025/05/29

❗ Changed

  • Using random dominant S.E.C. if multiple (equivalent) cycles are found

[2.1.0] - 2025/05/28

Tested all features added in 2.0.*

☑️ Fixed

  • Minor visual bugs
  • Bug in CMake file where if a CPLEX path is specified, it is ignored in favour of the defaul ones
  • Bug where number of landmarks and SEC where not shown if the relaxation callback wasn't used

[2.0.6] - 2025/05/27

☑️ Fixed

  • Bug where if no integer solution is found, the lower bound isn't retrieved

❗ Changed

  • Logger is now thread safe
  • Created a copy of the callback data for each thread CPLEX might use
  • More meaningful callback statistics (time and cuts added)

➕ Added

  • Flag to decide number of threads to use

[2.0.5] - 2025/05/26

➕ Added

  • Trying different CPLEX parameters

[2.0.4] - 2025/05/15

❗ Changed

  • Added thread safety in relaxation callback
  • Stronger landmark filtering in relaxation callback

[2.0.3] - 2025/05/11

➕ Added

  • Trying violated landmark detection through MIP formulation

[2.0.2] - 2025/05/08

➕ Added

  • Improved violated landmark detection of fractionary solution
  • Added SEC cuts on fractionary solution

[2.0.1] - 2025/04/25

➕ Added

  • Trying ways of producing cuts off the fractionary solution

[2.0.0] -2025/04/22

Tested all features added in 1.4.*

❗ Changed

  • Preparing for ufficial testing and open-sourcing

❌ Removed

  • Removed Inverse Actions Constraints

[1.4.2] - 2025/04/18

❗ Changed

  • Changed algorithm to find cycles
  • Removed probably unnecessary constraint in dynamic model

➕ Added

  • Handling CPXMIP_MEM_LIM_FEAS status code

[1.4.1] - 2025/04/15

➕ Added

  • Added inverse actions constraints in dynamic model
  • Added sec cuts in dynamic model

[1.4.0] - 2025/04/14

Tested all features added in 1.3.*

[1.3.4] - 2025/04/13

☑️ Fixed

  • Fixed CMakeLists with Release build type

➕ Added

  • Added complete landmark cuts to dynamic model

[1.3.3] - 2025/04/03

☑️ Fixed

  • Dynamic model might find wrong optimal solutions

[1.3.2] - 2025/04/02

❗ Changed

  • Slightly better callback in dynamic model

➕ Added

  • Added info executable to see info of an instance

[1.3.1] - 2025/04/01

☑️ Fixed

  • Imai's model finds wrong optimal solutions

➕ Added

  • Added dynamic model
  • Added references

➰ Other

  • Minor changes

[1.3.0] - 2025/03/28

Tested all features added in 1.2.*

❗ Changed

➕ Added

❌ Removed

[1.2.6] - 2025/03/27

☑️ Fixed

  • "Optimal" solution provided by the model with tb might not be optimal if problem optimization is being used

❗ Changed

➕ Added

❌ Removed

  • Temporarly removed Rankooh's dynamic model

➰ Other

[1.2.5] - 2025/03/25

⚠️ Known issues

  • "Optimal" solution provided by the model with tb might not be optimal if problem optimization is being used (max_steps might be smaller than the number of fixed actions (0 cost actions))

➕ Added

❌ Removed

[1.2.4] - 2025/03/21

☑️ Fixed

❗ Changed

➕ Added

[1.2.3] - 2025/03/20

❗ Changed

[1.2.2] - 2025/03/19

☑️ Fixed

➕ Added

[1.2.1] - 2025/03/18

☑️ Fixed

➕ Added

❌ Removed

➰ Other

[1.2.0] - 2025/03/17

Tested all features added in 1.1.*

❗ Changed

[1.1.3] - 2025/03/14

➕ Added

[1.1.2] - 2025/03/13

❗ Changed

[1.1.1] - 2025/03/11

➕ Added

[1.1.0] - 2025/03/11

Tested all features added in 1.0.*

☑️ Fixed

❗ Changed

➰ Other

[1.0.6] - 2025/03/04

☑️ Fixed

➰ Other

  • Started using clang-tidy as static code analyzer

[1.0.5] - 2025/03/02

☑️ Fixed

  • Imai's model crashes if instance optimization is active
  • Posting warm start to Imai's model might not find a feasible solution
  • Posting warm start to Rankooh's model finds wrong objective
  • Hmaxv1 and haddv1 heur find infeasible solutions even if they aren't

❗ Changed

➕ Added

[1.0.4] - 2025/03/01

⚠️ Known issues

  • Imai's model crashes if instance optimization is active
  • Posting warm start to Imai's model might not find a feasible solution
  • Posting warm start to Rankooh's model finds wrong objective

☑️ Fixed

  • Script for reading results from logs only read the first heuristic solution found (in randr, we need to read the last one)
  • Removed unused imports
  • List of remaining variables and actions are calculated on each request, even if after optimization the return is always the same

❗ Changed

➕ Added

➰ Other

  • Code readability adjustments

[1.0.3] - 2025/02/27

☑️ Fixed

❗ Changed

➕ Added

➰ Other

  • Little bit of code refactoring

[1.0.2] - 2025/02/25

☑️ Fixed

  • Errors not showing in log file
  • Logs with errors appear in results json file with an empty string as name
  • Test scripts modify files or folders before the user confirmed correctness of all paths
  • Update best solution didn't perform check on the solution if integrity checks are off (integrity of the solution should always be checked)

❗ Changed

➕ Added

➰ Other

  • Better readability in nested if and for loops

[1.0.1] - 2025/02/24

☑️ Fixed

❗ Changed

➕ Added

❌ Removed

➰ Other

  • Automatic code formatting with clang-format (cpp) and black-formatter (python)
  • Start using attributes ([[nodiscard]], [[likely]], [[unlikely]])

[1.0.0] - 2025/02/23

☑️ Fixed

➕ Added