diff --git a/bazel/notebook_requirements.in b/bazel/notebook_requirements.in
index d16d1b8951..56402811ad 100644
--- a/bazel/notebook_requirements.in
+++ b/bazel/notebook_requirements.in
@@ -3,8 +3,9 @@ absl-py==2.1.0
immutabledict==3.0.0
numpy==2.2.0
protobuf==6.30.2
-requests==2.32.0
+requests==2.32.3
scipy==1.14.1
+typing-extensions==4.13.1
# OR-Tools build dependencies
mypy==1.6.1
@@ -20,10 +21,10 @@ svgwrite==1.4.3
plotly==5.15.0
# Notebook
-jupyterlab==4.2.5
-notebook==7.2.2
-jupyter-server==2.14.2
+jupyterlab==4.4.1
+notebook==7.4.1
+jupyter-server==2.15.0
tornado==6.4.2
Pygments==2.15.0
jsonschema==4.19.0
-jinja2==3.1.5
+jinja2==3.1.6
diff --git a/bazel/notebook_requirements.txt b/bazel/notebook_requirements.txt
index 0ea2c14447..88cdc1bd3f 100644
--- a/bazel/notebook_requirements.txt
+++ b/bazel/notebook_requirements.txt
@@ -85,7 +85,7 @@ isoduration==20.11.0
# via jsonschema
jedi==0.19.0
# via ipython
-jinja2==3.1.5
+jinja2==3.1.6
# via
# -r bazel/notebook_requirements.in
# jupyter-server
@@ -118,11 +118,11 @@ jupyter-core==5.3.1
# nbclient
# nbconvert
# nbformat
-jupyter-events==0.9.0
+jupyter-events==0.12.0
# via jupyter-server
jupyter-lsp==2.2.2
# via jupyterlab
-jupyter-server==2.14.2
+jupyter-server==2.15.0
# via
# -r bazel/notebook_requirements.in
# jupyter-lsp
@@ -132,7 +132,7 @@ jupyter-server==2.14.2
# notebook-shim
jupyter-server-terminals==0.4.4
# via jupyter-server
-jupyterlab==4.2.5
+jupyterlab==4.4.1
# via
# -r bazel/notebook_requirements.in
# notebook
@@ -171,7 +171,7 @@ nbformat==5.9.2
# nbconvert
nest-asyncio==1.5.7
# via ipykernel
-notebook==7.2.2
+notebook==7.4.1
# via -r bazel/notebook_requirements.in
notebook-shim==0.2.3
# via
@@ -188,6 +188,7 @@ packaging==23.1
# via
# black
# ipykernel
+ # jupyter-events
# jupyter-server
# jupyterlab
# jupyterlab-server
@@ -256,7 +257,7 @@ referencing==0.30.2
# jsonschema
# jsonschema-specifications
# jupyter-events
-requests==2.32.0
+requests==2.32.3
# via
# -r bazel/notebook_requirements.in
# jupyterlab-server
@@ -325,8 +326,10 @@ traitlets==5.9.0
# nbformat
types-protobuf==4.24.0.0
# via mypy-protobuf
-typing-extensions==4.8.0
- # via mypy
+typing-extensions==4.13.1
+ # via
+ # -r bazel/notebook_requirements.in
+ # mypy
tzdata==2023.3
# via pandas
uri-template==1.3.0
diff --git a/bazel/ortools_requirements.in b/bazel/ortools_requirements.in
index 7984c46ea4..5dc2da0ffe 100644
--- a/bazel/ortools_requirements.in
+++ b/bazel/ortools_requirements.in
@@ -5,6 +5,7 @@ numpy==2.2.0
protobuf==6.30.2
requests==2.32.3
scipy==1.14.1
+typing-extensions==4.13.1
# OR-Tools build dependencies
mypy==1.6.1
diff --git a/bazel/ortools_requirements.txt b/bazel/ortools_requirements.txt
index 2bfd1ba508..2c6f29d454 100644
--- a/bazel/ortools_requirements.txt
+++ b/bazel/ortools_requirements.txt
@@ -63,8 +63,10 @@ svgwrite==1.4.3
# via -r bazel/ortools_requirements.in
types-protobuf==4.24.0.0
# via mypy-protobuf
-typing-extensions==4.8.0
- # via mypy
+typing-extensions==4.13.1
+ # via
+ # -r bazel/ortools_requirements.in
+ # mypy
tzdata==2023.3
# via pandas
urllib3==2.2.2
diff --git a/bazel/swig_java.bzl b/bazel/swig_java.bzl
index 2dd18ac184..51864b052a 100644
--- a/bazel/swig_java.bzl
+++ b/bazel/swig_java.bzl
@@ -14,6 +14,7 @@
"""Build definitions for SWIG Java."""
load("@bazel_skylib//lib:paths.bzl", "paths")
+load("@rules_cc//cc:defs.bzl", "cc_library")
load("@rules_java//java:java_library.bzl", "java_library")
load("@rules_java//java/common:java_common.bzl", "java_common")
@@ -195,8 +196,7 @@ def ortools_java_wrap_cc(
visibility = ["//visibility:private"],
**kwargs
)
-
- native.cc_library(
+ cc_library(
name = cc_name,
srcs = [outfile],
hdrs = [outhdr] if use_directors else [],
diff --git a/cmake/README.md b/cmake/README.md
index eadf45b2bd..157e9cbfeb 100644
--- a/cmake/README.md
+++ b/cmake/README.md
@@ -184,86 +184,86 @@ Following is a list of available options, for the full list run:
cmake -S. -Bbuild -LH
```
-| CMake Option | Default Value | Note |
-|:-------------|:--------------|:-----|
-| `CMAKE_BUILD_TYPE` | Release | see CMake documentation [here](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) |
-| `BUILD_CXX` | ON | Build C++ |
-| `BUILD_DOTNET` | OFF | Build .Net wrapper and packages |
-| `BUILD_JAVA` | OFF | Build Java wrapper and packages |
-| `BUILD_PYTHON` | OFF | Build Python wrapper and package |
-| | | |
-| `BUILD_FLATZINC` | ON\* | Build the flatzinc library
**Forced** to OFF if `BUILD_CXX=OFF` |
-| `BUILD_GLOP` | OFF\* | Build the standalone Glop library
**Forced** to OFF if `BUILD_CXX=ON`, otherwise default to ON |
-| | | |
-| `BUILD_DEPS` | OFF* | Default to ON if `BUILD_JAVA=ON` or `BUILD_PYTHON=ON` or `BUILD_DOTNET=ON` |
-| `BUILD_ZLIB` | OFF* | Build the zlib dynamic library
**Forced** to ON if `BUILD_DEPS=ON` |
-| `BUILD_BZip2` | OFF* | Build the bzip2 dynamic library
**Forced** to ON if `BUILD_DEPS=ON` |
-| `BUILD_absl` | OFF* | Build the abseil-cpp dynamic libraries
**Forced** to ON if `BUILD_DEPS=ON` |
-| `BUILD_Protobuf` | OFF* | Build the protobuf dynamic libraries
**Forced** to ON if `BUILD_DEPS=ON` |
-| `BUILD_re2` | OFF* | Build the re2 dynamic libraries
**Forced** to ON if `BUILD_DEPS=ON` |
-| `BUILD_Eigen3` | OFF* | Build the Eigen3 libraries
**Forced** to ON if `BUILD_DEPS=ON` |
-| | | |
-| `USE_COINOR` | ON\* | Enable Coin-OR support
**Forced** to OFF if `BUILD_CXX=OFF` |
-| `BUILD_CoinUtils` | OFF\* | Build the CoinUtils dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON` |
-| `BUILD_Osi` | OFF\* | Build the Osi dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON` |
-| `BUILD_Clp` | OFF\* | Build the Clp dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON` |
-| `BUILD_Cgl` | OFF\* | Build the Cgl dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON` |
-| `BUILD_Cbc` | OFF\* | Build the Cbc dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON` |
-| | | |
-| `USE_GLPK` | OFF\* | Enable GLPK support
**Forced** to OFF if `BUILD_CXX=OFF` |
-| `BUILD_GLPK` | OFF\* | Build the GLPK dynamic libraries
**Forced** to ON if `USE_GLPK=ON` **and** `BUILD_DEPS=ON` |
-| | | |
-| `USE_HIGHS` | ON\* | Enable HIGHS support
**Forced** to OFF if `BUILD_CXX=OFF` |
-| `BUILD_HIGHS` | OFF\* | Build the HiGHS dynamic libraries
**Forced** to ON if `USE_HIGHS=ON` **and** `BUILD_DEPS=ON` |
-| | | |
-| `USE_SCIP` | ON\* | Enable SCIP support
**Forced** to OFF if `BUILD_CXX=OFF` |
-| `BUILD_SCIP` | OFF\* | Build the SCIP dynamic libraries
**Forced** to ON if `USE_SCIP=ON` **and** `BUILD_DEPS=ON` |
-| | | |
-| `USE_CPLEX` | OFF | Enable CPLEX support |
-| | | |
-| `BUILD_DOC` | OFF\* | Build all documentations |
-| `BUILD_CXX_DOC` | OFF\* | Build C++ documentation
**Forced** to ON if `BUILD_DOC=ON` |
-| `BUILD_DOTNET_DOC` | OFF\* | Build .Net documentation
**Forced** to ON if `BUILD_DOC=ON` |
-| `BUILD_JAVA_DOC` | OFF\* | Build Java documentation
**Forced** to ON if `BUILD_DOC=ON` |
-| `BUILD_PYTHON_DOC` | OFF\* | Build Python documentation
**Forced** to ON if `BUILD_DOC=ON` |
-| `INSTALL_DOC` | OFF\* | Install all documentations
**Forced** to OFF if `BUILD_CXX=OFF` or `BUILD_DOC=OFF` |
-| | | |
-| `BUILD_SAMPLES` | ON\* | Build all samples
Default to ON if `BUILD_DEPS=ON` |
-| `BUILD_CXX_SAMPLES` | ON\* | Build all C++ samples
**Forced** to OFF if `BUILD_CXX=OFF` or `BUILD_SAMPLE=OFF` |
-| `BUILD_DOTNET_SAMPLES` | ON\* | Build all .Net samples
**Forced** to OFF if `BUILD_DOTNET=OFF` or `BUILD_SAMPLE=OFF` |
-| `BUILD_JAVA_SAMPLES` | ON\* | Build all Java samples
**Forced** to OFF if `BUILD_JAVA=OFF` or `BUILD_SAMPLE=OFF` |
-| `BUILD_PYTHON_SAMPLES` | ON\* | Build all Python samples
**Forced** to OFF if `BUILD_PYTHON=OFF` or `BUILD_SAMPLE=OFF` |
-| | | |
-| `BUILD_EXAMPLES` | ON\* | Build all examples
Default to ON if `BUILD_DEPS=ON` |
-| `BUILD_CXX_EXAMPLES` | ON\* | Build all C++ examples
**Forced** to OFF if `BUILD_CXX=OFF` or `BUILD_SAMPLE=OFF` |
-| `BUILD_DOTNET_EXAMPLES` | ON\* | Build all .Net examples
**Forced** to OFF if `BUILD_DOTNET=OFF` or `BUILD_SAMPLE=OFF` |
-| `BUILD_JAVA_EXAMPLES` | ON\* | Build all Java examples
**Forced** to OFF if `BUILD_JAVA=OFF` or `BUILD_SAMPLE=OFF` |
-| `BUILD_PYTHON_EXAMPLES` | ON\* | Build all Python examples
**Forced** to OFF if `BUILD_PYTHON=OFF` or `BUILD_SAMPLE=OFF` |
-| | | |
-| `USE_DOTNET_46` | OFF | Enable .Net Framework 4.6 support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_461` | OFF | Enable .Net Framework 4.6.1 support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_462` | OFF | Enable .Net Framework 4.6.2 support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_48` | OFF | Enable .Net Framework 4.8 support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_STD_21` | OFF | Enable .Net Standard 2.1 support
Only available if `BUILD_DOTNET=ON` and not targeting arm64 platform |
-| `USE_DOTNET_CORE_31` | OFF | Enable .Net Core 3.1 LTS support
Only available if `BUILD_DOTNET=ON` and not targeting arm64 platform |
-| `USE_DOTNET_6` | OFF | Enable .Net 6 LTS support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_7` | OFF | Enable .Net 7 support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_8` | ON | Enable .Net 8 LTS support
Only available if `BUILD_DOTNET=ON` |
-| `USE_DOTNET_9` | OFF | Enable .Net 9 support
Only available if `BUILD_DOTNET=ON` |
-| `UNIVERSAL_DOTNET_PACKAGE` | OFF | Build a multi platform package (i.e. `Google.OrTools` will depends on all runtime packages)
Only available if `BUILD_DOTNET=ON` |
-| | | |
-| `SKIP_GPG` | ON | Disable GPG sign
Only available if `BUILD_JAVA=ON` |
-| `UNIVERSAL_JAVA_PACKAGE` | OFF | Build a multi platform package (i.e. `ortools-java` will depends on all native packages)
Only available if `BUILD_JAVA=ON` |
-| `BUILD_FAT_JAR` | OFF | Build a `ortools-java` .jar that includes all of its own Maven dependencies, including the native package
Only available if `BUILD_JAVA=ON` |
-| | | |
-| `BUILD_pybind11` | `BUILD_DEPS` | Static build the pybind11 libraries
**Forced** to ON if `BUILD_DEPS=ON`
Only available if `BUILD_PYTHON=ON` |
-| `BUILD_pybind11_abseil` | `BUILD_DEPS` | Static build the pybind11_abseil libraries
**Forced** to ON if `BUILD_DEPS=ON`
Only available if `BUILD_PYTHON=ON` |
-| `BUILD_pybind11_protobuf` | `BUILD_DEPS` | Static build the pybind11_protobuf libraries
**Forced** to ON if `BUILD_DEPS=ON`
Only available if `BUILD_PYTHON=ON` |
-| `GENERATE_PYTHON_STUB` | ON | Generate python stub files
Only available if `BUILD_PYTHON=ON` |
-| `BUILD_VENV` | `BUILD_TESTING` | Create python venv in `BINARY_DIR/python/venv`
**Forced** to ON if `BUILD_TESTING=ON`
Only available if `BUILD_PYTHON=ON` |
-| `VENV_USE_SYSTEM_SITE_PACKAGES` | OFF | Python venv can use system site package (e.g. `py3-numpy` on Alpine)
Only available if `BUILD_PYTHON=ON` and `BUILD_VENV=ON` |
-| `FETCH_PYTHON_DEPS` | `BUILD_DEPS` | Fetch python modules needed to build ortools package
Only available if `BUILD_PYTHON=ON` |
-| | | |
+CMake Option | Default Value | Note
+:------------------------------ | :-------------- | :---
+`CMAKE_BUILD_TYPE` | Release | see CMake documentation [here](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html)
+`BUILD_CXX` | ON | Build C++
+`BUILD_DOTNET` | OFF | Build .Net wrapper and packages
+`BUILD_JAVA` | OFF | Build Java wrapper and packages
+`BUILD_PYTHON` | OFF | Build Python wrapper and package
+ | |
+`BUILD_FLATZINC` | ON\* | Build the flatzinc library
**Forced** to OFF if `BUILD_CXX=OFF`
+`BUILD_GLOP` | OFF\* | Build the standalone Glop library
**Forced** to OFF if `BUILD_CXX=ON`, otherwise default to ON
+ | |
+`BUILD_DEPS` | OFF* | Default to ON if `BUILD_JAVA=ON` or `BUILD_PYTHON=ON` or `BUILD_DOTNET=ON`
+`BUILD_ZLIB` | OFF* | Build the zlib dynamic library
**Forced** to ON if `BUILD_DEPS=ON`
+`BUILD_BZip2` | OFF* | Build the bzip2 dynamic library
**Forced** to ON if `BUILD_DEPS=ON`
+`BUILD_absl` | OFF* | Build the abseil-cpp dynamic libraries
**Forced** to ON if `BUILD_DEPS=ON`
+`BUILD_Protobuf` | OFF* | Build the protobuf dynamic libraries
**Forced** to ON if `BUILD_DEPS=ON`
+`BUILD_re2` | OFF* | Build the re2 dynamic libraries
**Forced** to ON if `BUILD_DEPS=ON`
+`BUILD_Eigen3` | OFF* | Build the Eigen3 libraries
**Forced** to ON if `BUILD_DEPS=ON`
+ | |
+`USE_COINOR` | ON\* | Enable Coin-OR support
**Forced** to OFF if `BUILD_CXX=OFF`
+`BUILD_CoinUtils` | OFF\* | Build the CoinUtils dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON`
+`BUILD_Osi` | OFF\* | Build the Osi dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON`
+`BUILD_Clp` | OFF\* | Build the Clp dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON`
+`BUILD_Cgl` | OFF\* | Build the Cgl dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON`
+`BUILD_Cbc` | OFF\* | Build the Cbc dynamic library
**Forced** to ON if `USE_COINOR=ON` **and** `BUILD_DEPS=ON`
+ | |
+`USE_GLPK` | OFF\* | Enable GLPK support
**Forced** to OFF if `BUILD_CXX=OFF`
+`BUILD_GLPK` | OFF\* | Build the GLPK dynamic libraries
**Forced** to ON if `USE_GLPK=ON` **and** `BUILD_DEPS=ON`
+ | |
+`USE_HIGHS` | ON\* | Enable HIGHS support
**Forced** to OFF if `BUILD_CXX=OFF`
+`BUILD_HIGHS` | OFF\* | Build the HiGHS dynamic libraries
**Forced** to ON if `USE_HIGHS=ON` **and** `BUILD_DEPS=ON`
+ | |
+`USE_SCIP` | ON\* | Enable SCIP support
**Forced** to OFF if `BUILD_CXX=OFF`
+`BUILD_SCIP` | OFF\* | Build the SCIP dynamic libraries
**Forced** to ON if `USE_SCIP=ON` **and** `BUILD_DEPS=ON`
+ | |
+`USE_CPLEX` | OFF | Enable CPLEX support
+ | |
+`BUILD_DOC` | OFF\* | Build all documentations
+`BUILD_CXX_DOC` | OFF\* | Build C++ documentation
**Forced** to ON if `BUILD_DOC=ON`
+`BUILD_DOTNET_DOC` | OFF\* | Build .Net documentation
**Forced** to ON if `BUILD_DOC=ON`
+`BUILD_JAVA_DOC` | OFF\* | Build Java documentation
**Forced** to ON if `BUILD_DOC=ON`
+`BUILD_PYTHON_DOC` | OFF\* | Build Python documentation
**Forced** to ON if `BUILD_DOC=ON`
+`INSTALL_DOC` | OFF\* | Install all documentations
**Forced** to OFF if `BUILD_CXX=OFF` or `BUILD_DOC=OFF`
+ | |
+`BUILD_SAMPLES` | ON\* | Build all samples
Default to ON if `BUILD_DEPS=ON`
+`BUILD_CXX_SAMPLES` | ON\* | Build all C++ samples
**Forced** to OFF if `BUILD_CXX=OFF` or `BUILD_SAMPLE=OFF`
+`BUILD_DOTNET_SAMPLES` | ON\* | Build all .Net samples
**Forced** to OFF if `BUILD_DOTNET=OFF` or `BUILD_SAMPLE=OFF`
+`BUILD_JAVA_SAMPLES` | ON\* | Build all Java samples
**Forced** to OFF if `BUILD_JAVA=OFF` or `BUILD_SAMPLE=OFF`
+`BUILD_PYTHON_SAMPLES` | ON\* | Build all Python samples
**Forced** to OFF if `BUILD_PYTHON=OFF` or `BUILD_SAMPLE=OFF`
+ | |
+`BUILD_EXAMPLES` | ON\* | Build all examples
Default to ON if `BUILD_DEPS=ON`
+`BUILD_CXX_EXAMPLES` | ON\* | Build all C++ examples
**Forced** to OFF if `BUILD_CXX=OFF` or `BUILD_SAMPLE=OFF`
+`BUILD_DOTNET_EXAMPLES` | ON\* | Build all .Net examples
**Forced** to OFF if `BUILD_DOTNET=OFF` or `BUILD_SAMPLE=OFF`
+`BUILD_JAVA_EXAMPLES` | ON\* | Build all Java examples
**Forced** to OFF if `BUILD_JAVA=OFF` or `BUILD_SAMPLE=OFF`
+`BUILD_PYTHON_EXAMPLES` | ON\* | Build all Python examples
**Forced** to OFF if `BUILD_PYTHON=OFF` or `BUILD_SAMPLE=OFF`
+ | |
+`USE_DOTNET_46` | OFF | Enable .Net Framework 4.6 support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_461` | OFF | Enable .Net Framework 4.6.1 support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_462` | OFF | Enable .Net Framework 4.6.2 support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_48` | OFF | Enable .Net Framework 4.8 support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_STD_21` | OFF | Enable .Net Standard 2.1 support
Only available if `BUILD_DOTNET=ON` and not targeting arm64 platform
+`USE_DOTNET_CORE_31` | OFF | Enable .Net Core 3.1 LTS support
Only available if `BUILD_DOTNET=ON` and not targeting arm64 platform
+`USE_DOTNET_6` | OFF | Enable .Net 6 LTS support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_7` | OFF | Enable .Net 7 support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_8` | ON | Enable .Net 8 LTS support
Only available if `BUILD_DOTNET=ON`
+`USE_DOTNET_9` | OFF | Enable .Net 9 support
Only available if `BUILD_DOTNET=ON`
+`UNIVERSAL_DOTNET_PACKAGE` | OFF | Build a multi platform package (i.e. `Google.OrTools` will depends on all runtime packages)
Only available if `BUILD_DOTNET=ON`
+ | |
+`SKIP_GPG` | ON | Disable GPG sign
Only available if `BUILD_JAVA=ON`
+`UNIVERSAL_JAVA_PACKAGE` | OFF | Build a multi platform package (i.e. `ortools-java` will depends on all native packages)
Only available if `BUILD_JAVA=ON`
+`BUILD_FAT_JAR` | OFF | Build a `ortools-java` .jar that includes all of its own Maven dependencies, including the native package
Only available if `BUILD_JAVA=ON`
+ | |
+`BUILD_pybind11` | `BUILD_DEPS` | Static build the pybind11 libraries
**Forced** to ON if `BUILD_DEPS=ON`
Only available if `BUILD_PYTHON=ON`
+`BUILD_pybind11_abseil` | `BUILD_DEPS` | Static build the pybind11_abseil libraries
**Forced** to ON if `BUILD_DEPS=ON`
Only available if `BUILD_PYTHON=ON`
+`BUILD_pybind11_protobuf` | `BUILD_DEPS` | Static build the pybind11_protobuf libraries
**Forced** to ON if `BUILD_DEPS=ON`
Only available if `BUILD_PYTHON=ON`
+`GENERATE_PYTHON_STUB` | ON | Generate python stub files
Only available if `BUILD_PYTHON=ON`
+`BUILD_VENV` | `BUILD_TESTING` | Create python venv in `BINARY_DIR/python/venv`
**Forced** to ON if `BUILD_TESTING=ON`
Only available if `BUILD_PYTHON=ON`
+`VENV_USE_SYSTEM_SITE_PACKAGES` | OFF | Python venv can use system site package (e.g. `py3-numpy` on Alpine)
Only available if `BUILD_PYTHON=ON` and `BUILD_VENV=ON`
+`FETCH_PYTHON_DEPS` | `BUILD_DEPS` | Fetch python modules needed to build ortools package
Only available if `BUILD_PYTHON=ON`
+ | |
## Integrating OR-Tools in your CMake Project
diff --git a/ortools/gscip/CMakeLists.txt b/ortools/gscip/CMakeLists.txt
index 2eafbb1844..eb4160b5ff 100644
--- a/ortools/gscip/CMakeLists.txt
+++ b/ortools/gscip/CMakeLists.txt
@@ -33,6 +33,6 @@ target_link_libraries(${NAME} PRIVATE
absl::strings
absl::str_format
protobuf::libprotobuf
- $<$:libscip>
+ SCIP::libscip
${PROJECT_NAMESPACE}::ortools_proto)
#add_library(${PROJECT_NAMESPACE}::gscip ALIAS ${NAME})
diff --git a/ortools/julia/ORTools.jl/src/moi_wrapper/MOI_wrapper.jl b/ortools/julia/ORTools.jl/src/moi_wrapper/MOI_wrapper.jl
index cac48b81e0..5197a4a23f 100644
--- a/ortools/julia/ORTools.jl/src/moi_wrapper/MOI_wrapper.jl
+++ b/ortools/julia/ORTools.jl/src/moi_wrapper/MOI_wrapper.jl
@@ -1924,3 +1924,164 @@ function MOI.optimize!(model::Optimizer)
return nothing
end
+
+function MOI.get(model::Optimizer, ::MOI.RawStatusString)::String
+ if !isnothing(model) && !isnothing(model.solve_result)
+ return string(model.solve_result.termination.reason)
+ end
+
+ return ""
+end
+
+"""
+Additional, typically solver-specific information about termination.
+"""
+struct ExtraTerminationDetailString <: MOI.AbstractOptimizerAttribute end
+MOI.attribute_value_type(::ExtraTerminationDetailString) = String
+
+function MOI.get(model::Optimizer, ::ExtraTerminationDetailString)::String
+ if !isnothing(model) && !isnothing(model.solve_result)
+ return model.solve_result.termination.detail
+ end
+
+ return ""
+end
+
+function MOI.get(model::Optimizer, ::MOI.TerminationStatus)::MOI.TerminationStatusCode
+ if isnothing(model) || isnothing(model.solve_result)
+ return MOI.OPTIMIZE_NOT_CALLED
+ end
+
+ if model.solve_result.termination.reason ==
+ TerminationReasonProto.TERMINATION_REASON_OPTIMAL
+ # It is expected that the LimitProto is LIMIT_UNSPECIFIED when the termination reason is OPTIMAL.
+ return MOI.OPTIMAL
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_ITERATION
+ return MOI.ITERATION_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_TIME
+ return MOI.TIME_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_NODE
+ return MOI.NODE_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_SOLUTION
+ return MOI.SOLUTION_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_MEMORY
+ return MOI.MEMORY_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_OBJECTIVE
+ return MOI.OBJECTIVE_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_NORM
+ return MOI.NORM_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_INTERRUPTED
+ return MOI.INTERRUPTED
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_SLOW_PROGRESS
+ return MOI.SLOW_PROGRESS
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_OTHER
+ return MOI.OTHER_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_UNDETERMINED
+ # TODO: b/411325865 Follow up on support for LIMIT_UNDETERMINED in MOI.jl
+ # A fallback as there's currently no associated MOI.LIMIT_* that can represent this.
+ @info "The underlying solver does not expose which limit was reached and the actual limit is LIMIT_UNDETERMINED " \
+ "However, LIMIT_UNDETERMINED is not associated with a MOI.LIMIT_* hence the returned LIMIT is MOI.OTHER_LIMIT."
+ return MOI.OTHER_LIMIT
+ elseif model.solve_result.termination.limit == LimitProto.LIMIT_CUTOFF
+ # TODO: b/411328356 Follow up on support for LIMIT_CUTOFF in MOI.jl
+ # A fallback as there's currently no associated MOI.LIMIT_* that can represent this.
+ @info "The solver was run with a cutoff on the objective, indicating that the user did not want any solution " \
+ "worse than the cutoff, and the solver concluded there were no solutions at least as good as the cutoff. " \
+ "Typically no further solution information is provided. The actual limit is LIMIT_CUTOFF. " \
+ "However, LIMIT_CUTOFF is not associated with a MOI.LIMIT_* hence the returned LIMIT is MOI.OTHER_LIMIT."
+ return MOI.OTHER_LIMIT
+ else
+ # TODO: b/411328207 Add attribute to capture more information about the limit when LIMIT_UNSPECIFIED is the returned limit.
+ # The else bit falls back to MOI.LIMIT_UNSPECIFIED if the termination reason wasn't TERMINATION_REASON_OPTIMAL
+ @info "The solver terminated but not from a limit and the actual limit is LIMIT_UNSPECIFIED, which is used as a null. " \
+ "However, LIMIT_UNSPECIFIED is not associated with a MOI.LIMIT_* hence the returned LIMIT is MOI.OTHER_LIMIT."
+ return MOI.OTHER_LIMIT
+ end
+end
+
+function MOI.get(model::Optimizer, attr::MOI.PrimalStatus)
+ if isnothing(model) || isnothing(model.solve_result)
+ return MOI.NO_SOLUTION
+ end
+
+ if attr.result_index != 1
+ return MOI.NO_SOLUTION
+ elseif model.solve_result.termination.problem_status.primal_status ==
+ FeasibilityStatusProto.FEASIBILITY_STATUS_UNDETERMINED
+ return MOI.UNKNOWN_RESULT_STATUS
+ elseif model.solve_result.termination.problem_status.primal_status ==
+ FeasibilityStatusProto.FEASIBILITY_STATUS_FEASIBLE
+ return MOI.FEASIBLE_POINT
+ elseif model.solve_result.termination.problem_status.primal_status ==
+ FeasibilityStatusProto.FEASIBILITY_STATUS_INFEASIBLE
+ return MOI.INFEASIBLE_POINT
+ else
+ # For FEASIBILITY_STATUS_UNSPECIFIED which is a guard value representing no status
+ return MOI.NO_SOLUTION
+ end
+end
+
+function MOI.get(model::Optimizer, attr::MOI.DualStatus)
+ if isnothing(model) || isnothing(model.solve_result)
+ return MOI.NO_SOLUTION
+ end
+
+ if attr.result_index != 1
+ return MOI.NO_SOLUTION
+ elseif model.solve_result.termination.problem_status.dual_status ==
+ FeasibilityStatusProto.FEASIBILITY_STATUS_UNDETERMINED
+ return MOI.UNKNOWN_RESULT_STATUS
+ elseif model.solve_result.termination.problem_status.dual_status ==
+ FeasibilityStatusProto.FEASIBILITY_STATUS_FEASIBLE
+ return MOI.FEASIBLE_SOLUTION
+ elseif model.solve_result.termination.problem_status.dual_status ==
+ FeasibilityStatusProto.FEASIBILITY_STATUS_INFEASIBLE
+ return MOI.INFEASIBLE_SOLUTION
+ else
+ # For FEASIBILITY_STATUS_UNSPECIFIED which is a guard value representing no status
+ return MOI.NO_SOLUTION
+ end
+end
+
+"""
+When the solver claims the the primal or dual problem is infeasible, but
+it does not know which (or if both are infeasible), this attribute returns `true`.
+It can be true only when primal_status = dual_status = FEASIBILITY_STATUS_UNDETERMINED
+(mapped to MOI.UNKNOWN_RESULT_STATUS). This extra information is often needed when
+preprocessing determines there is no optimal solution to the problem
+(but can't determine if it is due to infeasibility, unboundedness, or both).
+"""
+struct PrimalOrDualInfeasible <: MOI.AbstractOptimizerAttribute end
+MOI.attribute_value_type(::PrimalOrDualInfeasible) = Bool
+
+function MOI.get(model::Optimizer, ::PrimalOrDualInfeasible)::Bool
+ if isnothing(model) || isnothing(model.solve_result)
+ return false
+ end
+
+ return model.solve_result.termination.problem_status.primal_status.primal_or_dual_infeasible
+end
+
+function MOI.get(model::Optimizer, attr::MOI.ObjectiveBound)
+ if isnothing(model) || isnothing(model.solve_result)
+ throw(MOI.GetAttributeNotAllowed(attr))
+ end
+
+ return model.solve_result.termination.objective_bounds.primal_bound
+end
+
+"""
+When the solver claims there exists a dual solution that is numerically feasible
+(i.e. feasible up to the solvers tolerance), and whose objective value is
+dual_bound, this attribute returns the dual bound.
+"""
+struct DualObjectiveBound <: MOI.AbstractOptimizerAttribute end
+MOI.attribute_value_type(::DualObjectiveBound) = Float64
+
+function MOI.get(model::Optimizer, attr::DualObjectiveBound)
+ if isnothing(model) || isnothing(model.solve_result)
+ throw(MOI.GetAttributeNotAllowed(attr))
+ end
+
+ return model.solve_result.termination.objective_bounds.dual_bound
+end
diff --git a/ortools/julia/ORTools.jl/src/moi_wrapper/Type_wrappers.jl b/ortools/julia/ORTools.jl/src/moi_wrapper/Type_wrappers.jl
index a7debbc3e0..849fe4b393 100644
--- a/ortools/julia/ORTools.jl/src/moi_wrapper/Type_wrappers.jl
+++ b/ortools/julia/ORTools.jl/src/moi_wrapper/Type_wrappers.jl
@@ -3,6 +3,9 @@ const OperationsResearch = ORToolsGenerated.Proto.operations_research
const MathOpt = OperationsResearch.math_opt
const SolverType = MathOpt.SolverTypeProto
const SolveResultProto = MathOpt.SolveResultProto
+const TerminationReasonProto = MathOpt.TerminationReasonProto
+const LimitProto = MathOpt.LimitProto
+const FeasibilityStatusProto = MathOpt.FeasibilityStatusProto
const PB = MathOpt.PB
"""
@@ -933,7 +936,7 @@ mutable struct SatParameters <: AbstractSatParameters
exploit_objective::Bool
probing_period_at_root::Int64
use_probing_search::Bool
- shaving_deterministic_time_in_probing_search::Float64
+ use_shaving_in_probing_search::Bool
shaving_search_deterministic_time::Float64
use_objective_lb_search::Bool
use_objective_shaving_search::Bool
@@ -1154,8 +1157,8 @@ mutable struct SatParameters <: AbstractSatParameters
exploit_objective = true,
probing_period_at_root = Int64(0),
use_probing_search = false,
- shaving_deterministic_time_in_probing_search = Float64(0.001),
- shaving_search_deterministic_time = Float64(0.1),
+ use_shaving_in_probing_search = true,
+ shaving_search_deterministic_time = Float64(0.001),
use_objective_lb_search = false,
use_objective_shaving_search = false,
pseudo_cost_reliability_threshold = Int64(100),
@@ -1375,7 +1378,7 @@ mutable struct SatParameters <: AbstractSatParameters
exploit_objective,
probing_period_at_root,
use_probing_search,
- shaving_deterministic_time_in_probing_search,
+ use_shaving_in_probing_search,
shaving_search_deterministic_time,
use_objective_lb_search,
use_objective_shaving_search,
@@ -1603,7 +1606,7 @@ function to_proto_struct(
sat_parameters.exploit_objective,
sat_parameters.probing_period_at_root,
sat_parameters.use_probing_search,
- sat_parameters.shaving_deterministic_time_in_probing_search,
+ sat_parameters.use_shaving_in_probing_search,
sat_parameters.shaving_search_deterministic_time,
sat_parameters.use_objective_lb_search,
sat_parameters.use_objective_shaving_search,