linear_solver: backport from main

This commit is contained in:
Corentin Le Molgat
2025-10-16 13:06:55 +02:00
parent 87f3383057
commit 28cfca9a22
4 changed files with 305 additions and 145 deletions

View File

@@ -15,13 +15,34 @@ load("@rules_cc//cc:cc_library.bzl", "cc_library")
package(default_visibility = ["//visibility:public"])
cc_library(
name = "preprocessor",
srcs = ["preprocessor.cc"],
hdrs = ["preprocessor.h"],
deps = [
"//ortools/glop:preprocessor",
"//ortools/lp_data",
"//ortools/lp_data:base",
"//ortools/lp_data:lp_utils",
"//ortools/lp_data:sparse",
"//ortools/lp_data:sparse_column",
"//ortools/util:fp_utils",
"//ortools/util:return_macros",
"//ortools/util:stats",
"@abseil-cpp//absl/log",
"@abseil-cpp//absl/log:check",
],
)
cc_library(
name = "proto_utils",
hdrs = ["proto_utils.h"],
visibility = ["//visibility:public"],
deps = [
"//ortools/linear_solver:linear_solver_cc_proto",
"//ortools/port:proto_utils",
"@abseil-cpp//absl/log",
"@abseil-cpp//absl/log:check",
"@abseil-cpp//absl/status:statusor",
"@protobuf",
],
)
@@ -56,6 +77,7 @@ cc_library(
hdrs = ["pdlp_proto_solver.h"],
deps = [
"//ortools/base:logging",
"//ortools/base:status_macros",
"//ortools/linear_solver:linear_solver_cc_proto",
"//ortools/linear_solver:model_validator",
"//ortools/pdlp:iteration_stats",
@@ -78,9 +100,12 @@ cc_library(
"//ortools/glop:parameters_cc_proto",
"//ortools/glop:preprocessor",
"//ortools/linear_solver:linear_solver_cc_proto",
"//ortools/lp_data",
"//ortools/lp_data:base",
"//ortools/lp_data:proto_utils",
"//ortools/util:logging",
"@abseil-cpp//absl/memory",
"//ortools/util:time_limit",
"@abseil-cpp//absl/log:check",
],
)
@@ -118,7 +143,7 @@ cc_library(
srcs = ["scip_params.cc"],
hdrs = ["scip_params.h"],
deps = [
"//ortools/base:logging",
"//ortools/base",
"//ortools/linear_solver:scip_helper_macros",
"@abseil-cpp//absl/status",
"@abseil-cpp//absl/strings",
@@ -136,16 +161,19 @@ cc_library(
"//conditions:default": [],
}),
deps = [
"//ortools/base",
":scip_params",
"//ortools/base:status_macros",
"//ortools/base:timer",
"//ortools/linear_solver:linear_solver_cc_proto",
"//ortools/linear_solver:model_validator",
"//ortools/linear_solver:scip_helper_macros",
"//ortools/linear_solver/proto_solver:scip_params",
"//ortools/util:lazy_mutable_copy",
"@abseil-cpp//absl/base:core_headers",
"@abseil-cpp//absl/cleanup",
"@abseil-cpp//absl/container:btree",
"@abseil-cpp//absl/flags:flag",
"@abseil-cpp//absl/log",
"@abseil-cpp//absl/log:check",
"@abseil-cpp//absl/status",
"@abseil-cpp//absl/status:statusor",
"@abseil-cpp//absl/strings",
@@ -162,6 +190,7 @@ cc_library(
srcs = ["gurobi_proto_solver.cc"],
hdrs = ["gurobi_proto_solver.h"],
deps = [
"//ortools/base:status_macros",
"//ortools/base:timer",
"//ortools/linear_solver:gurobi_util",
"//ortools/linear_solver:linear_solver_cc_proto",
@@ -177,7 +206,6 @@ cc_library(
"@abseil-cpp//absl/strings",
"@abseil-cpp//absl/strings:str_format",
"@abseil-cpp//absl/time",
"@abseil-cpp//absl/types:optional",
],
)
@@ -193,28 +221,13 @@ cc_library(
"//ortools/base:timer",
"//ortools/linear_solver:linear_solver_cc_proto",
"//ortools/linear_solver:model_validator",
"//ortools/port:proto_utils",
"//ortools/util:lazy_mutable_copy",
"@abseil-cpp//absl/status",
"@abseil-cpp//absl/status:statusor",
"@abseil-cpp//absl/strings",
"@abseil-cpp//absl/time",
"@abseil-cpp//absl/types:optional",
"@highs",
],
)
cc_library(
name = "preprocessor",
srcs = ["preprocessor.cc"],
hdrs = ["preprocessor.h"],
deps = [
"//ortools/glop:preprocessor",
"//ortools/lp_data",
"//ortools/lp_data:base",
"//ortools/lp_data:lp_utils",
"//ortools/lp_data:sparse",
"//ortools/lp_data:sparse_column",
"//ortools/util:fp_utils",
"//ortools/util:return_macros",
"//ortools/util:stats",
"@abseil-cpp//absl/log",
"@abseil-cpp//absl/log:check",
"@protobuf",
],
)

View File

@@ -11,22 +11,26 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# Python wrapper for model_builder.
load("@pip_deps//:requirements.bzl", "requirement")
load("@pybind11_bazel//:build_defs.bzl", "pybind_extension")
load("@rules_python//python:py_binary.bzl", "py_binary")
load("@rules_python//python:py_library.bzl", "py_library")
load("@rules_python//python:py_test.bzl", "py_test")
# Python wrapper for model_builder.
pybind_extension(
name = "model_builder_helper",
srcs = ["model_builder_helper.cc"],
visibility = ["//visibility:public"],
deps = [
"//ortools/base:logging",
"//ortools/linear_solver:linear_solver_cc_proto",
"//ortools/linear_solver:model_exporter",
"//ortools/linear_solver/wrappers:model_builder_helper",
"@abseil-cpp//absl/hash",
"@abseil-cpp//absl/log:check",
"@abseil-cpp//absl/strings",
"@abseil-cpp//absl/types:span",
"@eigen",
"@pybind11_protobuf//pybind11_protobuf:native_proto_caster",
],
@@ -41,11 +45,10 @@ py_test(
],
deps = [
":model_builder_helper",
":model_builder_numbers",
"//ortools/linear_solver:linear_solver_py_pb2",
requirement("absl-py"),
requirement("numpy"),
requirement("scipy"),
"//ortools/linear_solver:linear_solver_py_pb2",
],
)
@@ -80,18 +83,22 @@ py_test(
],
deps = [
":model_builder",
":model_builder_helper",
"@protobuf//:protobuf_python",
requirement("absl-py"),
requirement("numpy"),
requirement("pandas"),
"//ortools/linear_solver:linear_solver_py_pb2",
],
)
## Proto solver
py_binary(
name = "solve_model",
srcs = ["solve_model.py"],
deps = [
":model_builder",
requirement("absl-py"),
"//ortools/linear_solver:linear_solver_py_pb2",
],
)

View File

@@ -11,49 +11,282 @@
# See the License for the specific language governing permissions and
# limitations under the License.
load(":code_samples.bzl", "code_sample_cc", "code_sample_java", "code_sample_py")
load("@pip_deps//:requirements.bzl", "requirement")
load("@rules_cc//cc:cc_test.bzl", "cc_test")
load("@rules_java//java:java_binary.bzl", "java_binary")
load("@rules_python//python:py_test.bzl", "py_test")
load("//bazel:run_binary_test.bzl", "run_binary_test")
# Linear Solver
code_sample_cc(name = "assignment_mip")
code_sample_cc(name = "basic_example")
cc_test(
name = "assignment_mip_test",
srcs = ["assignment_mip.cc"],
deps = [
"//ortools/base",
"//ortools/base:logging",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
],
)
code_sample_cc(name = "bin_packing_mip")
cc_test(
name = "assignment_groups_mip_test",
srcs = ["assignment_groups_mip.cc"],
deps = [
"//ortools/base",
"//ortools/base:logging",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
"@abseil-cpp//absl/strings:str_format",
],
)
code_sample_cc(name = "integer_programming_example")
cc_test(
name = "assignment_task_sizes_mip_test",
srcs = ["assignment_task_sizes_mip.cc"],
deps = [
"//ortools/base",
"//ortools/base:logging",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
"@abseil-cpp//absl/strings:str_format",
],
)
code_sample_cc(name = "linear_programming_example")
cc_test(
name = "assignment_teams_mip_test",
srcs = ["assignment_teams_mip.cc"],
deps = [
"//ortools/base",
"//ortools/base:logging",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
"@abseil-cpp//absl/strings:str_format",
],
)
code_sample_cc(name = "mip_var_array")
cc_test(
name = "basic_example_test",
srcs = ["basic_example.cc"],
deps = [
"//ortools/base",
"//ortools/init",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log",
"@abseil-cpp//absl/log:globals",
],
)
code_sample_cc(name = "multiple_knapsack_mip")
cc_test(
name = "bin_packing_mip_test",
srcs = ["bin_packing_mip.cc"],
deps = ["//ortools/linear_solver"],
)
#code_sample_cc(name = "network_design_ilph")
cc_test(
name = "linear_programming_example_test",
srcs = ["linear_programming_example.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
],
)
code_sample_cc(name = "simple_lp_program")
cc_test(
name = "integer_programming_example_test",
srcs = ["integer_programming_example.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
],
)
code_sample_cc(name = "simple_mip_program")
cc_test(
name = "mip_var_array_test",
srcs = ["mip_var_array.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
],
)
code_sample_cc(name = "stigler_diet")
cc_test(
name = "multiple_knapsack_mip_test",
srcs = ["multiple_knapsack_mip.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
"@abseil-cpp//absl/strings:str_format",
],
)
cc_test(
name = "simple_lp_program_test",
srcs = ["simple_lp_program.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
],
)
cc_test(
name = "simple_mip_program_test",
srcs = ["simple_mip_program.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log:globals",
],
)
cc_test(
name = "stigler_diet_test",
srcs = ["stigler_diet.cc"],
deps = [
"//ortools/base",
"//ortools/linear_solver",
"@abseil-cpp//absl/base:log_severity",
"@abseil-cpp//absl/log",
"@abseil-cpp//absl/log:globals",
],
)
# Model Builder
code_sample_java(name = "AssignmentMb")
py_test(
name = "assignment_mb_py3",
srcs = ["assignment_mb.py"],
main = "assignment_mb.py",
deps = [
requirement("pandas"),
"//ortools/linear_solver/python:model_builder",
],
)
code_sample_java(name = "BinPackingMb")
py_test(
name = "bin_packing_mb_py3",
srcs = ["bin_packing_mb.py"],
main = "bin_packing_mb.py",
deps = [
requirement("pandas"),
"//ortools/linear_solver/python:model_builder",
],
)
code_sample_java(name = "CloneModelMb")
py_test(
name = "clone_model_mb_py3",
srcs = ["clone_model_mb.py"],
main = "clone_model_mb.py",
deps = ["//ortools/linear_solver/python:model_builder"],
)
code_sample_java(name = "SimpleLpProgramMb")
py_test(
name = "simple_lp_program_mb_py3",
srcs = ["simple_lp_program_mb.py"],
main = "simple_lp_program_mb.py",
deps = ["//ortools/linear_solver/python:model_builder"],
)
code_sample_java(name = "SimpleMipProgramMb")
py_test(
name = "simple_mip_program_mb_py3",
srcs = ["simple_mip_program_mb.py"],
main = "simple_mip_program_mb.py",
deps = ["//ortools/linear_solver/python:model_builder"],
)
code_sample_py(name = "assignment_mb")
java_binary(
name = "AssignmentMb",
srcs = ["AssignmentMb.java"],
main_class = "com.google.ortools.linearsolver.samples.AssignmentMb",
deps = [
"//ortools/java/com/google/ortools:Loader",
"//ortools/java/com/google/ortools/modelbuilder",
"//ortools/linear_solver/java:modelbuilder",
],
)
code_sample_py(name = "bin_packing_mb")
run_binary_test(
name = "AssignmentMbTest",
binary = ":AssignmentMb",
)
code_sample_py(name = "clone_model_mb")
java_binary(
name = "BinPackingMb",
srcs = ["BinPackingMb.java"],
main_class = "com.google.ortools.linearsolver.samples.BinPackingMb",
deps = [
"//ortools/java/com/google/ortools:Loader",
"//ortools/java/com/google/ortools/modelbuilder",
"//ortools/linear_solver/java:modelbuilder",
],
)
code_sample_py(name = "simple_lp_program_mb")
run_binary_test(
name = "BinPackingMbTest",
binary = ":BinPackingMb",
)
code_sample_py(name = "simple_mip_program_mb")
java_binary(
name = "CloneModelMb",
srcs = ["CloneModelMb.java"],
main_class = "com.google.ortools.linearsolver.samples.CloneModelMb",
deps = [
"//ortools/java/com/google/ortools:Loader",
"//ortools/java/com/google/ortools/modelbuilder",
"//ortools/linear_solver/java:modelbuilder",
],
)
run_binary_test(
name = "CloneModelMbTest",
binary = ":CloneModelMb",
)
java_binary(
name = "SimpleLpProgramMb",
srcs = ["SimpleLpProgramMb.java"],
main_class = "com.google.ortools.linearsolver.samples.SimpleLpProgramMb",
deps = [
"//ortools/java/com/google/ortools:Loader",
"//ortools/java/com/google/ortools/modelbuilder",
"//ortools/linear_solver/java:modelbuilder",
],
)
run_binary_test(
name = "SimpleLpProgramMbTest",
binary = ":SimpleLpProgramMb",
)
java_binary(
name = "SimpleMipProgramMb",
srcs = ["SimpleMipProgramMb.java"],
main_class = "com.google.ortools.linearsolver.samples.SimpleMipProgramMb",
deps = [
"//ortools/java/com/google/ortools:Loader",
"//ortools/java/com/google/ortools/modelbuilder",
"//ortools/linear_solver/java:modelbuilder",
],
)
run_binary_test(
name = "SimpleMipProgramMbTest",
binary = ":SimpleMipProgramMb",
)

View File

@@ -1,93 +0,0 @@
# Copyright 2010-2025 Google LLC
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Helper macro to compile and test code samples."""
load("@pip_deps//:requirements.bzl", "requirement")
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
load("@rules_cc//cc:cc_test.bzl", "cc_test")
load("@rules_java//java:java_test.bzl", "java_test")
load("@rules_python//python:py_binary.bzl", "py_binary")
load("@rules_python//python:py_test.bzl", "py_test")
def code_sample_cc(name):
cc_binary(
name = name + "_cc",
srcs = [name + ".cc"],
deps = [
"//ortools/base",
"//ortools/init",
"//ortools/linear_solver",
"//ortools/linear_solver:linear_solver_cc_proto",
],
)
cc_test(
name = name + "_cc_test",
size = "small",
srcs = [name + ".cc"],
deps = [
":" + name + "_cc",
"//ortools/base",
"//ortools/init",
"//ortools/linear_solver",
"//ortools/linear_solver:linear_solver_cc_proto",
],
)
def code_sample_py(name):
py_binary(
name = name + "_py3",
srcs = [name + ".py"],
main = name + ".py",
deps = [
requirement("absl-py"),
requirement("protobuf"),
requirement("numpy"),
requirement("pandas"),
"//ortools/init/python:init",
"//ortools/linear_solver/python:model_builder",
],
)
py_test(
name = name + "_py_test",
size = "small",
srcs = [name + ".py"],
main = name + ".py",
data = [
"//ortools/init/python:init",
"//ortools/linear_solver/python:model_builder",
],
deps = [
requirement("absl-py"),
requirement("protobuf"),
requirement("numpy"),
requirement("pandas"),
],
)
def code_sample_java(name):
java_test(
name = name + "_java_test",
size = "small",
srcs = [name + ".java"],
main_class = "com.google.ortools.linearsolver.samples." + name,
test_class = "com.google.ortools.linearsolver.samples." + name,
deps = [
"//ortools/init/java:init",
"//ortools/linear_solver/java:modelbuilder",
"//ortools/java/com/google/ortools/modelbuilder",
"//ortools/java/com/google/ortools:Loader",
],
)