OPTANO.Modeling Change-Log
Are you missing a feature? Please report to OPTANO Modeling Groups
Version 3.24.0 (2024-12-01)
- Feature
- Add support for
ILOG.CPLEX.Cplex.DoubleParam.DetTimeLimit
to CPLEX12.10
andCPLEX 20.10
.
- Add support for
Versoin 3.23.1 (2024-09-26)
- Improvement
- Properly check if user specified a custom
objective.RelativeTolerance
orobjective.AbsoluteTolerance
before printing hint. - Parallelize lazy extraction of variables
- Add
gurobiSolverConfiguration.ConstraintBatchSize
(default:266144
) in order to not exceedGRB.IDLE_TIMEOUT
limit when converting huge models into theGRBModel
API.
- Properly check if user specified a custom
Version 3.23.0 (2024-07-24)
- Feature
- Add support for Highs 1.7.2, using the official Highs.Native NuGet package.
Version 3.22.1 (2024-07-16)
- Fix
- Normalize constraints that are auto-generated during substitution of non-linear expressions/operators when transforming model before solve.
Version 3.22.0 (2024-03-11)
- Improvement:
- Add (
OptimalityTarget
)[https://www.ibm.com/docs/en/icos/20.1.0?topic=parameters-optimality-target] toCplexSolver
(12.8 and newer).
- Add (
Version 3.21.0 (2024-01-03)
- Fix
- Refresh the
model.Variables
collection before starting LP/MPS export, whenModelBehavior.Lazy
is active.
- Refresh the
- Feature
- Add support for Gurobi 11.
- Update limited licenses for Gurobi 9.5.0 - 11.0
Version 3.20.1 (2023-11-20)
- Fix
- No longer create shallow copy of solution dictionaries when accessing the public property getters in order to improve performance.
Version 3.20.0 (2023-11-20)
- Breaking:
- Remove NuGet dependency to Microsoft.Z3
- Reference is only required, if the Z3 solver should be used.
- Please reference the desired version of Z3 from NuGet manually, if you want to use the Z3 solver.
- Change default value of
ModelScope.ModelBehavior
toModelBehavior.Lazy
- NOTE: If you require the
model.Variables
collection to contain the referenced Variables before callingsolver.Solve
, you need to make sure that you useModelBehavior.Auto
!
- NOTE: If you require the
- Remove NuGet dependency to Microsoft.Z3
- Improvement:
- Ignore added SOS when variable count is less than 2, since this might cause errors in various solver APIs.
- Gracefully handle queries on an infeasbile
Solution
objects instead of throwingNullPointerException
s.
Version 3.19.0 (2023-09-25)
- Feature:
- Add support for HiGHS 1.5.x
- Breaking:
- Remove
ISolver.IsBusy
property, since it was obsolete. Usages are replaced (and have been for about 5 years) withlocks
toSolverBase._busyLock
object.
- Remove
Version 3.18.1 (2023-09-12)
- Fix:
- In some cases,
GurobiSolver 9.5.2
andGurobiSolver 10.0.0
did not behave deterministic when adding constraints, even thoughModelScope.DeterministicModelGeneration
is set totrue
.
- In some cases,
Version 3.18.0 (2023-09-08)
- Feature: Add
NameHandlingSytle.ConfidentialNames
- Only short names (i.e. base-64 indices) are passed to the solver APIs
- Constraints store their
OriginalName
, which is only used/printed in IIS text. - When printing the conflicting set (IIS), the long names (for
variables
andconstraints
) will be automatically inserted when calling:conflictingSet.ToString()
- (or
conflictingSet.ToDebugNameString(model.GetVariableNameToLongNameMapping());
)
- Note: Variables that are not manged by a
VariableCollection
will always be printed with theirShortName
.
Version 3.17.0 (2023-06-01)
- Improvement: Reworked
Solution.Gap
:- MIP Gap is now also available for multi-objective optimization (
Native
andEmulated
). Solution.Gap
will return the MIP Gap for the last optimized priority level. (In case of a single stage optimization, this is the classical mip gap.)Solution.GetMipGap(prioLevel)
returns the gap for the given priority level.
- MIP Gap is now also available for multi-objective optimization (
Version 3.16.0 (2023-05-25)
- Feature: Add (partial) determinism to OPTANO Modeling.
- Set your Configuration.DeterministicModelGeneration (or
ModelScope.DeterministicModelGeneration
) totrue
, to enable deterministic model generation. - So far, only Objectives and linear Constraints, and Variables will be added to solvers in a deterministic order.
- If the actual solver will behave deterministically between two runs with identical model (and order), depends on the solver and/or the respective settings.
- NOTE: Special ordered sets (SOS) are not explicitly sorted before passing them to the solver.
- Set your Configuration.DeterministicModelGeneration (or
- Improvement: Make HiGHS solver(s) less verbose.
- Only log config values that deviate from the default setting, and consider the
HighsSolverConfiguration.LogToConsole
value.
- Only log config values that deviate from the default setting, and consider the
- Fix: Prevent
NullPointerException
duringHighsSolver.ClearLastModel()
(e.g. during a resolve) call.- See also: groups forum
- Fix: Revised logic for checking which license type (Compute Server, Cloud Server, Web License Service, License File) in
GurobiSolver 9.0
(and later). Now, only the hard required parameters are checked. - Improvement: Add support for
WLS
(Web License Service) environments toGurobiSolver 9.5.0
(and later).
Version 3.16.0-beta (2023-03-21)
- Feature: Add (partial) determinism to OPTANO Modeling.
- Set your Configuration.DeterministicModelGeneration (or
ModelScope.DeterministicModelGeneration
) totrue
, to enable deterministic model generation. - So far, only Objectives and linear Constraints, and Variables will be added to solvers in a deterministic order.
- If the actual solver will behave deterministically between two runs with identical model (and order), depends on the solver and/or the respective settings.
- NOTE: Special ordered sets (SOS) are not explicitly sorted before passing them to the solver.
- Set your Configuration.DeterministicModelGeneration (or
- Improvement: Make HiGHS solver(s) less verbose.
- Only log config values that deviate from the default setting, and consider the
HighsSolverConfiguration.LogToConsole
value.
- Only log config values that deviate from the default setting, and consider the
- Fix: Prevent
NullPointerException
duringHighsSolver.ClearLastModel()
(e.g. during a resolve) call.- See also: groups forum
Version 3.15.1 (2023-02-22)
- Fix: Sometimes
ScipSolverAdapter.Dispose()
threw anAccessViolationException
, due to a pre-mature garbage collection run for wrapped SCIP variable/constraint objects. - Improvement: The OPTANO.Modeling package no longer copies the
ScipOptWrapperCpp
andMipCLCppWrapper
to your/Source
directory, when installing the package.
Version 3.15.0 (2023-02-10)
- Improvement: Add support for HiGHS 1.4.x
- Improvement: Updated
Z3
solver to Version 4.11.2- Note: The new solver package now targets
AnyCPU
instead ofx64
.
- Note: The new solver package now targets
Version 3.14.2 (2023-01-13)
- Fix: Transformation in
Or
constraints no longer reduced the effective upper bound for the constraint(s) in the active constraint group. Previously, a rounding error might have introduced some |delta| < 1 for the LB/UB. - Improvement: Gurobi will now ignore other license files (e.g. located in
c:\gurobi
, or defined in environment variableGRB_LICENSE_FILE
), when initialized withLimitedLicenseUsage.Always
.
Version 3.14.0 (2022-12-23)
- Feature: Update limited licenses for Gurobi 9.x - 10.0
- Note: Gurobi 8.x is no longer officially supported by Gurobi, and thus the limited license will expire on 2022-12-31.
- Improvement: Add
ModelBehavior.Lazy
(set viaModelScope.ModelBehavior
(or the scope configuration), that delays the adding of variables untilsolver.Solve
is called.- With
ModelBehavior.Auto
, every time that a constraint is added to a model, all variables from it are extracted, and the new variables are added to the model. Since many variables are already known, a lot of redundant work/checks are performed, which hurts the performance. - With
ModelBehavior.Lazy
, the variables are collected + added just before the model is converted to the respective solver-API. This might speed up the pre-processing time when building your model.
- With
- Improvement: Add
Variable.Partition
values as batch to speed up performance, especially for cloud instances.
Version 3.13.1 (2022-11-17)
- Fix: Optimization with CPLEX 12.7 no longer fails, when variables that are removed during normalization (e.g. because all factors for them are
0
) exist in the model. - Fix: Prevent crash of GurobiSolver, when
Abort()
is called before theGRBModel
is initialized. - Fix: Prevent
KeyNotFoundException
during normalization of non-linear expressions that contain terms with a factor of0
.
Version 3.13.0 (2022-11-11)
- Feature: Add support for Gurobi 10.0.0.
- Feature: The HiGHS adapter now targets the latest release version of HiGHS v1.3.0.
- The v1.3.0 release contains additional extensions to HiGHS' C# interface, that are required for some OPTANO.Modeling features in the HiGHS adapter.
- NOTE: Breaking: The v1.2x of the HiGHS adapter has been removed. Please adjust your
using
statements accordingly and update to the latest version of HiGHS.
- Fix: The HiGHS v1.3.x adapter no longer omits constant terms in expressions, and now moves them into the LB/UB, before sending the model to the solver.
Version 3.12.0 (2022-10-18)
- Feature: Add support for HiGHS Solver 1.2.x
- Note: We recommend to download + compile the sources yourself (unless v-next after the current
HiGHS 1.2.2
is officially released by HiGHS), in order to gain access to the full feature set. In HiGHS <=1.2.2
, setting start values is not supported through the C# API. Thus, no start solution can be passed to HiGHS <=1.2.2
, especially during (emulated) multi-objective optimization! - Note 2: HiGHS seems to expect a "complete" solution as start solution. I.e. it does not suffice to only pass values for the integer/binary variables. Updates are tracked here.
- Note 3: Make sure that the following libraries can be accessed by your application, if you want to use HiGHS:
- libhighs.dll
- libstdc++-6.dll
- libwinpthread-1.dll (Windows) / pthread.dll (Linux)
- libgcc_s_seh-1.dll
- Note: We recommend to download + compile the sources yourself (unless v-next after the current
Version 3.11.0 (2022-07-18)
- Feature: Add support for Gurobi 9.5.2.
- Fix: Resolve an issue that prevented CPLEX 20.10 from exporting multi objective LPs (cf. here).
Version 3.10.1 (2022-05-16)
- Fix: Calculated property Solution.MipGap displayed an incorrect gap in a case where a model was solved twice, using different objective functions.
- Value should now be displayed correctly.
Version 3.10.0 (2021-12-17)
- Feature: Add support for CPLEX 20.1.0.
- Feature: Add native multi-objective support to CPLEX 12.10 and CPLEX 20.1.0 adapters.
- Improvement: Add support for multi-objective cost coefficients in Model.VariableStatistics.
- Fix: Prevent a
FileAccessException
(on log file), when callingSolve
for a 2nd time on the same instance of a CPLEX solver. (For CPLEX 12.6 and newer.)
Version 3.9.2 (2021-12-10)
- Feature: Add option for excluding the MipCLCpp- and ScipOptWrapperCpp DLLs.
- Simply append the following properties to your
*.csproj
file, if you want to hide (+ prevent copying) the wrapper DLLs, in case that you do not use the corresponding solvers.xml <PropertyGroup> <FlagHideMipCl>true</FlagHideMipCl> <FlagHideScip>true</FlagHideScip> </PropertyGroup>
- NOTE: After excluding a wrapper, you [need to | can] manually remove the respective wrapper DLL from your solution folder. The DLL will no longer be restored after future builds, unless you disable the
Hide
-flag again. - NOTE 2: This feature is only supported for projects $\geq$
.netstandard20
.
- Simply append the following properties to your
Version 3.9.1 (2021-11-17)
- Fix: ScipOpt adapter now properly handles constant values in constraint expressions.
- Fix: Built-In LPReader now correctly handles constant values in expression part of constraints.
Version 3.9.0 (2021-11-15)
- Feature: Add adapter for Gurobi 9.5
- Feature: Extend all limited licenses for Gurobi adapters 8.0 - 9.5 until 2022-12-31.
- Fix: Prevent NullPointer in rare edge-case during multi-objective optimization. cf. here
Version 3.8.1 (2021-10-15)
- Feature: Add native support for SOS1 and SOS2 in the ScipOpt adapter.
- Fix: Fixed an error that could occur in case of a timeout during emulated multi-objective solve (cf. here).
Version 3.8.0 (2021-08-27)
- Feature: Added support for the SCIP Optimization Suite 7.0.2.
- Feature: Added support for multiple model output files.
- The SolverConfiguration contains two sets of FileInfos:
- SolverConfiguration.OutputFilesBeforeSolve: This set of files will be written before the model is solved.
- SolverConfiguration.OutputFilesAfterSolve: This set of files will be written after the model is solved.
- It is the responsibility of the user to make sure the requested exports are valid at the specified point in time.
- E.g. it is not possible to export an
.ILP
with Gurobi, before a model is solved (see Gurobi IIS).
- E.g. it is not possible to export an
- The SolverConfiguration contains two sets of FileInfos:
- Fix: Added missing parameter CSClientLog to GurobiSolverConfiguration 9.0.
Version 3.7.0 (2021-04-26)
- Feature: Added support for GurobiSolver 9.1.2. Due to an API change, the general Gurobi 9.1 Adapter is not compatible with Gurobi 9.1.1 and 9.1.2.
Version 3.6.0 (2020-12-10)
- Feature: Added support for GurobiSolver 9.1
- Feature: Updated all size-limited licenses for Gurobi 8.0 and above.
- Licenses are valid until 2021-21-31.
- Fix: Template for error message related to assigning
VariableType.Binary
to a variable with bounds outside of[0, 1]
was using a wrong number format for displaying variable bounds, which caused an exception. Bounds are now properly formatted.
Version 3.5.1 (2020-11-23)
- Hotfix: Prevent a
KeyNotFoundException
that could occur during the re-solve of a model, to which anOperatorExpression
(e.g.Expression.Absolute
) was added between thesolver.Solve(model)
-calls. - Feature: Add a proper
ToString()
forAbs
-operator:|x|
now will be printed as such when it occurs within anExpression.ToString()
.
Version 3.5.0 (2020-11-06)
- Breaking Change: Move GLPK Solver Adapter to a separate package.
- You can find it here: OPTANO.Modeling.GLPK.
- Feature: Make
ModelScope.Current
publicly accessible. That means for example, that you can now do something like this within yourTearDown()
methods for unit tests in order to clear a (potentially) implicitly createdModelScope
:
public void TearDown() { ... ModelScope.Current?.Dispose(); ... }
- Feature:
Expression
now has a public property to compute theConstant
of the expression without manually creating a variable-dictionary and calling theEvaluate
method.
Version 3.4.1 (2020-08-20)
- Feature: Prevent ModelScope from generating short names that are used as keywords in the LP file format.
- The following words are blocked by default: "min", "max", "such", "st", "free", "end", "bin", "sos", "gen", "semi", "semis", "minimize", "maximize", "bounds", "binary"
- This includes all different capitalizations, such as "miN", "MiN", etc.
- A list of the blocked words is available via ModelScope.BlockedShortNames
- Feature: Add methods for custom (Un-)blocking of unwanted shortnames:
- ModelScope.AddInvalidShortName and ModelScope.RemoveInvalidShortName
- Note: Both methods do have a bool-flag that indicates whether only the exact casing that is given as "word to block" should be (un-)blocked, or all capitalizations.
This also gives the opportunity to re-allow any number of short names that are blocked by default.
Version 3.4 (2020-07-16)
- Feature: Add support for CPLEX 12.10
- Feature: The internal LP writer (used as fallback for solvers that do not provide a native option for exporting a model) now orders variables and constraints by name.
- Feature: Updated the limited license for all versions of Gurobi 8.*.
- Fix: The automatic substitution for OR-Constraint was not properly working for all cases. This also affected the substitution of Implies-Constraints.
- See also this google groups discussion.
- Fix: When Products with "very small" (i.e.
< 1e-6
) factors were normalized, the complete product was declared to be0
.
Internally, it was assumed that numbers < ModelScope.EPSILON are "equal" to0
, without checking if the "final" result might be larger than1e-6
.- E.g.:
p = 1/10000000 * (1000 * x)
Previously:p = 0
Now:p = 1/10000 * x
- E.g.:
Version 3.3 (2020-02-21)
- Feature: Support reading of config.prm files for GurobiSolver (starting with GurobiSolver 8.0).
- The config.prm file info can be set via GurobiSolverConfiguration.ParameterFilePath. NOTE: The file needs to end with ".prm"!
- With GurobiSolverConfiguration.ApplyParameterFileBeforeModelingConfiguration you can specify whether the params.prm will be set before (true, default), or after (false) the parameters that are specified in the GurobiSolverConfiguration.
I.e. you can control the order in which parameters that are set both in the params.prm AND the GurobiSolverConfiguration override each other. The value that is applied LAST will be used for the optimization.
- Fix: License information parameters from GurobiSolverConfiguration were applied after the
GRBEnv
was already started. This causes an error.- Additionally, some license parameters were not used, when initializing the
GRBEnv
.
This has now been resolved for GurobiSolver 8.0 and later. - Note: If you provide information for more than 1 license type (e.g. CloudServer + ComputeServer), the first complete license information will be used. License types are checked in the following order:
- Check if
LimitedLicenseUsage.Always
- ISV License
- Compute Server License
- Cloud Server License
- gurobi.lic file
- Check if
LimitedLicenseUsage.Fallback
- else: Abort with error
- Additionally, some license parameters were not used, when initializing the
Version 3.2.2 (2020-01-16)
- Fix: Model.Clear did not properly clear all
Objective Names
, so that re-adding an objective with a name that was used before resulted in an error.- All relevant dictionaries are now cleared properly.
- cf. this forum thread: Unable to AddObjective after Clear due to name collision
Version 3.2.1 (2020-01-09)
- Fix: ExistingIndicesGeneric sometimes returned indices that were not accepted by the same variable collection.
- This issue is now resolved.
Version 3.2.0 (2020-01-08)
- Feature: Added callback mechanism to interrupt a multi-hierarchical solve after each hierarchy-level is optimized.
- Based on the current Solution and hierarchy-level, the user can specify whether or not to interrupt the solving. The callback SolverBase.InterruptMultiHierarchicalOptimization is queried after each iteration of the non-native solution. It can be set via SolverBase.SetMultiHierarchicalInterruptionCallback
- If the function returns the value true, the intermediate solution will be treated like a time-limited solution, and the current state (variable values, etc.) will be returned to the user.
Version 3.1.0 (2019-12-09)
- Feature: Added support for GurobiSolver 9.0
- Fix: Variable.BranchingPriority was wrongly inverted when using any version of the CPLEX solver.
- This means that variables for which the user specified a low priority were transferred as variables with high priority (and vice versa).
- Please make sure to double-check your code for possible usages of Variable.BranchingPriority in combination.
- The new behavior for all solvers is: Larger Number = Higher Priority
Version 3.0.1 (2019-05-06)
- Improvement: Updated expired limited licenses for Gurobi 7.52 and Gurobi 8.0
- All limited licenses for Gurobi will be valid until 2020-05-01
Version 3.0.0 (2019-04-29)
- TargetFramework is increased to .net 4.6.1 in order to provide full compatibility for .netstandard20.
- This means that you need to update your application to .net 4.6.1 (or later), if you wish to continue using OPTANO.Modeling in version 3.0 (or later).
- Feature: Updated Z3 Solver to version 4.8.4.
- The Z3Solver now references the official NuGet release of Z3: https://www.nuget.org/packages/Microsoft.Z3.x64/4.8.4
- Feature: Methods for adding variables and constraints to the Model are now
- Thread Safe
- Executed as (parallelized) batch queries.
- Feature: Added parameter for specifying library paths that contain the required libraries/DLLs for your solver.
- The LibraryPaths will be appended to the PATH environment variable, so that you do not need to copy the DLLs into your bin/Debug (or /Release) folders.
- Feature: Truncating length of DebugNames to a total number of characters (this includes the appended base64-suffixes), since some solvers can only handle variable/constraint names up to that size.
- The truncating can be activated with the Configuration.MaximumNameLength parameter.
- This is relevant for the GurobiSolver, since it can only handle names with a total length of up to 255 characters.
- I.e. if you encounter issues with the length of your debug-names, set the above-mentioned parameter to 255 (instead of its default value 'null').
- Feature: Added MaximumNameLength parameter to the ModelScope for limiting the maximum (debug-) name length of Variables, Constraints and Objectives.
- Some solvers (e.g. Gurobi) only allow variable names with a length of up to 255 characters. If a variable with a longer name is added, an Exception is thrown.
- The MaximumNameLength limits the length of the generated UniqueLongNames by truncating the debug names (from your specified name generator), before appending the suffix, so that the total length of the name will not exceed the MaximumNameLength.
- Improvement: Added possibility for generating a mapping of Variable ShortNames to DebugNames in the ConflictingSet. See ConflictingSet Documentation for further information.
- Improvement: Added a method for checking if a given variable index is used within a VariableCollection: IVariableCollection.IsVariableForIndexInstanciated
- GenericVariableCollection provides explicitly typed methods for querying with the generic "T" parameters.
- Improvement: Added method that returns all used variable indices within a GenericVariableCollection: GenericVariableCollection.ExistingIndicesGeneric
- Fix: Fixed an issue in MIPCL, where constraints without variables, such as "1 <= 0" were ignored by the solver.
- Models that contain such constraints will now be declared infeasible.
- Breaking Change: Removed support for older MIPCL versions, since only the most recent version of MIPCL can be obtained from MIPCL Download.
- Breaking Change: Removed static ModelScope Configuration.Instance.
- There is no technical necessity for maintaining a singleton instance of the model scope configuration.
Version 2.16.0 (2019-04-23)
- Feature: Added support for MIPCL 2.1.3.
- Feature: Option for using the limited License of the OPTANO.Modeling.Gurobi with priority over an existing full license.
- This enables you to solve small optimization models during unit testing, without blocking your license for other ("real") optimization jobs.
- Feature: Support batch-adding of Constraints and Variables in CPLEX Solver 12.8
- This speeds up the "translation" between the OPTANO Modeling Model and the CPLEX API model by some orders of magnitude
- Feature: More parallelization + log messages during CPLEX 12.8 API model creation
- Fix: Add all Variables from Model to CplexModel. Previously, only variables that were used in the constraints or objectives were added to the CPLEX API model.
- When querying the solution values, CPLEX crashed since the query contained variables that were unknown to the API model.
Version 2.15.0 (2019-04-04)
- Feature: Added more control options for multi-hierarchical objectives. Several settings can now be set for a specific hierarchy-levels.
- Custom TimeLimit for specific hierarchy-levels can be set via SolverConfiguration.PriorityLevelTimeLimitDefinition.
- If a global time limit is set, too, the effective time limit is the minimum of the "remaining" global time limit and the specific time limit.
- If no hierarchy-level specific TimeLimit is defined, the remaining global time is used.
- If the global TimeLimit is reached before all objective stages are optimized, the last known solution will be returned, since it is also a solution for later objective stages.
- Keep in mind that this solution might have a large gap (for the later objective stages), since these stages were not looked at by the solver, yet.
- Currently supported by CPLEX Solver 12.8 and Gurobi Solver 8.1 (in both, non-native and native mode).
- Custom MIP Gaps for specific hierarchy-levels can be set via SolverConfiguration.PriorityLevelMipGapDefinition.
- If no custom Gap is defined for a given hierarchy-level, the global MIP Gap is used as a fallback.
- IMPORTANT: Gurobi's interpretation of global and custom MIP gaps deviates from what users usually expect. If both, global and custom MIP Gaps are set, the objective will be solved with the custom MIP Gap, only to relax the known lower bound for that objective with the global MIP Gap in later stages. This is and additional relaxation that is multplicative with their ObjNRelTol degradation.
- For OPTANO modeling in non-native mode, we deliberately deviate from this pattern, because it can lead to huge degradations of the "most important/prioritized" objectives when there are many hierarchical levels.
- Currently supported by CPLEX Solver 12.8 and Gurobi Solver 8.1 (in both, non-native and native mode).
- Custom objective quality degradation for specific hierarchy-levels can be controlled via SolverConfiguration.PriorityLevelQualityDegradationDefinition.
- The values specify how much the objective value for a given hierarchy-level is allowed to be degraded in later levels. These settings behave just as Gurobi's ObjNRelTol and ObjNAbsTol.
- Supported by all solvers.
- Fix: Objective.AbsoluteTolerance and Objective.RelativeTolerance are only used to resolve numerical problems during non-native multi-hierarchical optimization (i.e. the OPTANO Modeling implementation).
- Before, these values were also set for Gurobi's ObjNRelTol and ObjNAbsTol
- The ObjNRelTol and ObjNAbsTol now are set with the values from PriorityLevelQualityDegradationDefinition
Version 2.14.1 (2019-02-14)
- Cplex ComputeIIS: Fixed Upper Bound Conflicts (now longer reported as Lower Bound Conflicts). Added a few status infos
Version 2.14.0 (2019-01-31)
- Cplex ComputeIIS add for Cplex 12.6, 12.7 and 12.8. Use ComputeIIS of the SolverConfiguration to active it. It reports if either Upper or Lower Bound of a Constraint and of a Bound are part of the conflict.
Thanks to Ryan and Bo of the cplex Team for persistently answering our questions and making this happen!!! - Extended Documentation about ComputeIIS
Version 2.14.0-pre2 (2019-01-14)
- Ported Cplex 12.8 Adapter back to Cplex 12.6 and Cplex 12.7: All versions from 12.6+ feature ComputeIIS
- Fix: ConflictingSet.ConstraintsLB and ConstraintsUB only report constraints, which are member of the infeasibility set and have such bound.
Version 2.14.0-pre (2019-01-14)
- Updated dependencies to support netstandard20: MathNet.Symbolics from 0.18.1 to 0.20.0, MathNet.Numerics.FSharp from 4.5.1 to 4.7.0 and FSharp.Core from 4.3.4 to 4.5.4
- Added ComputeIIS Feature to Cplex 12.8. This is a beta-implementation, it only supports constraint-conflicts. Please use carefully.
Version 2.13.0 (not released separately)
- Added: MstReader.ReadMstFile(string filename)
Version 2.12.1 (2018-12-19)
- Fixed: MipCL, all Versions: Negative Variables have been transferred as positive values from MipCL to Modeling. (omitting negative sign)
Version 2.12.0 (2018-12-15)
- Added: Support for MipCL 1.7.2 has been added
Version 2.11.3 (2018-12-04)
- Fix: MipCL 1.6.2 does not read Solution.BestBound from the solver
- Improvement: Extending doc-page about Short Names.
Version 2.11.2 (2018-12-03)
- Fix: GurobiSolver 8.1.0 not included in nuget package
Version 2.11.1 (2018-12-02)
- Fix: Gurobi limited size license does not work for Gurobi 8.0.1 and Gurobi 8.1.0
- Improvement: Added a flag GurobiSolverConfiguration.PreferTrialLicense to preferable use the installed limited license, even if a regular license is installed on the system.
Version 2.11.0 (2018-11-19)
- Improvement: Added support for Gurobi 8.1
Version 2.10.0 (2018-10-02)
- Improvement: Added support for MIPCL 1.6.2
- Improvement: Changed the StatusInfo.VariableValues from property to function.
- By doing so, the respective Dictionary only is computed when the user actually needs it. Before, the dictionary was computed for each newly discovered solution.
- Improvement: Added support for LazyConstraints to Gurobi 8.0 and newer
- Lazyness Level can be set in the Constraint ctor
- The values of the LazyConstraintLevel enumeration correspond to the laziness levels that are described in the Gurobi refman:
- http://www.gurobi.com/documentation/8.1/refman/lazy.html
Version 2.9.0 (2018-09-05)
- Improvement: Added support for Gurobi 8.0.1
- Improvement: Only computing StatusInfo updates in Gurobi when a user is subscribed to the event handler.
- Previously, the StatusInfo also was computed when user did not subscribe to it.
- Only fixed in GurobiSolver 7.01 and newer.
- Fix: StatusInfo.SolutionCount now is retrieved correctly from the Gurobi API.
- Improvement: Added Feature ModelScope.NormalizingBehavior (xref:OPTANO.Modeling.Optimization.Configuration.NormalizingBehavior) to switch off automatic constraint and objective normalization (default is still 'Auto')
- Improvement/Outlook: Gurobi 7.5.2 and 8.0.1 now accept user solutions during a solution process. Use (xref:OPTANO.Modeling.Optimization.Solver.Gurobi801.GurobiSolver.OPTANO#Modeling#Optimization#Solver#Interfaces#ICanHandleUserSolution#EnqueueUserSolution(System.Collections.Generic.Dictionary{System.String,System.Double})) to pass new solutions on the very next callback interrupt. This is a outlook of upcoming features. The API of this feature will be updated and include the StatusInfo Updates as well. Stay tuned.
Version 2.8.1 (2018-05-25)
- Fix: The version of MathNet.Symbolics that was specified in the
optano.modeling.nuspec
file did not match the version that the NuPkg was built against.- The nuspec file now references the correct version: MathNet.Symbolics 0.18.1
- Improvement: Updated other referenced NuGet packages:
- FParsec 1.0.2 -> 1.0.3
- FSharp.Core 3.1.2.5 -> 4.3.4
- MathNet.Numerics(.FSharp)) 3.8.0 -> 4.5.1
- .Net TargetFramework: 4.0 -> 4.5
- Was required for updating the referenced NuGet packages
- Improvement: Extended the user documentation to cover/fix possible OutOfMemoryExceptions.
Version 2.8.0 (2018-05-16)
- Fix: Making use of the Model.NotifySolversIfModelChanges feature in conjunction with
- a) solving several (different) models with a solver,
- b) modifying the models,
- c) and then re-solving the last-solved model
- could lead to unexpected behavior, since changes to the previously solved models might have been applied to the last-solved model.
- Fix: Fixed an issue with Model.DeepClone().
- (Generic) VariableCollections were not marked as serializable, which caused an SerializationException.
- Additionally, several internal data structures were falsely cloned, which could cause an overhead due to "shadow clone objects" that should have been excluded from the (de-)serialization process.
- Improvement: After deep cloning a model, it is now possible to "re-create"/copy/clone (whichever name you find appropriate) your generic VariableCollections so that they
- a) work on the cloned veriables that are used in the cloned model, and
- b) still use the same index sets as the "original" variable collections that were associated with the "original" (i.e. uncloned) model.
- This is especially useful if you use non-primitive objects within your index sets, i.e. other types than int, string, double, bool, ... .
- In order to create such a (generically typed) copy, simply call yourGenericCollection.CreateCopyFromClonedModel(clonedModel).
- Important: Make sure to never use variables from "original" VariableCollections in your cloned models!
- For more information, have a look at the documentation.
Version 2.7.0 (2018-05-02)
- New: Added support for Gurobi 8.0
- In order to use the new Partition Heuristic, you need to set the GurobiSolver.GetUserVariablePartition to a delegate function that takes a Variable and returns the partition number that you want to assign for that variable.
- Your specified value will not be validated and directly assigned to the GRBVar.Partition attribute.
- Make sure to read up on the documentation that is provided by Gurobi.
- For specifying when to run the Partition Heuristic, you can use the GurobiSolverConfiguration.PartitionPlace property.
- For a more convenient usage, we provide a flags-enum for specifying the desired option set.
- By default, Gurobi uses the options PartitionPlace.WhenBranchAndCutSearchTerminates, PartitionPlace.AtNodesOfBranchAndCutSearch, PartitionPlace.AtEndOfRootCutLoop and PartitionPlace.AtStartOfRootCutLoop.
- Note: GurobiSolver 8.0 can be used out of the box with a size-limited license that is kindly provided by the Gurobi GmbH.
- Note 2: If you want to use the GurobiSolver.GetUserVariablePartition, make sure to add the gurobi80.netstandard20.dll as a project reference, even if you are using the "full framework" (e.g. .NET 4.5.2) as a target for your project.
- In order to use the new Partition Heuristic, you need to set the GurobiSolver.GetUserVariablePartition to a delegate function that takes a Variable and returns the partition number that you want to assign for that variable.
- Improvement: More fine-grained check for "trivially feasible constraints": Only throwing an InvalidOperationException if the currently used Solver does not support the handling of trivial constraints. (Before: Exception was thrown regardless of the used Solver's capabilities.)
- The user can check this with solver.TriviallyFeasibleConstraintHandling
- If a TriviallyFeasibleConstraintHandling is Unsupported, the user needs to make sure that the Model does not contain such constraints, before calling solver.Solve(model).
- Fix: Trying to solve a model that contained no variables (and/or no constraints) caused the GLPKSolver to crash. Both cases are now handled correctly.
- Fix: GLPKSolver ignored/discarded the constant part of an objective when computing the resulting objective value.
Version 2.6.0 (2018-03-14)
- Improvement: Added an option to specify a LogFile to the SolverConfiguration. If the property is set, the solver-specific console output while solving a model will be exported.
- Improvement: Added Solution.GetNameForMergedObjective to the Solution object. Method can be used to a) get the name of merged objectives during multi-hierarchical optimization and b) use that name to get the value of the merged objective for the given priorityLevel.
- Before, the merged objective's value was contained in Solution.ObjectiveValues, but the objective's name was unknown to the user (since merged objectives are created automatically by OPTANO.Modeling).
- Improvement: Changed the name for the qualtiy-conservation constraints that are added to the model during multi-hierarchical optimization.
- Constraint names will now contain the Objective.PriorityLevel and the concatenated names of all merged objectives for that respective priority level.
- Improvement: More detailed documentation, with regard to the merging of objectives and the export of LP/MPS files (see SolverConfiguration.ModelOutputFile) during multi-hierarchical optimization.
- Improvement: Solution.GetObjectiveValue now also accepts the "original" user-names as input, and no longer requires the use of the automatically generated names that contain base-64 extensions.
- Improvement: Added support for threading parameters to FicoXpressSolvers 7.9, 8.0.4 and 8.4.3
- The THREADS, CONCURRENTTHREADS, MIPTHREADS and BARTHREADS can now be controlled via the FicoXpressSolverConfiguration
Version 2.5.1 (2018-03-07)
- Fixed: Gurobi 7.5.2 does not accept application specific licenses.
- Fixed: The limited license for Gurobi 7.52 could not be used after 2018-01-09 due to a wrong end-date check.
Version 2.5.0
- New: Added support for Fico Xpress 8.4.3
- New: Added support for IBM ILOG Cplex 12.8
Version 2.4.1
- Improvement: Enabled message callback for FicoXpressSolver
- Before, the FicoXpressSolver.MessageCallback did not fire when OPTANO.Modeling received a callback from the Fico API.
- Fix: Expression.Evaluate now uses the ModelScope.EPSILON when validating the variable values that are given as parameters.
- Fix: In some cases the ConflictingSet that was computed by the GurobiSolvers contained null-elements in the ConflictingSet.ConstraintsLB and ConflictingSet.ConstraintsUB collections, that caused NullReferenceExceptions when ConflictingSet.ToString was called.
- This was caused by a faulty name-resolving for Constraint within the GurobiSolver during the construction of the IIS.
- Fix: Set the default value for the Configuration.IndexValidationStyle to Heuristic.
- Value was changed unintendedly during migration to .net standard 2.0.
- Fix: We had to drop the strong naming for our assemblies some time ago, since not all referenced packages are strongly named.
- Our merged assembly ('optano.modeling.dll') still was strongly named, which caused an exception as soon as a non-strongly named assembly was loaded.
Version 2.4.0 (2017-11-14)
- Breaking Change: Gurobi 7.5.2 changed some important enum values. A rebuild is required for all gurobi related solutions. We decided to remove 7.5.x from Modeling and Added 7.5.2. Please update to 7.5.2 and Modeling 2.4.0
- This also means that we had to drop the support for Gurobi 7.5.0 and 7.5.1.
Version 2.3.0
- Hotfix: All Versions of MipCL falsely treated Variables with Variable.Type
==
VariableType.Integer or VariableType.Integer and a fractional Lower-/UpperBound as though they were of VariableType.Continuous!- I.e. they might have fractional values (e.g. 0.5) in the optimal Solution.
- It seems as though this is an issue with the C-Wrapper for MipCL. We're in contact with the MipCL developer to resolve this issue.
- For now:
- We explicitly check the bounds on our Variable-objects and pass rounded values (using Ceiling/Floor) to the MipCL.dll
- As soon as the API correctly handles fractional bounds for integer variables, we will remove this workaround.
- Added: Support for MipCL 1.4.1
Version 2.2.0
- Breaking Change: Introduced a VariableTypeGenerator in generic and non-generic version of the VariableCollection. The new generator replaced the old 'static' VariableType. It can be used to assign individual VariableTypes to Variables that are member of a VariableCollection.
- The generator is a delegate to a function that takes an Index of a VariableCollection and returns the desired VariableType.
- If 'null' is passed (which is the default), we will create a generator that always returns VariableType.Continuous.
- The usage is analogous to the usage of lower- and upper bound generators.
- Easiest fix of your existing code:
- Old: var collection = new VariableCollection<T, T2, ...>(..., type: VariableType.Continuous, ...)
- New: var collection = new VariableCollection<T, T2, ...>(..., variableTypeGenerator: (idx, idx2, ...) => VariableType.Continuous)
- Improvement: Added a getter for Model.VariablesRemovedDuringPreProcessing.
- Will only return values, if ModelScope.ComputeRemovedVariables is set to
true
, and the chosen Solver supports the computation.
- Will only return values, if ModelScope.ComputeRemovedVariables is set to
- Improvement: Extended (and updated) User Documentation to comply with the current state of OPTANO.Modeling.
Version 2.1.0
- Improvement: Created easy-to-use operators for creating OperatorExpressions of type Expression.Minimum, Expression.Maximum, Expression.Absolute, Expression.Floor, Expression.Ceiling
- Change: Reduced the required number of Expressions to 1 (from 2) for OperatorExpressions Min and Max.
Version 2.0.1
- Fix: Model.IsObjectiveLinear was always ´false´. Added Objective.IsLinear as a property to Objective.
- Fix: Removed non-dotnet standard compatible reference to System.ServiceModel from Optimization.
Version 2.0.0
Version 2.0.0 has been tested to comply with dotnet standard 2.0.
- Breaking Change: Removed
@OPTANO.Modeling.Optimization.Operators.Whereand replaced it with Implication- The reasoning behind this is that we tried to create a more intuitive API. Since a
Wherebasically was a "backwards implication", and the constructor required a Not-constraint, the final effect was not apparent. - The new Implication operator clearly states which constraint will be the Implication.Premise and which one will be the Implication.Conclusion.
- The reasoning behind this is that we tried to create a more intuitive API. Since a
- Breaking Change: The signature of VariableCollection<T> was changed.
- The DebugNameGenerator delegate's signature was changed to (index) => string.
- Previously: (index) => StringBuilder
- Initially, we tried to enforce the usage of StringBuilder in order to prevent the user specifying names with long chains of string + string + ...
- With the introduction of short names, this style will not affect performance in a productive environment.
- We'd still suggest using either string.Format(), string interpolation, or expressions like 'new StringBuilder().Append() ... Append().ToString().
- The DebugNameGenerator delegate's signature was changed to (index) => string.
- Improvement: Better handling of BigM
- BigM is required during the transformation of OperatorExpressions, such as Abs to equivalent 'linear expressions'.
- User can provide an optional BigM when such a OperatorExpression is created.
- New implementation for the automatic derivation of a BigM
- When Variables have finite bounds, the maximum row sum is computed and used as BigM
- Only when this fails, the user-provided BigM is used.
- If user does not provide a finite BigM, an InvalidOperationException](xref:System.InvalidOperationException) is thrown.
- BigM is required during the transformation of OperatorExpressions, such as Abs to equivalent 'linear expressions'.
- Improvement: Centralized name-cleansing and unified behavior among different types (Variable, Constraint, Objective, VariableCollection, OperatorConstraints)
- Also, Constraint and Objective now use the same counter for the base64 suffixes
- This prevents duplicate name issues when exporting a model to MPS.
- Improvement: Operator '==' now creates a nicer Constraint for 'Variable x == double c'
- Old: 0 <= x - c <= 0 (even if c = 0).
- New: c <= x < c
- Change: Configuration.CopySolutionToModel == true in default (was false)
- Change: Expression.Evaluate now requires the passed values for the Variables to be within the range of [LowerBound, UpperBound].
- Fix: Gurobi ISV Keys have not been handled correctly
- Fix: Improved the stability of he LP- and MPS Reader/Writers. They are used for im-/export of models when a solver does not provide a native API.
- Fix: In some cases the ExpressionNormalizer threw a KeyNotFoundException. Cases now are handled correctly.
- Fix: ModelTransformation
- OperatorExpressions were not remove from the Model after they were transformed
- Some helper-constraints were not marked as helper and thus not removed from the Model even though ModelScope.RestoreUserModelAfterSolve was set to true.
- Normalizing all Expressions before transforming them
- Can prevent issues while encountering Times operators during derivation of BigM
- In a helper method Expression.BigM falsely was used, when working with a 'lower bounded Constraint'.
- Fix: Model.RemoveConstraint now also looks for OperatorConstraints
- Before, OperatorConstraints could not be removed from the Model.
Please also take the changes of alpha01 und alpha02 into account, when upgrading from version 1.6.
Version 2.0.0-alpha02
- Breaking Change: Replaced Configuration.UseLongNames by Configuration.NameHandling and added a new enum NameHandlingStyle enum. 'NameHandlingStyle.Manual' is a new Style that does no name altering, sanitizing and checking.
- Add: Gurobi75x connector starts Gurobi in ISV Mode with size-limited license, when no other license is found
Version 2.0.0-alpha01
- New: OPTANO.Modeling is dotnet standard 2.0 compatible
- Breaking Change: removed non-dotnet-standard compliant code
- Breaking Change: Flatting the Configuration object (Configuration manager is not supported by dotnet standard 2.0)
- Improvement: Using new API in Gurobi 7.5 to pass objective expressions to the Gurobi.NET DLL in case of multi-objective optimization
- Improvement: Added an info message to Gurobi 7.0 and higher log output whenever an objective is solved that needed to be converted from max to min:
- "INFO: Since Gurobi 7.x does not support Objective(-Stage) specific ModelSense/ObjectiveSense, all Objectives will be converted to ObjectiveSense.Minimize. This may lead to a "confusing" log output, since "max z" will be converted to "min -z" and thus the displayed objective values will have a flipped sign. The same is true for Min-objectives with a negative weight.\r\nAfter a model is solved, the returned Solution object will contain the "expected" objective value."
- Fix: In some cases a Model that was solved with Gurobi 7.0 and higher returned a Solution where the sign of the Solution.BestBound was flipped
- Fix: During multi-objective optimization with Gurobi 7.0 and higher, constant values in objective expressions were ignored/not passed to the solver
Version 1.6.2
- Improvement: Using new API in Gurobi 7.5 to pass objective expressions to the Gurobi.NET DLL in case of multi-objective optimization
- Improvement: Added an info message to Gurobi 7.0 and higher log output whenever an objective is solved that needed to be converted from max to min:
- "INFO: Since Gurobi 7.x does not support Objective(-Stage) specific ModelSense/ObjectiveSense, all Objectives will be converted to ObjectiveSense.Minimize. This may lead to a "confusing" log output, since "max z" will be converted to "min -z" and thus the displayed objective values will have a flipped sign. The same is true for Min-objectives with a negative weight.\r\nAfter a model is solved, the returned Solution object will contain the "expected" objective value."
- Fix: In some cases a Model that was solved with Gurobi 7.0 and higher returned a Solution where the sign of the Solution.BestBound was flipped
- Fix: During multi-objective optimization with Gurobi 7.0 and higher, constant values in objective expressions were ignored/not passed to the solver
Version 1.6.1
- Improvement: Minimization problems are now passed directly to MIPCL. I.e. 'min z' is no longer transformed to 'max -z', which leads to a less confusing log output.
- Fix: MIPCL Adapter now correctly handles constant values in objective expression
- Previously, those values were ignored/not added to the resulting objective value
- Fix: Fixed several errors in MIPCL console output
- Fix: Fixed indentation of sub-bullet points in changelog
Version 1.6
Changes:
- New: Added Support for MipCL 1.4.0
Version 1.5
Changes:
- New: Added Support for Gurobi 7.5.0
- Feature: Added a getter for the OPTANO.Modeling.Optimization.Enums.VariableType that is used for within a VariableCollection
Version 1.4
Changes:
- New: Added support for QP and QCP models in Gurobi 7.0 and above.
- Natively, Gurobi only supports models with a single quadratic objective. If you wish to optimize a model with 2 or more quadratic objectives, you need to override the NativeMultipleObjectiveSupport value in your OptimizationConfigSection and set it to "Unsupported". Otherwise, OPTANO.Modeling will throw an Exception for Q(C)P models with more than one objective that should be solved with a GurobiSolver.
- New: Added SolverConfiguration.RetryMultiObjectiveWithTolerance, which indicates if the tolerances defined in Objective.RelativeTolerance and Objective.AbsoluteTolerance should be applied during multi-hierarchical optimization.
- If the quality-conservation constraints' bounds during multi-hierarchical optimization are set exactly to the optimal solution value of a respective stage, the model may become infeasible due to floating point inaccuracies. If that happens, SolverConfiguration.RetryMultiObjectiveWithTolerance indicates if the constraint should be relaxed by the tolerance which can be specified for each objective via Objective.AbsoluteTolerance and/or Objective.RelativeTolerance.
- For weighted multi-hierarchical optimization, the specified tolerances are combined, according to Objective.Weight.
- If a model becomes infeasible du to a quality-conservation constraint and SolverConfiguration.RetryMultiObjectiveWithTolerance is set to false, the solution process will be stopped and the model will be declared as infeasible.
- Feature: Added the option to export a model as LP or MPS file to all solvers. Export can be enabled by setting the SolverConfiguration.ModelOutputFile.
- Make sure to specify the desired output format via the file extension. E.g. ".lp" or ".mps".
- Some Solvers, such as CplexSolver, also support more comply expressions such as "*.lp.gz", which will produce a gz-zipped LP file. Please refer to your respective solver's RefMan for more information about supported extensions.
- Improvement: Added a multitude of parameters (42 [sic!] to be exact) to the CplexSolverConfiguration.
- Improvement: GLPK and FicoXpressSolver now will return the total number of explored nodes and the best objective bound (which enables the computation of Solution.Gap).
- Improvement: For multi-objective models the total sum of all explored nodes will be returned.
- Improvement: Catching + logging Exceptions thrown by the call CPLEX.Solve() to CPLEX.Output() (and Console.Out, if it differs from CPLEX.Output()). Returning a Solution with Solution.Status == SolutionStatus.NoSolutionValues.
- Improvement: Added support for MIP Start in GLPK.
- Change: Removed Properties from CplexSolver: OutputFile and Output. They are replaced with equivalent Properties in the CplexSolverConfiguration.
- Fix: Fixed an issue where CPLEX would throw a 'CPLEX Error 3003: Not a mixed-integer problem.' when a model did not contain any Variable of type VariableType.Binary or VariableType.Integer.
- Added a workaround where a dummy binary-variable and constraint is added to the CPLEX model before CPLEX.Solve is called
- Constraint: 0 <= dummyVar <= 0
- Variable and Constraint will be removed after CPLEX solved the problem.
- Fix: Fixed an issue where negative objective values during multi-hierarchical optimization lead to infeasibilities during faulty computation of objectives' maximum quality change.
- Fix: CPLEX Solver now will use the CplexSolverConfiguration.OutputFile (which was also renamed to ModelOutputFile), which was previously ignored, while CplexSolver.OutputFile was used instead.
- Fix: Fixed an issue where Solution.Gap would throw an Exception in case of multi-objective models. If no Gap can be determined (e.g. more than one hierarchy-level), double.NaN will be returned.
- Fix: (Operator)Expression.Variables now will return a distinct set of variables. I.e. each Variable that occurs in (at least) one sub-expression will only be returned a single time when exp.Variables is called.
- Fix: Some Parameters from SolverConfiguration base class were not used in GLPK, since GLPK uses its own structs to control parameters. Mapped getters/setters between parameters from SolverConfiguration base and respective glp_iocp/glp_smcp parameters.
Version 1.3 (2017-04-20)
Changes:
- New: Added support for MIPCL 1.31
- Fix: Cplex falsely refused quadratic expressions of the form A * (B + C), even though it represents a valid quadratic expression. (Quadratic) Expressions now will be normalized before further handling in Cplex.
- Fix: Fixed an issue where changes to (multi-) objective functions were not propagated correctly to Gurobi 7.x when a model was resolved.
- Fix: Fixed an issue where invalid MIP-Start values were passed to CPLEX 12.x, which caused ""CPLEX Error 3003: Not a mixed-integer problem".
- Change: Removed documentation.zip from nuget package, as it has grown pretty large. Please find all documentation on http://docs.optano.com/modeling/current
Note: We have experienced some issues about a FParsec 1.0.3-alpha (as a dependency of MathNet.Symbolics). If you find some issues, please try to install FParsec Version 1.0.2 from nuget before you install OPTANO.Modeling.
Version 1.2.3 (2017-03-06)
Changes:
- Fix: GLPK reads all configuration parameters from IOCP object. Please add libglpk-cli.dll as a reference to your project.
- Fix: LP- and MPS-Writer normalize constraints
- Improvement: Added SMCP Parameters for GLPK
Version 1.2.2 (2017-03-05)
Changes:
- Fix: Added Z3 adapter to the package (tested with z3 v4.5)
- Fix: GLPK could not handle empty objectives (and threw an exception)
- Fix: GLPK needs to normalize constraints: Constraints with duplicate Terms lead to a broken matrix.
- Change: Used glpk_4_60.dll as new dll file name
Version 1.2.1 (2017-03-02)
Changes:
- Improvement: Working around the following issue: Gurobi 7.0.2 switches to multi objective mode, even if number of objectives is 1 and ignores mip start values.
- Improvement: SOS handling improved for all solvers.
- Fix: Added GLPK adapter to the package
Version 1.2.0 (2017-02-23)
Changes:
- Improvement: Extended the Fico Xpress 7.9 and 8.0.4 Configuration so that all parameters from the "Fico Tuner" are supported.
- Updated supported solver with detailed information about functionality
Minors:
- New: Support for Branching Priorities in CPLEX 11 and 12.x (see Branching)
- New: Support for Branching Directions in CPLEX 11 and 12.x (see Branching)
- New: Several Example Models (IP: Knapsack, N-Queens, ProjectSelection, Set-Covering, Set-Partitioning, Set-Packing, Sudoku and MIP: CLSP, JobScheduling, NDP, TSP, VRP, WLP)
- New: Added Support for Gurobi 7.0.2
- New: Added Constraint-validation: Model.AddConstraint does not accept a "trivially feasible" Constraint, i.e. a Constraint without any Variables in its Expression. E.g. a Constraint that looks like "0 <= 1", etc.
- Improvement: GurobiSolverNative now supports resolves and hierarchical/weighted objectives (emulated by OPTANO.Modeling).
- Improvement: Logging warning messages on the command line, when a Model uses BranchingPriorities or -Directions, but the specified solver adapter does not.
- Improvement: Emulating SOS 1 - 3 support for all Solvers that previously did not support special ordered sets.
- Fix: Fixed a bug, where special ordered sets where ignored when they were added to a Model that should be re-solved.
- Fix: CPLEXSolver 12.x won't crash when more than one MIP Start Value is given.
- Fix: Fixed a bug in CPLEX, where an Exception was thrown when a new Objective should be set and the old one was not removed beforehand.
- Fix: SOS1 and SOS2 now work as intended with Fico Xpress
- Renamed
ModelScope.ModelTotalMemoryto ModelMemoryDelta.
Version 1.1.0 (2017-01-03)
Changes:
- New: Added Support for Fico Xpress 8.0.4
- New: Added Support for Cplex 12.7
- New: Added Support for Frontline Xpress Solver SDK 2016
- Improvement: Improving Fico Xpress Expression-Building
- Fix: Cplex 12.x reads MIP start values
- Fix: Updated Supported Solvers: Gurobi and Cplex Solver Adapters use solvers's native re-solve interfaces.
- Fix: GurobiSolverNative now uses the correct configuration settings.
Version 1.0.0 (2016-12-24)
Changes:
- New: Added Support for XPRESS Solver SDK 2016.
- Improvement: The CSV Writer uses file type ".stat.csv"
- Improvement: The ExpressionNormalizer now utilizes native MathNet.Symbolics Expressions, instead of taking the detour of transforming OPTANO.Modeling Expressions to String and parsing that String to MathNet.Symbolics.
- Improvement: Linear Expressions that only consist of ConstantExpressions, Plus, Times, and Terms, can be normalized without usage of MathNet, which speeds up the GurobiSolverNative- and XPRESS-SolverAdapters.
- Improvement: The Solution of a weighted objective problem now contains the objective value for every single objective, and not just the value of the merged objective (per stage).
- Fix: Fixed a bug in the SumExpressionBuilder that caused the builder to drop operators such as Times, and simply sum over all Terms that are contained in the "dropped" operator.
- Fix: The SumExpressionBuilder.Constant-Value now is properly reset to 0, when builder.Reset() is called.
- Fix: Fixed a bug in the GLPK Solver Adapter that caused the solver to drop tolerance constraints during hierarchical optimization.
- Fix: Fixed a bug that affected GLPK and GurobiSolverNative, where the objective expression was not properly normalized and thus all coefficients were set to 0.
- Fix: Fixed a bug that could cause the objective not being properly updated when a model was resolved.
Version 0.9.1 (2016-11-23)
Changes:
- New: Added Support for Gurobi 7.0.1
- New: Extended documentation about ModelScope, including an example without a using()-block.
- Improvement: Changed extension of variable statistic files to "*.stat.csv".
- Improvement: The Shortname-Builder uses a reduced char set of A-Z and a-z to comply with all solvers. It does no longer use the .net Base64 Methods, but implements its own Code and got a speed up of 14% on average. Thou, this speedup will not be notable usually.
- Improvement: Cplex Version 12.4 and above: SetStartingValues upgraded to use new CPlex's AddMIPStart function.
- Fix: GurobiSolverNative releases license tokens on Dispose() correctly.
- Fix: Model.GetObjective(string name) now also compares "name" to the original Name that was provided by user's code.
- Breaking Change: SetStartingValues requires a Dictionary instead of IDictionary. Dictionary offers a reliable enumerator, while IDictionary does not.
Version 0.9.0 (2016-11-01)
OPTANO.Modeling is forked from optimization.framework 0.3.1282 (Aug 2016, discontinued) and will replace it.
Please have a look at the Getting Started-Section. It will give you an overview of all changes quickly.
We applied all breaking changes scheduled so far. Future minor releases (changing second digit of the version number) will not introduce any breaking changes. Major releases (incrementing first digit) might include breaking changes and therefore require changes on your code.
Changes:
- Breaking Change: new namespace OPTANO.Modeling.Optimization (replacing optimization.framework). Update your usings!
- Breaking Change: Added ModelScope which is required for all Model instances
- Breaking Change: Unified the API and removed some constructors from Model, VariableCollection and Constraint
- Breaking Change: Introduced Generators: LowerBoundGenerator, UpperBoundGenerator and NameGenerator, all of type VariableCollection.BoundGenerator
- Breaking Change: Extended Model.Objective to a weighted multi-objective and added a priorityLevel for hierarchical optimization (see
priorityLevel
andweight
) - Breaking Change: Converted a lot of Get...()-Methods to Properties
Breaking Change: "Load" is no longer used in method names when reading streams. All methods have been renamed to "Read" (see Model.Read
Removed Interface IVariable. It has never been used.
Removed Interface IModel. It has never been used.
New: Added some Model.VariableStatistics in Model including a CSV-Writer
- New: Added Support for Gurobi 6.5.2
- New: Added Support for Gurobi 7.0
- New: VariableType
Binary
for binary variables - New: Memory-saving short names for Variable and Constraint. May be switched off via ModelElement.EnableFullNames
- New: A solving process might be canceled.
Work in progress, available with upcoming releases
- New: A new Xpress-Solver Adapter is currently being developed.
- New: A wide set of optimization modeling examples will be added to the documentation
- Improvement: The documentation still lacks some links
- Improvement: A faster formula expression evaluator is in tests
Thanks for reading thoroughly. 👍