Remove examples/tests folder (#4971)

This folder was mostly used to store reproducers for issues but were never proper tests.
This commit is contained in:
Guillaume Chatelet
2026-01-05 13:26:43 +01:00
committed by Corentin Le Molgat
parent 30a7baee6d
commit caab346d4d
43 changed files with 0 additions and 4657 deletions

2
.gitignore vendored
View File

@@ -95,8 +95,6 @@ ortools/dotnet/*/bin
ortools/dotnet/*/obj
ortools/**/samples/bin
ortools/**/samples/obj
examples/tests/bin
examples/tests/obj
examples/contrib/bin
examples/contrib/obj
examples/dotnet/bin

View File

@@ -470,6 +470,3 @@ endforeach()
foreach(EXAMPLES IN ITEMS contrib cpp dotnet java python)
add_subdirectory(examples/${EXAMPLES})
endforeach()
# Add tests in examples/tests
add_subdirectory(examples/tests)

View File

@@ -84,7 +84,6 @@ This software suite is composed of the following components:
* [python](examples/python) Python examples.
* [notebook](examples/notebook) Jupyter/IPython notebooks.
* [flatzinc](examples/flatzinc) FlatZinc examples.
* [tests](examples/tests) Unit tests and bug reports.
* [tools](tools) Delivery Tools (e.g. Windows GNU binaries, scripts, release dockers)
## Installation

View File

@@ -91,7 +91,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -94,7 +94,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -93,7 +93,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../LICENSE", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -85,7 +85,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -87,7 +87,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../tools/doc/orLogo.png", destination: "$HOME/project/tools/doc/"

View File

@@ -88,7 +88,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -87,7 +87,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../LICENSE", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -85,7 +85,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -87,7 +87,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../tools/doc/orLogo.png", destination: "$HOME/project/tools/doc/"

View File

@@ -88,7 +88,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -87,7 +87,6 @@ Vagrant.configure("2") do |config|
config.vm.provision "file", source: "../../../../examples/dotnet", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/java", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/python", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../examples/tests", destination: "$HOME/project/examples/"
config.vm.provision "file", source: "../../../../patches", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../LICENSE", destination: "$HOME/project/"
config.vm.provision "file", source: "../../../../Version.txt", destination: "$HOME/project/"

View File

@@ -1,51 +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.
if(NOT BUILD_EXAMPLES)
return()
endif()
if(BUILD_CXX_EXAMPLES)
file(GLOB CXX_SRCS "*.cc")
foreach(_FULL_FILE_NAME IN LISTS CXX_SRCS)
get_filename_component(_NAME ${_FULL_FILE_NAME} NAME_WE)
get_filename_component(_FILE_NAME ${_FULL_FILE_NAME} NAME)
ortools_cxx_test(
NAME
tests_${_NAME}
SOURCES
${_FULL_FILE_NAME}
)
endforeach()
endif()
if(BUILD_PYTHON_EXAMPLES)
file(GLOB PYTHON_SRCS "*.py")
foreach(FILE_NAME IN LISTS PYTHON_SRCS)
add_python_example(FILE_NAME ${FILE_NAME})
endforeach()
endif()
if(BUILD_JAVA_EXAMPLES)
file(GLOB JAVA_SRCS "*.java")
foreach(FILE_NAME IN LISTS JAVA_SRCS)
add_java_example(FILE_NAME ${FILE_NAME})
endforeach()
endif()
if(BUILD_DOTNET_EXAMPLES)
file(GLOB DOTNET_SRCS "*.cs")
foreach(FILE_NAME IN LISTS DOTNET_SRCS)
add_dotnet_example(FILE_NAME ${FILE_NAME})
endforeach()
endif()

View File

@@ -1,74 +0,0 @@
// Copyright 2011-2012 Google
// 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.
#include "absl/flags/parse.h"
#include "ortools/base/hash.h"
#include "ortools/base/map_util.h"
#include "ortools/base/stl_util.h"
#include "ortools/constraint_solver/constraint_solver.h"
#include "ortools/constraint_solver/constraint_solveri.h"
#include "ortools/util/string_array.h"
namespace operations_research {
void ShoppingBasketBug() {
Solver s("ShoppingBasketBug");
IntVar* const x15 = s.MakeIntVar(0, 2, "x15");
IntVar* const x18 = s.MakeIntVar(0, 2, "x18");
IntVar* const is1 = s.MakeIsEqualCstVar(x15, 2);
IntVar* const is2 = s.MakeIsEqualCstVar(x18, 2);
IntVar* const is_less = s.MakeIsLessOrEqualCstVar(
s.MakeSum(s.MakeProd(is1, 2), s.MakeProd(is2, 2)), 1);
std::vector<int64_t> values1;
values1.push_back(10);
values1.push_back(2);
values1.push_back(12);
IntVar* const elem1 = s.MakeElement(values1, x15)->Var();
std::vector<int64_t> values2;
values2.push_back(2);
values2.push_back(10);
values2.push_back(5);
IntVar* const elem2 = s.MakeElement(values2, x18)->Var();
std::vector<IntVar*> vars;
vars.push_back(elem1);
vars.push_back(is_less);
vars.push_back(elem2);
std::vector<int64_t> coefs;
coefs.push_back(1);
coefs.push_back(90);
coefs.push_back(1);
IntVar* const obj = s.MakeScalProd(vars, coefs)->Var();
OptimizeVar* const optimize = s.MakeMinimize(obj, 1);
SearchMonitor* const log = s.MakeSearchLog(10, optimize);
SolutionCollector* const collector = s.MakeLastSolutionCollector();
collector->Add(x15);
collector->Add(x18);
collector->Add(is_less);
collector->Add(elem1);
collector->Add(elem2);
collector->Add(is1);
collector->Add(is2);
DecisionBuilder* const db1 =
s.MakePhase(x15, x18, Solver::CHOOSE_MAX_SIZE, Solver::ASSIGN_MIN_VALUE);
DecisionBuilder* const db2 =
s.MakePhase(obj, Solver::CHOOSE_FIRST_UNBOUND, Solver::ASSIGN_MIN_VALUE);
DecisionBuilder* const db = s.Compose(db1, db2);
s.Solve(db, optimize, log, collector);
LOG(INFO) << collector->solution(0)->DebugString();
}
} // namespace operations_research
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
operations_research::ShoppingBasketBug();
return 0;
}

View File

@@ -1,88 +0,0 @@
#include <iostream>
#include <memory>
#include <unordered_map>
#include <vector>
#include "ortools/base/hash.h"
namespace operations_research {
struct Foo {
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
void bar() { std::cout << "Foo::bar\n"; }
};
void f(const Foo& foo) { std::cout << "f(const Foo&)\n"; }
void test_unique() {
std::cout << "test_unique" << std::endl;
std::unique_ptr<Foo> p1(new Foo); // p1 owns Foo
if (p1) p1->bar();
{
std::unique_ptr<Foo> p2(std::move(p1)); // now p2 owns Foo
f(*p2);
p1 = std::move(p2); // ownership returns to p1
std::cout << "destroying p2...\n";
}
if (p1) p1->bar();
// Foo instance is destroyed when p1 goes out of scope
}
void test_auto() {
std::cout << "test_auto" << std::endl;
std::vector<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
numbers.push_back(5);
numbers.push_back(6);
numbers.push_back(7);
for (int vec : numbers) {
std::cout << vec << std::endl;
}
std::unordered_map<std::string, int> my_map;
my_map["toto"] = 2;
for (auto mm : my_map) {
std::cout << mm.first << " -> " << mm.second << std::endl;
}
}
void test_chevron() {
std::cout << "test_chevron" << std::endl;
std::vector<std::pair<int, int>> toto;
toto.push_back(std::make_pair(2, 4));
}
class A {
public:
virtual ~A() {}
virtual int V() const { return 1; }
};
class B : public A {
public:
~B() override {}
int V() const override { return 2; }
};
void test_override() {
std::cout << "test_override" << std::endl;
B* b = new B();
if (b->V() != 2) {
std::cout << "Problem with override" << std::endl;
}
}
} // namespace operations_research
int main() {
operations_research::test_unique();
operations_research::test_auto();
operations_research::test_chevron();
operations_research::test_override();
return 0;
}

View File

@@ -1,12 +0,0 @@
#!/usr/bin/env python3
from ortools.constraint_solver import pywrapcp
from ortools.linear_solver import pywraplp
def main():
cp = pywrapcp.Solver("test")
lp = pywraplp.Solver.CreateSolver('GLOP')
if __name__ == "__main__":
main()

View File

@@ -1,160 +0,0 @@
// Copyright 2011-2012 Google
// 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.
#include "absl/flags/parse.h"
#include "ortools/constraint_solver/constraint_solver.h"
namespace operations_research {
class ForbiddenIntervalTestSimpleReductionOnBothSide : public DecisionBuilder {
public:
ForbiddenIntervalTestSimpleReductionOnBothSide(IntVar* const var)
: var_(var) {}
~ForbiddenIntervalTestSimpleReductionOnBothSide() override {}
Decision* Next(Solver* const s) override {
CHECK_EQ(101, var_->Min());
CHECK_EQ(899, var_->Max());
return NULL;
}
private:
IntVar* const var_;
};
class ForbiddenIntervalTestMultipleReductionsOnMin : public DecisionBuilder {
public:
ForbiddenIntervalTestMultipleReductionsOnMin(IntVar* const var) : var_(var) {}
~ForbiddenIntervalTestMultipleReductionsOnMin() override {}
Decision* Next(Solver* const s) override {
CHECK_EQ(0, var_->Min());
CHECK_EQ(1000, var_->Max());
var_->SetMin(5);
CHECK_EQ(5, var_->Min());
CHECK_EQ(1000, var_->Max());
var_->SetMax(995);
CHECK_EQ(5, var_->Min());
CHECK_EQ(995, var_->Max());
var_->SetMin(10);
CHECK_EQ(21, var_->Min());
CHECK_EQ(995, var_->Max());
var_->SetMin(30);
CHECK_EQ(30, var_->Min());
CHECK_EQ(995, var_->Max());
var_->SetMin(505);
CHECK_EQ(511, var_->Min());
CHECK_EQ(995, var_->Max());
var_->SetMin(600);
CHECK_EQ(600, var_->Min());
CHECK_EQ(995, var_->Max());
var_->SetMin(900);
CHECK_EQ(901, var_->Min());
CHECK_EQ(995, var_->Max());
return NULL;
}
private:
IntVar* const var_;
};
class ForbiddenIntervalTestMultipleReductionsOnMax : public DecisionBuilder {
public:
ForbiddenIntervalTestMultipleReductionsOnMax(IntVar* const var) : var_(var) {}
~ForbiddenIntervalTestMultipleReductionsOnMax() override {}
Decision* Next(Solver* const s) override {
CHECK_EQ(0, var_->Min());
CHECK_EQ(1000, var_->Max());
var_->SetMin(5);
CHECK_EQ(5, var_->Min());
CHECK_EQ(1000, var_->Max());
var_->SetMax(995);
CHECK_EQ(5, var_->Min());
CHECK_EQ(995, var_->Max());
var_->SetMax(900);
CHECK_EQ(5, var_->Min());
CHECK_EQ(799, var_->Max());
var_->SetMax(750);
CHECK_EQ(5, var_->Min());
CHECK_EQ(750, var_->Max());
var_->SetMax(505);
CHECK_EQ(5, var_->Min());
CHECK_EQ(499, var_->Max());
var_->SetMax(300);
CHECK_EQ(5, var_->Min());
CHECK_EQ(300, var_->Max());
var_->SetMax(20);
CHECK_EQ(5, var_->Min());
CHECK_EQ(9, var_->Max());
return NULL;
}
private:
IntVar* const var_;
};
class ForbiddenIntervalTest {
public:
void SetUp(std::vector<int64_t>& starts, std::vector<int64_t>& ends) {
solver_.reset(new Solver("ForbiddenIntervalTest"));
var_ = solver_->MakeIntVar(0, 1000, "var");
CHECK_EQ(starts.size(), ends.size());
for (std::size_t i = 0; i < starts.size(); ++i) {
var_->RemoveInterval(starts[i], ends[i]);
}
}
std::unique_ptr<Solver> solver_;
IntVar* var_;
void TestSimpleReductionOnBothSide() {
std::cout << "TestSimpleReductionOnBothSide" << std::endl;
std::vector<int64_t> starts = {0, 900};
std::vector<int64_t> ends = {100, 1000};
SetUp(starts, ends);
CHECK(solver_->Solve(solver_->RevAlloc(
new ForbiddenIntervalTestSimpleReductionOnBothSide(var_))));
std::cout << " .. done" << std::endl;
}
void TestMultipleReductionsOnMin() {
std::cout << "TestMultipleReductionsOnMin" << std::endl;
std::vector<int64_t> starts = {10, 500, 800};
std::vector<int64_t> ends = {20, 510, 900};
SetUp(starts, ends);
CHECK(solver_->Solve(solver_->RevAlloc(
new ForbiddenIntervalTestMultipleReductionsOnMin(var_))));
std::cout << " .. done" << std::endl;
}
void TestMultipleReductionsOnMax() {
std::cout << "TestMultipleReductionsOnMax" << std::endl;
std::vector<int64_t> starts = {10, 500, 800};
std::vector<int64_t> ends = {20, 510, 900};
SetUp(starts, ends);
CHECK(solver_->Solve(solver_->RevAlloc(
new ForbiddenIntervalTestMultipleReductionsOnMax(var_))));
std::cout << " .. done" << std::endl;
}
};
} // namespace operations_research
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
operations_research::ForbiddenIntervalTest forbidden_intervals_test;
forbidden_intervals_test.TestSimpleReductionOnBothSide();
forbidden_intervals_test.TestMultipleReductionsOnMin();
forbidden_intervals_test.TestMultipleReductionsOnMax();
return 0;
}

View File

@@ -1,53 +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.
#include "ortools/init/init.h"
#include "absl/strings/str_cat.h"
namespace operations_research {
void TestLogging() {
LOG(INFO) << "Test Logging";
CppBridge::InitLogging("init");
CppBridge::ShutdownLogging();
}
void TestFlags() {
LOG(INFO) << "Test Flags";
auto cpp_flags = CppFlags();
cpp_flags.log_prefix = true;
cpp_flags.cp_model_dump_prefix = "init";
cpp_flags.cp_model_dump_models = true;
cpp_flags.cp_model_dump_submodels = true;
cpp_flags.cp_model_dump_response = true;
CppBridge::SetFlags(cpp_flags);
}
void TestVersion() {
LOG(INFO) << "Test Version";
using version = OrToolsVersion;
int major = version::MajorNumber();
int minor = version::MinorNumber();
int patch = version::PatchNumber();
std::string vers = absl::StrCat(major, ".", minor, ".", patch);
assert(vers == version::VersionString());
}
} // namespace operations_research
int main(int argc, char** argv) {
operations_research::TestLogging();
operations_research::TestFlags();
operations_research::TestVersion();
return 0;
}

View File

@@ -1,560 +0,0 @@
array [1..8] of int: X_INTRODUCED_255 = [1,1,1,1,1,1,1,1];
array [1..4] of int: X_INTRODUCED_419 = [-1,-1,-1,-1];
array [1..97] of int: X_INTRODUCED_796 = [1,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-1,-1,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-1,-1,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-1,-1,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-1,-1,-3,-3];
var bool: X_INTRODUCED_2;
var bool: X_INTRODUCED_3;
var bool: X_INTRODUCED_6;
var bool: X_INTRODUCED_7;
var bool: X_INTRODUCED_8;
var bool: X_INTRODUCED_9;
var bool: X_INTRODUCED_10;
var bool: X_INTRODUCED_11;
var bool: X_INTRODUCED_12;
var bool: X_INTRODUCED_13;
var bool: X_INTRODUCED_20;
var bool: X_INTRODUCED_21;
var bool: X_INTRODUCED_22;
var bool: X_INTRODUCED_23;
var bool: X_INTRODUCED_24;
var bool: X_INTRODUCED_25;
var bool: X_INTRODUCED_26;
var bool: X_INTRODUCED_27;
var bool: X_INTRODUCED_28;
var bool: X_INTRODUCED_29;
var bool: X_INTRODUCED_32;
var bool: X_INTRODUCED_33;
var bool: X_INTRODUCED_34;
var bool: X_INTRODUCED_35;
var bool: X_INTRODUCED_40;
var bool: X_INTRODUCED_41;
var bool: X_INTRODUCED_46;
var bool: X_INTRODUCED_47;
var bool: X_INTRODUCED_50;
var bool: X_INTRODUCED_51;
var bool: X_INTRODUCED_52;
var bool: X_INTRODUCED_53;
var bool: X_INTRODUCED_58;
var bool: X_INTRODUCED_59;
var bool: X_INTRODUCED_60;
var bool: X_INTRODUCED_61;
var bool: X_INTRODUCED_62;
var bool: X_INTRODUCED_63;
var bool: X_INTRODUCED_66;
var bool: X_INTRODUCED_67;
var bool: X_INTRODUCED_76;
var bool: X_INTRODUCED_77;
var bool: X_INTRODUCED_78;
var bool: X_INTRODUCED_79;
var bool: X_INTRODUCED_82;
var bool: X_INTRODUCED_83;
var bool: X_INTRODUCED_88;
var bool: X_INTRODUCED_89;
var bool: X_INTRODUCED_92;
var bool: X_INTRODUCED_93;
var bool: X_INTRODUCED_102;
var bool: X_INTRODUCED_103;
var bool: X_INTRODUCED_106;
var bool: X_INTRODUCED_107;
var bool: X_INTRODUCED_108;
var bool: X_INTRODUCED_109;
var bool: X_INTRODUCED_116;
var bool: X_INTRODUCED_117;
var bool: X_INTRODUCED_118;
var bool: X_INTRODUCED_119;
var bool: X_INTRODUCED_122;
var bool: X_INTRODUCED_123;
var bool: X_INTRODUCED_126;
var bool: X_INTRODUCED_127;
var bool: X_INTRODUCED_128;
var bool: X_INTRODUCED_129;
var bool: X_INTRODUCED_130;
var bool: X_INTRODUCED_131;
var bool: X_INTRODUCED_132;
var bool: X_INTRODUCED_133;
var 0..144: objective:: output_var:: is_defined_var;
var 0..1: X_INTRODUCED_248 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_249 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_252 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_253 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_257 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_258 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_259 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_260 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_261 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_262 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_271 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_272 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_273 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_274 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_277 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_278 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_279 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_280 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_281 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_282 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_287 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_288 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_289 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_290 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_297 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_298 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_303 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_304 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_309 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_310 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_311 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_312 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_319 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_320 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_321 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_322 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_323 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_324 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_329 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_330 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_341 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_342 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_343 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_344 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_349 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_350 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_357 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_358 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_361 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_362 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_373 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_374 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_379 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_380 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_381 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_382 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_391 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_392 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_393 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_394 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_399 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_400 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_403 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_404 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_407 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_408 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_409 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_410 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_411 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_412 ::var_is_introduced :: is_defined_var;
var -10..1: X_INTRODUCED_492 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_493 ::var_is_introduced ;
var 0..1: X_INTRODUCED_497 ::var_is_introduced ;
var -7..1: X_INTRODUCED_500 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_501 ::var_is_introduced ;
var -4..1: X_INTRODUCED_504 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_505 ::var_is_introduced ;
var -2..1: X_INTRODUCED_508 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_509 ::var_is_introduced ;
var 0..1: X_INTRODUCED_512 ::var_is_introduced ;
var 0..1: X_INTRODUCED_515 ::var_is_introduced ;
var 0..1: X_INTRODUCED_518 ::var_is_introduced ;
var 0..1: X_INTRODUCED_521 ::var_is_introduced ;
var 0..1: X_INTRODUCED_524 ::var_is_introduced ;
var -3..1: X_INTRODUCED_527 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_528 ::var_is_introduced ;
var -3..1: X_INTRODUCED_531 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_532 ::var_is_introduced ;
var -1..1: X_INTRODUCED_535 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_536 ::var_is_introduced ;
var -1..1: X_INTRODUCED_539 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_540 ::var_is_introduced ;
var -15..2: X_INTRODUCED_543 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_544 ::var_is_introduced ;
var -15..2: X_INTRODUCED_547 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_548 ::var_is_introduced ;
var -10..1: X_INTRODUCED_551 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_552 ::var_is_introduced ;
var -4..1: X_INTRODUCED_555 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_556 ::var_is_introduced ;
var -7..1: X_INTRODUCED_559 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_560 ::var_is_introduced ;
var -4..1: X_INTRODUCED_563 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_564 ::var_is_introduced ;
var -2..1: X_INTRODUCED_567 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_568 ::var_is_introduced ;
var 0..1: X_INTRODUCED_570 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_571 ::var_is_introduced ;
var 0..1: X_INTRODUCED_574 ::var_is_introduced ;
var 0..1: X_INTRODUCED_577 ::var_is_introduced ;
var 0..1: X_INTRODUCED_580 ::var_is_introduced ;
var 0..1: X_INTRODUCED_583 ::var_is_introduced ;
var -3..1: X_INTRODUCED_586 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_587 ::var_is_introduced ;
var -3..1: X_INTRODUCED_590 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_591 ::var_is_introduced ;
var -1..1: X_INTRODUCED_594 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_595 ::var_is_introduced ;
var -1..1: X_INTRODUCED_598 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_599 ::var_is_introduced ;
var -15..2: X_INTRODUCED_602 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_603 ::var_is_introduced ;
var -15..2: X_INTRODUCED_606 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_607 ::var_is_introduced ;
var -10..1: X_INTRODUCED_610 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_611 ::var_is_introduced ;
var -4..1: X_INTRODUCED_614 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_615 ::var_is_introduced ;
var -7..1: X_INTRODUCED_618 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_619 ::var_is_introduced ;
var -4..1: X_INTRODUCED_622 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_623 ::var_is_introduced ;
var -2..1: X_INTRODUCED_626 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_627 ::var_is_introduced ;
var 0..1: X_INTRODUCED_629 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_630 ::var_is_introduced ;
var 0..1: X_INTRODUCED_633 ::var_is_introduced ;
var 0..1: X_INTRODUCED_636 ::var_is_introduced ;
var 0..1: X_INTRODUCED_639 ::var_is_introduced ;
var 0..1: X_INTRODUCED_642 ::var_is_introduced ;
var -3..1: X_INTRODUCED_645 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_646 ::var_is_introduced ;
var -3..1: X_INTRODUCED_649 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_650 ::var_is_introduced ;
var -1..1: X_INTRODUCED_653 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_654 ::var_is_introduced ;
var -1..1: X_INTRODUCED_657 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_658 ::var_is_introduced ;
var -15..2: X_INTRODUCED_661 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_662 ::var_is_introduced ;
var -15..2: X_INTRODUCED_665 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_666 ::var_is_introduced ;
var -10..1: X_INTRODUCED_669 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_670 ::var_is_introduced ;
var -4..1: X_INTRODUCED_673 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_674 ::var_is_introduced ;
var -7..1: X_INTRODUCED_677 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_678 ::var_is_introduced ;
var -4..1: X_INTRODUCED_681 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_682 ::var_is_introduced ;
var -2..1: X_INTRODUCED_685 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_686 ::var_is_introduced ;
var 0..1: X_INTRODUCED_689 ::var_is_introduced ;
var 0..1: X_INTRODUCED_691 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_692 ::var_is_introduced ;
var 0..1: X_INTRODUCED_694 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_695 ::var_is_introduced ;
var 0..1: X_INTRODUCED_697 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_698 ::var_is_introduced ;
var 0..1: X_INTRODUCED_700 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_701 ::var_is_introduced ;
var -3..1: X_INTRODUCED_704 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_705 ::var_is_introduced ;
var -3..1: X_INTRODUCED_708 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_709 ::var_is_introduced ;
var 0..1: X_INTRODUCED_713 ::var_is_introduced ;
var 0..1: X_INTRODUCED_717 ::var_is_introduced ;
var -15..2: X_INTRODUCED_720 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_721 ::var_is_introduced ;
var -15..2: X_INTRODUCED_724 ::var_is_introduced :: is_defined_var;
var 0..2: X_INTRODUCED_725 ::var_is_introduced ;
var 0..1: X_INTRODUCED_246 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_247 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_250 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_251 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_263 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_264 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_267 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_268 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_269 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_270 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_283 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_284 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_291 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_292 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_293 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_294 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_299 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_300 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_301 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_302 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_307 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_308 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_313 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_314 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_317 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_318 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_327 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_328 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_331 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_332 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_333 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_334 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_337 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_338 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_339 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_340 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_347 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_348 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_351 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_352 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_353 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_354 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_359 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_360 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_363 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_364 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_367 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_368 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_369 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_370 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_371 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_372 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_377 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_378 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_383 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_384 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_387 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_388 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_389 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_390 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_397 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_398 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_401 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_402 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_413 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_414 ::var_is_introduced = 0;
array [1..136] of var bool: Assignment:: output_array([1..17,1..4,1..2]) = [false,false,X_INTRODUCED_2,X_INTRODUCED_3,false,false,X_INTRODUCED_6,X_INTRODUCED_7,X_INTRODUCED_8,X_INTRODUCED_9,X_INTRODUCED_10,X_INTRODUCED_11,X_INTRODUCED_12,X_INTRODUCED_13,false,false,false,false,false,false,X_INTRODUCED_20,X_INTRODUCED_21,X_INTRODUCED_22,X_INTRODUCED_23,X_INTRODUCED_24,X_INTRODUCED_25,X_INTRODUCED_26,X_INTRODUCED_27,X_INTRODUCED_28,X_INTRODUCED_29,false,false,X_INTRODUCED_32,X_INTRODUCED_33,X_INTRODUCED_34,X_INTRODUCED_35,false,false,false,false,X_INTRODUCED_40,X_INTRODUCED_41,false,false,false,false,X_INTRODUCED_46,X_INTRODUCED_47,false,false,X_INTRODUCED_50,X_INTRODUCED_51,X_INTRODUCED_52,X_INTRODUCED_53,false,false,false,false,X_INTRODUCED_58,X_INTRODUCED_59,X_INTRODUCED_60,X_INTRODUCED_61,X_INTRODUCED_62,X_INTRODUCED_63,false,false,X_INTRODUCED_66,X_INTRODUCED_67,false,false,false,false,false,false,false,false,X_INTRODUCED_76,X_INTRODUCED_77,X_INTRODUCED_78,X_INTRODUCED_79,false,false,X_INTRODUCED_82,X_INTRODUCED_83,false,false,false,false,X_INTRODUCED_88,X_INTRODUCED_89,false,false,X_INTRODUCED_92,X_INTRODUCED_93,false,false,false,false,false,false,false,false,X_INTRODUCED_102,X_INTRODUCED_103,false,false,X_INTRODUCED_106,X_INTRODUCED_107,X_INTRODUCED_108,X_INTRODUCED_109,false,false,false,false,false,false,X_INTRODUCED_116,X_INTRODUCED_117,X_INTRODUCED_118,X_INTRODUCED_119,false,false,X_INTRODUCED_122,X_INTRODUCED_123,false,false,X_INTRODUCED_126,X_INTRODUCED_127,X_INTRODUCED_128,X_INTRODUCED_129,X_INTRODUCED_130,X_INTRODUCED_131,X_INTRODUCED_132,X_INTRODUCED_133,false,false];
array [1..96] of var int: SubjSlack:: output_array([1..4,1..12,1..2]) = [X_INTRODUCED_493,0,0,X_INTRODUCED_497,X_INTRODUCED_501,0,0,X_INTRODUCED_505,0,X_INTRODUCED_509,0,X_INTRODUCED_512,X_INTRODUCED_515,X_INTRODUCED_518,X_INTRODUCED_521,X_INTRODUCED_524,X_INTRODUCED_528,X_INTRODUCED_532,X_INTRODUCED_536,X_INTRODUCED_540,0,X_INTRODUCED_544,X_INTRODUCED_548,0,X_INTRODUCED_552,0,0,X_INTRODUCED_556,X_INTRODUCED_560,0,0,X_INTRODUCED_564,0,X_INTRODUCED_568,0,X_INTRODUCED_571,X_INTRODUCED_574,X_INTRODUCED_577,X_INTRODUCED_580,X_INTRODUCED_583,X_INTRODUCED_587,X_INTRODUCED_591,X_INTRODUCED_595,X_INTRODUCED_599,0,X_INTRODUCED_603,X_INTRODUCED_607,0,X_INTRODUCED_611,0,0,X_INTRODUCED_615,X_INTRODUCED_619,0,0,X_INTRODUCED_623,0,X_INTRODUCED_627,0,X_INTRODUCED_630,X_INTRODUCED_633,X_INTRODUCED_636,X_INTRODUCED_639,X_INTRODUCED_642,X_INTRODUCED_646,X_INTRODUCED_650,X_INTRODUCED_654,X_INTRODUCED_658,0,X_INTRODUCED_662,X_INTRODUCED_666,0,X_INTRODUCED_670,0,0,X_INTRODUCED_674,X_INTRODUCED_678,0,0,X_INTRODUCED_682,0,X_INTRODUCED_686,0,X_INTRODUCED_689,X_INTRODUCED_692,X_INTRODUCED_695,X_INTRODUCED_698,X_INTRODUCED_701,X_INTRODUCED_705,X_INTRODUCED_709,X_INTRODUCED_713,X_INTRODUCED_717,0,X_INTRODUCED_721,X_INTRODUCED_725,0];
array [1..12] of var int: Target:: output_array([1..12]) = [1,1,1,1,1,1,1,1,1,1,2,2];
array [1..97] of var int: X_INTRODUCED_795 ::var_is_introduced = [objective,X_INTRODUCED_493,0,0,X_INTRODUCED_497,X_INTRODUCED_501,0,0,X_INTRODUCED_505,0,X_INTRODUCED_509,0,X_INTRODUCED_512,X_INTRODUCED_515,X_INTRODUCED_518,X_INTRODUCED_521,X_INTRODUCED_524,X_INTRODUCED_528,X_INTRODUCED_532,X_INTRODUCED_536,X_INTRODUCED_540,0,X_INTRODUCED_544,X_INTRODUCED_548,0,X_INTRODUCED_552,0,0,X_INTRODUCED_556,X_INTRODUCED_560,0,0,X_INTRODUCED_564,0,X_INTRODUCED_568,0,X_INTRODUCED_571,X_INTRODUCED_574,X_INTRODUCED_577,X_INTRODUCED_580,X_INTRODUCED_583,X_INTRODUCED_587,X_INTRODUCED_591,X_INTRODUCED_595,X_INTRODUCED_599,0,X_INTRODUCED_603,X_INTRODUCED_607,0,X_INTRODUCED_611,0,0,X_INTRODUCED_615,X_INTRODUCED_619,0,0,X_INTRODUCED_623,0,X_INTRODUCED_627,0,X_INTRODUCED_630,X_INTRODUCED_633,X_INTRODUCED_636,X_INTRODUCED_639,X_INTRODUCED_642,X_INTRODUCED_646,X_INTRODUCED_650,X_INTRODUCED_654,X_INTRODUCED_658,0,X_INTRODUCED_662,X_INTRODUCED_666,0,X_INTRODUCED_670,0,0,X_INTRODUCED_674,X_INTRODUCED_678,0,0,X_INTRODUCED_682,0,X_INTRODUCED_686,0,X_INTRODUCED_689,X_INTRODUCED_692,X_INTRODUCED_695,X_INTRODUCED_698,X_INTRODUCED_701,X_INTRODUCED_705,X_INTRODUCED_709,X_INTRODUCED_713,X_INTRODUCED_717,0,X_INTRODUCED_721,X_INTRODUCED_725,0];
array [1..136] of var bool: X_INTRODUCED_798 ::var_is_introduced = [false,false,X_INTRODUCED_2,X_INTRODUCED_3,false,false,X_INTRODUCED_6,X_INTRODUCED_7,X_INTRODUCED_8,X_INTRODUCED_9,X_INTRODUCED_10,X_INTRODUCED_11,X_INTRODUCED_12,X_INTRODUCED_13,false,false,false,false,false,false,X_INTRODUCED_20,X_INTRODUCED_21,X_INTRODUCED_22,X_INTRODUCED_23,X_INTRODUCED_24,X_INTRODUCED_25,X_INTRODUCED_26,X_INTRODUCED_27,X_INTRODUCED_28,X_INTRODUCED_29,false,false,X_INTRODUCED_32,X_INTRODUCED_33,X_INTRODUCED_34,X_INTRODUCED_35,false,false,false,false,X_INTRODUCED_40,X_INTRODUCED_41,false,false,false,false,X_INTRODUCED_46,X_INTRODUCED_47,false,false,X_INTRODUCED_50,X_INTRODUCED_51,X_INTRODUCED_52,X_INTRODUCED_53,false,false,false,false,X_INTRODUCED_58,X_INTRODUCED_59,X_INTRODUCED_60,X_INTRODUCED_61,X_INTRODUCED_62,X_INTRODUCED_63,false,false,X_INTRODUCED_66,X_INTRODUCED_67,false,false,false,false,false,false,false,false,X_INTRODUCED_76,X_INTRODUCED_77,X_INTRODUCED_78,X_INTRODUCED_79,false,false,X_INTRODUCED_82,X_INTRODUCED_83,false,false,false,false,X_INTRODUCED_88,X_INTRODUCED_89,false,false,X_INTRODUCED_92,X_INTRODUCED_93,false,false,false,false,false,false,false,false,X_INTRODUCED_102,X_INTRODUCED_103,false,false,X_INTRODUCED_106,X_INTRODUCED_107,X_INTRODUCED_108,X_INTRODUCED_109,false,false,false,false,false,false,X_INTRODUCED_116,X_INTRODUCED_117,X_INTRODUCED_118,X_INTRODUCED_119,false,false,X_INTRODUCED_122,X_INTRODUCED_123,false,false,X_INTRODUCED_126,X_INTRODUCED_127,X_INTRODUCED_128,X_INTRODUCED_129,X_INTRODUCED_130,X_INTRODUCED_131,X_INTRODUCED_132,X_INTRODUCED_133,false,false];
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_246,X_INTRODUCED_247,X_INTRODUCED_248,X_INTRODUCED_249,X_INTRODUCED_250,X_INTRODUCED_251,X_INTRODUCED_252,X_INTRODUCED_253],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_257,X_INTRODUCED_258,X_INTRODUCED_259,X_INTRODUCED_260,X_INTRODUCED_261,X_INTRODUCED_262,X_INTRODUCED_263,X_INTRODUCED_264],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_267,X_INTRODUCED_268,X_INTRODUCED_269,X_INTRODUCED_270,X_INTRODUCED_271,X_INTRODUCED_272,X_INTRODUCED_273,X_INTRODUCED_274],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_277,X_INTRODUCED_278,X_INTRODUCED_279,X_INTRODUCED_280,X_INTRODUCED_281,X_INTRODUCED_282,X_INTRODUCED_283,X_INTRODUCED_284],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_287,X_INTRODUCED_288,X_INTRODUCED_289,X_INTRODUCED_290,X_INTRODUCED_291,X_INTRODUCED_292,X_INTRODUCED_293,X_INTRODUCED_294],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_297,X_INTRODUCED_298,X_INTRODUCED_299,X_INTRODUCED_300,X_INTRODUCED_301,X_INTRODUCED_302,X_INTRODUCED_303,X_INTRODUCED_304],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_307,X_INTRODUCED_308,X_INTRODUCED_309,X_INTRODUCED_310,X_INTRODUCED_311,X_INTRODUCED_312,X_INTRODUCED_313,X_INTRODUCED_314],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_317,X_INTRODUCED_318,X_INTRODUCED_319,X_INTRODUCED_320,X_INTRODUCED_321,X_INTRODUCED_322,X_INTRODUCED_323,X_INTRODUCED_324],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_327,X_INTRODUCED_328,X_INTRODUCED_329,X_INTRODUCED_330,X_INTRODUCED_331,X_INTRODUCED_332,X_INTRODUCED_333,X_INTRODUCED_334],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_337,X_INTRODUCED_338,X_INTRODUCED_339,X_INTRODUCED_340,X_INTRODUCED_341,X_INTRODUCED_342,X_INTRODUCED_343,X_INTRODUCED_344],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_347,X_INTRODUCED_348,X_INTRODUCED_349,X_INTRODUCED_350,X_INTRODUCED_351,X_INTRODUCED_352,X_INTRODUCED_353,X_INTRODUCED_354],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_357,X_INTRODUCED_358,X_INTRODUCED_359,X_INTRODUCED_360,X_INTRODUCED_361,X_INTRODUCED_362,X_INTRODUCED_363,X_INTRODUCED_364],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_367,X_INTRODUCED_368,X_INTRODUCED_369,X_INTRODUCED_370,X_INTRODUCED_371,X_INTRODUCED_372,X_INTRODUCED_373,X_INTRODUCED_374],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_377,X_INTRODUCED_378,X_INTRODUCED_379,X_INTRODUCED_380,X_INTRODUCED_381,X_INTRODUCED_382,X_INTRODUCED_383,X_INTRODUCED_384],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_387,X_INTRODUCED_388,X_INTRODUCED_389,X_INTRODUCED_390,X_INTRODUCED_391,X_INTRODUCED_392,X_INTRODUCED_393,X_INTRODUCED_394],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_397,X_INTRODUCED_398,X_INTRODUCED_399,X_INTRODUCED_400,X_INTRODUCED_401,X_INTRODUCED_402,X_INTRODUCED_403,X_INTRODUCED_404],1);
constraint int_lin_eq(X_INTRODUCED_255,[X_INTRODUCED_407,X_INTRODUCED_408,X_INTRODUCED_409,X_INTRODUCED_410,X_INTRODUCED_411,X_INTRODUCED_412,X_INTRODUCED_413,X_INTRODUCED_414],1);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_246,X_INTRODUCED_248,X_INTRODUCED_250,X_INTRODUCED_252],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_247,X_INTRODUCED_249,X_INTRODUCED_251,X_INTRODUCED_253],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_257,X_INTRODUCED_259,X_INTRODUCED_261,X_INTRODUCED_263],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_258,X_INTRODUCED_260,X_INTRODUCED_262,X_INTRODUCED_264],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_267,X_INTRODUCED_269,X_INTRODUCED_271,X_INTRODUCED_273],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_268,X_INTRODUCED_270,X_INTRODUCED_272,X_INTRODUCED_274],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_277,X_INTRODUCED_279,X_INTRODUCED_281,X_INTRODUCED_283],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_278,X_INTRODUCED_280,X_INTRODUCED_282,X_INTRODUCED_284],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_287,X_INTRODUCED_289,X_INTRODUCED_291,X_INTRODUCED_293],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_288,X_INTRODUCED_290,X_INTRODUCED_292,X_INTRODUCED_294],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_297,X_INTRODUCED_299,X_INTRODUCED_301,X_INTRODUCED_303],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_298,X_INTRODUCED_300,X_INTRODUCED_302,X_INTRODUCED_304],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_307,X_INTRODUCED_309,X_INTRODUCED_311,X_INTRODUCED_313],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_308,X_INTRODUCED_310,X_INTRODUCED_312,X_INTRODUCED_314],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_317,X_INTRODUCED_319,X_INTRODUCED_321,X_INTRODUCED_323],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_318,X_INTRODUCED_320,X_INTRODUCED_322,X_INTRODUCED_324],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_327,X_INTRODUCED_329,X_INTRODUCED_331,X_INTRODUCED_333],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_328,X_INTRODUCED_330,X_INTRODUCED_332,X_INTRODUCED_334],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_337,X_INTRODUCED_339,X_INTRODUCED_341,X_INTRODUCED_343],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_338,X_INTRODUCED_340,X_INTRODUCED_342,X_INTRODUCED_344],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_347,X_INTRODUCED_349,X_INTRODUCED_351,X_INTRODUCED_353],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_348,X_INTRODUCED_350,X_INTRODUCED_352,X_INTRODUCED_354],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_357,X_INTRODUCED_359,X_INTRODUCED_361,X_INTRODUCED_363],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_358,X_INTRODUCED_360,X_INTRODUCED_362,X_INTRODUCED_364],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_367,X_INTRODUCED_369,X_INTRODUCED_371,X_INTRODUCED_373],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_368,X_INTRODUCED_370,X_INTRODUCED_372,X_INTRODUCED_374],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_377,X_INTRODUCED_379,X_INTRODUCED_381,X_INTRODUCED_383],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_378,X_INTRODUCED_380,X_INTRODUCED_382,X_INTRODUCED_384],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_387,X_INTRODUCED_389,X_INTRODUCED_391,X_INTRODUCED_393],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_388,X_INTRODUCED_390,X_INTRODUCED_392,X_INTRODUCED_394],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_397,X_INTRODUCED_399,X_INTRODUCED_401,X_INTRODUCED_403],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_398,X_INTRODUCED_400,X_INTRODUCED_402,X_INTRODUCED_404],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_407,X_INTRODUCED_409,X_INTRODUCED_411,X_INTRODUCED_413],0);
constraint int_lin_le(X_INTRODUCED_419,[X_INTRODUCED_408,X_INTRODUCED_410,X_INTRODUCED_412,X_INTRODUCED_414],0);
constraint int_max(0,X_INTRODUCED_492,X_INTRODUCED_493);
constraint int_max(0,1,X_INTRODUCED_497);
constraint int_max(0,X_INTRODUCED_500,X_INTRODUCED_501);
constraint int_max(0,X_INTRODUCED_504,X_INTRODUCED_505);
constraint int_max(0,X_INTRODUCED_508,X_INTRODUCED_509);
constraint int_max(0,1,X_INTRODUCED_512);
constraint int_max(0,1,X_INTRODUCED_515);
constraint int_max(0,1,X_INTRODUCED_518);
constraint int_max(0,1,X_INTRODUCED_521);
constraint int_max(0,1,X_INTRODUCED_524);
constraint int_max(0,X_INTRODUCED_527,X_INTRODUCED_528);
constraint int_max(0,X_INTRODUCED_531,X_INTRODUCED_532);
constraint int_max(0,X_INTRODUCED_535,X_INTRODUCED_536);
constraint int_max(0,X_INTRODUCED_539,X_INTRODUCED_540);
constraint int_max(0,X_INTRODUCED_543,X_INTRODUCED_544);
constraint int_max(0,X_INTRODUCED_547,X_INTRODUCED_548);
constraint int_max(0,X_INTRODUCED_551,X_INTRODUCED_552);
constraint int_max(0,X_INTRODUCED_555,X_INTRODUCED_556);
constraint int_max(0,X_INTRODUCED_559,X_INTRODUCED_560);
constraint int_max(0,X_INTRODUCED_563,X_INTRODUCED_564);
constraint int_max(0,X_INTRODUCED_567,X_INTRODUCED_568);
constraint int_max(0,X_INTRODUCED_570,X_INTRODUCED_571);
constraint int_max(0,1,X_INTRODUCED_574);
constraint int_max(0,1,X_INTRODUCED_577);
constraint int_max(0,1,X_INTRODUCED_580);
constraint int_max(0,1,X_INTRODUCED_583);
constraint int_max(0,X_INTRODUCED_586,X_INTRODUCED_587);
constraint int_max(0,X_INTRODUCED_590,X_INTRODUCED_591);
constraint int_max(0,X_INTRODUCED_594,X_INTRODUCED_595);
constraint int_max(0,X_INTRODUCED_598,X_INTRODUCED_599);
constraint int_max(0,X_INTRODUCED_602,X_INTRODUCED_603);
constraint int_max(0,X_INTRODUCED_606,X_INTRODUCED_607);
constraint int_max(0,X_INTRODUCED_610,X_INTRODUCED_611);
constraint int_max(0,X_INTRODUCED_614,X_INTRODUCED_615);
constraint int_max(0,X_INTRODUCED_618,X_INTRODUCED_619);
constraint int_max(0,X_INTRODUCED_622,X_INTRODUCED_623);
constraint int_max(0,X_INTRODUCED_626,X_INTRODUCED_627);
constraint int_max(0,X_INTRODUCED_629,X_INTRODUCED_630);
constraint int_max(0,1,X_INTRODUCED_633);
constraint int_max(0,1,X_INTRODUCED_636);
constraint int_max(0,1,X_INTRODUCED_639);
constraint int_max(0,1,X_INTRODUCED_642);
constraint int_max(0,X_INTRODUCED_645,X_INTRODUCED_646);
constraint int_max(0,X_INTRODUCED_649,X_INTRODUCED_650);
constraint int_max(0,X_INTRODUCED_653,X_INTRODUCED_654);
constraint int_max(0,X_INTRODUCED_657,X_INTRODUCED_658);
constraint int_max(0,X_INTRODUCED_661,X_INTRODUCED_662);
constraint int_max(0,X_INTRODUCED_665,X_INTRODUCED_666);
constraint int_max(0,X_INTRODUCED_669,X_INTRODUCED_670);
constraint int_max(0,X_INTRODUCED_673,X_INTRODUCED_674);
constraint int_max(0,X_INTRODUCED_677,X_INTRODUCED_678);
constraint int_max(0,X_INTRODUCED_681,X_INTRODUCED_682);
constraint int_max(0,X_INTRODUCED_685,X_INTRODUCED_686);
constraint int_max(0,1,X_INTRODUCED_689);
constraint int_max(0,X_INTRODUCED_691,X_INTRODUCED_692);
constraint int_max(0,X_INTRODUCED_694,X_INTRODUCED_695);
constraint int_max(0,X_INTRODUCED_697,X_INTRODUCED_698);
constraint int_max(0,X_INTRODUCED_700,X_INTRODUCED_701);
constraint int_max(0,X_INTRODUCED_704,X_INTRODUCED_705);
constraint int_max(0,X_INTRODUCED_708,X_INTRODUCED_709);
constraint int_max(0,1,X_INTRODUCED_713);
constraint int_max(0,1,X_INTRODUCED_717);
constraint int_max(0,X_INTRODUCED_720,X_INTRODUCED_721);
constraint int_max(0,X_INTRODUCED_724,X_INTRODUCED_725);
constraint int_lin_eq(X_INTRODUCED_796,X_INTRODUCED_795,0):: defines_var(objective);
constraint bool2int(X_INTRODUCED_2,X_INTRODUCED_248):: defines_var(X_INTRODUCED_248);
constraint bool2int(X_INTRODUCED_3,X_INTRODUCED_249):: defines_var(X_INTRODUCED_249);
constraint bool2int(X_INTRODUCED_6,X_INTRODUCED_252):: defines_var(X_INTRODUCED_252);
constraint bool2int(X_INTRODUCED_7,X_INTRODUCED_253):: defines_var(X_INTRODUCED_253);
constraint bool2int(X_INTRODUCED_8,X_INTRODUCED_257):: defines_var(X_INTRODUCED_257);
constraint bool2int(X_INTRODUCED_9,X_INTRODUCED_258):: defines_var(X_INTRODUCED_258);
constraint bool2int(X_INTRODUCED_10,X_INTRODUCED_259):: defines_var(X_INTRODUCED_259);
constraint bool2int(X_INTRODUCED_11,X_INTRODUCED_260):: defines_var(X_INTRODUCED_260);
constraint bool2int(X_INTRODUCED_12,X_INTRODUCED_261):: defines_var(X_INTRODUCED_261);
constraint bool2int(X_INTRODUCED_13,X_INTRODUCED_262):: defines_var(X_INTRODUCED_262);
constraint bool2int(X_INTRODUCED_20,X_INTRODUCED_271):: defines_var(X_INTRODUCED_271);
constraint bool2int(X_INTRODUCED_21,X_INTRODUCED_272):: defines_var(X_INTRODUCED_272);
constraint bool2int(X_INTRODUCED_22,X_INTRODUCED_273):: defines_var(X_INTRODUCED_273);
constraint bool2int(X_INTRODUCED_23,X_INTRODUCED_274):: defines_var(X_INTRODUCED_274);
constraint bool2int(X_INTRODUCED_24,X_INTRODUCED_277):: defines_var(X_INTRODUCED_277);
constraint bool2int(X_INTRODUCED_25,X_INTRODUCED_278):: defines_var(X_INTRODUCED_278);
constraint bool2int(X_INTRODUCED_26,X_INTRODUCED_279):: defines_var(X_INTRODUCED_279);
constraint bool2int(X_INTRODUCED_27,X_INTRODUCED_280):: defines_var(X_INTRODUCED_280);
constraint bool2int(X_INTRODUCED_28,X_INTRODUCED_281):: defines_var(X_INTRODUCED_281);
constraint bool2int(X_INTRODUCED_29,X_INTRODUCED_282):: defines_var(X_INTRODUCED_282);
constraint bool2int(X_INTRODUCED_32,X_INTRODUCED_287):: defines_var(X_INTRODUCED_287);
constraint bool2int(X_INTRODUCED_33,X_INTRODUCED_288):: defines_var(X_INTRODUCED_288);
constraint bool2int(X_INTRODUCED_34,X_INTRODUCED_289):: defines_var(X_INTRODUCED_289);
constraint bool2int(X_INTRODUCED_35,X_INTRODUCED_290):: defines_var(X_INTRODUCED_290);
constraint bool2int(X_INTRODUCED_40,X_INTRODUCED_297):: defines_var(X_INTRODUCED_297);
constraint bool2int(X_INTRODUCED_41,X_INTRODUCED_298):: defines_var(X_INTRODUCED_298);
constraint bool2int(X_INTRODUCED_46,X_INTRODUCED_303):: defines_var(X_INTRODUCED_303);
constraint bool2int(X_INTRODUCED_47,X_INTRODUCED_304):: defines_var(X_INTRODUCED_304);
constraint bool2int(X_INTRODUCED_50,X_INTRODUCED_309):: defines_var(X_INTRODUCED_309);
constraint bool2int(X_INTRODUCED_51,X_INTRODUCED_310):: defines_var(X_INTRODUCED_310);
constraint bool2int(X_INTRODUCED_52,X_INTRODUCED_311):: defines_var(X_INTRODUCED_311);
constraint bool2int(X_INTRODUCED_53,X_INTRODUCED_312):: defines_var(X_INTRODUCED_312);
constraint bool2int(X_INTRODUCED_58,X_INTRODUCED_319):: defines_var(X_INTRODUCED_319);
constraint bool2int(X_INTRODUCED_59,X_INTRODUCED_320):: defines_var(X_INTRODUCED_320);
constraint bool2int(X_INTRODUCED_60,X_INTRODUCED_321):: defines_var(X_INTRODUCED_321);
constraint bool2int(X_INTRODUCED_61,X_INTRODUCED_322):: defines_var(X_INTRODUCED_322);
constraint bool2int(X_INTRODUCED_62,X_INTRODUCED_323):: defines_var(X_INTRODUCED_323);
constraint bool2int(X_INTRODUCED_63,X_INTRODUCED_324):: defines_var(X_INTRODUCED_324);
constraint bool2int(X_INTRODUCED_66,X_INTRODUCED_329):: defines_var(X_INTRODUCED_329);
constraint bool2int(X_INTRODUCED_67,X_INTRODUCED_330):: defines_var(X_INTRODUCED_330);
constraint bool2int(X_INTRODUCED_76,X_INTRODUCED_341):: defines_var(X_INTRODUCED_341);
constraint bool2int(X_INTRODUCED_77,X_INTRODUCED_342):: defines_var(X_INTRODUCED_342);
constraint bool2int(X_INTRODUCED_78,X_INTRODUCED_343):: defines_var(X_INTRODUCED_343);
constraint bool2int(X_INTRODUCED_79,X_INTRODUCED_344):: defines_var(X_INTRODUCED_344);
constraint bool2int(X_INTRODUCED_82,X_INTRODUCED_349):: defines_var(X_INTRODUCED_349);
constraint bool2int(X_INTRODUCED_83,X_INTRODUCED_350):: defines_var(X_INTRODUCED_350);
constraint bool2int(X_INTRODUCED_88,X_INTRODUCED_357):: defines_var(X_INTRODUCED_357);
constraint bool2int(X_INTRODUCED_89,X_INTRODUCED_358):: defines_var(X_INTRODUCED_358);
constraint bool2int(X_INTRODUCED_92,X_INTRODUCED_361):: defines_var(X_INTRODUCED_361);
constraint bool2int(X_INTRODUCED_93,X_INTRODUCED_362):: defines_var(X_INTRODUCED_362);
constraint bool2int(X_INTRODUCED_102,X_INTRODUCED_373):: defines_var(X_INTRODUCED_373);
constraint bool2int(X_INTRODUCED_103,X_INTRODUCED_374):: defines_var(X_INTRODUCED_374);
constraint bool2int(X_INTRODUCED_106,X_INTRODUCED_379):: defines_var(X_INTRODUCED_379);
constraint bool2int(X_INTRODUCED_107,X_INTRODUCED_380):: defines_var(X_INTRODUCED_380);
constraint bool2int(X_INTRODUCED_108,X_INTRODUCED_381):: defines_var(X_INTRODUCED_381);
constraint bool2int(X_INTRODUCED_109,X_INTRODUCED_382):: defines_var(X_INTRODUCED_382);
constraint bool2int(X_INTRODUCED_116,X_INTRODUCED_391):: defines_var(X_INTRODUCED_391);
constraint bool2int(X_INTRODUCED_117,X_INTRODUCED_392):: defines_var(X_INTRODUCED_392);
constraint bool2int(X_INTRODUCED_118,X_INTRODUCED_393):: defines_var(X_INTRODUCED_393);
constraint bool2int(X_INTRODUCED_119,X_INTRODUCED_394):: defines_var(X_INTRODUCED_394);
constraint bool2int(X_INTRODUCED_122,X_INTRODUCED_399):: defines_var(X_INTRODUCED_399);
constraint bool2int(X_INTRODUCED_123,X_INTRODUCED_400):: defines_var(X_INTRODUCED_400);
constraint bool2int(X_INTRODUCED_126,X_INTRODUCED_403):: defines_var(X_INTRODUCED_403);
constraint bool2int(X_INTRODUCED_127,X_INTRODUCED_404):: defines_var(X_INTRODUCED_404);
constraint bool2int(X_INTRODUCED_128,X_INTRODUCED_407):: defines_var(X_INTRODUCED_407);
constraint bool2int(X_INTRODUCED_129,X_INTRODUCED_408):: defines_var(X_INTRODUCED_408);
constraint bool2int(X_INTRODUCED_130,X_INTRODUCED_409):: defines_var(X_INTRODUCED_409);
constraint bool2int(X_INTRODUCED_131,X_INTRODUCED_410):: defines_var(X_INTRODUCED_410);
constraint bool2int(X_INTRODUCED_132,X_INTRODUCED_411):: defines_var(X_INTRODUCED_411);
constraint bool2int(X_INTRODUCED_133,X_INTRODUCED_412):: defines_var(X_INTRODUCED_412);
constraint int_lin_eq([-1,-1,-1,-1,-1],[X_INTRODUCED_277,X_INTRODUCED_287,X_INTRODUCED_297,X_INTRODUCED_407,X_INTRODUCED_492],-1):: defines_var(X_INTRODUCED_492);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1],[X_INTRODUCED_257,X_INTRODUCED_277,X_INTRODUCED_297,X_INTRODUCED_357,X_INTRODUCED_407,X_INTRODUCED_500],-1):: defines_var(X_INTRODUCED_500);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_258,X_INTRODUCED_278,X_INTRODUCED_504],-1):: defines_var(X_INTRODUCED_504);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_258,X_INTRODUCED_508],-1):: defines_var(X_INTRODUCED_508);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_277,X_INTRODUCED_297,X_INTRODUCED_527],-1):: defines_var(X_INTRODUCED_527);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_278,X_INTRODUCED_298,X_INTRODUCED_531],-1):: defines_var(X_INTRODUCED_531);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_277,X_INTRODUCED_535],-1):: defines_var(X_INTRODUCED_535);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_278,X_INTRODUCED_539],-1):: defines_var(X_INTRODUCED_539);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_258,X_INTRODUCED_278,X_INTRODUCED_288,X_INTRODUCED_298,X_INTRODUCED_358,X_INTRODUCED_408,X_INTRODUCED_543],-2):: defines_var(X_INTRODUCED_543);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_257,X_INTRODUCED_277,X_INTRODUCED_287,X_INTRODUCED_297,X_INTRODUCED_357,X_INTRODUCED_407,X_INTRODUCED_547],-2):: defines_var(X_INTRODUCED_547);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_248,X_INTRODUCED_279,X_INTRODUCED_289,X_INTRODUCED_309,X_INTRODUCED_349,X_INTRODUCED_379,X_INTRODUCED_399,X_INTRODUCED_409,X_INTRODUCED_551],-1):: defines_var(X_INTRODUCED_551);
constraint int_lin_eq([-1,-1,-1,-1,-1],[X_INTRODUCED_310,X_INTRODUCED_330,X_INTRODUCED_350,X_INTRODUCED_380,X_INTRODUCED_555],-1):: defines_var(X_INTRODUCED_555);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1],[X_INTRODUCED_259,X_INTRODUCED_279,X_INTRODUCED_319,X_INTRODUCED_399,X_INTRODUCED_409,X_INTRODUCED_559],-1):: defines_var(X_INTRODUCED_559);
constraint int_lin_eq([-1,-1,-1,-1,-1],[X_INTRODUCED_260,X_INTRODUCED_280,X_INTRODUCED_310,X_INTRODUCED_320,X_INTRODUCED_563],-1):: defines_var(X_INTRODUCED_563);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_260,X_INTRODUCED_320,X_INTRODUCED_567],-1):: defines_var(X_INTRODUCED_567);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_380,X_INTRODUCED_570],-1):: defines_var(X_INTRODUCED_570);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_279,X_INTRODUCED_379,X_INTRODUCED_586],-1):: defines_var(X_INTRODUCED_586);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_280,X_INTRODUCED_380,X_INTRODUCED_590],-1):: defines_var(X_INTRODUCED_590);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_279,X_INTRODUCED_379,X_INTRODUCED_594],-1):: defines_var(X_INTRODUCED_594);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_280,X_INTRODUCED_380,X_INTRODUCED_598],-1):: defines_var(X_INTRODUCED_598);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_249,X_INTRODUCED_260,X_INTRODUCED_280,X_INTRODUCED_290,X_INTRODUCED_310,X_INTRODUCED_320,X_INTRODUCED_330,X_INTRODUCED_350,X_INTRODUCED_380,X_INTRODUCED_400,X_INTRODUCED_410,X_INTRODUCED_602],-2):: defines_var(X_INTRODUCED_602);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_248,X_INTRODUCED_259,X_INTRODUCED_279,X_INTRODUCED_289,X_INTRODUCED_309,X_INTRODUCED_319,X_INTRODUCED_329,X_INTRODUCED_349,X_INTRODUCED_379,X_INTRODUCED_399,X_INTRODUCED_409,X_INTRODUCED_606],-2):: defines_var(X_INTRODUCED_606);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_271,X_INTRODUCED_281,X_INTRODUCED_311,X_INTRODUCED_381,X_INTRODUCED_391,X_INTRODUCED_411,X_INTRODUCED_610],-1):: defines_var(X_INTRODUCED_610);
constraint int_lin_eq([-1,-1,-1,-1],[X_INTRODUCED_312,X_INTRODUCED_342,X_INTRODUCED_382,X_INTRODUCED_614],-1):: defines_var(X_INTRODUCED_614);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_261,X_INTRODUCED_281,X_INTRODUCED_321,X_INTRODUCED_341,X_INTRODUCED_361,X_INTRODUCED_411,X_INTRODUCED_618],-1):: defines_var(X_INTRODUCED_618);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1],[X_INTRODUCED_262,X_INTRODUCED_282,X_INTRODUCED_312,X_INTRODUCED_322,X_INTRODUCED_392,X_INTRODUCED_622],-1):: defines_var(X_INTRODUCED_622);
constraint int_lin_eq([-1,-1,-1,-1],[X_INTRODUCED_262,X_INTRODUCED_322,X_INTRODUCED_342,X_INTRODUCED_626],-1):: defines_var(X_INTRODUCED_626);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_382,X_INTRODUCED_629],-1):: defines_var(X_INTRODUCED_629);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_281,X_INTRODUCED_381,X_INTRODUCED_645],-1):: defines_var(X_INTRODUCED_645);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_282,X_INTRODUCED_382,X_INTRODUCED_649],-1):: defines_var(X_INTRODUCED_649);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_281,X_INTRODUCED_381,X_INTRODUCED_653],-1):: defines_var(X_INTRODUCED_653);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_282,X_INTRODUCED_382,X_INTRODUCED_657],-1):: defines_var(X_INTRODUCED_657);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_262,X_INTRODUCED_272,X_INTRODUCED_282,X_INTRODUCED_312,X_INTRODUCED_322,X_INTRODUCED_342,X_INTRODUCED_362,X_INTRODUCED_382,X_INTRODUCED_392,X_INTRODUCED_412,X_INTRODUCED_661],-2):: defines_var(X_INTRODUCED_661);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_261,X_INTRODUCED_271,X_INTRODUCED_281,X_INTRODUCED_311,X_INTRODUCED_321,X_INTRODUCED_341,X_INTRODUCED_361,X_INTRODUCED_381,X_INTRODUCED_391,X_INTRODUCED_411,X_INTRODUCED_665],-2):: defines_var(X_INTRODUCED_665);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1],[X_INTRODUCED_252,X_INTRODUCED_273,X_INTRODUCED_303,X_INTRODUCED_393,X_INTRODUCED_403,X_INTRODUCED_669],-1):: defines_var(X_INTRODUCED_669);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_344,X_INTRODUCED_673],-1):: defines_var(X_INTRODUCED_673);
constraint int_lin_eq([-1,-1,-1,-1,-1],[X_INTRODUCED_303,X_INTRODUCED_323,X_INTRODUCED_343,X_INTRODUCED_403,X_INTRODUCED_677],-1):: defines_var(X_INTRODUCED_677);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_324,X_INTRODUCED_394,X_INTRODUCED_681],-1):: defines_var(X_INTRODUCED_681);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_324,X_INTRODUCED_344,X_INTRODUCED_685],-1):: defines_var(X_INTRODUCED_685);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_373,X_INTRODUCED_691],-1):: defines_var(X_INTRODUCED_691);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_374,X_INTRODUCED_694],-1):: defines_var(X_INTRODUCED_694);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_373,X_INTRODUCED_697],-1):: defines_var(X_INTRODUCED_697);
constraint int_lin_eq([-1,-1],[X_INTRODUCED_374,X_INTRODUCED_700],-1):: defines_var(X_INTRODUCED_700);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_303,X_INTRODUCED_373,X_INTRODUCED_704],-1):: defines_var(X_INTRODUCED_704);
constraint int_lin_eq([-1,-1,-1],[X_INTRODUCED_304,X_INTRODUCED_374,X_INTRODUCED_708],-1):: defines_var(X_INTRODUCED_708);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_253,X_INTRODUCED_274,X_INTRODUCED_304,X_INTRODUCED_324,X_INTRODUCED_344,X_INTRODUCED_374,X_INTRODUCED_394,X_INTRODUCED_404,X_INTRODUCED_720],-2):: defines_var(X_INTRODUCED_720);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_252,X_INTRODUCED_273,X_INTRODUCED_303,X_INTRODUCED_323,X_INTRODUCED_343,X_INTRODUCED_373,X_INTRODUCED_393,X_INTRODUCED_403,X_INTRODUCED_724],-2):: defines_var(X_INTRODUCED_724);
solve :: bool_search(X_INTRODUCED_798,occurrence,indomain_random,complete) minimize objective;

View File

@@ -1,777 +0,0 @@
predicate maximum_int(var int: m,array [int] of var int: x);
predicate minimum_int(var int: m,array [int] of var int: x);
array [1..8] of int: X_INTRODUCED_313 = [1,1,1,1,1,1,1,1];
array [1..4] of int: X_INTRODUCED_538 = [-1,-1,-1,-1];
array [1..14] of int: X_INTRODUCED_633 = [1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];
array [1..7] of int: X_INTRODUCED_657 = [1,-1,-1,-1,-1,-1,-1];
array [1..11] of int: X_INTRODUCED_675 = [1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];
array [1..8] of int: X_INTRODUCED_699 = [1,-1,-1,-1,-1,-1,-1,-1];
array [1..6] of int: X_INTRODUCED_716 = [1,-1,-1,-1,-1,-1];
array [1..5] of int: X_INTRODUCED_741 = [1,-1,-1,-1,-1];
array [1..3] of int: X_INTRODUCED_782 = [1,-1,-1];
array [1..9] of int: X_INTRODUCED_815 = [1,-1,-1,-1,-1,-1,-1,-1,-1];
array [1..29] of int: X_INTRODUCED_909 = [1,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,1,1,1,1,1,1,1,1];
var bool: X_INTRODUCED_2;
var bool: X_INTRODUCED_3;
var bool: X_INTRODUCED_6;
var bool: X_INTRODUCED_7;
var bool: X_INTRODUCED_8;
var bool: X_INTRODUCED_9;
var bool: X_INTRODUCED_10;
var bool: X_INTRODUCED_11;
var bool: X_INTRODUCED_12;
var bool: X_INTRODUCED_13;
var bool: X_INTRODUCED_20;
var bool: X_INTRODUCED_21;
var bool: X_INTRODUCED_22;
var bool: X_INTRODUCED_23;
var bool: X_INTRODUCED_24;
var bool: X_INTRODUCED_25;
var bool: X_INTRODUCED_26;
var bool: X_INTRODUCED_27;
var bool: X_INTRODUCED_28;
var bool: X_INTRODUCED_29;
var bool: X_INTRODUCED_32;
var bool: X_INTRODUCED_33;
var bool: X_INTRODUCED_34;
var bool: X_INTRODUCED_35;
var bool: X_INTRODUCED_40;
var bool: X_INTRODUCED_41;
var bool: X_INTRODUCED_46;
var bool: X_INTRODUCED_47;
var bool: X_INTRODUCED_50;
var bool: X_INTRODUCED_51;
var bool: X_INTRODUCED_52;
var bool: X_INTRODUCED_53;
var bool: X_INTRODUCED_58;
var bool: X_INTRODUCED_59;
var bool: X_INTRODUCED_60;
var bool: X_INTRODUCED_61;
var bool: X_INTRODUCED_62;
var bool: X_INTRODUCED_63;
var bool: X_INTRODUCED_66;
var bool: X_INTRODUCED_67;
var bool: X_INTRODUCED_76;
var bool: X_INTRODUCED_77;
var bool: X_INTRODUCED_78;
var bool: X_INTRODUCED_79;
var bool: X_INTRODUCED_82;
var bool: X_INTRODUCED_83;
var bool: X_INTRODUCED_88;
var bool: X_INTRODUCED_89;
var bool: X_INTRODUCED_92;
var bool: X_INTRODUCED_93;
var bool: X_INTRODUCED_102;
var bool: X_INTRODUCED_103;
var bool: X_INTRODUCED_106;
var bool: X_INTRODUCED_107;
var bool: X_INTRODUCED_108;
var bool: X_INTRODUCED_109;
var bool: X_INTRODUCED_116;
var bool: X_INTRODUCED_117;
var bool: X_INTRODUCED_118;
var bool: X_INTRODUCED_119;
var bool: X_INTRODUCED_122;
var bool: X_INTRODUCED_123;
var bool: X_INTRODUCED_126;
var bool: X_INTRODUCED_127;
var bool: X_INTRODUCED_128;
var bool: X_INTRODUCED_129;
var bool: X_INTRODUCED_130;
var bool: X_INTRODUCED_131;
var bool: X_INTRODUCED_132;
var bool: X_INTRODUCED_133;
var bool: X_INTRODUCED_138;
var bool: X_INTRODUCED_139;
var bool: X_INTRODUCED_142;
var bool: X_INTRODUCED_143;
var bool: X_INTRODUCED_148;
var bool: X_INTRODUCED_149;
var bool: X_INTRODUCED_152;
var bool: X_INTRODUCED_153;
var bool: X_INTRODUCED_156;
var bool: X_INTRODUCED_157;
var bool: X_INTRODUCED_162;
var bool: X_INTRODUCED_163;
var bool: X_INTRODUCED_166;
var bool: X_INTRODUCED_167;
var bool: X_INTRODUCED_172;
var bool: X_INTRODUCED_173;
var bool: X_INTRODUCED_178;
var bool: X_INTRODUCED_179;
var bool: X_INTRODUCED_182;
var bool: X_INTRODUCED_183;
var 0..13: X_INTRODUCED_184:: is_defined_var;
var 0..13: X_INTRODUCED_185:: is_defined_var;
var 0..13: X_INTRODUCED_186:: is_defined_var;
var 0..13: X_INTRODUCED_187:: is_defined_var;
var 0..13: X_INTRODUCED_188:: is_defined_var;
var 0..13: X_INTRODUCED_189:: is_defined_var;
var 0..13: X_INTRODUCED_190:: is_defined_var;
var 0..13: X_INTRODUCED_191:: is_defined_var;
var 0..6: X_INTRODUCED_192:: is_defined_var;
var 0..6: X_INTRODUCED_193:: is_defined_var;
var 0..6: X_INTRODUCED_194:: is_defined_var;
var 0..6: X_INTRODUCED_195:: is_defined_var;
var 0..6: X_INTRODUCED_196:: is_defined_var;
var 0..6: X_INTRODUCED_197:: is_defined_var;
var 0..6: X_INTRODUCED_198:: is_defined_var;
var 0..6: X_INTRODUCED_199:: is_defined_var;
var 0..10: X_INTRODUCED_200:: is_defined_var;
var 0..10: X_INTRODUCED_201:: is_defined_var;
var 0..10: X_INTRODUCED_202:: is_defined_var;
var 0..10: X_INTRODUCED_203:: is_defined_var;
var 0..10: X_INTRODUCED_204:: is_defined_var;
var 0..10: X_INTRODUCED_205:: is_defined_var;
var 0..10: X_INTRODUCED_206:: is_defined_var;
var 0..10: X_INTRODUCED_207:: is_defined_var;
var 0..7: X_INTRODUCED_208:: is_defined_var;
var 0..7: X_INTRODUCED_209:: is_defined_var;
var 0..7: X_INTRODUCED_210:: is_defined_var;
var 0..7: X_INTRODUCED_211:: is_defined_var;
var 0..7: X_INTRODUCED_212:: is_defined_var;
var 0..7: X_INTRODUCED_213:: is_defined_var;
var 0..7: X_INTRODUCED_214:: is_defined_var;
var 0..7: X_INTRODUCED_215:: is_defined_var;
var 0..5: X_INTRODUCED_216:: is_defined_var;
var 0..5: X_INTRODUCED_217:: is_defined_var;
var 0..5: X_INTRODUCED_218:: is_defined_var;
var 0..5: X_INTRODUCED_219:: is_defined_var;
var 0..5: X_INTRODUCED_220:: is_defined_var;
var 0..5: X_INTRODUCED_221:: is_defined_var;
var 0..5: X_INTRODUCED_222:: is_defined_var;
var 0..5: X_INTRODUCED_223:: is_defined_var;
var 0..4: X_INTRODUCED_232:: is_defined_var;
var 0..4: X_INTRODUCED_233:: is_defined_var;
var 0..4: X_INTRODUCED_234:: is_defined_var;
var 0..4: X_INTRODUCED_235:: is_defined_var;
var 0..4: X_INTRODUCED_236:: is_defined_var;
var 0..4: X_INTRODUCED_237:: is_defined_var;
var 0..4: X_INTRODUCED_238:: is_defined_var;
var 0..4: X_INTRODUCED_239:: is_defined_var;
var 0..4: X_INTRODUCED_240:: is_defined_var;
var 0..4: X_INTRODUCED_241:: is_defined_var;
var 0..4: X_INTRODUCED_242:: is_defined_var;
var 0..4: X_INTRODUCED_243:: is_defined_var;
var 0..4: X_INTRODUCED_244:: is_defined_var;
var 0..4: X_INTRODUCED_245:: is_defined_var;
var 0..4: X_INTRODUCED_246:: is_defined_var;
var 0..4: X_INTRODUCED_247:: is_defined_var;
var 0..4: X_INTRODUCED_248:: is_defined_var;
var 0..4: X_INTRODUCED_249:: is_defined_var;
var 0..4: X_INTRODUCED_250:: is_defined_var;
var 0..4: X_INTRODUCED_251:: is_defined_var;
var 0..4: X_INTRODUCED_252:: is_defined_var;
var 0..4: X_INTRODUCED_253:: is_defined_var;
var 0..4: X_INTRODUCED_254:: is_defined_var;
var 0..4: X_INTRODUCED_255:: is_defined_var;
var 0..2: X_INTRODUCED_256:: is_defined_var;
var 0..2: X_INTRODUCED_257:: is_defined_var;
var 0..2: X_INTRODUCED_258:: is_defined_var;
var 0..2: X_INTRODUCED_259:: is_defined_var;
var 0..2: X_INTRODUCED_260:: is_defined_var;
var 0..2: X_INTRODUCED_261:: is_defined_var;
var 0..2: X_INTRODUCED_262:: is_defined_var;
var 0..2: X_INTRODUCED_263:: is_defined_var;
var int: X_INTRODUCED_264;
var int: X_INTRODUCED_265;
var int: X_INTRODUCED_266;
var int: X_INTRODUCED_267;
var int: X_INTRODUCED_268;
var int: X_INTRODUCED_269;
var int: X_INTRODUCED_270;
var int: X_INTRODUCED_271;
var int: X_INTRODUCED_272;
var int: X_INTRODUCED_273;
var int: X_INTRODUCED_274;
var int: X_INTRODUCED_275;
var int: X_INTRODUCED_276;
var int: X_INTRODUCED_277;
var int: X_INTRODUCED_278;
var int: X_INTRODUCED_279;
var int: X_INTRODUCED_280;
var int: X_INTRODUCED_281;
var int: X_INTRODUCED_282;
var int: X_INTRODUCED_283;
var 0..52: X_INTRODUCED_284:: is_defined_var;
var 0..24: X_INTRODUCED_285:: is_defined_var;
var 0..40: X_INTRODUCED_286:: is_defined_var;
var 0..28: X_INTRODUCED_287:: is_defined_var;
var 0..20: X_INTRODUCED_288:: is_defined_var;
var int: X_INTRODUCED_289:: is_defined_var;
var 0..32: X_INTRODUCED_290:: is_defined_var;
var 0..32: X_INTRODUCED_291:: is_defined_var;
var 0..32: X_INTRODUCED_292:: is_defined_var;
var 0..16: X_INTRODUCED_293:: is_defined_var;
var int: objective:: output_var:: is_defined_var;
var 3..3: target:: output_var;
var 0..1: X_INTRODUCED_306 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_307 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_310 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_311 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_315 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_316 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_317 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_318 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_319 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_320 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_329 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_330 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_331 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_332 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_335 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_336 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_337 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_338 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_339 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_340 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_345 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_346 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_347 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_348 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_355 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_356 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_361 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_362 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_367 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_368 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_369 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_370 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_377 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_378 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_379 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_380 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_381 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_382 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_387 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_388 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_399 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_400 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_401 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_402 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_407 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_408 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_415 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_416 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_419 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_420 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_431 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_432 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_437 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_438 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_439 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_440 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_449 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_450 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_451 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_452 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_457 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_458 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_461 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_462 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_465 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_466 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_467 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_468 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_469 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_470 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_477 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_478 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_481 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_482 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_489 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_490 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_495 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_496 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_499 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_500 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_507 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_508 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_511 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_512 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_519 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_520 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_527 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_528 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_531 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_532 ::var_is_introduced :: is_defined_var;
var -20..3: X_INTRODUCED_823 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_824 ::var_is_introduced ;
var -20..3: X_INTRODUCED_828 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_829 ::var_is_introduced ;
var -20..3: X_INTRODUCED_833 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_834 ::var_is_introduced ;
var -20..3: X_INTRODUCED_838 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_839 ::var_is_introduced ;
var -20..3: X_INTRODUCED_843 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_844 ::var_is_introduced ;
var -20..3: X_INTRODUCED_848 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_849 ::var_is_introduced ;
var -20..3: X_INTRODUCED_853 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_854 ::var_is_introduced ;
var -20..3: X_INTRODUCED_858 ::var_is_introduced :: is_defined_var;
var 0..3: X_INTRODUCED_859 ::var_is_introduced ;
var 0..300: X_INTRODUCED_861 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_863 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_864 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_866 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_867 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_869 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_870 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_872 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_873 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_875 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_876 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_878 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_879 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_881 ::var_is_introduced :: is_defined_var;
var 0..300: X_INTRODUCED_882 ::var_is_introduced :: is_defined_var;
var 0..100: X_INTRODUCED_884 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_304 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_305 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_308 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_309 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_321 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_322 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_325 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_326 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_327 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_328 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_341 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_342 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_349 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_350 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_351 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_352 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_357 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_358 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_359 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_360 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_365 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_366 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_371 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_372 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_375 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_376 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_385 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_386 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_389 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_390 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_391 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_392 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_395 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_396 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_397 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_398 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_405 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_406 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_409 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_410 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_411 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_412 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_417 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_418 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_421 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_422 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_425 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_426 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_427 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_428 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_429 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_430 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_435 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_436 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_441 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_442 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_445 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_446 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_447 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_448 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_455 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_456 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_459 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_460 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_471 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_472 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_475 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_476 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_479 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_480 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_485 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_486 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_487 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_488 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_491 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_492 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_497 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_498 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_501 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_502 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_505 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_506 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_509 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_510 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_515 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_516 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_517 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_518 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_521 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_522 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_525 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_526 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_529 ::var_is_introduced = 0;
var 0..1: X_INTRODUCED_530 ::var_is_introduced = 0;
array [1..184] of var bool: Assignment:: output_array([1..23,1..4,1..2]) = [false,false,X_INTRODUCED_2,X_INTRODUCED_3,false,false,X_INTRODUCED_6,X_INTRODUCED_7,X_INTRODUCED_8,X_INTRODUCED_9,X_INTRODUCED_10,X_INTRODUCED_11,X_INTRODUCED_12,X_INTRODUCED_13,false,false,false,false,false,false,X_INTRODUCED_20,X_INTRODUCED_21,X_INTRODUCED_22,X_INTRODUCED_23,X_INTRODUCED_24,X_INTRODUCED_25,X_INTRODUCED_26,X_INTRODUCED_27,X_INTRODUCED_28,X_INTRODUCED_29,false,false,X_INTRODUCED_32,X_INTRODUCED_33,X_INTRODUCED_34,X_INTRODUCED_35,false,false,false,false,X_INTRODUCED_40,X_INTRODUCED_41,false,false,false,false,X_INTRODUCED_46,X_INTRODUCED_47,false,false,X_INTRODUCED_50,X_INTRODUCED_51,X_INTRODUCED_52,X_INTRODUCED_53,false,false,false,false,X_INTRODUCED_58,X_INTRODUCED_59,X_INTRODUCED_60,X_INTRODUCED_61,X_INTRODUCED_62,X_INTRODUCED_63,false,false,X_INTRODUCED_66,X_INTRODUCED_67,false,false,false,false,false,false,false,false,X_INTRODUCED_76,X_INTRODUCED_77,X_INTRODUCED_78,X_INTRODUCED_79,false,false,X_INTRODUCED_82,X_INTRODUCED_83,false,false,false,false,X_INTRODUCED_88,X_INTRODUCED_89,false,false,X_INTRODUCED_92,X_INTRODUCED_93,false,false,false,false,false,false,false,false,X_INTRODUCED_102,X_INTRODUCED_103,false,false,X_INTRODUCED_106,X_INTRODUCED_107,X_INTRODUCED_108,X_INTRODUCED_109,false,false,false,false,false,false,X_INTRODUCED_116,X_INTRODUCED_117,X_INTRODUCED_118,X_INTRODUCED_119,false,false,X_INTRODUCED_122,X_INTRODUCED_123,false,false,X_INTRODUCED_126,X_INTRODUCED_127,X_INTRODUCED_128,X_INTRODUCED_129,X_INTRODUCED_130,X_INTRODUCED_131,X_INTRODUCED_132,X_INTRODUCED_133,false,false,false,false,X_INTRODUCED_138,X_INTRODUCED_139,false,false,X_INTRODUCED_142,X_INTRODUCED_143,false,false,false,false,X_INTRODUCED_148,X_INTRODUCED_149,false,false,X_INTRODUCED_152,X_INTRODUCED_153,false,false,X_INTRODUCED_156,X_INTRODUCED_157,false,false,false,false,X_INTRODUCED_162,X_INTRODUCED_163,false,false,X_INTRODUCED_166,X_INTRODUCED_167,false,false,false,false,X_INTRODUCED_172,X_INTRODUCED_173,false,false,false,false,X_INTRODUCED_178,X_INTRODUCED_179,false,false,X_INTRODUCED_182,X_INTRODUCED_183];
array [1..80] of var int: Coverage:: output_array([1..10,1..4,1..2]) = [X_INTRODUCED_184,X_INTRODUCED_185,X_INTRODUCED_186,X_INTRODUCED_187,X_INTRODUCED_188,X_INTRODUCED_189,X_INTRODUCED_190,X_INTRODUCED_191,X_INTRODUCED_192,X_INTRODUCED_193,X_INTRODUCED_194,X_INTRODUCED_195,X_INTRODUCED_196,X_INTRODUCED_197,X_INTRODUCED_198,X_INTRODUCED_199,X_INTRODUCED_200,X_INTRODUCED_201,X_INTRODUCED_202,X_INTRODUCED_203,X_INTRODUCED_204,X_INTRODUCED_205,X_INTRODUCED_206,X_INTRODUCED_207,X_INTRODUCED_208,X_INTRODUCED_209,X_INTRODUCED_210,X_INTRODUCED_211,X_INTRODUCED_212,X_INTRODUCED_213,X_INTRODUCED_214,X_INTRODUCED_215,X_INTRODUCED_216,X_INTRODUCED_217,X_INTRODUCED_218,X_INTRODUCED_219,X_INTRODUCED_220,X_INTRODUCED_221,X_INTRODUCED_222,X_INTRODUCED_223,0,0,X_INTRODUCED_437,X_INTRODUCED_438,X_INTRODUCED_439,X_INTRODUCED_440,0,0,X_INTRODUCED_232,X_INTRODUCED_233,X_INTRODUCED_234,X_INTRODUCED_235,X_INTRODUCED_236,X_INTRODUCED_237,X_INTRODUCED_238,X_INTRODUCED_239,X_INTRODUCED_240,X_INTRODUCED_241,X_INTRODUCED_242,X_INTRODUCED_243,X_INTRODUCED_244,X_INTRODUCED_245,X_INTRODUCED_246,X_INTRODUCED_247,X_INTRODUCED_248,X_INTRODUCED_249,X_INTRODUCED_250,X_INTRODUCED_251,X_INTRODUCED_252,X_INTRODUCED_253,X_INTRODUCED_254,X_INTRODUCED_255,X_INTRODUCED_256,X_INTRODUCED_257,X_INTRODUCED_258,X_INTRODUCED_259,X_INTRODUCED_260,X_INTRODUCED_261,X_INTRODUCED_262,X_INTRODUCED_263];
array [1..10] of var int: MaxTable:: output_array([1..10]) = [X_INTRODUCED_264,X_INTRODUCED_265,X_INTRODUCED_266,X_INTRODUCED_267,X_INTRODUCED_268,X_INTRODUCED_269,X_INTRODUCED_270,X_INTRODUCED_271,X_INTRODUCED_272,X_INTRODUCED_273];
array [1..10] of var int: MinTable:: output_array([1..10]) = [X_INTRODUCED_274,X_INTRODUCED_275,X_INTRODUCED_276,X_INTRODUCED_277,X_INTRODUCED_278,X_INTRODUCED_279,X_INTRODUCED_280,X_INTRODUCED_281,X_INTRODUCED_282,X_INTRODUCED_283];
array [1..10] of var int: totalTable:: output_array([1..10]) = [X_INTRODUCED_284,X_INTRODUCED_285,X_INTRODUCED_286,X_INTRODUCED_287,X_INTRODUCED_288,X_INTRODUCED_289,X_INTRODUCED_290,X_INTRODUCED_291,X_INTRODUCED_292,X_INTRODUCED_293];
array [1..8] of var int: seshSlack:: output_array([1..4,1..2]) = [X_INTRODUCED_824,X_INTRODUCED_829,X_INTRODUCED_834,X_INTRODUCED_839,X_INTRODUCED_844,X_INTRODUCED_849,X_INTRODUCED_854,X_INTRODUCED_859];
array [1..14] of var int: X_INTRODUCED_632 ::var_is_introduced = [X_INTRODUCED_184,X_INTRODUCED_304,X_INTRODUCED_325,X_INTRODUCED_335,X_INTRODUCED_345,X_INTRODUCED_355,X_INTRODUCED_365,X_INTRODUCED_405,X_INTRODUCED_435,X_INTRODUCED_445,X_INTRODUCED_455,X_INTRODUCED_465,X_INTRODUCED_515,X_INTRODUCED_525];
array [1..14] of var int: X_INTRODUCED_636 ::var_is_introduced = [X_INTRODUCED_185,X_INTRODUCED_305,X_INTRODUCED_326,X_INTRODUCED_336,X_INTRODUCED_346,X_INTRODUCED_356,X_INTRODUCED_366,X_INTRODUCED_406,X_INTRODUCED_436,X_INTRODUCED_446,X_INTRODUCED_456,X_INTRODUCED_466,X_INTRODUCED_516,X_INTRODUCED_526];
array [1..14] of var int: X_INTRODUCED_639 ::var_is_introduced = [X_INTRODUCED_186,X_INTRODUCED_306,X_INTRODUCED_327,X_INTRODUCED_337,X_INTRODUCED_347,X_INTRODUCED_357,X_INTRODUCED_367,X_INTRODUCED_407,X_INTRODUCED_437,X_INTRODUCED_447,X_INTRODUCED_457,X_INTRODUCED_467,X_INTRODUCED_517,X_INTRODUCED_527];
array [1..14] of var int: X_INTRODUCED_642 ::var_is_introduced = [X_INTRODUCED_187,X_INTRODUCED_307,X_INTRODUCED_328,X_INTRODUCED_338,X_INTRODUCED_348,X_INTRODUCED_358,X_INTRODUCED_368,X_INTRODUCED_408,X_INTRODUCED_438,X_INTRODUCED_448,X_INTRODUCED_458,X_INTRODUCED_468,X_INTRODUCED_518,X_INTRODUCED_528];
array [1..14] of var int: X_INTRODUCED_645 ::var_is_introduced = [X_INTRODUCED_188,X_INTRODUCED_308,X_INTRODUCED_329,X_INTRODUCED_339,X_INTRODUCED_349,X_INTRODUCED_359,X_INTRODUCED_369,X_INTRODUCED_409,X_INTRODUCED_439,X_INTRODUCED_449,X_INTRODUCED_459,X_INTRODUCED_469,X_INTRODUCED_519,X_INTRODUCED_529];
array [1..14] of var int: X_INTRODUCED_648 ::var_is_introduced = [X_INTRODUCED_189,X_INTRODUCED_309,X_INTRODUCED_330,X_INTRODUCED_340,X_INTRODUCED_350,X_INTRODUCED_360,X_INTRODUCED_370,X_INTRODUCED_410,X_INTRODUCED_440,X_INTRODUCED_450,X_INTRODUCED_460,X_INTRODUCED_470,X_INTRODUCED_520,X_INTRODUCED_530];
array [1..14] of var int: X_INTRODUCED_651 ::var_is_introduced = [X_INTRODUCED_190,X_INTRODUCED_310,X_INTRODUCED_331,X_INTRODUCED_341,X_INTRODUCED_351,X_INTRODUCED_361,X_INTRODUCED_371,X_INTRODUCED_411,X_INTRODUCED_441,X_INTRODUCED_451,X_INTRODUCED_461,X_INTRODUCED_471,X_INTRODUCED_521,X_INTRODUCED_531];
array [1..14] of var int: X_INTRODUCED_654 ::var_is_introduced = [X_INTRODUCED_191,X_INTRODUCED_311,X_INTRODUCED_332,X_INTRODUCED_342,X_INTRODUCED_352,X_INTRODUCED_362,X_INTRODUCED_372,X_INTRODUCED_412,X_INTRODUCED_442,X_INTRODUCED_452,X_INTRODUCED_462,X_INTRODUCED_472,X_INTRODUCED_522,X_INTRODUCED_532];
array [1..11] of var int: X_INTRODUCED_674 ::var_is_introduced = [X_INTRODUCED_200,X_INTRODUCED_315,X_INTRODUCED_335,X_INTRODUCED_355,X_INTRODUCED_375,X_INTRODUCED_395,X_INTRODUCED_415,X_INTRODUCED_455,X_INTRODUCED_465,X_INTRODUCED_475,X_INTRODUCED_525];
array [1..11] of var int: X_INTRODUCED_678 ::var_is_introduced = [X_INTRODUCED_201,X_INTRODUCED_316,X_INTRODUCED_336,X_INTRODUCED_356,X_INTRODUCED_376,X_INTRODUCED_396,X_INTRODUCED_416,X_INTRODUCED_456,X_INTRODUCED_466,X_INTRODUCED_476,X_INTRODUCED_526];
array [1..11] of var int: X_INTRODUCED_681 ::var_is_introduced = [X_INTRODUCED_202,X_INTRODUCED_317,X_INTRODUCED_337,X_INTRODUCED_357,X_INTRODUCED_377,X_INTRODUCED_397,X_INTRODUCED_417,X_INTRODUCED_457,X_INTRODUCED_467,X_INTRODUCED_477,X_INTRODUCED_527];
array [1..11] of var int: X_INTRODUCED_684 ::var_is_introduced = [X_INTRODUCED_203,X_INTRODUCED_318,X_INTRODUCED_338,X_INTRODUCED_358,X_INTRODUCED_378,X_INTRODUCED_398,X_INTRODUCED_418,X_INTRODUCED_458,X_INTRODUCED_468,X_INTRODUCED_478,X_INTRODUCED_528];
array [1..11] of var int: X_INTRODUCED_687 ::var_is_introduced = [X_INTRODUCED_204,X_INTRODUCED_319,X_INTRODUCED_339,X_INTRODUCED_359,X_INTRODUCED_379,X_INTRODUCED_399,X_INTRODUCED_419,X_INTRODUCED_459,X_INTRODUCED_469,X_INTRODUCED_479,X_INTRODUCED_529];
array [1..11] of var int: X_INTRODUCED_690 ::var_is_introduced = [X_INTRODUCED_205,X_INTRODUCED_320,X_INTRODUCED_340,X_INTRODUCED_360,X_INTRODUCED_380,X_INTRODUCED_400,X_INTRODUCED_420,X_INTRODUCED_460,X_INTRODUCED_470,X_INTRODUCED_480,X_INTRODUCED_530];
array [1..11] of var int: X_INTRODUCED_693 ::var_is_introduced = [X_INTRODUCED_206,X_INTRODUCED_321,X_INTRODUCED_341,X_INTRODUCED_361,X_INTRODUCED_381,X_INTRODUCED_401,X_INTRODUCED_421,X_INTRODUCED_461,X_INTRODUCED_471,X_INTRODUCED_481,X_INTRODUCED_531];
array [1..11] of var int: X_INTRODUCED_696 ::var_is_introduced = [X_INTRODUCED_207,X_INTRODUCED_322,X_INTRODUCED_342,X_INTRODUCED_362,X_INTRODUCED_382,X_INTRODUCED_402,X_INTRODUCED_422,X_INTRODUCED_462,X_INTRODUCED_472,X_INTRODUCED_482,X_INTRODUCED_532];
array [1..4] of var int: X_INTRODUCED_798 ::var_is_introduced = [X_INTRODUCED_184,X_INTRODUCED_186,X_INTRODUCED_188,X_INTRODUCED_190];
array [1..4] of var int: X_INTRODUCED_799 ::var_is_introduced = [X_INTRODUCED_193,X_INTRODUCED_195,X_INTRODUCED_197,X_INTRODUCED_199];
array [1..4] of var int: X_INTRODUCED_800 ::var_is_introduced = [X_INTRODUCED_200,X_INTRODUCED_202,X_INTRODUCED_204,X_INTRODUCED_206];
array [1..4] of var int: X_INTRODUCED_801 ::var_is_introduced = [X_INTRODUCED_209,X_INTRODUCED_211,X_INTRODUCED_213,X_INTRODUCED_215];
array [1..4] of var int: X_INTRODUCED_802 ::var_is_introduced = [X_INTRODUCED_217,X_INTRODUCED_219,X_INTRODUCED_221,X_INTRODUCED_223];
array [1..4] of var int: X_INTRODUCED_803 ::var_is_introduced = [0,X_INTRODUCED_438,X_INTRODUCED_440,0];
array [1..8] of var int: X_INTRODUCED_804 ::var_is_introduced = [X_INTRODUCED_232,X_INTRODUCED_233,X_INTRODUCED_234,X_INTRODUCED_235,X_INTRODUCED_236,X_INTRODUCED_237,X_INTRODUCED_238,X_INTRODUCED_239];
array [1..8] of var int: X_INTRODUCED_805 ::var_is_introduced = [X_INTRODUCED_240,X_INTRODUCED_241,X_INTRODUCED_242,X_INTRODUCED_243,X_INTRODUCED_244,X_INTRODUCED_245,X_INTRODUCED_246,X_INTRODUCED_247];
array [1..8] of var int: X_INTRODUCED_806 ::var_is_introduced = [X_INTRODUCED_248,X_INTRODUCED_249,X_INTRODUCED_250,X_INTRODUCED_251,X_INTRODUCED_252,X_INTRODUCED_253,X_INTRODUCED_254,X_INTRODUCED_255];
array [1..8] of var int: X_INTRODUCED_807 ::var_is_introduced = [X_INTRODUCED_256,X_INTRODUCED_257,X_INTRODUCED_258,X_INTRODUCED_259,X_INTRODUCED_260,X_INTRODUCED_261,X_INTRODUCED_262,X_INTRODUCED_263];
array [1..29] of var int: X_INTRODUCED_908 ::var_is_introduced = [objective,X_INTRODUCED_284,X_INTRODUCED_274,X_INTRODUCED_285,X_INTRODUCED_275,X_INTRODUCED_286,X_INTRODUCED_276,X_INTRODUCED_287,X_INTRODUCED_277,X_INTRODUCED_288,X_INTRODUCED_278,X_INTRODUCED_289,X_INTRODUCED_279,X_INTRODUCED_290,X_INTRODUCED_280,X_INTRODUCED_291,X_INTRODUCED_281,X_INTRODUCED_292,X_INTRODUCED_282,X_INTRODUCED_293,X_INTRODUCED_283,X_INTRODUCED_863,X_INTRODUCED_866,X_INTRODUCED_869,X_INTRODUCED_872,X_INTRODUCED_875,X_INTRODUCED_878,X_INTRODUCED_881,X_INTRODUCED_884];
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_304,X_INTRODUCED_305,X_INTRODUCED_306,X_INTRODUCED_307,X_INTRODUCED_308,X_INTRODUCED_309,X_INTRODUCED_310,X_INTRODUCED_311],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_315,X_INTRODUCED_316,X_INTRODUCED_317,X_INTRODUCED_318,X_INTRODUCED_319,X_INTRODUCED_320,X_INTRODUCED_321,X_INTRODUCED_322],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_325,X_INTRODUCED_326,X_INTRODUCED_327,X_INTRODUCED_328,X_INTRODUCED_329,X_INTRODUCED_330,X_INTRODUCED_331,X_INTRODUCED_332],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_335,X_INTRODUCED_336,X_INTRODUCED_337,X_INTRODUCED_338,X_INTRODUCED_339,X_INTRODUCED_340,X_INTRODUCED_341,X_INTRODUCED_342],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_345,X_INTRODUCED_346,X_INTRODUCED_347,X_INTRODUCED_348,X_INTRODUCED_349,X_INTRODUCED_350,X_INTRODUCED_351,X_INTRODUCED_352],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_355,X_INTRODUCED_356,X_INTRODUCED_357,X_INTRODUCED_358,X_INTRODUCED_359,X_INTRODUCED_360,X_INTRODUCED_361,X_INTRODUCED_362],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_365,X_INTRODUCED_366,X_INTRODUCED_367,X_INTRODUCED_368,X_INTRODUCED_369,X_INTRODUCED_370,X_INTRODUCED_371,X_INTRODUCED_372],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_375,X_INTRODUCED_376,X_INTRODUCED_377,X_INTRODUCED_378,X_INTRODUCED_379,X_INTRODUCED_380,X_INTRODUCED_381,X_INTRODUCED_382],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_385,X_INTRODUCED_386,X_INTRODUCED_387,X_INTRODUCED_388,X_INTRODUCED_389,X_INTRODUCED_390,X_INTRODUCED_391,X_INTRODUCED_392],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_395,X_INTRODUCED_396,X_INTRODUCED_397,X_INTRODUCED_398,X_INTRODUCED_399,X_INTRODUCED_400,X_INTRODUCED_401,X_INTRODUCED_402],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_405,X_INTRODUCED_406,X_INTRODUCED_407,X_INTRODUCED_408,X_INTRODUCED_409,X_INTRODUCED_410,X_INTRODUCED_411,X_INTRODUCED_412],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_415,X_INTRODUCED_416,X_INTRODUCED_417,X_INTRODUCED_418,X_INTRODUCED_419,X_INTRODUCED_420,X_INTRODUCED_421,X_INTRODUCED_422],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_425,X_INTRODUCED_426,X_INTRODUCED_427,X_INTRODUCED_428,X_INTRODUCED_429,X_INTRODUCED_430,X_INTRODUCED_431,X_INTRODUCED_432],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_435,X_INTRODUCED_436,X_INTRODUCED_437,X_INTRODUCED_438,X_INTRODUCED_439,X_INTRODUCED_440,X_INTRODUCED_441,X_INTRODUCED_442],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_445,X_INTRODUCED_446,X_INTRODUCED_447,X_INTRODUCED_448,X_INTRODUCED_449,X_INTRODUCED_450,X_INTRODUCED_451,X_INTRODUCED_452],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_455,X_INTRODUCED_456,X_INTRODUCED_457,X_INTRODUCED_458,X_INTRODUCED_459,X_INTRODUCED_460,X_INTRODUCED_461,X_INTRODUCED_462],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_465,X_INTRODUCED_466,X_INTRODUCED_467,X_INTRODUCED_468,X_INTRODUCED_469,X_INTRODUCED_470,X_INTRODUCED_471,X_INTRODUCED_472],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_475,X_INTRODUCED_476,X_INTRODUCED_477,X_INTRODUCED_478,X_INTRODUCED_479,X_INTRODUCED_480,X_INTRODUCED_481,X_INTRODUCED_482],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_485,X_INTRODUCED_486,X_INTRODUCED_487,X_INTRODUCED_488,X_INTRODUCED_489,X_INTRODUCED_490,X_INTRODUCED_491,X_INTRODUCED_492],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_495,X_INTRODUCED_496,X_INTRODUCED_497,X_INTRODUCED_498,X_INTRODUCED_499,X_INTRODUCED_500,X_INTRODUCED_501,X_INTRODUCED_502],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_505,X_INTRODUCED_506,X_INTRODUCED_507,X_INTRODUCED_508,X_INTRODUCED_509,X_INTRODUCED_510,X_INTRODUCED_511,X_INTRODUCED_512],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_515,X_INTRODUCED_516,X_INTRODUCED_517,X_INTRODUCED_518,X_INTRODUCED_519,X_INTRODUCED_520,X_INTRODUCED_521,X_INTRODUCED_522],1);
constraint int_lin_eq(X_INTRODUCED_313,[X_INTRODUCED_525,X_INTRODUCED_526,X_INTRODUCED_527,X_INTRODUCED_528,X_INTRODUCED_529,X_INTRODUCED_530,X_INTRODUCED_531,X_INTRODUCED_532],1);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_304,X_INTRODUCED_306,X_INTRODUCED_308,X_INTRODUCED_310],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_305,X_INTRODUCED_307,X_INTRODUCED_309,X_INTRODUCED_311],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_315,X_INTRODUCED_317,X_INTRODUCED_319,X_INTRODUCED_321],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_316,X_INTRODUCED_318,X_INTRODUCED_320,X_INTRODUCED_322],-1);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_325,X_INTRODUCED_327,X_INTRODUCED_329,X_INTRODUCED_331],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_326,X_INTRODUCED_328,X_INTRODUCED_330,X_INTRODUCED_332],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_335,X_INTRODUCED_337,X_INTRODUCED_339,X_INTRODUCED_341],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_336,X_INTRODUCED_338,X_INTRODUCED_340,X_INTRODUCED_342],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_345,X_INTRODUCED_347,X_INTRODUCED_349,X_INTRODUCED_351],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_346,X_INTRODUCED_348,X_INTRODUCED_350,X_INTRODUCED_352],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_355,X_INTRODUCED_357,X_INTRODUCED_359,X_INTRODUCED_361],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_356,X_INTRODUCED_358,X_INTRODUCED_360,X_INTRODUCED_362],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_365,X_INTRODUCED_367,X_INTRODUCED_369,X_INTRODUCED_371],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_366,X_INTRODUCED_368,X_INTRODUCED_370,X_INTRODUCED_372],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_375,X_INTRODUCED_377,X_INTRODUCED_379,X_INTRODUCED_381],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_376,X_INTRODUCED_378,X_INTRODUCED_380,X_INTRODUCED_382],-1);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_385,X_INTRODUCED_387,X_INTRODUCED_389,X_INTRODUCED_391],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_386,X_INTRODUCED_388,X_INTRODUCED_390,X_INTRODUCED_392],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_395,X_INTRODUCED_397,X_INTRODUCED_399,X_INTRODUCED_401],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_396,X_INTRODUCED_398,X_INTRODUCED_400,X_INTRODUCED_402],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_405,X_INTRODUCED_407,X_INTRODUCED_409,X_INTRODUCED_411],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_406,X_INTRODUCED_408,X_INTRODUCED_410,X_INTRODUCED_412],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_415,X_INTRODUCED_417,X_INTRODUCED_419,X_INTRODUCED_421],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_416,X_INTRODUCED_418,X_INTRODUCED_420,X_INTRODUCED_422],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_425,X_INTRODUCED_427,X_INTRODUCED_429,X_INTRODUCED_431],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_426,X_INTRODUCED_428,X_INTRODUCED_430,X_INTRODUCED_432],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_435,X_INTRODUCED_437,X_INTRODUCED_439,X_INTRODUCED_441],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_436,X_INTRODUCED_438,X_INTRODUCED_440,X_INTRODUCED_442],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_445,X_INTRODUCED_447,X_INTRODUCED_449,X_INTRODUCED_451],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_446,X_INTRODUCED_448,X_INTRODUCED_450,X_INTRODUCED_452],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_455,X_INTRODUCED_457,X_INTRODUCED_459,X_INTRODUCED_461],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_456,X_INTRODUCED_458,X_INTRODUCED_460,X_INTRODUCED_462],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_465,X_INTRODUCED_467,X_INTRODUCED_469,X_INTRODUCED_471],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_466,X_INTRODUCED_468,X_INTRODUCED_470,X_INTRODUCED_472],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_475,X_INTRODUCED_477,X_INTRODUCED_479,X_INTRODUCED_481],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_476,X_INTRODUCED_478,X_INTRODUCED_480,X_INTRODUCED_482],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_485,X_INTRODUCED_487,X_INTRODUCED_489,X_INTRODUCED_491],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_486,X_INTRODUCED_488,X_INTRODUCED_490,X_INTRODUCED_492],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_495,X_INTRODUCED_497,X_INTRODUCED_499,X_INTRODUCED_501],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_496,X_INTRODUCED_498,X_INTRODUCED_500,X_INTRODUCED_502],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_505,X_INTRODUCED_507,X_INTRODUCED_509,X_INTRODUCED_511],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_506,X_INTRODUCED_508,X_INTRODUCED_510,X_INTRODUCED_512],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_515,X_INTRODUCED_517,X_INTRODUCED_519,X_INTRODUCED_521],-1);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_516,X_INTRODUCED_518,X_INTRODUCED_520,X_INTRODUCED_522],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_525,X_INTRODUCED_527,X_INTRODUCED_529,X_INTRODUCED_531],0);
constraint int_lin_le(X_INTRODUCED_538,[X_INTRODUCED_526,X_INTRODUCED_528,X_INTRODUCED_530,X_INTRODUCED_532],0);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_632,0):: defines_var(X_INTRODUCED_184);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_636,0):: defines_var(X_INTRODUCED_185);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_639,0):: defines_var(X_INTRODUCED_186);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_642,0):: defines_var(X_INTRODUCED_187);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_645,0):: defines_var(X_INTRODUCED_188);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_648,0):: defines_var(X_INTRODUCED_189);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_651,0):: defines_var(X_INTRODUCED_190);
constraint int_lin_eq(X_INTRODUCED_633,X_INTRODUCED_654,0):: defines_var(X_INTRODUCED_191);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_192,X_INTRODUCED_365,X_INTRODUCED_385,X_INTRODUCED_395,X_INTRODUCED_405,X_INTRODUCED_435,X_INTRODUCED_525],0):: defines_var(X_INTRODUCED_192);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_193,X_INTRODUCED_366,X_INTRODUCED_386,X_INTRODUCED_396,X_INTRODUCED_406,X_INTRODUCED_436,X_INTRODUCED_526],0):: defines_var(X_INTRODUCED_193);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_194,X_INTRODUCED_367,X_INTRODUCED_387,X_INTRODUCED_397,X_INTRODUCED_407,X_INTRODUCED_437,X_INTRODUCED_527],0):: defines_var(X_INTRODUCED_194);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_195,X_INTRODUCED_368,X_INTRODUCED_388,X_INTRODUCED_398,X_INTRODUCED_408,X_INTRODUCED_438,X_INTRODUCED_528],0):: defines_var(X_INTRODUCED_195);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_196,X_INTRODUCED_369,X_INTRODUCED_389,X_INTRODUCED_399,X_INTRODUCED_409,X_INTRODUCED_439,X_INTRODUCED_529],0):: defines_var(X_INTRODUCED_196);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_197,X_INTRODUCED_370,X_INTRODUCED_390,X_INTRODUCED_400,X_INTRODUCED_410,X_INTRODUCED_440,X_INTRODUCED_530],0):: defines_var(X_INTRODUCED_197);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_198,X_INTRODUCED_371,X_INTRODUCED_391,X_INTRODUCED_401,X_INTRODUCED_411,X_INTRODUCED_441,X_INTRODUCED_531],0):: defines_var(X_INTRODUCED_198);
constraint int_lin_eq(X_INTRODUCED_657,[X_INTRODUCED_199,X_INTRODUCED_372,X_INTRODUCED_392,X_INTRODUCED_402,X_INTRODUCED_412,X_INTRODUCED_442,X_INTRODUCED_532],0):: defines_var(X_INTRODUCED_199);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_674,0):: defines_var(X_INTRODUCED_200);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_678,0):: defines_var(X_INTRODUCED_201);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_681,0):: defines_var(X_INTRODUCED_202);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_684,0):: defines_var(X_INTRODUCED_203);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_687,0):: defines_var(X_INTRODUCED_204);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_690,0):: defines_var(X_INTRODUCED_205);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_693,0):: defines_var(X_INTRODUCED_206);
constraint int_lin_eq(X_INTRODUCED_675,X_INTRODUCED_696,0):: defines_var(X_INTRODUCED_207);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_208,X_INTRODUCED_315,X_INTRODUCED_335,X_INTRODUCED_365,X_INTRODUCED_375,X_INTRODUCED_445,X_INTRODUCED_475,X_INTRODUCED_485],0):: defines_var(X_INTRODUCED_208);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_209,X_INTRODUCED_316,X_INTRODUCED_336,X_INTRODUCED_366,X_INTRODUCED_376,X_INTRODUCED_446,X_INTRODUCED_476,X_INTRODUCED_486],0):: defines_var(X_INTRODUCED_209);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_210,X_INTRODUCED_317,X_INTRODUCED_337,X_INTRODUCED_367,X_INTRODUCED_377,X_INTRODUCED_447,X_INTRODUCED_477,X_INTRODUCED_487],0):: defines_var(X_INTRODUCED_210);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_211,X_INTRODUCED_318,X_INTRODUCED_338,X_INTRODUCED_368,X_INTRODUCED_378,X_INTRODUCED_448,X_INTRODUCED_478,X_INTRODUCED_488],0):: defines_var(X_INTRODUCED_211);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_212,X_INTRODUCED_319,X_INTRODUCED_339,X_INTRODUCED_369,X_INTRODUCED_379,X_INTRODUCED_449,X_INTRODUCED_479,X_INTRODUCED_489],0):: defines_var(X_INTRODUCED_212);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_213,X_INTRODUCED_320,X_INTRODUCED_340,X_INTRODUCED_370,X_INTRODUCED_380,X_INTRODUCED_450,X_INTRODUCED_480,X_INTRODUCED_490],0):: defines_var(X_INTRODUCED_213);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_214,X_INTRODUCED_321,X_INTRODUCED_341,X_INTRODUCED_371,X_INTRODUCED_381,X_INTRODUCED_451,X_INTRODUCED_481,X_INTRODUCED_491],0):: defines_var(X_INTRODUCED_214);
constraint int_lin_eq(X_INTRODUCED_699,[X_INTRODUCED_215,X_INTRODUCED_322,X_INTRODUCED_342,X_INTRODUCED_372,X_INTRODUCED_382,X_INTRODUCED_452,X_INTRODUCED_482,X_INTRODUCED_492],0):: defines_var(X_INTRODUCED_215);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_216,X_INTRODUCED_315,X_INTRODUCED_375,X_INTRODUCED_395,X_INTRODUCED_475,X_INTRODUCED_485],0):: defines_var(X_INTRODUCED_216);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_217,X_INTRODUCED_316,X_INTRODUCED_376,X_INTRODUCED_396,X_INTRODUCED_476,X_INTRODUCED_486],0):: defines_var(X_INTRODUCED_217);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_218,X_INTRODUCED_317,X_INTRODUCED_377,X_INTRODUCED_397,X_INTRODUCED_477,X_INTRODUCED_487],0):: defines_var(X_INTRODUCED_218);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_219,X_INTRODUCED_318,X_INTRODUCED_378,X_INTRODUCED_398,X_INTRODUCED_478,X_INTRODUCED_488],0):: defines_var(X_INTRODUCED_219);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_220,X_INTRODUCED_319,X_INTRODUCED_379,X_INTRODUCED_399,X_INTRODUCED_479,X_INTRODUCED_489],0):: defines_var(X_INTRODUCED_220);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_221,X_INTRODUCED_320,X_INTRODUCED_380,X_INTRODUCED_400,X_INTRODUCED_480,X_INTRODUCED_490],0):: defines_var(X_INTRODUCED_221);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_222,X_INTRODUCED_321,X_INTRODUCED_381,X_INTRODUCED_401,X_INTRODUCED_481,X_INTRODUCED_491],0):: defines_var(X_INTRODUCED_222);
constraint int_lin_eq(X_INTRODUCED_716,[X_INTRODUCED_223,X_INTRODUCED_322,X_INTRODUCED_382,X_INTRODUCED_402,X_INTRODUCED_482,X_INTRODUCED_492],0):: defines_var(X_INTRODUCED_223);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_232,X_INTRODUCED_425,X_INTRODUCED_495,X_INTRODUCED_505,X_INTRODUCED_515],0):: defines_var(X_INTRODUCED_232);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_233,X_INTRODUCED_426,X_INTRODUCED_496,X_INTRODUCED_506,X_INTRODUCED_516],0):: defines_var(X_INTRODUCED_233);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_234,X_INTRODUCED_427,X_INTRODUCED_497,X_INTRODUCED_507,X_INTRODUCED_517],0):: defines_var(X_INTRODUCED_234);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_235,X_INTRODUCED_428,X_INTRODUCED_498,X_INTRODUCED_508,X_INTRODUCED_518],0):: defines_var(X_INTRODUCED_235);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_236,X_INTRODUCED_429,X_INTRODUCED_499,X_INTRODUCED_509,X_INTRODUCED_519],0):: defines_var(X_INTRODUCED_236);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_237,X_INTRODUCED_430,X_INTRODUCED_500,X_INTRODUCED_510,X_INTRODUCED_520],0):: defines_var(X_INTRODUCED_237);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_238,X_INTRODUCED_431,X_INTRODUCED_501,X_INTRODUCED_511,X_INTRODUCED_521],0):: defines_var(X_INTRODUCED_238);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_239,X_INTRODUCED_432,X_INTRODUCED_502,X_INTRODUCED_512,X_INTRODUCED_522],0):: defines_var(X_INTRODUCED_239);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_240,X_INTRODUCED_425,X_INTRODUCED_495,X_INTRODUCED_505,X_INTRODUCED_515],0):: defines_var(X_INTRODUCED_240);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_241,X_INTRODUCED_426,X_INTRODUCED_496,X_INTRODUCED_506,X_INTRODUCED_516],0):: defines_var(X_INTRODUCED_241);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_242,X_INTRODUCED_427,X_INTRODUCED_497,X_INTRODUCED_507,X_INTRODUCED_517],0):: defines_var(X_INTRODUCED_242);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_243,X_INTRODUCED_428,X_INTRODUCED_498,X_INTRODUCED_508,X_INTRODUCED_518],0):: defines_var(X_INTRODUCED_243);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_244,X_INTRODUCED_429,X_INTRODUCED_499,X_INTRODUCED_509,X_INTRODUCED_519],0):: defines_var(X_INTRODUCED_244);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_245,X_INTRODUCED_430,X_INTRODUCED_500,X_INTRODUCED_510,X_INTRODUCED_520],0):: defines_var(X_INTRODUCED_245);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_246,X_INTRODUCED_431,X_INTRODUCED_501,X_INTRODUCED_511,X_INTRODUCED_521],0):: defines_var(X_INTRODUCED_246);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_247,X_INTRODUCED_432,X_INTRODUCED_502,X_INTRODUCED_512,X_INTRODUCED_522],0):: defines_var(X_INTRODUCED_247);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_248,X_INTRODUCED_335,X_INTRODUCED_355,X_INTRODUCED_425,X_INTRODUCED_435],0):: defines_var(X_INTRODUCED_248);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_249,X_INTRODUCED_336,X_INTRODUCED_356,X_INTRODUCED_426,X_INTRODUCED_436],0):: defines_var(X_INTRODUCED_249);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_250,X_INTRODUCED_337,X_INTRODUCED_357,X_INTRODUCED_427,X_INTRODUCED_437],0):: defines_var(X_INTRODUCED_250);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_251,X_INTRODUCED_338,X_INTRODUCED_358,X_INTRODUCED_428,X_INTRODUCED_438],0):: defines_var(X_INTRODUCED_251);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_252,X_INTRODUCED_339,X_INTRODUCED_359,X_INTRODUCED_429,X_INTRODUCED_439],0):: defines_var(X_INTRODUCED_252);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_253,X_INTRODUCED_340,X_INTRODUCED_360,X_INTRODUCED_430,X_INTRODUCED_440],0):: defines_var(X_INTRODUCED_253);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_254,X_INTRODUCED_341,X_INTRODUCED_361,X_INTRODUCED_431,X_INTRODUCED_441],0):: defines_var(X_INTRODUCED_254);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_255,X_INTRODUCED_342,X_INTRODUCED_362,X_INTRODUCED_432,X_INTRODUCED_442],0):: defines_var(X_INTRODUCED_255);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_256,X_INTRODUCED_335,X_INTRODUCED_435],0):: defines_var(X_INTRODUCED_256);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_257,X_INTRODUCED_336,X_INTRODUCED_436],0):: defines_var(X_INTRODUCED_257);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_258,X_INTRODUCED_337,X_INTRODUCED_437],0):: defines_var(X_INTRODUCED_258);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_259,X_INTRODUCED_338,X_INTRODUCED_438],0):: defines_var(X_INTRODUCED_259);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_260,X_INTRODUCED_339,X_INTRODUCED_439],0):: defines_var(X_INTRODUCED_260);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_261,X_INTRODUCED_340,X_INTRODUCED_440],0):: defines_var(X_INTRODUCED_261);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_262,X_INTRODUCED_341,X_INTRODUCED_441],0):: defines_var(X_INTRODUCED_262);
constraint int_lin_eq(X_INTRODUCED_782,[X_INTRODUCED_263,X_INTRODUCED_342,X_INTRODUCED_442],0):: defines_var(X_INTRODUCED_263);
constraint maximum_int(X_INTRODUCED_264,X_INTRODUCED_798);
constraint maximum_int(X_INTRODUCED_265,X_INTRODUCED_799);
constraint maximum_int(X_INTRODUCED_266,X_INTRODUCED_800);
constraint maximum_int(X_INTRODUCED_267,X_INTRODUCED_801);
constraint maximum_int(X_INTRODUCED_268,X_INTRODUCED_802);
constraint maximum_int(X_INTRODUCED_269,X_INTRODUCED_803);
constraint maximum_int(X_INTRODUCED_270,X_INTRODUCED_804);
constraint maximum_int(X_INTRODUCED_271,X_INTRODUCED_805);
constraint maximum_int(X_INTRODUCED_272,X_INTRODUCED_806);
constraint maximum_int(X_INTRODUCED_273,X_INTRODUCED_807);
constraint minimum_int(X_INTRODUCED_274,X_INTRODUCED_798);
constraint minimum_int(X_INTRODUCED_275,X_INTRODUCED_799);
constraint minimum_int(X_INTRODUCED_276,X_INTRODUCED_800);
constraint minimum_int(X_INTRODUCED_277,X_INTRODUCED_801);
constraint minimum_int(X_INTRODUCED_278,X_INTRODUCED_802);
constraint minimum_int(X_INTRODUCED_279,X_INTRODUCED_803);
constraint minimum_int(X_INTRODUCED_280,X_INTRODUCED_804);
constraint minimum_int(X_INTRODUCED_281,X_INTRODUCED_805);
constraint minimum_int(X_INTRODUCED_282,X_INTRODUCED_806);
constraint minimum_int(X_INTRODUCED_283,X_INTRODUCED_807);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_284,X_INTRODUCED_184,X_INTRODUCED_186,X_INTRODUCED_188,X_INTRODUCED_190],0):: defines_var(X_INTRODUCED_284);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_285,X_INTRODUCED_193,X_INTRODUCED_195,X_INTRODUCED_197,X_INTRODUCED_199],0):: defines_var(X_INTRODUCED_285);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_286,X_INTRODUCED_200,X_INTRODUCED_202,X_INTRODUCED_204,X_INTRODUCED_206],0):: defines_var(X_INTRODUCED_286);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_287,X_INTRODUCED_209,X_INTRODUCED_211,X_INTRODUCED_213,X_INTRODUCED_215],0):: defines_var(X_INTRODUCED_287);
constraint int_lin_eq(X_INTRODUCED_741,[X_INTRODUCED_288,X_INTRODUCED_217,X_INTRODUCED_219,X_INTRODUCED_221,X_INTRODUCED_223],0):: defines_var(X_INTRODUCED_288);
constraint int_lin_eq([1,-1,-1],[X_INTRODUCED_289,X_INTRODUCED_438,X_INTRODUCED_440],0):: defines_var(X_INTRODUCED_289);
constraint int_lin_eq(X_INTRODUCED_815,[X_INTRODUCED_290,X_INTRODUCED_232,X_INTRODUCED_233,X_INTRODUCED_234,X_INTRODUCED_235,X_INTRODUCED_236,X_INTRODUCED_237,X_INTRODUCED_238,X_INTRODUCED_239],0):: defines_var(X_INTRODUCED_290);
constraint int_lin_eq(X_INTRODUCED_815,[X_INTRODUCED_291,X_INTRODUCED_240,X_INTRODUCED_241,X_INTRODUCED_242,X_INTRODUCED_243,X_INTRODUCED_244,X_INTRODUCED_245,X_INTRODUCED_246,X_INTRODUCED_247],0):: defines_var(X_INTRODUCED_291);
constraint int_lin_eq(X_INTRODUCED_815,[X_INTRODUCED_292,X_INTRODUCED_248,X_INTRODUCED_249,X_INTRODUCED_250,X_INTRODUCED_251,X_INTRODUCED_252,X_INTRODUCED_253,X_INTRODUCED_254,X_INTRODUCED_255],0):: defines_var(X_INTRODUCED_292);
constraint int_lin_eq(X_INTRODUCED_815,[X_INTRODUCED_293,X_INTRODUCED_256,X_INTRODUCED_257,X_INTRODUCED_258,X_INTRODUCED_259,X_INTRODUCED_260,X_INTRODUCED_261,X_INTRODUCED_262,X_INTRODUCED_263],0):: defines_var(X_INTRODUCED_293);
constraint int_max(0,X_INTRODUCED_823,X_INTRODUCED_824);
constraint int_max(0,X_INTRODUCED_828,X_INTRODUCED_829);
constraint int_max(0,X_INTRODUCED_833,X_INTRODUCED_834);
constraint int_max(0,X_INTRODUCED_838,X_INTRODUCED_839);
constraint int_max(0,X_INTRODUCED_843,X_INTRODUCED_844);
constraint int_max(0,X_INTRODUCED_848,X_INTRODUCED_849);
constraint int_max(0,X_INTRODUCED_853,X_INTRODUCED_854);
constraint int_max(0,X_INTRODUCED_858,X_INTRODUCED_859);
constraint int_div(X_INTRODUCED_861,3,X_INTRODUCED_863):: defines_var(X_INTRODUCED_863);
constraint int_div(X_INTRODUCED_864,3,X_INTRODUCED_866):: defines_var(X_INTRODUCED_866);
constraint int_div(X_INTRODUCED_867,3,X_INTRODUCED_869):: defines_var(X_INTRODUCED_869);
constraint int_div(X_INTRODUCED_870,3,X_INTRODUCED_872):: defines_var(X_INTRODUCED_872);
constraint int_div(X_INTRODUCED_873,3,X_INTRODUCED_875):: defines_var(X_INTRODUCED_875);
constraint int_div(X_INTRODUCED_876,3,X_INTRODUCED_878):: defines_var(X_INTRODUCED_878);
constraint int_div(X_INTRODUCED_879,3,X_INTRODUCED_881):: defines_var(X_INTRODUCED_881);
constraint int_div(X_INTRODUCED_882,3,X_INTRODUCED_884):: defines_var(X_INTRODUCED_884);
constraint int_lin_eq(X_INTRODUCED_909,X_INTRODUCED_908,0):: defines_var(objective);
constraint int_le(0,0);
constraint int_le(0,0);
constraint int_le(0,0);
constraint int_le(0,0);
constraint int_le(0,X_INTRODUCED_264);
constraint int_le(0,X_INTRODUCED_265);
constraint int_le(0,X_INTRODUCED_266);
constraint int_le(0,X_INTRODUCED_267);
constraint int_le(0,X_INTRODUCED_268);
constraint int_le(0,X_INTRODUCED_269);
constraint int_le(0,X_INTRODUCED_270);
constraint int_le(0,X_INTRODUCED_271);
constraint int_le(0,X_INTRODUCED_272);
constraint int_le(0,X_INTRODUCED_273);
constraint int_le(0,X_INTRODUCED_274);
constraint int_le(0,X_INTRODUCED_275);
constraint int_le(0,X_INTRODUCED_276);
constraint int_le(0,X_INTRODUCED_277);
constraint int_le(0,X_INTRODUCED_278);
constraint int_le(0,X_INTRODUCED_279);
constraint int_le(0,X_INTRODUCED_280);
constraint int_le(0,X_INTRODUCED_281);
constraint int_le(0,X_INTRODUCED_282);
constraint int_le(0,X_INTRODUCED_283);
constraint int_le(0,X_INTRODUCED_289);
constraint int_le(0,objective);
constraint bool2int(X_INTRODUCED_2,X_INTRODUCED_306):: defines_var(X_INTRODUCED_306);
constraint bool2int(X_INTRODUCED_3,X_INTRODUCED_307):: defines_var(X_INTRODUCED_307);
constraint bool2int(X_INTRODUCED_6,X_INTRODUCED_310):: defines_var(X_INTRODUCED_310);
constraint bool2int(X_INTRODUCED_7,X_INTRODUCED_311):: defines_var(X_INTRODUCED_311);
constraint bool2int(X_INTRODUCED_8,X_INTRODUCED_315):: defines_var(X_INTRODUCED_315);
constraint bool2int(X_INTRODUCED_9,X_INTRODUCED_316):: defines_var(X_INTRODUCED_316);
constraint bool2int(X_INTRODUCED_10,X_INTRODUCED_317):: defines_var(X_INTRODUCED_317);
constraint bool2int(X_INTRODUCED_11,X_INTRODUCED_318):: defines_var(X_INTRODUCED_318);
constraint bool2int(X_INTRODUCED_12,X_INTRODUCED_319):: defines_var(X_INTRODUCED_319);
constraint bool2int(X_INTRODUCED_13,X_INTRODUCED_320):: defines_var(X_INTRODUCED_320);
constraint bool2int(X_INTRODUCED_20,X_INTRODUCED_329):: defines_var(X_INTRODUCED_329);
constraint bool2int(X_INTRODUCED_21,X_INTRODUCED_330):: defines_var(X_INTRODUCED_330);
constraint bool2int(X_INTRODUCED_22,X_INTRODUCED_331):: defines_var(X_INTRODUCED_331);
constraint bool2int(X_INTRODUCED_23,X_INTRODUCED_332):: defines_var(X_INTRODUCED_332);
constraint bool2int(X_INTRODUCED_24,X_INTRODUCED_335):: defines_var(X_INTRODUCED_335);
constraint bool2int(X_INTRODUCED_25,X_INTRODUCED_336):: defines_var(X_INTRODUCED_336);
constraint bool2int(X_INTRODUCED_26,X_INTRODUCED_337):: defines_var(X_INTRODUCED_337);
constraint bool2int(X_INTRODUCED_27,X_INTRODUCED_338):: defines_var(X_INTRODUCED_338);
constraint bool2int(X_INTRODUCED_28,X_INTRODUCED_339):: defines_var(X_INTRODUCED_339);
constraint bool2int(X_INTRODUCED_29,X_INTRODUCED_340):: defines_var(X_INTRODUCED_340);
constraint bool2int(X_INTRODUCED_32,X_INTRODUCED_345):: defines_var(X_INTRODUCED_345);
constraint bool2int(X_INTRODUCED_33,X_INTRODUCED_346):: defines_var(X_INTRODUCED_346);
constraint bool2int(X_INTRODUCED_34,X_INTRODUCED_347):: defines_var(X_INTRODUCED_347);
constraint bool2int(X_INTRODUCED_35,X_INTRODUCED_348):: defines_var(X_INTRODUCED_348);
constraint bool2int(X_INTRODUCED_40,X_INTRODUCED_355):: defines_var(X_INTRODUCED_355);
constraint bool2int(X_INTRODUCED_41,X_INTRODUCED_356):: defines_var(X_INTRODUCED_356);
constraint bool2int(X_INTRODUCED_46,X_INTRODUCED_361):: defines_var(X_INTRODUCED_361);
constraint bool2int(X_INTRODUCED_47,X_INTRODUCED_362):: defines_var(X_INTRODUCED_362);
constraint bool2int(X_INTRODUCED_50,X_INTRODUCED_367):: defines_var(X_INTRODUCED_367);
constraint bool2int(X_INTRODUCED_51,X_INTRODUCED_368):: defines_var(X_INTRODUCED_368);
constraint bool2int(X_INTRODUCED_52,X_INTRODUCED_369):: defines_var(X_INTRODUCED_369);
constraint bool2int(X_INTRODUCED_53,X_INTRODUCED_370):: defines_var(X_INTRODUCED_370);
constraint bool2int(X_INTRODUCED_58,X_INTRODUCED_377):: defines_var(X_INTRODUCED_377);
constraint bool2int(X_INTRODUCED_59,X_INTRODUCED_378):: defines_var(X_INTRODUCED_378);
constraint bool2int(X_INTRODUCED_60,X_INTRODUCED_379):: defines_var(X_INTRODUCED_379);
constraint bool2int(X_INTRODUCED_61,X_INTRODUCED_380):: defines_var(X_INTRODUCED_380);
constraint bool2int(X_INTRODUCED_62,X_INTRODUCED_381):: defines_var(X_INTRODUCED_381);
constraint bool2int(X_INTRODUCED_63,X_INTRODUCED_382):: defines_var(X_INTRODUCED_382);
constraint bool2int(X_INTRODUCED_66,X_INTRODUCED_387):: defines_var(X_INTRODUCED_387);
constraint bool2int(X_INTRODUCED_67,X_INTRODUCED_388):: defines_var(X_INTRODUCED_388);
constraint bool2int(X_INTRODUCED_76,X_INTRODUCED_399):: defines_var(X_INTRODUCED_399);
constraint bool2int(X_INTRODUCED_77,X_INTRODUCED_400):: defines_var(X_INTRODUCED_400);
constraint bool2int(X_INTRODUCED_78,X_INTRODUCED_401):: defines_var(X_INTRODUCED_401);
constraint bool2int(X_INTRODUCED_79,X_INTRODUCED_402):: defines_var(X_INTRODUCED_402);
constraint bool2int(X_INTRODUCED_82,X_INTRODUCED_407):: defines_var(X_INTRODUCED_407);
constraint bool2int(X_INTRODUCED_83,X_INTRODUCED_408):: defines_var(X_INTRODUCED_408);
constraint bool2int(X_INTRODUCED_88,X_INTRODUCED_415):: defines_var(X_INTRODUCED_415);
constraint bool2int(X_INTRODUCED_89,X_INTRODUCED_416):: defines_var(X_INTRODUCED_416);
constraint bool2int(X_INTRODUCED_92,X_INTRODUCED_419):: defines_var(X_INTRODUCED_419);
constraint bool2int(X_INTRODUCED_93,X_INTRODUCED_420):: defines_var(X_INTRODUCED_420);
constraint bool2int(X_INTRODUCED_102,X_INTRODUCED_431):: defines_var(X_INTRODUCED_431);
constraint bool2int(X_INTRODUCED_103,X_INTRODUCED_432):: defines_var(X_INTRODUCED_432);
constraint bool2int(X_INTRODUCED_106,X_INTRODUCED_437):: defines_var(X_INTRODUCED_437);
constraint bool2int(X_INTRODUCED_107,X_INTRODUCED_438):: defines_var(X_INTRODUCED_438);
constraint bool2int(X_INTRODUCED_108,X_INTRODUCED_439):: defines_var(X_INTRODUCED_439);
constraint bool2int(X_INTRODUCED_109,X_INTRODUCED_440):: defines_var(X_INTRODUCED_440);
constraint bool2int(X_INTRODUCED_116,X_INTRODUCED_449):: defines_var(X_INTRODUCED_449);
constraint bool2int(X_INTRODUCED_117,X_INTRODUCED_450):: defines_var(X_INTRODUCED_450);
constraint bool2int(X_INTRODUCED_118,X_INTRODUCED_451):: defines_var(X_INTRODUCED_451);
constraint bool2int(X_INTRODUCED_119,X_INTRODUCED_452):: defines_var(X_INTRODUCED_452);
constraint bool2int(X_INTRODUCED_122,X_INTRODUCED_457):: defines_var(X_INTRODUCED_457);
constraint bool2int(X_INTRODUCED_123,X_INTRODUCED_458):: defines_var(X_INTRODUCED_458);
constraint bool2int(X_INTRODUCED_126,X_INTRODUCED_461):: defines_var(X_INTRODUCED_461);
constraint bool2int(X_INTRODUCED_127,X_INTRODUCED_462):: defines_var(X_INTRODUCED_462);
constraint bool2int(X_INTRODUCED_128,X_INTRODUCED_465):: defines_var(X_INTRODUCED_465);
constraint bool2int(X_INTRODUCED_129,X_INTRODUCED_466):: defines_var(X_INTRODUCED_466);
constraint bool2int(X_INTRODUCED_130,X_INTRODUCED_467):: defines_var(X_INTRODUCED_467);
constraint bool2int(X_INTRODUCED_131,X_INTRODUCED_468):: defines_var(X_INTRODUCED_468);
constraint bool2int(X_INTRODUCED_132,X_INTRODUCED_469):: defines_var(X_INTRODUCED_469);
constraint bool2int(X_INTRODUCED_133,X_INTRODUCED_470):: defines_var(X_INTRODUCED_470);
constraint bool2int(X_INTRODUCED_138,X_INTRODUCED_477):: defines_var(X_INTRODUCED_477);
constraint bool2int(X_INTRODUCED_139,X_INTRODUCED_478):: defines_var(X_INTRODUCED_478);
constraint bool2int(X_INTRODUCED_142,X_INTRODUCED_481):: defines_var(X_INTRODUCED_481);
constraint bool2int(X_INTRODUCED_143,X_INTRODUCED_482):: defines_var(X_INTRODUCED_482);
constraint bool2int(X_INTRODUCED_148,X_INTRODUCED_489):: defines_var(X_INTRODUCED_489);
constraint bool2int(X_INTRODUCED_149,X_INTRODUCED_490):: defines_var(X_INTRODUCED_490);
constraint bool2int(X_INTRODUCED_152,X_INTRODUCED_495):: defines_var(X_INTRODUCED_495);
constraint bool2int(X_INTRODUCED_153,X_INTRODUCED_496):: defines_var(X_INTRODUCED_496);
constraint bool2int(X_INTRODUCED_156,X_INTRODUCED_499):: defines_var(X_INTRODUCED_499);
constraint bool2int(X_INTRODUCED_157,X_INTRODUCED_500):: defines_var(X_INTRODUCED_500);
constraint bool2int(X_INTRODUCED_162,X_INTRODUCED_507):: defines_var(X_INTRODUCED_507);
constraint bool2int(X_INTRODUCED_163,X_INTRODUCED_508):: defines_var(X_INTRODUCED_508);
constraint bool2int(X_INTRODUCED_166,X_INTRODUCED_511):: defines_var(X_INTRODUCED_511);
constraint bool2int(X_INTRODUCED_167,X_INTRODUCED_512):: defines_var(X_INTRODUCED_512);
constraint bool2int(X_INTRODUCED_172,X_INTRODUCED_519):: defines_var(X_INTRODUCED_519);
constraint bool2int(X_INTRODUCED_173,X_INTRODUCED_520):: defines_var(X_INTRODUCED_520);
constraint bool2int(X_INTRODUCED_178,X_INTRODUCED_527):: defines_var(X_INTRODUCED_527);
constraint bool2int(X_INTRODUCED_179,X_INTRODUCED_528):: defines_var(X_INTRODUCED_528);
constraint bool2int(X_INTRODUCED_182,X_INTRODUCED_531):: defines_var(X_INTRODUCED_531);
constraint bool2int(X_INTRODUCED_183,X_INTRODUCED_532):: defines_var(X_INTRODUCED_532);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_315,X_INTRODUCED_335,X_INTRODUCED_345,X_INTRODUCED_355,X_INTRODUCED_415,X_INTRODUCED_465,X_INTRODUCED_495,X_INTRODUCED_823],-3):: defines_var(X_INTRODUCED_823);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_316,X_INTRODUCED_336,X_INTRODUCED_346,X_INTRODUCED_356,X_INTRODUCED_416,X_INTRODUCED_466,X_INTRODUCED_496,X_INTRODUCED_828],-3):: defines_var(X_INTRODUCED_828);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_306,X_INTRODUCED_317,X_INTRODUCED_337,X_INTRODUCED_347,X_INTRODUCED_367,X_INTRODUCED_377,X_INTRODUCED_387,X_INTRODUCED_407,X_INTRODUCED_437,X_INTRODUCED_457,X_INTRODUCED_467,X_INTRODUCED_477,X_INTRODUCED_507,X_INTRODUCED_527,X_INTRODUCED_833],-3):: defines_var(X_INTRODUCED_833);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_307,X_INTRODUCED_318,X_INTRODUCED_338,X_INTRODUCED_348,X_INTRODUCED_368,X_INTRODUCED_378,X_INTRODUCED_388,X_INTRODUCED_408,X_INTRODUCED_438,X_INTRODUCED_458,X_INTRODUCED_468,X_INTRODUCED_478,X_INTRODUCED_508,X_INTRODUCED_528,X_INTRODUCED_838],-3):: defines_var(X_INTRODUCED_838);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_319,X_INTRODUCED_329,X_INTRODUCED_339,X_INTRODUCED_369,X_INTRODUCED_379,X_INTRODUCED_399,X_INTRODUCED_419,X_INTRODUCED_439,X_INTRODUCED_449,X_INTRODUCED_469,X_INTRODUCED_489,X_INTRODUCED_499,X_INTRODUCED_519,X_INTRODUCED_843],-3):: defines_var(X_INTRODUCED_843);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_320,X_INTRODUCED_330,X_INTRODUCED_340,X_INTRODUCED_370,X_INTRODUCED_380,X_INTRODUCED_400,X_INTRODUCED_420,X_INTRODUCED_440,X_INTRODUCED_450,X_INTRODUCED_470,X_INTRODUCED_490,X_INTRODUCED_500,X_INTRODUCED_520,X_INTRODUCED_848],-3):: defines_var(X_INTRODUCED_848);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_310,X_INTRODUCED_331,X_INTRODUCED_361,X_INTRODUCED_381,X_INTRODUCED_401,X_INTRODUCED_431,X_INTRODUCED_451,X_INTRODUCED_461,X_INTRODUCED_481,X_INTRODUCED_511,X_INTRODUCED_531,X_INTRODUCED_853],-3):: defines_var(X_INTRODUCED_853);
constraint int_lin_eq([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[X_INTRODUCED_311,X_INTRODUCED_332,X_INTRODUCED_362,X_INTRODUCED_382,X_INTRODUCED_402,X_INTRODUCED_432,X_INTRODUCED_452,X_INTRODUCED_462,X_INTRODUCED_482,X_INTRODUCED_512,X_INTRODUCED_532,X_INTRODUCED_858],-3):: defines_var(X_INTRODUCED_858);
constraint int_lin_eq([100,-1],[X_INTRODUCED_824,X_INTRODUCED_861],0):: defines_var(X_INTRODUCED_861);
constraint int_lin_eq([100,-1],[X_INTRODUCED_829,X_INTRODUCED_864],0):: defines_var(X_INTRODUCED_864);
constraint int_lin_eq([100,-1],[X_INTRODUCED_834,X_INTRODUCED_867],0):: defines_var(X_INTRODUCED_867);
constraint int_lin_eq([100,-1],[X_INTRODUCED_839,X_INTRODUCED_870],0):: defines_var(X_INTRODUCED_870);
constraint int_lin_eq([100,-1],[X_INTRODUCED_844,X_INTRODUCED_873],0):: defines_var(X_INTRODUCED_873);
constraint int_lin_eq([100,-1],[X_INTRODUCED_849,X_INTRODUCED_876],0):: defines_var(X_INTRODUCED_876);
constraint int_lin_eq([100,-1],[X_INTRODUCED_854,X_INTRODUCED_879],0):: defines_var(X_INTRODUCED_879);
constraint int_lin_eq([100,-1],[X_INTRODUCED_859,X_INTRODUCED_882],0):: defines_var(X_INTRODUCED_882);
solve maximize objective;

View File

@@ -1,65 +0,0 @@
#!/usr/bin/env python3
from collections import namedtuple
from ortools.constraint_solver import pywrapcp
VEHICLE_COUNT = 30
VEHICLE_CAPACITY = 200
Customer = namedtuple("Customer", ['index', 'demand', 'x', 'y'])
print('Init')
customers = list()
customers.append(Customer(0, 0, 0, 0))
customers.append(Customer(1, 1, 1.0, 1.0))
customers.append(Customer(1, 1, 2.0, 2.0))
customer_count = len(customers)
manager = pywrapcp.RoutingIndexManager(3, VEHICLE_COUNT, 0)
routing = pywrapcp.RoutingModel(manager)
print('Demand Constraint')
demands = []
for i in range(0, customer_count):
demands.append(customers[i][1])
routing.AddVectorDimension(demands, VEHICLE_CAPACITY, True, "Demand")
print('Adding Costs')
def distance_callback(from_index, to_index):
#static just for the sake of the example
return 1
transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
routing.CloseModel()
assignment = routing.Solve(None)
# Inspect solution and extract routes
routes = []
for i in range(0, routing.vehicles()):
route_number = i
routes.append([])
node = routing.Start(route_number)
route = []
route.append(0)
if routing.IsVehicleUsed(assignment, i):
while True:
node = assignment.Value(routing.NextVar(node))
if not routing.IsEnd(node):
route.append(int(node))
else:
break
route.append(0)
routes[route_number].append(route)
#This are the routes as list of lists
routes = [el[0] for el in routes]
#Now try to read the routes into a new assigment object fails
assignment2 = routing.ReadAssignmentFromRoutes(routes, True)

View File

@@ -1,79 +0,0 @@
#!/usr/bin/env python3
# Copyright 2010-2025 Google
# 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.
"""
Cryptarithmetic puzzle
First attempt to solve equation CP + IS + FUN = TRUE
where each letter represents a unique digit.
This problem has 72 different solutions in base 10.
"""
from ortools.constraint_solver import pywrapcp
from os import abort
def CPIsFun():
# Constraint programming engine
solver = pywrapcp.Solver('CP is fun!');
kBase = 10
# Decision variables.
digits = list(range(0, kBase))
digits_without_zero = list(range(1, kBase))
c = solver.IntVar(digits_without_zero, 'C');
p = solver.IntVar(digits, 'P');
i = solver.IntVar(digits_without_zero, 'I');
s = solver.IntVar(digits, 'S');
f = solver.IntVar(digits_without_zero, 'F');
u = solver.IntVar(digits, 'U');
n = solver.IntVar(digits, 'N');
t = solver.IntVar(digits_without_zero, 'T');
r = solver.IntVar(digits, 'R');
e = solver.IntVar(digits, 'E');
# We need to group variables in a list to use the constraint AllDifferent.
letters = [c, p, i, s, f, u, n, t, r, e]
# Verify that we have enough digits.
assert kBase >= len(letters)
# Define constraints.
solver.Add(solver.AllDifferent(letters))
# CP + IS + FUN = TRUE
solver.Add (p + s + n + kBase * (c + i + u) + kBase * kBase * f ==
e + kBase * u + kBase * kBase * r + kBase * kBase * kBase * t)
db = solver.Phase(letters, solver.INT_VAR_DEFAULT,
solver.INT_VALUE_DEFAULT)
solver.NewSearch(db)
while solver.NextSolution():
print(letters)
# Is CP + IS + FUN = TRUE?
assert (kBase*c.Value() + p.Value() + kBase*i.Value() + s.Value() +
kBase*kBase*f.Value() + kBase*u.Value() + n.Value() ==
kBase*kBase*kBase*t.Value() + kBase*kBase*r.Value() +
kBase*u.Value() + e.Value())
solver.EndSearch()
return
if __name__ == '__main__':
CPIsFun()

View File

@@ -1,157 +0,0 @@
#!/usr/bin/env python3
from ortools.constraint_solver import pywrapcp
def test_v0():
print('test_v0')
solver = pywrapcp.Solver('')
# we have two tasks of durations 4 and 7
task1 = solver.FixedDurationIntervalVar(0, 5, 4, False, "task1")
task2 = solver.FixedDurationIntervalVar(0, 5, 7, False, "task2")
tasks = [task1, task2]
# to each task, a post task of duration 64 is attached
postTask1 = solver.FixedDurationIntervalVar(4, 74 + 64, 64, False, "postTask1")
postTask2 = solver.FixedDurationIntervalVar(4, 77 + 64, 64, False, "postTask2")
postTasks = [postTask1, postTask2]
solver.Add(postTask1.StartsAtEnd(task1))
solver.Add(postTask2.StartsAtEnd(task2))
# two resources are available for the post tasks. There are binary indicator
# variables to determine which task uses which resource
postTask1UsesRes1 = solver.IntVar(0, 1, "post task 1 using resource 1")
postTask1UsesRes2 = solver.IntVar(0, 1, "post task 1 using resource 2")
postTask2UsesRes1 = solver.IntVar(0, 1, "post task 2 using resource 1")
postTask2UsesRes2 = solver.IntVar(0, 1, "post task 2 using resource 2")
indicators = [postTask1UsesRes1, postTask1UsesRes2, postTask2UsesRes1, postTask2UsesRes2]
# each post task needs exactly one resource
solver.Add(postTask1UsesRes1 + postTask1UsesRes2 == 1)
solver.Add(postTask2UsesRes1 + postTask2UsesRes2 == 1)
# each resource cannot be used simultaneously by more than one post task
solver.Add(solver.Cumulative(postTasks, [postTask1UsesRes1, postTask2UsesRes1], 1, "cumul1"))
solver.Add(solver.Cumulative(postTasks, [postTask1UsesRes2, postTask2UsesRes2], 1, "cumul2"))
# using constant demands instead, the correct solution is found
# solver.Add(solver.Cumulative(postTasks, [0, 1], 1, ""))
# solver.Add(solver.Cumulative(postTasks, [1, 0], 1, ""))
# search setup and solving
dbInterval = solver.Phase(tasks + postTasks, solver.INTERVAL_DEFAULT)
dbInt = solver.Phase(indicators, solver.INT_VAR_DEFAULT, solver.INT_VALUE_DEFAULT)
makespan = solver.Max([task1.EndExpr().Var(), task2.EndExpr().Var()])
optimize = solver.Optimize(False, makespan, 1)
solution = solver.Assignment()
solution.Add([t for t in (tasks + postTasks)])
solution.Add(indicators)
collector = solver.LastSolutionCollector(solution)
phase = solver.Compose([dbInt, dbInterval])
solver.Solve(phase, [collector, optimize])
if collector.SolutionCount() > 0:
for i, task in enumerate(tasks):
print("task {} runs from {} to {}".format(
i,
collector.StartValue(0, task),
collector.EndValue(0, task)))
for i, task in enumerate(postTasks):
print("postTask {} starts at {}".format(i, collector.StartValue(0, task)))
for indicator in indicators:
print('{} -> {}'.format(indicator.Name(), collector.Value(0, indicator)))
else:
print('No solution')
def test_v1():
print('test_v1')
solver = pywrapcp.Solver('')
# we have two tasks of durations 4 and 7
task1 = solver.FixedDurationIntervalVar(0, 5, 4, False, "task1")
task2 = solver.FixedDurationIntervalVar(0, 5, 7, False, "task2")
tasks = [task1, task2]
# Create copies for each resource
task1_r1 = solver.FixedDurationIntervalVar(0, 5, 4, True, "task1_1")
task2_r1 = solver.FixedDurationIntervalVar(0, 5, 7, True, "task2_1")
tasks_r1 = [task1_r1, task2_r1]
task1_r2 = solver.FixedDurationIntervalVar(0, 5, 4, True, "task1_2")
task2_r2 = solver.FixedDurationIntervalVar(0, 5, 7, True, "task2_2")
tasks_r2 = [task1_r2, task2_r2]
# to each task, a post task of duration 64 is attached
postTask1 = solver.FixedDurationStartSyncedOnEndIntervalVar(task1, 64, 0)
postTask2 = solver.FixedDurationStartSyncedOnEndIntervalVar(task2, 64, 0)
postTasks = [postTask1, postTask2]
# Create copies for each resource
postTask1_r1 = solver.FixedDurationIntervalVar(4, 9, 64, True, "pTask1_1")
postTask2_r1 = solver.FixedDurationIntervalVar(4, 11, 64, True, "pTask2_1")
postTask1_r2 = solver.FixedDurationIntervalVar(4, 9, 64, True, "pTask1_2")
postTask2_r2 = solver.FixedDurationIntervalVar(4, 11, 64, True, "pTask2_2")
copies = [ task1_r1, task2_r1, task1_r2, task2_r2,
postTask1_r1, postTask1_r2, postTask2_r1, postTask2_r2 ]
# each resource cannot be used simultaneously by more than one post task
solver.Add(solver.DisjunctiveConstraint(
[task1_r1, task2_r1, postTask1_r1, postTask2_r1], "disj1"))
solver.Add(solver.DisjunctiveConstraint(
[task1_r2, task2_r2, postTask1_r2, postTask2_r2], "disj1"))
# Only one resource available
solver.Add(task1_r1.PerformedExpr() + task1_r2.PerformedExpr() == 1)
solver.Add(task2_r1.PerformedExpr() + task2_r2.PerformedExpr() == 1)
solver.Add(postTask1_r1.PerformedExpr() + postTask1_r2.PerformedExpr() == 1)
solver.Add(postTask2_r1.PerformedExpr() + postTask2_r2.PerformedExpr() == 1)
# Sync main task with copies
solver.Add(solver.Cover([task1_r1, task1_r2], task1))
solver.Add(solver.Cover([task2_r1, task2_r2], task2))
solver.Add(solver.Cover([postTask1_r1, postTask1_r2], postTask1))
solver.Add(solver.Cover([postTask2_r1, postTask2_r2], postTask2))
# Indicators (no need to add both as they are constrained together)
indicators = [
task1_r1.PerformedExpr(), task2_r1.PerformedExpr(),
postTask1_r1.PerformedExpr(), postTask2_r1.PerformedExpr()]
# search setup and solving
dbInterval = solver.Phase(tasks + postTasks, solver.INTERVAL_DEFAULT)
dbInt = solver.Phase(
indicators, solver.INT_VAR_DEFAULT, solver.INT_VALUE_DEFAULT)
makespan = solver.Max([task1.EndExpr(), task2.EndExpr()])
optimize = solver.Minimize(makespan, 1)
solution = solver.Assignment()
solution.Add(tasks)
solution.Add(postTasks)
solution.Add(copies)
solution.AddObjective(makespan)
collector = solver.LastSolutionCollector(solution)
phase = solver.Compose([dbInt, dbInterval])
solver.Solve(phase, [collector, optimize])
if collector.SolutionCount() > 0:
print('solution with makespan', collector.ObjectiveValue(0))
for task in tasks:
print("task {} runs from {} to {}".format(
task.Name(),
collector.StartValue(0, task),
collector.EndValue(0, task)))
for task in postTasks:
print("postTask {} starts at {}".format(
task.Name(), collector.StartValue(0, task)))
for task in copies:
print(task.Name(), collector.PerformedValue(0, task))
else:
print('No solution')
test_v0()
test_v1()

View File

@@ -1,29 +0,0 @@
// Copyright 2011-2014 Google
// 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.
#include "absl/flags/parse.h"
#include "ortools/base/logging.h"
#include "ortools/base/version.h"
namespace operations_research {
void PrintVersion() {
LOG(INFO) << "Version = " << OrToolsMajorVersion() << "."
<< OrToolsMinorVersion();
}
} // namespace operations_research
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
operations_research::PrintVersion();
return 0;
}

View File

@@ -1,243 +0,0 @@
predicate inverse(array [int] of var int: f,array [int] of var int: invf);
predicate array_int_maximum(var int: m,array [int] of var int: x);
array [1..2] of int: X_INTRODUCED_54 = [1,-1];
array [1..2] of int: X_INTRODUCED_81 = [-1,1];
array [1..3] of int: X_INTRODUCED_96 = [1,-2,-2];
array [1..2] of int: X_INTRODUCED_127 = [1,-2];
array [1..4] of int: X_INTRODUCED_158 = [1,-2,-2,-2];
var 1..18: X_INTRODUCED_0;
var 1..18: X_INTRODUCED_1;
var 1..18: X_INTRODUCED_2;
var 1..18: X_INTRODUCED_3;
var 1..18: X_INTRODUCED_4;
var 1..18: X_INTRODUCED_5;
var 1..18: X_INTRODUCED_6;
var 1..18: X_INTRODUCED_7;
var 1..18: X_INTRODUCED_8;
var 1..18: X_INTRODUCED_9;
var 1..18: X_INTRODUCED_10;
var 1..18: X_INTRODUCED_11;
var 1..18: X_INTRODUCED_12;
var 1..18: X_INTRODUCED_13;
var 1..18: X_INTRODUCED_14;
var 1..18: X_INTRODUCED_15;
var 1..18: X_INTRODUCED_16;
var 1..18: X_INTRODUCED_17;
var bool: X_INTRODUCED_55 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_56 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_57 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_58 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_59 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_60 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_61 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_62 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_63 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_64 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_65 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_66 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_67 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_68 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_69 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_70 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_71 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_72 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_73 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_74 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_75 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_76 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_77 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_78 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_80 ::var_is_introduced ;
var bool: X_INTRODUCED_82 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_83 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_84 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_85 ::var_is_introduced :: is_defined_var;
var 1..18: X_INTRODUCED_90 ::var_is_introduced ;
var bool: X_INTRODUCED_91 ::var_is_introduced :: is_defined_var;
var 1..18: X_INTRODUCED_93 ::var_is_introduced ;
var bool: X_INTRODUCED_94 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_95 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_97 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_98 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_99 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_100 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_101 ::var_is_introduced ;
var bool: X_INTRODUCED_102 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_103 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_104 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_105 ::var_is_introduced :: is_defined_var;
var 1..18: X_INTRODUCED_109 ::var_is_introduced ;
var bool: X_INTRODUCED_110 ::var_is_introduced :: is_defined_var;
var 1..18: X_INTRODUCED_112 ::var_is_introduced ;
var bool: X_INTRODUCED_113 ::var_is_introduced :: is_defined_var;
var 1..18: X_INTRODUCED_115 ::var_is_introduced ;
var bool: X_INTRODUCED_116 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_117 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_118 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_119 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_120 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_121 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_122 ::var_is_introduced ;
var bool: X_INTRODUCED_123 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_124 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_126 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_128 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_129 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_130 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_131 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_132 ::var_is_introduced ;
var bool: X_INTRODUCED_133 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_134 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_135 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_136 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_139 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_140 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_141 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_142 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_143 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_144 ::var_is_introduced ;
var bool: X_INTRODUCED_145 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_146 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_147 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_148 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_149 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_150 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_153 ::var_is_introduced :: is_defined_var;
var 1..18: X_INTRODUCED_155 ::var_is_introduced ;
var bool: X_INTRODUCED_156 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_157 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_159 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_160 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_161 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_162 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_163 ::var_is_introduced ;
var bool: X_INTRODUCED_164 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_165 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_166 ::var_is_introduced :: is_defined_var;
var 0..1: X_INTRODUCED_167 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_170 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_171 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_172 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_173 ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_174 ::var_is_introduced :: is_defined_var;
var int: X_INTRODUCED_178 ::var_is_introduced :: is_defined_var;
array [1..18] of var int: interview = [X_INTRODUCED_0,X_INTRODUCED_1,X_INTRODUCED_2,X_INTRODUCED_3,X_INTRODUCED_4,X_INTRODUCED_5,X_INTRODUCED_6,X_INTRODUCED_7,X_INTRODUCED_8,X_INTRODUCED_9,X_INTRODUCED_10,X_INTRODUCED_11,X_INTRODUCED_12,X_INTRODUCED_13,X_INTRODUCED_14,X_INTRODUCED_15,X_INTRODUCED_16,X_INTRODUCED_17];
array [1..18] of var int: order:: output_array([1..18]) = [18,8,17,3,16,7,12,4,15,6,14,5,13,9,1,11,2,10];
array [1..18] of var int: points:: output_array([1..18]) = [X_INTRODUCED_80,X_INTRODUCED_56,X_INTRODUCED_58,X_INTRODUCED_101,X_INTRODUCED_60,X_INTRODUCED_62,X_INTRODUCED_122,X_INTRODUCED_64,X_INTRODUCED_132,X_INTRODUCED_66,X_INTRODUCED_68,X_INTRODUCED_144,X_INTRODUCED_70,X_INTRODUCED_72,X_INTRODUCED_74,X_INTRODUCED_163,X_INTRODUCED_76,X_INTRODUCED_78];
array [1..3] of var int: X_INTRODUCED_89 ::var_is_introduced = [X_INTRODUCED_3,X_INTRODUCED_4,X_INTRODUCED_5];
array [1..4] of var int: X_INTRODUCED_92 ::var_is_introduced = [X_INTRODUCED_11,X_INTRODUCED_12,X_INTRODUCED_13,X_INTRODUCED_14];
array [1..3] of var int: X_INTRODUCED_108 ::var_is_introduced = [X_INTRODUCED_0,X_INTRODUCED_1,X_INTRODUCED_2];
array [1..3] of var int: X_INTRODUCED_114 ::var_is_introduced = [X_INTRODUCED_8,X_INTRODUCED_9,X_INTRODUCED_10];
array [1..3] of var int: X_INTRODUCED_154 ::var_is_introduced = [X_INTRODUCED_15,X_INTRODUCED_16,X_INTRODUCED_17];
constraint inverse(interview,order);
constraint array_int_maximum(X_INTRODUCED_90,X_INTRODUCED_89);
constraint array_int_maximum(X_INTRODUCED_93,X_INTRODUCED_92);
constraint bool_clause([X_INTRODUCED_97],[X_INTRODUCED_95]);
constraint bool_clause([X_INTRODUCED_95,X_INTRODUCED_99],[X_INTRODUCED_98]);
constraint array_bool_or([X_INTRODUCED_95,X_INTRODUCED_98,X_INTRODUCED_100],true);
constraint array_int_maximum(X_INTRODUCED_109,X_INTRODUCED_108);
constraint int_max(X_INTRODUCED_6,X_INTRODUCED_7,X_INTRODUCED_112);
constraint array_int_maximum(X_INTRODUCED_115,X_INTRODUCED_114);
constraint bool_clause([X_INTRODUCED_118],[X_INTRODUCED_117]);
constraint bool_clause([X_INTRODUCED_117,X_INTRODUCED_120],[X_INTRODUCED_119]);
constraint array_bool_or([X_INTRODUCED_117,X_INTRODUCED_119,X_INTRODUCED_121],true);
constraint bool_clause([X_INTRODUCED_128],[X_INTRODUCED_126]);
constraint bool_clause([X_INTRODUCED_126,X_INTRODUCED_130],[X_INTRODUCED_129]);
constraint array_bool_or([X_INTRODUCED_126,X_INTRODUCED_129,X_INTRODUCED_131],true);
constraint bool_clause([X_INTRODUCED_140],[X_INTRODUCED_139]);
constraint bool_clause([X_INTRODUCED_139,X_INTRODUCED_142],[X_INTRODUCED_141]);
constraint array_bool_or([X_INTRODUCED_139,X_INTRODUCED_141,X_INTRODUCED_143],true);
constraint array_int_maximum(X_INTRODUCED_155,X_INTRODUCED_154);
constraint bool_clause([X_INTRODUCED_159],[X_INTRODUCED_157]);
constraint bool_clause([X_INTRODUCED_157,X_INTRODUCED_161],[X_INTRODUCED_160]);
constraint array_bool_or([X_INTRODUCED_157,X_INTRODUCED_160,X_INTRODUCED_162],true);
constraint bool_clause([X_INTRODUCED_171],[X_INTRODUCED_170]);
constraint bool_clause([X_INTRODUCED_170,X_INTRODUCED_173],[X_INTRODUCED_172]);
constraint array_bool_or([X_INTRODUCED_170,X_INTRODUCED_172,X_INTRODUCED_174],true);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_1,X_INTRODUCED_0],-1,X_INTRODUCED_55):: defines_var(X_INTRODUCED_55);
constraint bool2int(X_INTRODUCED_55,X_INTRODUCED_56):: defines_var(X_INTRODUCED_56);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_2,X_INTRODUCED_0],-1,X_INTRODUCED_57):: defines_var(X_INTRODUCED_57);
constraint bool2int(X_INTRODUCED_57,X_INTRODUCED_58):: defines_var(X_INTRODUCED_58);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_4,X_INTRODUCED_3],-1,X_INTRODUCED_59):: defines_var(X_INTRODUCED_59);
constraint bool2int(X_INTRODUCED_59,X_INTRODUCED_60):: defines_var(X_INTRODUCED_60);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_5,X_INTRODUCED_3],-1,X_INTRODUCED_61):: defines_var(X_INTRODUCED_61);
constraint bool2int(X_INTRODUCED_61,X_INTRODUCED_62):: defines_var(X_INTRODUCED_62);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_7,X_INTRODUCED_6],-1,X_INTRODUCED_63):: defines_var(X_INTRODUCED_63);
constraint bool2int(X_INTRODUCED_63,X_INTRODUCED_64):: defines_var(X_INTRODUCED_64);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_9,X_INTRODUCED_8],-1,X_INTRODUCED_65):: defines_var(X_INTRODUCED_65);
constraint bool2int(X_INTRODUCED_65,X_INTRODUCED_66):: defines_var(X_INTRODUCED_66);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_10,X_INTRODUCED_8],-1,X_INTRODUCED_67):: defines_var(X_INTRODUCED_67);
constraint bool2int(X_INTRODUCED_67,X_INTRODUCED_68):: defines_var(X_INTRODUCED_68);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_12,X_INTRODUCED_11],-1,X_INTRODUCED_69):: defines_var(X_INTRODUCED_69);
constraint bool2int(X_INTRODUCED_69,X_INTRODUCED_70):: defines_var(X_INTRODUCED_70);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_13,X_INTRODUCED_11],-1,X_INTRODUCED_71):: defines_var(X_INTRODUCED_71);
constraint bool2int(X_INTRODUCED_71,X_INTRODUCED_72):: defines_var(X_INTRODUCED_72);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_14,X_INTRODUCED_11],-1,X_INTRODUCED_73):: defines_var(X_INTRODUCED_73);
constraint bool2int(X_INTRODUCED_73,X_INTRODUCED_74):: defines_var(X_INTRODUCED_74);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_16,X_INTRODUCED_15],-1,X_INTRODUCED_75):: defines_var(X_INTRODUCED_75);
constraint bool2int(X_INTRODUCED_75,X_INTRODUCED_76):: defines_var(X_INTRODUCED_76);
constraint int_lin_le_reif(X_INTRODUCED_54,[X_INTRODUCED_17,X_INTRODUCED_15],-1,X_INTRODUCED_77):: defines_var(X_INTRODUCED_77);
constraint bool2int(X_INTRODUCED_77,X_INTRODUCED_78):: defines_var(X_INTRODUCED_78);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_1,X_INTRODUCED_0],-1,X_INTRODUCED_82):: defines_var(X_INTRODUCED_82);
constraint bool2int(X_INTRODUCED_82,X_INTRODUCED_83):: defines_var(X_INTRODUCED_83);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_2,X_INTRODUCED_0],-1,X_INTRODUCED_84):: defines_var(X_INTRODUCED_84);
constraint bool2int(X_INTRODUCED_84,X_INTRODUCED_85):: defines_var(X_INTRODUCED_85);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_0,X_INTRODUCED_90],-1,X_INTRODUCED_91):: defines_var(X_INTRODUCED_91);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_0,X_INTRODUCED_93],-1,X_INTRODUCED_94):: defines_var(X_INTRODUCED_94);
constraint array_bool_or([X_INTRODUCED_91,X_INTRODUCED_94],X_INTRODUCED_95):: defines_var(X_INTRODUCED_95);
constraint int_lin_eq_reif(X_INTRODUCED_96,[X_INTRODUCED_80,X_INTRODUCED_83,X_INTRODUCED_85],3,X_INTRODUCED_97):: defines_var(X_INTRODUCED_97);
constraint int_le_reif(X_INTRODUCED_0,8,X_INTRODUCED_98):: defines_var(X_INTRODUCED_98);
constraint int_eq_reif(X_INTRODUCED_80,3,X_INTRODUCED_99):: defines_var(X_INTRODUCED_99);
constraint int_eq_reif(X_INTRODUCED_80,0,X_INTRODUCED_100):: defines_var(X_INTRODUCED_100);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_4,X_INTRODUCED_3],-1,X_INTRODUCED_102):: defines_var(X_INTRODUCED_102);
constraint bool2int(X_INTRODUCED_102,X_INTRODUCED_103):: defines_var(X_INTRODUCED_103);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_5,X_INTRODUCED_3],-1,X_INTRODUCED_104):: defines_var(X_INTRODUCED_104);
constraint bool2int(X_INTRODUCED_104,X_INTRODUCED_105):: defines_var(X_INTRODUCED_105);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_3,X_INTRODUCED_109],-1,X_INTRODUCED_110):: defines_var(X_INTRODUCED_110);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_3,X_INTRODUCED_112],-1,X_INTRODUCED_113):: defines_var(X_INTRODUCED_113);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_3,X_INTRODUCED_115],-1,X_INTRODUCED_116):: defines_var(X_INTRODUCED_116);
constraint array_bool_or([X_INTRODUCED_110,X_INTRODUCED_113,X_INTRODUCED_116],X_INTRODUCED_117):: defines_var(X_INTRODUCED_117);
constraint int_lin_eq_reif(X_INTRODUCED_96,[X_INTRODUCED_101,X_INTRODUCED_103,X_INTRODUCED_105],3,X_INTRODUCED_118):: defines_var(X_INTRODUCED_118);
constraint int_le_reif(X_INTRODUCED_3,8,X_INTRODUCED_119):: defines_var(X_INTRODUCED_119);
constraint int_eq_reif(X_INTRODUCED_101,3,X_INTRODUCED_120):: defines_var(X_INTRODUCED_120);
constraint int_eq_reif(X_INTRODUCED_101,0,X_INTRODUCED_121):: defines_var(X_INTRODUCED_121);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_7,X_INTRODUCED_6],-1,X_INTRODUCED_123):: defines_var(X_INTRODUCED_123);
constraint bool2int(X_INTRODUCED_123,X_INTRODUCED_124):: defines_var(X_INTRODUCED_124);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_6,X_INTRODUCED_90],-1,X_INTRODUCED_126):: defines_var(X_INTRODUCED_126);
constraint int_lin_eq_reif(X_INTRODUCED_127,[X_INTRODUCED_122,X_INTRODUCED_124],3,X_INTRODUCED_128):: defines_var(X_INTRODUCED_128);
constraint int_le_reif(X_INTRODUCED_6,8,X_INTRODUCED_129):: defines_var(X_INTRODUCED_129);
constraint int_eq_reif(X_INTRODUCED_122,3,X_INTRODUCED_130):: defines_var(X_INTRODUCED_130);
constraint int_eq_reif(X_INTRODUCED_122,0,X_INTRODUCED_131):: defines_var(X_INTRODUCED_131);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_9,X_INTRODUCED_8],-1,X_INTRODUCED_133):: defines_var(X_INTRODUCED_133);
constraint bool2int(X_INTRODUCED_133,X_INTRODUCED_134):: defines_var(X_INTRODUCED_134);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_10,X_INTRODUCED_8],-1,X_INTRODUCED_135):: defines_var(X_INTRODUCED_135);
constraint bool2int(X_INTRODUCED_135,X_INTRODUCED_136):: defines_var(X_INTRODUCED_136);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_8,X_INTRODUCED_90],-1,X_INTRODUCED_139):: defines_var(X_INTRODUCED_139);
constraint int_lin_eq_reif(X_INTRODUCED_96,[X_INTRODUCED_132,X_INTRODUCED_134,X_INTRODUCED_136],3,X_INTRODUCED_140):: defines_var(X_INTRODUCED_140);
constraint int_le_reif(X_INTRODUCED_8,8,X_INTRODUCED_141):: defines_var(X_INTRODUCED_141);
constraint int_eq_reif(X_INTRODUCED_132,3,X_INTRODUCED_142):: defines_var(X_INTRODUCED_142);
constraint int_eq_reif(X_INTRODUCED_132,0,X_INTRODUCED_143):: defines_var(X_INTRODUCED_143);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_12,X_INTRODUCED_11],-1,X_INTRODUCED_145):: defines_var(X_INTRODUCED_145);
constraint bool2int(X_INTRODUCED_145,X_INTRODUCED_146):: defines_var(X_INTRODUCED_146);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_13,X_INTRODUCED_11],-1,X_INTRODUCED_147):: defines_var(X_INTRODUCED_147);
constraint bool2int(X_INTRODUCED_147,X_INTRODUCED_148):: defines_var(X_INTRODUCED_148);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_14,X_INTRODUCED_11],-1,X_INTRODUCED_149):: defines_var(X_INTRODUCED_149);
constraint bool2int(X_INTRODUCED_149,X_INTRODUCED_150):: defines_var(X_INTRODUCED_150);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_11,X_INTRODUCED_109],-1,X_INTRODUCED_153):: defines_var(X_INTRODUCED_153);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_11,X_INTRODUCED_155],-1,X_INTRODUCED_156):: defines_var(X_INTRODUCED_156);
constraint array_bool_or([X_INTRODUCED_153,X_INTRODUCED_156],X_INTRODUCED_157):: defines_var(X_INTRODUCED_157);
constraint int_lin_eq_reif(X_INTRODUCED_158,[X_INTRODUCED_144,X_INTRODUCED_146,X_INTRODUCED_148,X_INTRODUCED_150],3,X_INTRODUCED_159):: defines_var(X_INTRODUCED_159);
constraint int_le_reif(X_INTRODUCED_11,8,X_INTRODUCED_160):: defines_var(X_INTRODUCED_160);
constraint int_eq_reif(X_INTRODUCED_144,3,X_INTRODUCED_161):: defines_var(X_INTRODUCED_161);
constraint int_eq_reif(X_INTRODUCED_144,0,X_INTRODUCED_162):: defines_var(X_INTRODUCED_162);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_16,X_INTRODUCED_15],-1,X_INTRODUCED_164):: defines_var(X_INTRODUCED_164);
constraint bool2int(X_INTRODUCED_164,X_INTRODUCED_165):: defines_var(X_INTRODUCED_165);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_17,X_INTRODUCED_15],-1,X_INTRODUCED_166):: defines_var(X_INTRODUCED_166);
constraint bool2int(X_INTRODUCED_166,X_INTRODUCED_167):: defines_var(X_INTRODUCED_167);
constraint int_lin_le_reif(X_INTRODUCED_81,[X_INTRODUCED_15,X_INTRODUCED_93],-1,X_INTRODUCED_170):: defines_var(X_INTRODUCED_170);
constraint int_lin_eq_reif(X_INTRODUCED_96,[X_INTRODUCED_163,X_INTRODUCED_165,X_INTRODUCED_167],3,X_INTRODUCED_171):: defines_var(X_INTRODUCED_171);
constraint int_le_reif(X_INTRODUCED_15,8,X_INTRODUCED_172):: defines_var(X_INTRODUCED_172);
constraint int_eq_reif(X_INTRODUCED_163,3,X_INTRODUCED_173):: defines_var(X_INTRODUCED_173);
constraint int_eq_reif(X_INTRODUCED_163,0,X_INTRODUCED_174):: defines_var(X_INTRODUCED_174);
constraint int_lin_eq([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1],[X_INTRODUCED_80,X_INTRODUCED_56,X_INTRODUCED_58,X_INTRODUCED_101,X_INTRODUCED_60,X_INTRODUCED_62,X_INTRODUCED_122,X_INTRODUCED_64,X_INTRODUCED_132,X_INTRODUCED_66,X_INTRODUCED_68,X_INTRODUCED_144,X_INTRODUCED_70,X_INTRODUCED_72,X_INTRODUCED_74,X_INTRODUCED_163,X_INTRODUCED_76,X_INTRODUCED_78,X_INTRODUCED_178],0):: defines_var(X_INTRODUCED_178);
solve maximize X_INTRODUCED_178;

View File

@@ -1,36 +0,0 @@
#include "ortools/base/commandlineflags.h"
#include "ortools/base/logging.h"
#include "ortools/linear_solver/linear_solver.h"
namespace operations_research {
void SolveLP() {
// Create the linear solver with the GLOP backend.
std::unique_ptr<MPSolver> solver(MPSolver::CreateSolver("CBC"));
if (!solver) {
return;
}
const double kInfinity = solver->infinity();
MPVariable* const x = solver->MakeNumVar(-kInfinity, kInfinity, "x");
MPObjective* const objective = solver->MutableObjective();
objective->SetMaximization();
objective->SetCoefficient(x, 1);
MPConstraint* const constraint = solver->MakeRowConstraint(0, 5);
constraint->SetCoefficient(x, 1);
solver->Solve();
}
void BreakLoop() {
for (int i = 0; i < 500; i++) {
SolveLP();
}
}
} // namespace operations_research
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
operations_research::BreakLoop();
return 0;
}

View File

@@ -1,60 +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.
using System;
using System.Collections.Generic;
using Google.OrTools.ConstraintSolver;
public class Issue18
{
public static void NewSearchTest()
{
Solver solver = new Google.OrTools.ConstraintSolver.Solver("p");
// creating dummy variables
List<IntVar> vars = new List<IntVar>();
for (int i = 0; i < 100000; i++)
{
vars.Add(solver.MakeIntVar(0, 1));
}
IntExpr globalSum = solver.MakeSum(vars.ToArray());
DecisionBuilder db = solver.MakePhase(vars.ToArray(), Google.OrTools.ConstraintSolver.Solver.INT_VAR_SIMPLE,
Google.OrTools.ConstraintSolver.Solver.INT_VALUE_SIMPLE);
solver.NewSearch(db, new OptimizeVar(solver, true, globalSum.Var(), 100));
// force Garbage Collector
GC.Collect();
GC.WaitForPendingFinalizers();
// Try to read all solutions
int count = 0;
while (solver.NextSolution())
{
count++;
Console.WriteLine("solution " + count + " found");
// Console.WriteLine("solution " + globalSum.Var().Value());
if (count > 10)
{
break;
}
}
Console.WriteLine("Solutions: " + count);
}
static void Main()
{
NewSearchTest();
}
}

View File

@@ -1,42 +0,0 @@
#!/usr/bin/env python3
from ortools.constraint_solver import pywrapcp
# Control-C test. Hit Control-C during execution of this program.
def main():
solver = pywrapcp.Solver("time limit test")
n = 10
x = [solver.IntVar(1, n, "x[%i]" % i) for i in range(n)]
solver.Add(solver.AllDifferent(x, True))
solution = solver.Assignment()
solution.Add(x)
db = solver.Phase(x,
solver.CHOOSE_FIRST_UNBOUND,
solver.ASSIGN_MIN_VALUE)
time_limit = 2000
branch_limit = 100000000
failures_limit = 100000000
solutions_limit = 10000000
limits = (
solver.Limit(
time_limit, branch_limit, failures_limit, solutions_limit, True))
search_log = solver.SearchLog(1000)
assignment = solver.Assignment()
assignment.Add(x)
collector = solver.LastSolutionCollector(assignment)
try:
solver.Solve(db, [limits, search_log, collector])
except KeyboardInterrupt:
print("Control-C caught")
print("failures:", solver.Failures())
print("branches:", solver.Branches())
print("wall_time:", solver.WallTime())
if __name__ == "__main__":
main()

View File

@@ -1,84 +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.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using Google.OrTools.ConstraintSolver;
public class Issue22Test
{
private static long Solve(long num_buses_check = 0)
{
ConstraintSolverParameters sPrm = Solver.DefaultSolverParameters();
sPrm.CompressTrail = 0;
Solver solver = new Solver("OrTools", sPrm);
// this works
// IntVar[,] x = solver.MakeIntVarMatrix(2,2, new int[] {-2,0,1,2}, "x");
// this doesn't work
IntVar[,] x = solver.MakeIntVarMatrix(2, 2, new int[] { 0, 1, 2 }, "x");
for (int w = 0; w < 2; w++)
{
IntVar[] b = new IntVar[2];
for (int i = 0; i < 2; i++)
{
b[i] = solver.MakeIsEqualCstVar(x[w, i], 0);
}
solver.Add(solver.MakeSumGreaterOrEqual(b, 2));
}
IntVar[] x_flat = x.Flatten();
DecisionBuilder db = solver.MakePhase(x_flat, Solver.CHOOSE_FIRST_UNBOUND, Solver.ASSIGN_MIN_VALUE);
solver.NewSearch(db);
while (solver.NextSolution())
{
Console.WriteLine("x: ");
for (int j = 0; j < 2; j++)
{
Console.Write("worker" + (j + 1).ToString() + ":");
for (int i = 0; i < 2; i++)
{
Console.Write(" {0,2} ", x[j, i].Value());
}
Console.Write("\n");
}
Console.WriteLine("End at---->" + DateTime.Now);
}
Console.WriteLine("\nSolutions: {0}", solver.Solutions());
Console.WriteLine("WallTime: {0}ms", solver.WallTime());
Console.WriteLine("Failures: {0}", solver.Failures());
Console.WriteLine("Branches: {0} ", solver.Branches());
solver.EndSearch();
return 1;
}
public static void InitialPropagateTest()
{
Console.WriteLine("Check for minimum number of buses: ");
long num_buses = Solve();
Console.WriteLine("\n... got {0} as minimal value.", num_buses);
Console.WriteLine("\nAll solutions: ", num_buses);
}
static void Main()
{
InitialPropagateTest();
}
}

View File

@@ -1,74 +0,0 @@
#!/usr/bin/env python3
# Copyright 2010 Pierre Schaus pschaus@gmail.com
#
# 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.
from ortools.constraint_solver import pywrapcp
from time import time
from random import randint
#----------------helper for binpacking posting----------------
def binpacking(cp, binvars, weights, loadvars):
"""post the connstraints forall j: loadvars[j] == sum_i (binvars[i] == j) * weights[i])"""
nbins = len(loadvars)
nitems = len(binvars)
for j in range(nbins):
b = [cp.BoolVar(str(i)) for i in range(nitems)]
for i in range(nitems):
cp.Add(cp.IsEqualCstCt(binvars[i], j, b[i]))
cp.Add(solver.Sum([b[i] * weights[i] for i in range(nitems)]) == l[j])
cp.Add(solver.Sum(loadvars) == sum(weights))
#------------------------------data reading-------------------
maxcapa = 44
weights = [4, 22, 9, 5, 8, 3, 3, 4, 7, 7, 3]
loss = [
0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 0, 2, 1, 0, 0, 0, 0, 2, 1, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 3, 2, 1, 0, 2, 1, 0, 0, 0]
nbslab = 11
#------------------solver and variable declaration-------------
solver = pywrapcp.Solver('Steel Mill Slab')
x = [solver.IntVar(0, nbslab-1, 'x' + str(i)) for i in range(nbslab)]
l = [solver.IntVar(0, maxcapa, 'l' + str(i)) for i in range(nbslab)]
obj = solver.IntVar(0, nbslab * maxcapa, 'obj')
#-------------------post of the constraints--------------
binpacking(solver, x, weights[:nbslab], l)
solver.Add(solver.Sum([solver.Element(loss, l[s])
for s in range(nbslab)]) == obj)
sol = [2, 0, 0, 0, 0, 1, 2, 2, 1, 1, 2]
#------------start the search and optimization-----------
objective = solver.Minimize(obj, 1)
db = solver.Phase(x, solver.INT_VAR_DEFAULT,
solver.INT_VALUE_DEFAULT)
# solver.NewSearch(db,[objective]) #segfault if I comment this
while solver.NextSolution():
print(obj, 'check:', sum([loss[l[s].Min()] for s in range(nbslab)]))
print(l)
solver.EndSearch()
print('#fails: ', solver.Failures())
print('time: ', solver.WallTime())

View File

@@ -1,676 +0,0 @@
// Authors: Johan Wessén
// 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.
using Google.OrTools.ConstraintSolver;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
public class Task
{
public int Id { get; private set; }
public int TaskType { get; private set; }
public int LocationId { get; private set; }
public Dictionary<int, int> Durations { get; private set; }
public int TaskPosition { get; private set; }
public Task(int id, int taskType, int locationIndex, int taskPosition, Dictionary<int, int> durations)
{
Id = id;
TaskType = taskType;
LocationId = locationIndex;
Durations = durations;
TaskPosition = taskPosition;
}
public Task(int id, int taskType, int locationIndex, int taskPosition)
{
Id = id;
TaskType = taskType;
LocationId = locationIndex;
TaskPosition = taskPosition;
Durations = new Dictionary<int, int>();
}
}
public class WorkLocation
{
public int Id { get; private set; }
public int NbTasks
{
get {
Debug.Assert(Tasks != null);
return Tasks.Length;
}
set {
Debug.Assert(Tasks == null);
Tasks = new Task[value];
}
}
public Task[] Tasks { get; private set; }
public WorkLocation(int index)
{
Id = index;
}
}
public class Tool
{
public int Id { get; private set; }
public HashSet<int> TaskTypes { get; set; }
public int[,] TravellingTime { get; set; }
public int InitialLocationId { get; set; }
public Tool(int index, int initialLocation = 0)
{
Id = index;
InitialLocationId = initialLocation;
TaskTypes = new HashSet<int>();
}
public void AddTaskType(int t)
{
TaskTypes.Add(t);
}
public bool CanPerformTaskType(int taskType)
{
return TaskTypes.Contains(taskType);
}
}
public class FactoryDescription
{
public Tool[] Tools { get; private set; }
public WorkLocation[] Locations { get; private set; }
public int NbWorkLocations
{
get {
return Locations.Length;
}
}
public int NbTools
{
get {
return Tools.Length;
}
}
public int NbTaskPerCycle { get; private set; }
// TaskType go typically from 0 to 6. InspectionType indicates which
// is the TaskType that correspond to Inspection.
public int Inspection { get; private set; }
// All the time within the schedule horizon in which the blast can start.
public long[] InspectionStarts { get; private set; }
public int Horizon { get; private set; }
// horizon equal to 2 weeks (in minutes).
public FactoryDescription(int nbTools, int nbLocations, int nbTaskPerCycle, int horizon = 14 * 24 * 60)
{
Debug.Assert(nbTools > 0);
Debug.Assert(nbLocations > 0);
Debug.Assert(nbTaskPerCycle > 0);
Debug.Assert(horizon > 0);
NbTaskPerCycle = nbTaskPerCycle;
Inspection = NbTaskPerCycle - 1;
Tools = new Tool[nbTools];
Horizon = horizon;
for (int i = 0; i < nbTools; i++)
Tools[i] = new Tool(i);
Locations = new WorkLocation[nbLocations];
for (int i = 0; i < nbLocations; i++)
Locations[i] = new WorkLocation(i);
InspectionStarts = new long[] { -1, 600, 1200, 1800, 2400, 2800 };
}
public Tool[] getToolPerTaskType(int taskType)
{
var elements = from tool in Tools
where tool.CanPerformTaskType(taskType) select tool;
return elements.ToArray();
}
public Task[] getFlatTaskList()
{
return (from location in Locations from task in location.Tasks orderby task.Id select task).ToArray();
}
public int[] getTaskTypes()
{
return (from location in Locations from task in location.Tasks select task.TaskType).Distinct().ToArray();
}
// TODO: This should be enhanced
public void SanityCheck()
{
foreach (Tool tool in Tools)
{
Debug.Assert(tool.TravellingTime.GetLength(0) == NbWorkLocations);
Debug.Assert(tool.TravellingTime.GetLength(1) == NbWorkLocations);
for (int i = 0; i < NbWorkLocations; i++)
Debug.Assert(tool.TravellingTime[i, i] == 0);
}
}
}
interface DataReader
{
FactoryDescription FetchData();
}
public class SmallSyntheticData : DataReader
{
public SmallSyntheticData()
{
}
public FactoryDescription FetchData()
{
// deterministic seed for result reproducibility
Random randomDuration = new Random(2);
// FactoryDescription(nbTools, nblocations, nbTasks per cycle)
FactoryDescription factoryDescription = new FactoryDescription(5, 4, 3);
// Travelling time and distance are temporarily identical and they
// are no different for different tools
int[,] travellingTime = new int[factoryDescription.NbWorkLocations, factoryDescription.NbWorkLocations];
for (int i = 0; i < travellingTime.GetLength(0); i++)
{
for (int j = 0; j < travellingTime.GetLength(1); j++)
{
if (i == j)
travellingTime[i, j] = 0;
else
travellingTime[i, j] = (5 * Math.Abs(i - j)) * 10;
}
}
factoryDescription.Tools[0].AddTaskType(0);
factoryDescription.Tools[1].AddTaskType(0);
factoryDescription.Tools[2].AddTaskType(1);
factoryDescription.Tools[3].AddTaskType(1);
factoryDescription.Tools[4].AddTaskType(2);
factoryDescription.Tools[1].AddTaskType(1);
foreach (Tool tool in factoryDescription.Tools)
tool.TravellingTime = travellingTime;
int c = 0;
int nbCyclePerWorkLocation = 2;
int[] boll = new int[100];
for (int i = 0; i < factoryDescription.NbWorkLocations; i++)
{
factoryDescription.Locations[i].NbTasks = nbCyclePerWorkLocation * factoryDescription.NbTaskPerCycle;
for (int j = 0; j < nbCyclePerWorkLocation; j++)
{
for (int k = 0; k < factoryDescription.NbTaskPerCycle; k++)
{
Task t = new Task(c, k, i, k + j * factoryDescription.NbTaskPerCycle);
// Filling in tool-dependent durations
Tool[] compatibleTools = factoryDescription.getToolPerTaskType(k);
foreach (Tool tool in compatibleTools)
{
boll[c] = randomDuration.Next(13, 17) * 10;
;
t.Durations[tool.Id] = boll[c];
}
factoryDescription.Locations[i].Tasks[t.TaskPosition] = t;
c++;
}
}
}
factoryDescription.SanityCheck();
return factoryDescription;
}
}
public class RandomSelectToolHeuristic : NetDecisionBuilder
{
private FactoryScheduling factoryScheduling;
private Random rnd;
public RandomSelectToolHeuristic(FactoryScheduling factoryScheduling, int seed)
{
this.factoryScheduling = factoryScheduling;
// deterministic seed for result reproducibility
this.rnd = new Random(seed);
}
public override Decision Next(Solver solver)
{
foreach (IntVar var in factoryScheduling.SelectedTool)
{
if (!var.Bound())
{
int min = (int)var.Min();
int max = (int)var.Max();
int rndVal = rnd.Next(min, max + 1);
while (!var.Contains(rndVal))
rndVal = rnd.Next(min, max + 1);
return solver.MakeAssignVariableValue(var, rndVal);
}
}
return null;
}
}
class TaskAlternative
{
public Task Task { get; private set; }
public IntVar ToolVar { get; set; }
public List<IntervalVar> Intervals { get; private set; }
public TaskAlternative(Task t)
{
Task = t;
Intervals = new List<IntervalVar>();
}
}
public class FactoryScheduling
{
private FactoryDescription factoryData;
private Solver solver;
private Task[] tasks;
private int[] taskTypes;
/* Flat list of all the tasks */
private TaskAlternative[] taskStructures;
/* Task per WorkLocation: location2Task[d][i]: the i-th task of the
* d-th location */
private TaskAlternative[][] location2Task;
/* Task per Tool: tool2Task[t][i]: the i-th task of the t-th tool.
Note that it does NOT imply that the it will be the i-th
executed. In other words, it should be considered as an unordered
set. Furthermore, tool2Task[t][i] can also be *unperformed* */
private List<IntervalVar>[] tool2Task;
/* All the transition times for the tools.
tool2TransitionTimes[t][i]: the transition time of the t-th tool
from the i-th task to the next */
private List<IntVar>[] tool2TransitionTimes;
/* Map between the interval var of a tool to its related task id.
toolIntervalVar2TaskId[t][k] = i: in the t-th tool, the k-th
interval var correspond to tasks[i] */
private List<int>[] toolIntervalVar2TaskId;
/* Tools per task type: taskType2Tool[tt][t]: the t-th tool capable
* of doing the tt-th task type */
private List<Tool>[] taskType2Tool;
/* For each task which tools is performed upon */
private List<IntVar> selectedTool;
public List<IntVar> SelectedTool
{
get {
return selectedTool;
}
}
/* Sequence of task for each tool */
private SequenceVar[] allToolSequences;
public SequenceVar[] AllToolSequences
{
get {
return allToolSequences;
}
}
/* Makespan var */
private IntVar makespan;
/* Objective */
private OptimizeVar objective;
/* maximum horizon */
private int horizon;
/* Start & End times of IntervalVars*/
IntVar[][] startingTimes;
IntVar[][] endTimes;
public FactoryScheduling(FactoryDescription data)
{
factoryData = data;
}
private void Init()
{
horizon = factoryData.Horizon;
solver = new Solver("Factory Scheduling");
tasks = factoryData.getFlatTaskList();
taskTypes = factoryData.getTaskTypes();
taskStructures = new TaskAlternative[tasks.Length];
location2Task = new TaskAlternative[factoryData.NbWorkLocations][];
tool2Task = new List<IntervalVar>[factoryData.NbTools];
toolIntervalVar2TaskId = new List<int>[factoryData.NbTools];
tool2TransitionTimes = new List<IntVar>[factoryData.NbTools];
taskType2Tool = new List<Tool>[taskTypes.Length];
selectedTool = new List<IntVar>();
for (int tt = 0; tt < taskTypes.Length; tt++)
taskType2Tool[tt] = new List<Tool>();
foreach (Tool tool in factoryData.Tools)
foreach (int taskType in tool.TaskTypes)
taskType2Tool[taskType].Add(tool);
for (int d = 0; d < factoryData.NbWorkLocations; d++)
location2Task[d] = new TaskAlternative[factoryData.Locations[d].NbTasks];
for (int t = 0; t < factoryData.NbTools; t++)
{
tool2Task[t] = new List<IntervalVar>();
toolIntervalVar2TaskId[t] = new List<int>();
tool2TransitionTimes[t] = new List<IntVar>();
}
allToolSequences = new SequenceVar[factoryData.NbTools - 1];
startingTimes = new IntVar[factoryData.NbTools - 1][];
endTimes = new IntVar[factoryData.NbTools - 1][];
}
private void PostTransitionTimeConstraints(int t, bool postTransitionsConstraint = true)
{
Tool tool = factoryData.Tools[t];
// if it is a inspection, we make sure there are no transitiontimes
if (tool.CanPerformTaskType(factoryData.Inspection))
tool2TransitionTimes[t].Add(null);
else
{
int[,] tt = tool.TravellingTime;
SequenceVar seq = allToolSequences[t];
long s = seq.Size();
IntVar[] nextLocation = new IntVar[s + 1];
// The seq.Next(i) represents the task performed after the i-th
// task in the sequence seq.Next(0) represents the first task
// performed for extracting travelling times we need to get the
// related location In case a task is not performed (seq.Next(i)
// == i), i.e. it's pointing to itself The last performed task
// (or pre-start task, if no tasks are performed) will have
// seq.Next(i) == s + 1 therefore we add a virtual location
// whose travelling time is equal to 0
//
// NOTE: The index of a SequenceVar are 0..n, but the domain
// range is 1..(n+1), this is due to that the start node = 0 is
// a dummy node, and the node where seq.Next(i) == n+1 is the
// end node
// Extra elements for the unreachable start node (0), and the
// end node whose next task takes place in a virtual location
int[] taskIndex2locationId = new int[s + 2];
taskIndex2locationId[0] = -10;
for (int i = 0; i < s; i++)
taskIndex2locationId[i + 1] = tasks[toolIntervalVar2TaskId[t][i]].LocationId;
// this is the virtual location for unperformed tasks
taskIndex2locationId[s + 1] = factoryData.NbWorkLocations;
// Build the travelling time matrix with the additional virtual location
int[][] ttWithVirtualLocation = new int [factoryData.NbWorkLocations + 1][];
for (int d1 = 0; d1 < ttWithVirtualLocation.Length; d1++)
{
ttWithVirtualLocation[d1] = new int[factoryData.NbWorkLocations + 1];
for (int d2 = 0; d2 < ttWithVirtualLocation.Length; d2++)
if (d1 == factoryData.NbWorkLocations)
{
ttWithVirtualLocation[d1][d2] = 0;
}
else
{
ttWithVirtualLocation[d1][d2] = (d2 == factoryData.NbWorkLocations) ? 0 : tt[d1, d2];
}
}
for (int i = 0; i < nextLocation.Length; i++)
{
// this is the next-location associated with the i-th task
nextLocation[i] = solver.MakeElement(taskIndex2locationId, seq.Next(i)).Var();
int d = (i == 0) ? tool.InitialLocationId : tasks[toolIntervalVar2TaskId[t][i - 1]].LocationId;
if (i == 0)
{
// To be changed - right now we don't have meaningful indata
// of previous location Ugly way of setting initial travel
// time to = 0, as this is how we find common grounds
// between benchmark algorithm and this
tool2TransitionTimes[t].Add(
solver.MakeElement(new int[ttWithVirtualLocation[d].Length], nextLocation[i]).Var());
}
else
{
tool2TransitionTimes[t].Add(solver.MakeElement(ttWithVirtualLocation[d], nextLocation[i]).Var());
}
}
// Extra elements for the unreachable start node (0), and the
// end node whose next task takes place in a virtual location
startingTimes[t] = new IntVar[s + 2];
endTimes[t] = new IntVar[s + 2];
startingTimes[t][0] = solver.MakeIntConst(0);
// Tbd: Set this endtime to the estimated time of finishing
// previous task for the current tool
endTimes[t][0] = solver.MakeIntConst(0);
for (int i = 0; i < s; i++)
{
startingTimes[t][i + 1] = tool2Task[t][i].SafeStartExpr(-1).Var();
endTimes[t][i + 1] = tool2Task[t][i].SafeEndExpr(-1).Var();
}
startingTimes[t][s + 1] = solver.MakeIntConst(factoryData.Horizon);
endTimes[t][s + 1] = solver.MakeIntConst(factoryData.Horizon);
// Enforce (or not) that each task is separated by the
// transition time to the next task
for (int i = 0; i < nextLocation.Length; i++)
{
IntVar nextStart = solver.MakeElement(startingTimes[t], seq.Next(i).Var()).Var();
if (postTransitionsConstraint)
solver.Add(endTimes[t][i] + tool2TransitionTimes[t][i] <= nextStart);
}
}
}
private void Model()
{
/* Building basic task data structures */
for (int i = 0; i < tasks.Length; i++)
{
/* Create a new set of possible IntervalVars & IntVar to decide
* which one (and only 1) is performed */
taskStructures[i] = new TaskAlternative(tasks[i]);
/* Container to use when posting constraints */
location2Task[tasks[i].LocationId][tasks[i].TaskPosition] = taskStructures[i];
/* Get task type */
int taskType = tasks[i].TaskType;
/* Possible tool for this task */
List<Tool> tools = taskType2Tool[taskType];
bool optional = tools.Count > 1;
/* List of boolean variables. If performedOnTool[t] == true then
* the task is performed on tool t */
List<IntVar> performedOnTool = new List<IntVar>();
for (int t = 0; t < tools.Count; t++)
{
/* Creating an IntervalVar. If tools.Count > 1 the intervalVar
* is *OPTIONAL* */
int toolId = tools[t].Id;
Debug.Assert(tasks[i].Durations.ContainsKey(toolId));
int duration = tasks[i].Durations[toolId];
string name = "J " + tasks[i].Id + " [" + toolId + "]";
IntervalVar intervalVar;
if (taskType == factoryData.Inspection)
{
/* We set a 0 time if the task is an inspection */
duration = 0;
intervalVar = solver.MakeFixedDurationIntervalVar(0, horizon, duration, optional, name);
IntVar start = intervalVar.SafeStartExpr(-1).Var();
intervalVar.SafeStartExpr(-1).Var().SetValues(factoryData.InspectionStarts);
}
else
{
intervalVar = solver.MakeFixedDurationIntervalVar(0, horizon, duration, optional, name);
}
taskStructures[i].Intervals.Add(intervalVar);
tool2Task[toolId].Add(intervalVar);
toolIntervalVar2TaskId[toolId].Add(i);
/* Collecting all the bool vars, even if they are optional */
performedOnTool.Add(intervalVar.PerformedExpr().Var());
}
/* Linking the bool var to a single integer variable: */
/* if alternativeToolVar == t <=> performedOnTool[t] == true */
string alternativeName = "J " + tasks[i].Id;
IntVar alternativeToolVar = solver.MakeIntVar(0, tools.Count - 1, alternativeName);
taskStructures[i].ToolVar = alternativeToolVar;
solver.Add(solver.MakeMapDomain(alternativeToolVar, performedOnTool.ToArray()));
Debug.Assert(performedOnTool.ToArray().Length == alternativeToolVar.Max() + 1);
selectedTool.Add(alternativeToolVar);
}
/* Creates precedences on a work Location in order to enforce a
* fully ordered set within the same location
*/
for (int d = 0; d < location2Task.Length; d++)
{
for (int i = 0; i < location2Task[d].Length - 1; i++)
{
TaskAlternative task1 = location2Task[d][i];
TaskAlternative task2 = location2Task[d][i + 1];
/* task1 must end before task2 starts */
/* Adding precedence for each possible alternative pair */
for (int t1 = 0; t1 < task1.Intervals.Count(); t1++)
{
IntervalVar task1Alternative = task1.Intervals[t1];
for (int t2 = 0; t2 < task2.Intervals.Count(); t2++)
{
IntervalVar task2Alternative = task2.Intervals[t2];
Constraint precedence =
solver.MakeIntervalVarRelation(task2Alternative, Solver.STARTS_AFTER_END, task1Alternative);
solver.Add(precedence);
}
}
}
}
/* Adds disjunctive constraints on unary resources, and creates
* sequence variables. */
for (int t = 0; t < factoryData.NbTools; t++)
{
string name = "Tool " + t;
if (!factoryData.Tools[t].CanPerformTaskType(factoryData.Inspection))
{
DisjunctiveConstraint ct = solver.MakeDisjunctiveConstraint(tool2Task[t].ToArray(), name);
solver.Add(ct);
allToolSequences[t] = ct.SequenceVar();
}
PostTransitionTimeConstraints(t, true);
}
/* Collecting all tasks end for makespan objective function */
List<IntVar> intervalEnds = new List<IntVar>();
for (int i = 0; i < tasks.Length; i++)
foreach (IntervalVar var in taskStructures[i].Intervals)
intervalEnds.Add(var.SafeEndExpr(-1).Var());
/* Objective: minimize the makespan (maximum end times of all tasks) */
makespan = solver.MakeMax(intervalEnds.ToArray()).Var();
objective = solver.MakeMinimize(makespan, 1);
}
private void Search()
{
int seed = 2; // This is a good seed to show the crash
/* Assigning first tools */
DecisionBuilder myToolAssignmentPhase = new RandomSelectToolHeuristic(this, seed);
/* Ranking of the tools */
DecisionBuilder sequencingPhase = solver.MakePhase(allToolSequences, Solver.SEQUENCE_DEFAULT);
/* Then fixing time of tasks as early as possible */
DecisionBuilder timingPhase = solver.MakePhase(makespan, Solver.CHOOSE_FIRST_UNBOUND, Solver.ASSIGN_MIN_VALUE);
/* Overall phase */
DecisionBuilder mainPhase = solver.Compose(myToolAssignmentPhase, sequencingPhase, timingPhase);
/* Logging */
const int logFrequency = 1000000;
SearchMonitor searchLog = solver.MakeSearchLog(logFrequency, objective);
/* Restarts */
SearchMonitor searchRestart = solver.MakeLubyRestart(100);
/* Search Limit in ms */
SearchLimit limit = solver.MakeTimeLimit(180 * 1000);
/* Collecting best solution */
SolutionCollector collector = solver.MakeLastSolutionCollector();
collector.AddObjective(makespan);
// collector.Add( pile.ToArray() );
solver.NewSearch(mainPhase, searchLog, searchRestart, objective, limit);
while (solver.NextSolution())
{
Console.WriteLine("MAKESPAN: " + makespan.Value());
}
}
public void Solve()
{
Init();
Model();
Search();
}
}
public class Issue33Test
{
public static void FactorySchedulingTest()
{
FactoryScheduling scheduling = new FactoryScheduling(new SmallSyntheticData().FetchData());
scheduling.Solve();
}
static void Main()
{
FactorySchedulingTest();
}
}

View File

@@ -1,42 +0,0 @@
#!/usr/bin/env python3
from ortools.constraint_solver import pywrapcp
def main():
solver = pywrapcp.Solver("time limit test")
n = 10
x = [solver.IntVar(1, n, "x[%i]" % i) for i in range(n)]
solver.Add(solver.AllDifferent(x, True))
solution = solver.Assignment()
solution.Add(x)
db = solver.Phase(x,
solver.CHOOSE_FIRST_UNBOUND,
solver.ASSIGN_MIN_VALUE)
time_limit = 2000
branch_limit = 100000000
failures_limit = 100000000
solutions_limit = 10000000
limits = (
solver.Limit(
time_limit, branch_limit, failures_limit, solutions_limit, True))
search_log = solver.SearchLog(1000)
solver.NewSearch(db, [limits, search_log])
num_solutions = 0
while solver.NextSolution():
print("x:", [x[i].Value() for i in range(n)])
num_solutions += 1
solver.EndSearch()
print("num_solutions:", num_solutions)
print("failures:", solver.Failures())
print("branches:", solver.Branches())
print("wall_time:", solver.WallTime())
if __name__ == "__main__":
main()

View File

@@ -1,94 +0,0 @@
#!/usr/bin/env python3
# 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.
"""Code for issue 46 in or-tools."""
from ortools.constraint_solver import pywrapcp
class AssignToStartMin(pywrapcp.PyDecisionBuilder):
def __init__(self, intervals):
pywrapcp.PyDecisionBuilder.__init__(self)
self.__intervals = intervals
def Next(self, solver):
for interval in self.__intervals:
interval.SetStartMax(interval.StartMin())
return None
def DebugString(self):
return 'CustomDecisionBuilder'
def NoSequence():
print('NoSequence')
solver = pywrapcp.Solver('Ordo')
tasks = []
[
tasks.append(
solver.FixedDurationIntervalVar(0, 25, 5, False, 'Tasks%i' % i))
for i in range(3)
]
print(tasks)
disj = solver.DisjunctiveConstraint(tasks, 'Disjunctive')
solver.Add(disj)
collector = solver.AllSolutionCollector()
collector.Add(tasks)
intervalPhase = solver.Phase(tasks, solver.INTERVAL_DEFAULT)
solver.Solve(intervalPhase, [collector])
print(collector.SolutionCount())
for i in range(collector.SolutionCount()):
print("Solution ", i)
print(collector.ObjectiveValue(i))
print([collector.StartValue(i, tasks[j]) for j in range(3)])
print([collector.EndValue(i, tasks[j]) for j in range(3)])
def Sequence():
print('Sequence')
solver = pywrapcp.Solver('Ordo')
tasks = []
[
tasks.append(
solver.FixedDurationIntervalVar(0, 25, 5, False, 'Tasks%i' % i))
for i in range(3)
]
print(tasks)
disj = solver.DisjunctiveConstraint(tasks, 'Disjunctive')
solver.Add(disj)
sequence = []
sequence.append(disj.SequenceVar())
sequence[0].RankFirst(0)
collector = solver.AllSolutionCollector()
collector.Add(sequence)
collector.Add(tasks)
sequencePhase = solver.Phase(sequence, solver.SEQUENCE_DEFAULT)
intervalPhase = AssignToStartMin(tasks)
# intervalPhase = solver.Phase(tasks, solver.INTERVAL_DEFAULT)
mainPhase = solver.Compose([sequencePhase, intervalPhase])
solver.Solve(mainPhase, [collector])
print(collector.SolutionCount())
for i in range(collector.SolutionCount()):
print("Solution ", i)
print(collector.ObjectiveValue(i))
print([collector.StartValue(i, tasks[j]) for j in range(3)])
print([collector.EndValue(i, tasks[j]) for j in range(3)])
def main():
NoSequence()
Sequence()
if __name__ == '__main__':
main()

View File

@@ -1,180 +0,0 @@
#!/usr/bin/env python3
# Copyright 2010 Hakan Kjellerstrand hakank@bonetmail.com
#
# 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.
'''
A programming puzzle from Einav in Google CP Solver.
From
'A programming puzzle from Einav'
http://gcanyon.wordpress.com/2009/10/28/a-programming-puzzle-from-einav/
My friend Einav gave me this programming puzzle to work on. Given
this array of positive and negative numbers:
33 30 -10 -6 18 7 -11 -23 6
...
-25 4 16 30 33 -23 -4 4 -23
You can flip the sign of entire rows and columns, as many of them
as you like. The goal is to make all the rows and columns sum to positive
numbers (or zero), and then to find the solution (there are more than one)
that has the smallest overall sum. So for example, for this array:
33 30 -10
-16 19 9
-17 -12 -14
You could flip the sign for the bottom row to get this array:
33 30 -10
-16 19 9
17 12 14
Now all the rows and columns have positive sums, and the overall total is
108.
But you could instead flip the second and third columns, and the second
row, to get this array:
33 -30 10
16 19 9
-17 12 14
All the rows and columns still total positive, and the overall sum is just
66. So this solution is better (I don't know if it's the best)
A pure brute force solution would have to try over 30 billion solutions.
I wrote code to solve this in J. I'll post that separately.
Compare with the following models:
* MiniZinc http://www.hakank.org/minizinc/einav_puzzle.mzn
* SICStus: http://hakank.org/sicstus/einav_puzzle.pl
This model was created by Hakan Kjellerstrand (hakank@bonetmail.com)
Also see my other Google CP Solver models:
http://www.hakank.org/google_or_tools/
'''
from ortools.constraint_solver import pywrapcp
def main():
# Create the solver.
solver = pywrapcp.Solver('Einav puzzle')
#
# data
#
# small problem
# data = [
# [ 33, 30, -10],
# [-16, 19, 9],
# [-17, -12, -14]
# ]
data = [[33, 30, 10, -6, 18, -7, -11, 23, -6],
[16, -19, 9, -26, -8, -19, -8, -21, -14],
[17, 12, -14, 31, -30, 13, -13, 19, 16],
[-6, -11, 1, 17, -12, -4, -7, 14, -21],
[18, -31, 34, -22, 17, -19, 20, 24, 6],
[33, -18, 17, -15, 31, -5, 3, 27, -3],
[-18, -20, -18, 31, 6, 4, -2, -12, 24],
[27, 14, 4, -29, -3, 5, -29, 8, -12],
[-15, -7, -23, 23, -9, -8, 6, 8, -12],
[33, -23, -19, -4, -8, -7, 11, -12, 31],
[-20, 19, -15, -30, 11, 32, 7, 14, -5],
[-23, 18, -32, -2, -31, -7, 8, 24, 16],
[32, -4, -10, -14, -6, -1, 0, 23, 23],
[25, 0, -23, 22, 12, 28, -27, 15, 4],
[-30, -13, -16, -3, -3, -32, -3, 27, -31],
[22, 1, 26, 4, -2, -13, 26, 17, 14],
[-9, -18, 3, -20, -27, -32, -11, 27, 13],
[-17, 33, -7, 19, -32, 13, -31, -2, -24],
[-31, 27, -31, -29, 15, 2, 29, -15, 33],
[-18, -23, 15, 28, 0, 30, -4, 12, -32],
[-3, 34, 27, -25, -18, 26, 1, 34, 26],
[-21, -31, -10, -13, -30, -17, -12, -26, 31],
[23, -31, -19, 21, -17, -10, 2, -23, 23],
[-3, 6, 0, -3, -32, 0, -10, -25, 14],
[-19, 9, 14, -27, 20, 15, -5, -27, 18],
[11, -6, 24, 7, -17, 26, 20, -31, -25],
[-25, 4, -16, 30, 33, 23, -4, -4, 23]]
rows = len(data)
cols = len(data[0])
#
# variables
#
x = {}
for i in range(rows):
for j in range(cols):
x[i, j] = solver.IntVar(-100, 100, 'x[%i,%i]' % (i, j))
row_signs = [solver.IntVar([-1, 1], 'row_signs(%i)' % i)
for i in range(rows)]
col_signs = [solver.IntVar([-1, 1], 'col_signs(%i)' % j)
for j in range(cols)]
#
# constraints
#
for i in range(rows):
for j in range(cols):
solver.Add(x[i, j] == data[i][j] * row_signs[i] * col_signs[j])
total_sum = solver.Sum([x[i, j] for i in range(rows) for j in range(cols)])
# row sums
row_sums = [solver.Sum([x[i, j] for j in range(cols)]).Var()
for i in range(rows)]
# >= 0
for i in range(rows):
row_sums[i].SetMin(0)
# column sums
col_sums = [solver.Sum([x[i, j] for i in range(rows)]).Var()
for j in range(cols)]
for j in range(cols):
col_sums[j].SetMin(0)
# objective
objective = solver.Minimize(total_sum, 1)
#
# search and result
#
db = solver.Phase(col_signs + row_signs,
solver.CHOOSE_FIRST_UNBOUND,
solver.ASSIGN_MIN_VALUE)
search_log = solver.SearchLog(100000, total_sum)
solver.NewSearch(db, [objective, search_log])
num_solutions = 0
while solver.NextSolution():
num_solutions += 1
print('Sum =', objective.Best())
print('row_sums:', [row_sums[i].Value() for i in range(rows)])
print('col_sums:', [col_sums[j].Value() for j in range(cols)])
for i in range(rows):
for j in range(cols):
print(x[i, j].Value(),', ')
print('\n')
print('\n')
solver.EndSearch()
print('num_solutions:', num_solutions)
print('failures:', solver.Failures())
print('branches:', solver.Branches())
print('wall_time:', solver.WallTime(), 'ms')
if __name__ == '__main__':
main()

View File

@@ -1,39 +0,0 @@
// Copyright 2011-2014 Google
// 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.
#include "absl/flags/parse.h"
#include "ortools/base/hash.h"
#include "ortools/base/map_util.h"
#include "ortools/base/stl_util.h"
#include "ortools/constraint_solver/constraint_solver.h"
#include "ortools/constraint_solver/constraint_solveri.h"
#include "ortools/util/string_array.h"
namespace operations_research {
void OverflowTest() {
// It works on mac-clang, but fails with gcc.
Solver solver("OverflowTest");
IntVar* const x = solver.MakeIntVar(kint64min, kint64max, "x");
IntVar* const y = solver.MakeIntVar(kint64min, kint64max, "y");
IntExpr* const z = solver.MakeDifference(x, y);
LOG(INFO) << z->DebugString();
Constraint* const ct = solver.MakeGreaterOrEqual(z, 10);
LOG(INFO) << ct->DebugString();
}
} // namespace operations_research
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
operations_research::OverflowTest();
return 0;
}

View File

@@ -1,29 +0,0 @@
#!/usr/bin/env python3
from ortools.constraint_solver import pywrapcp
def main():
solver = pywrapcp.Solver('Ordo')
tasks = [solver.FixedDurationIntervalVar(0, 25, 5, False, 'Tasks%i' %i)
for i in range(3)]
print(tasks)
disj = solver.DisjunctiveConstraint(tasks, 'Disjunctive')
sequence = []
sequence.append(disj.SequenceVar())
solver.Add(disj)
collector = solver.AllSolutionCollector()
collector.Add(sequence)
collector.Add(tasks)
sequencePhase = solver.Phase(sequence, solver.SEQUENCE_DEFAULT)
intervalPhase = solver.Phase(tasks, solver.INTERVAL_DEFAULT)
mainPhase = solver.Compose([sequencePhase, intervalPhase])
solver.Solve(mainPhase, [ collector])
print(collector.SolutionCount())
for i in range(collector.SolutionCount()):
print("Solution " , i)
print([collector.StartValue(i, tasks[j]) for j in range(3)])
print([collector.EndValue(i, tasks[j]) for j in range(3)])
if __name__ == '__main__':
main()

View File

@@ -1,232 +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.
// Linear programming example that shows how to use the API.
#include "ortools/base/init_google.h"
#include "ortools/base/logging.h"
#include "ortools/linear_solver/linear_solver.h"
#include "ortools/linear_solver/linear_solver.pb.h"
namespace operations_research {
void SolveAndPrint(MPSolver& solver, std::vector<MPVariable*> variables,
std::vector<MPConstraint*> constraints, bool is_continuous) {
LOG(INFO) << "Number of variables = " << solver.NumVariables();
LOG(INFO) << "Number of constraints = " << solver.NumConstraints();
const MPSolver::ResultStatus result_status = solver.Solve();
// Check that the problem has an optimal solution.
if (result_status != MPSolver::OPTIMAL) {
LOG(FATAL) << "The problem does not have an optimal solution!";
}
LOG(INFO) << "Solution:";
for (const auto& i : variables) {
LOG(INFO) << i->name() << " = " << i->solution_value();
}
LOG(INFO) << "Optimal objective value = " << solver.Objective().Value();
LOG(INFO) << "";
LOG(INFO) << "Advanced usage:";
LOG(INFO) << "Problem solved in " << solver.wall_time() << " milliseconds";
if (solver.ProblemType() != MPSolver::BOP_INTEGER_PROGRAMMING)
LOG(INFO) << "Problem solved in " << solver.iterations() << " iterations";
if (is_continuous) {
for (const auto& i : variables) {
LOG(INFO) << i->name() << ": reduced cost " << i->reduced_cost();
}
const std::vector<double> activities = solver.ComputeConstraintActivities();
for (const auto& i : constraints) {
LOG(INFO) << i->name() << ": dual value = " << i->dual_value()
<< " activity = " << activities[i->index()];
}
}
}
void RunLinearProgrammingExample(
MPSolver::OptimizationProblemType optimization_problem_type) {
MPSolver solver("LinearProgrammingExample", optimization_problem_type);
const double infinity = solver.infinity();
// x and y are continuous non-negative variables.
MPVariable* const x = solver.MakeNumVar(0.0, infinity, "x");
MPVariable* const y = solver.MakeNumVar(0.0, infinity, "y");
// Objectif function: Maximize 3x + 4y.
MPObjective* const objective = solver.MutableObjective();
objective->SetCoefficient(x, 3);
objective->SetCoefficient(y, 4);
objective->SetMaximization();
// x + 2y <= 14.
MPConstraint* const c0 = solver.MakeRowConstraint(-infinity, 14.0, "c0");
c0->SetCoefficient(x, 1);
c0->SetCoefficient(y, 2);
// 3x - y >= 0.
MPConstraint* const c1 = solver.MakeRowConstraint(0.0, infinity, "c1");
c1->SetCoefficient(x, 3);
c1->SetCoefficient(y, -1);
// x - y <= 2.
MPConstraint* const c2 = solver.MakeRowConstraint(-infinity, 2.0, "c2");
c2->SetCoefficient(x, 1);
c2->SetCoefficient(y, -1);
SolveAndPrint(solver, {x, y}, {c0, c1, c2}, true);
}
void RunMixedIntegerProgrammingExample(
MPSolver::OptimizationProblemType optimization_problem_type) {
MPSolver solver("MixedIntegerProgrammingExample", optimization_problem_type);
const double infinity = solver.infinity();
// x and y are integers non-negative variables.
MPVariable* const x = solver.MakeIntVar(0.0, infinity, "x");
MPVariable* const y = solver.MakeIntVar(0.0, infinity, "y");
// Objective function: Maximize x + 10 * y.
MPObjective* const objective = solver.MutableObjective();
objective->SetCoefficient(x, 1);
objective->SetCoefficient(y, 10);
objective->SetMaximization();
// x + 7 * y <= 17.5
MPConstraint* const c0 = solver.MakeRowConstraint(-infinity, 17.5, "c0");
c0->SetCoefficient(x, 1);
c0->SetCoefficient(y, 7);
// x <= 3.5
MPConstraint* const c1 = solver.MakeRowConstraint(-infinity, 3.5, "c1");
c1->SetCoefficient(x, 1);
c1->SetCoefficient(y, 0);
SolveAndPrint(solver, {x, y}, {c0, c1}, false);
}
void RunBooleanProgrammingExample(
MPSolver::OptimizationProblemType optimization_problem_type) {
MPSolver solver("BooleanProgrammingExample", optimization_problem_type);
const double infinity = solver.infinity();
// x and y are boolean variables.
MPVariable* const x = solver.MakeBoolVar("x");
MPVariable* const y = solver.MakeBoolVar("y");
// Objective function: Minimize 2 * x + y.
MPObjective* const objective = solver.MutableObjective();
objective->SetCoefficient(x, 2);
objective->SetCoefficient(y, 1);
objective->SetMinimization();
// 1 <= x + 2 * y <= 3.
MPConstraint* const c0 = solver.MakeRowConstraint(1, 3, "c0");
c0->SetCoefficient(x, 1);
c0->SetCoefficient(y, 2);
SolveAndPrint(solver, {x, y}, {c0}, false);
}
void MutableObjectiveCrash() {
LOG(INFO) << "MutableObjectiveCrash";
// Create the linear solver with the GLOP backend.
std::unique_ptr<MPSolver> solver(MPSolver::CreateSolver("GLOP"));
// Create the variables x and y.
MPVariable* const x = solver->MakeNumVar(0.0, 1, "x");
MPVariable* const y = solver->MakeNumVar(0.0, 2, "y");
LOG(INFO) << "Number of variables = " << solver->NumVariables();
// Create a linear constraint, 0 <= x + y <= 2.
MPConstraint* const ct = solver->MakeRowConstraint(0.0, 2.0, "ct");
ct->SetCoefficient(x, 1);
ct->SetCoefficient(y, 1);
LOG(INFO) << "Number of constraints = " << solver->NumConstraints();
// Create the objective function, 3 * x + y.
MPObjective* const objective = solver->MutableObjective();
objective->SetCoefficient(x, 3);
objective->SetCoefficient(y, 1);
objective->SetMaximization();
solver->Solve();
LOG(INFO) << "Solution:" << std::endl;
LOG(INFO) << "Objective value = " << objective->Value();
LOG(INFO) << "x = " << x->solution_value();
LOG(INFO) << "y = " << y->solution_value();
}
void RunAllExamples() {
// Linear programming problems
#if defined(USE_CLP)
LOG(INFO) << "---- Linear programming example with CLP ----";
RunLinearProgrammingExample(MPSolver::CLP_LINEAR_PROGRAMMING);
#endif // USE_CLP
#if defined(USE_GLPK)
LOG(INFO) << "---- Linear programming example with GLPK ----";
RunLinearProgrammingExample(MPSolver::GLPK_LINEAR_PROGRAMMING);
#endif // USE_GLPK
#if defined(USE_GLOP)
LOG(INFO) << "---- Linear programming example with GLOP ----";
RunLinearProgrammingExample(MPSolver::GLOP_LINEAR_PROGRAMMING);
#endif // USE_GLOP
#if defined(USE_PDLP)
LOG(INFO) << "---- Linear programming example with PDLP ----";
RunLinearProgrammingExample(MPSolver::PDLP_LINEAR_PROGRAMMING);
#endif // USE_PDLP
#if defined(USE_GUROBI)
LOG(INFO) << "---- Linear programming example with Gurobi ----";
RunLinearProgrammingExample(MPSolver::GUROBI_LINEAR_PROGRAMMING);
#endif // USE_GUROBI
#if defined(USE_CPLEX)
LOG(INFO) << "---- Linear programming example with CPLEX ----";
RunLinearProgrammingExample(MPSolver::CPLEX_LINEAR_PROGRAMMING);
#endif // USE_CPLEX
// Integer programming problems
#if defined(USE_SCIP)
LOG(INFO) << "---- Mixed Integer programming example with SCIP ----";
RunMixedIntegerProgrammingExample(MPSolver::SCIP_MIXED_INTEGER_PROGRAMMING);
#endif // USE_SCIP
#if defined(USE_GLPK)
LOG(INFO) << "---- Mixed Integer programming example with GLPK ----";
RunMixedIntegerProgrammingExample(MPSolver::GLPK_MIXED_INTEGER_PROGRAMMING);
#endif // USE_GLPK
#if defined(USE_CBC)
LOG(INFO) << "---- Mixed Integer programming example with CBC ----";
RunMixedIntegerProgrammingExample(MPSolver::CBC_MIXED_INTEGER_PROGRAMMING);
#endif // USE_CBC
#if defined(USE_GUROBI)
LOG(INFO) << "---- Mixed Integer programming example with GUROBI ----";
RunMixedIntegerProgrammingExample(MPSolver::GUROBI_MIXED_INTEGER_PROGRAMMING);
#endif // USE_GUROBI
#if defined(USE_CPLEX)
LOG(INFO) << "---- Mixed Integer programming example with CPLEX ----";
RunMixedIntegerProgrammingExample(MPSolver::CPLEX_MIXED_INTEGER_PROGRAMMING);
#endif // USE_CPLEX
// Boolean integer programming problems
#if defined(USE_BOP)
LOG(INFO) << "---- Boolean Integer programming example with BOP ----";
RunBooleanProgrammingExample(MPSolver::BOP_INTEGER_PROGRAMMING);
#endif // USE_BOP
MutableObjectiveCrash();
}
} // namespace operations_research
int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);
absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo);
operations_research::RunAllExamples();
return 0;
}

View File

@@ -1,407 +0,0 @@
// Copyright 2011-2012 Google
// 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.
#include "absl/flags/parse.h"
#include "ortools/base/hash.h"
#include "ortools/base/logging.h"
#include "ortools/base/map_util.h"
#include "ortools/base/stl_util.h"
#include "ortools/constraint_solver/constraint_solver.h"
#include "ortools/constraint_solver/constraint_solveri.h"
#include "ortools/util/string_array.h"
namespace operations_research {
class NullDemon : public Demon {
virtual void Run(Solver* const s) {}
};
// ----- Min Array Test -----
class MinArrayCtTestSetToMin : public DecisionBuilder {
public:
MinArrayCtTestSetToMin(IntExpr* const min, const std::vector<IntVar*>& vars)
: min_(min), vars_(vars) {}
virtual ~MinArrayCtTestSetToMin() {}
virtual Decision* Next(Solver* const s) {
min_->SetMax(0);
CHECK(vars_[0]->Bound()) << "var not bound";
CHECK_EQ(0, vars_[0]->Min()) << "var not bound to the correct value";
return NULL;
}
private:
IntExpr* const min_;
const std::vector<IntVar*>& vars_;
};
class MinArrayCtTestSetToMax : public DecisionBuilder {
public:
MinArrayCtTestSetToMax(IntExpr* const min, const std::vector<IntVar*>& vars)
: min_(min), vars_(vars) {}
virtual ~MinArrayCtTestSetToMax() {}
virtual Decision* Next(Solver* const s) {
min_->SetMin(5);
CHECK(vars_[0]->Bound()) << "var not bound";
CHECK_EQ(5, vars_[0]->Min()) << "var not bound to the correct value";
return NULL;
}
private:
IntExpr* const min_;
const std::vector<IntVar*>& vars_;
};
class MinArrayCtTestSetOneVar : public DecisionBuilder {
public:
MinArrayCtTestSetOneVar(IntExpr* const min, const std::vector<IntVar*>& vars)
: min_(min), vars_(vars) {}
virtual ~MinArrayCtTestSetOneVar() {}
virtual Decision* Next(Solver* const s) {
vars_[0]->SetValue(5);
CHECK_EQ(1, min_->Min()) << "bad computed min in min_array";
CHECK_EQ(5, min_->Max()) << "bad computed max in min_array";
return NULL;
}
private:
IntExpr* const min_;
const std::vector<IntVar*>& vars_;
};
class MinArrayCtTest {
public:
void SetUp() {
solver_.reset(new Solver("MinConstraintTest"));
vars_.clear();
vars_.resize(10);
for (int i = 0; i < 10; ++i) {
vars_[i] = solver_->MakeIntVar(i, 2 * i + 5);
}
min_ = solver_->MakeMin(vars_)->Var();
}
std::unique_ptr<Solver> solver_;
std::vector<IntVar*> vars_;
IntExpr* min_;
void TestAlternateCtor() {
SetUp();
std::vector<IntVar*> vars;
for (int i = 0; i < 4; ++i) {
vars.push_back(solver_->MakeIntVar(i, 2 * i));
}
IntExpr* emin = solver_->MakeMin(vars);
CHECK(!emin->DebugString().empty());
}
void TestBounds() {
SetUp();
CHECK_EQ(0LL, min_->Min()) << "bad computed min in min_array";
CHECK_EQ(5, min_->Max()) << "bad computed min in min_array";
}
void TestSetToMin() {
SetUp();
solver_->Solve(solver_->RevAlloc(new MinArrayCtTestSetToMin(min_, vars_)));
}
void TestSetToMax() {
SetUp();
solver_->Solve(solver_->RevAlloc(new MinArrayCtTestSetToMax(min_, vars_)));
}
void TestSetOneVar() {
SetUp();
solver_->Solve(solver_->RevAlloc(new MinArrayCtTestSetOneVar(min_, vars_)));
}
void TestWhen() {
SetUp();
Demon* const d = solver_->RevAlloc(new NullDemon());
min_->WhenRange(d);
}
void TestBigMinVector() {
SetUp();
std::vector<IntVar*> vars;
for (int i = 0; i < 1001; ++i) {
vars.push_back(
solver_->MakeIntVar(i, 3000 - i, absl::StrFormat("x%d", i)));
}
IntExpr* expr = solver_->MakeMin(vars);
CHECK_EQ(2000, expr->Max());
CHECK_EQ(0, expr->Min());
}
void TestBigMinArray() {
SetUp();
std::vector<IntVar*> vars;
vars.reserve(1001);
for (int i = 0; i < 1001; ++i) {
vars.push_back(
solver_->MakeIntVar(i, 3000 - i, absl::StrFormat("x%d", i)));
}
IntExpr* expr = solver_->MakeMin(vars);
CHECK_EQ(2000, expr->Max());
CHECK_EQ(0, expr->Min());
}
void TestSmallMinVector() {
SetUp();
std::vector<IntVar*> vars;
IntExpr* expr = solver_->MakeMin(vars);
CHECK_EQ(kint64max, expr->Min());
CHECK_EQ(kint64max, expr->Max());
vars.push_back(solver_->MakeIntVar(1, 10, "x0"));
expr = solver_->MakeMin(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(10, expr->Max());
vars.push_back(solver_->MakeIntVar(2, 9, "x1"));
expr = solver_->MakeMin(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(9, expr->Max());
vars.push_back(solver_->MakeIntVar(3, 8, "x2"));
expr = solver_->MakeMin(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(8, expr->Max());
}
void TestSmallMinArray() {
SetUp();
std::vector<IntVar*> vars;
vars.reserve(3);
IntExpr* expr = solver_->MakeMin(vars);
CHECK_EQ(kint64max, expr->Min());
CHECK_EQ(kint64max, expr->Max());
vars.push_back(solver_->MakeIntVar(1, 10, absl::StrFormat("x%d", 0)));
expr = solver_->MakeMin(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(10, expr->Max());
vars.push_back(solver_->MakeIntVar(1, 9, absl::StrFormat("x%d", 1)));
expr = solver_->MakeMin(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(9, expr->Max());
vars.push_back(solver_->MakeIntVar(1, 8, absl::StrFormat("x%d", 2)));
expr = solver_->MakeMin(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(8, expr->Max());
}
};
// ----- Max Array Test -----
class MaxArrayCtTestSetToMin : public DecisionBuilder {
public:
MaxArrayCtTestSetToMin(IntExpr* const max, const std::vector<IntVar*>& vars)
: max_(max), vars_(vars) {}
virtual ~MaxArrayCtTestSetToMin() {}
virtual Decision* Next(Solver* const s) {
max_->SetMin(23);
CHECK(vars_[9]->Bound()) << "var not bound";
CHECK_EQ(23, vars_[9]->Min()) << "var not bound to the correct value";
return NULL;
}
private:
IntExpr* const max_;
const std::vector<IntVar*>& vars_;
};
class MaxArrayCtTestSetToMax : public DecisionBuilder {
public:
MaxArrayCtTestSetToMax(IntExpr* const max, const std::vector<IntVar*>& vars)
: max_(max), vars_(vars) {}
virtual ~MaxArrayCtTestSetToMax() {}
virtual Decision* Next(Solver* const s) {
max_->SetMax(9);
CHECK(vars_[9]->Bound()) << "var not bound";
CHECK_EQ(9, vars_[9]->Min()) << "var not bound to the correct value";
return NULL;
}
private:
IntExpr* const max_;
const std::vector<IntVar*>& vars_;
};
class MaxArrayCtTestSetOneVar : public DecisionBuilder {
public:
MaxArrayCtTestSetOneVar(IntExpr* const max, const std::vector<IntVar*>& vars)
: max_(max), vars_(vars) {}
virtual ~MaxArrayCtTestSetOneVar() {}
virtual Decision* Next(Solver* const s) {
vars_[9]->SetValue(18);
CHECK_EQ(18, max_->Min()) << "bad computed min in max_array";
CHECK_EQ(21, max_->Max()) << "bad computed max in max_array";
return NULL;
}
private:
IntExpr* const max_;
const std::vector<IntVar*>& vars_;
};
class MaxArrayCtTest {
public:
void SetUp() {
solver_.reset(new Solver("MaxArrayCtTest"));
vars_.resize(10);
for (int i = 0; i < 10; ++i) {
vars_[i] = solver_->MakeIntVar(i, 2 * i + 5);
}
max_ = solver_->MakeMax(vars_)->Var();
}
std::unique_ptr<Solver> solver_;
std::vector<IntVar*> vars_;
IntExpr* max_;
void TestAlternateCtor() {
SetUp();
std::vector<IntVar*> vars;
for (int i = 0; i < 4; ++i) {
vars.push_back(solver_->MakeIntVar(i, 2 * i));
}
IntExpr* emax = solver_->MakeMax(vars);
CHECK(!emax->DebugString().empty());
}
void TestBounds() {
SetUp();
CHECK_EQ(9, max_->Min()) << "bad computed min in max_array";
CHECK_EQ(23, max_->Max()) << "bad computed min in max_array";
}
void TestSetToMin() {
SetUp();
solver_->Solve(solver_->RevAlloc(new MaxArrayCtTestSetToMin(max_, vars_)));
}
void TestSetToMax() {
SetUp();
solver_->Solve(solver_->RevAlloc(new MaxArrayCtTestSetToMax(max_, vars_)));
}
void TestSetOneVar() {
SetUp();
solver_->Solve(solver_->RevAlloc(new MaxArrayCtTestSetOneVar(max_, vars_)));
}
void TestWhen() {
SetUp();
Demon* d = solver_->RevAlloc(new NullDemon());
max_->WhenRange(d);
}
void TestBigMaxVector() {
SetUp();
std::vector<IntVar*> vars;
vars.reserve(1001);
for (int i = 0; i < 1001; ++i) {
vars.push_back(
solver_->MakeIntVar(i, 3000 - i, absl::StrFormat("x%d", i)));
}
IntExpr* expr = solver_->MakeMax(vars);
CHECK_EQ(3000, expr->Max());
CHECK_EQ(1000, expr->Min());
}
void TestBigMaxArray() {
SetUp();
std::vector<IntVar*> vars;
for (int i = 0; i < 1001; ++i) {
vars.push_back(
solver_->MakeIntVar(i, 3000 - i, absl::StrFormat("x%d", i)));
}
IntExpr* expr = solver_->MakeMax(vars);
CHECK_EQ(3000, expr->Max());
CHECK_EQ(1000, expr->Min());
}
void TestSmallMaxVector() {
SetUp();
std::vector<IntVar*> vars;
IntExpr* expr = solver_->MakeMax(vars);
CHECK_EQ(kint64min, expr->Min());
CHECK_EQ(kint64min, expr->Max());
vars.push_back(solver_->MakeIntVar(1, 10, "x0"));
expr = solver_->MakeMax(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(10, expr->Max());
vars.push_back(solver_->MakeIntVar(2, 9, "x1"));
expr = solver_->MakeMax(vars);
CHECK_EQ(2, expr->Min());
CHECK_EQ(10, expr->Max());
vars.push_back(solver_->MakeIntVar(3, 8, "x2"));
expr = solver_->MakeMax(vars);
CHECK_EQ(3, expr->Min());
CHECK_EQ(10, expr->Max());
}
void TestSmallMaxArray() {
SetUp();
std::vector<IntVar*> vars;
IntExpr* expr = solver_->MakeMax(vars);
CHECK_EQ(kint64min, expr->Min());
CHECK_EQ(kint64min, expr->Max());
vars.push_back(solver_->MakeIntVar(1, 10, absl::StrFormat("x%d", 0)));
expr = solver_->MakeMax(vars);
CHECK_EQ(1, expr->Min());
CHECK_EQ(10, expr->Max());
vars.push_back(solver_->MakeIntVar(2, 10, absl::StrFormat("x%d", 1)));
expr = solver_->MakeMax(vars);
CHECK_EQ(2, expr->Min());
CHECK_EQ(10, expr->Max());
vars.push_back(solver_->MakeIntVar(3, 10, absl::StrFormat("x%d", 2)));
expr = solver_->MakeMax(vars);
CHECK_EQ(3, expr->Min());
CHECK_EQ(10, expr->Max());
}
};
} // namespace operations_research
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
operations_research::MinArrayCtTest min_test;
min_test.TestAlternateCtor();
min_test.TestBounds();
min_test.TestSetToMin();
min_test.TestSetToMax();
min_test.TestSetOneVar();
min_test.TestWhen();
min_test.TestBigMinVector();
min_test.TestBigMinArray();
min_test.TestSmallMinVector();
min_test.TestSmallMinArray();
operations_research::MaxArrayCtTest max_test;
max_test.TestAlternateCtor();
max_test.TestBounds();
max_test.TestSetToMin();
max_test.TestSetToMax();
max_test.TestSetOneVar();
max_test.TestWhen();
max_test.TestBigMaxVector();
max_test.TestBigMaxArray();
max_test.TestSmallMaxVector();
max_test.TestSmallMaxArray();
return 0;
}

View File

@@ -1,18 +0,0 @@
OR_TOOLS_TOP=$(CURDIR)/../../..
include $(OR_TOOLS_TOP)/Makefile
tsp.$O: tsp.cc $(OR_TOOLS_TOP)/src/constraint_solver/routing.h
$(CCC) $(CFLAGS) -c tsp.cc $(OBJ_OUT)tsp.$O
tsp$E: $(DYNAMIC_ROUTING_DEPS) tsp.$O
$(CCC) $(CFLAGS) tsp.$O $(DYNAMIC_ROUTING_LNK) $(DYNAMIC_LD_FLAGS) $(EXE_OUT)tsp$E
linear_programming.$O: linear_programming.cc $(OR_TOOLS_TOP)/src/constraint_solver/routing.h
$(CCC) $(CFLAGS) -c linear_programming.cc $(OBJ_OUT)linear_programming.$O
linear_programming$E: $(DYNAMIC_LP_DEPS) linear_programming.$O
$(CCC) $(CFLAGS) linear_programming.$O $(DYNAMIC_LP_LNK) $(DYNAMIC_LD_FLAGS) $(EXE_OUT)linear_programming$E
local_clean:
rm tsp.$O tsp$E linear_programming.$O linear_programming$E

View File

@@ -1,115 +0,0 @@
// Copyright 2010-2025 Google
// 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.
//
// Linear programming example that shows how to use the API.
#include "base/commandlineflags.h"
#include "base/logging.h"
#include "linear_solver/linear_solver.h"
#include "linear_solver/linear_solver.pb.h"
namespace operations_research {
void RunLinearProgrammingExample(
MPSolver::OptimizationProblemType optimization_problem_type) {
MPSolver solver("LinearProgrammingExample", optimization_problem_type);
const double infinity = solver.infinity();
// x1, x2 and x3 are continuous non-negative variables.
MPVariable* const x1 = solver.MakeNumVar(0.0, infinity, "x1");
MPVariable* const x2 = solver.MakeNumVar(0.0, infinity, "x2");
MPVariable* const x3 = solver.MakeNumVar(0.0, infinity, "x3");
// Maximize 10 * x1 + 6 * x2 + 4 * x3.
MPObjective* const objective = solver.MutableObjective();
objective->SetCoefficient(x1, 10);
objective->SetCoefficient(x2, 6);
objective->SetCoefficient(x3, 4);
objective->SetMaximization();
// x1 + x2 + x3 <= 100.
MPConstraint* const c0 = solver.MakeRowConstraint(-infinity, 100.0);
c0->SetCoefficient(x1, 1);
c0->SetCoefficient(x2, 1);
c0->SetCoefficient(x3, 1);
// 10 * x1 + 4 * x2 + 5 * x3 <= 600.
MPConstraint* const c1 = solver.MakeRowConstraint(-infinity, 600.0);
c1->SetCoefficient(x1, 10);
c1->SetCoefficient(x2, 4);
c1->SetCoefficient(x3, 5);
// 2 * x1 + 2 * x2 + 6 * x3 <= 300.
MPConstraint* const c2 = solver.MakeRowConstraint(-infinity, 300.0);
c2->SetCoefficient(x1, 2);
c2->SetCoefficient(x2, 2);
c2->SetCoefficient(x3, 6);
// TODO(user): Change example to show = and >= constraints.
LOG(INFO) << "Number of variables = " << solver.NumVariables();
LOG(INFO) << "Number of constraints = " << solver.NumConstraints();
const MPSolver::ResultStatus result_status = solver.Solve();
// Check that the problem has an optimal solution.
if (result_status != MPSolver::OPTIMAL) {
LOG(FATAL) << "The problem does not have an optimal solution!";
}
LOG(INFO) << "Problem solved in " << solver.wall_time() << " milliseconds";
// The objective value of the solution.
LOG(INFO) << "Optimal objective value = " << objective->Value();
// The value of each variable in the solution.
LOG(INFO) << "x1 = " << x1->solution_value();
LOG(INFO) << "x2 = " << x2->solution_value();
LOG(INFO) << "x3 = " << x3->solution_value();
LOG(INFO) << "Advanced usage:";
LOG(INFO) << "Problem solved in " << solver.iterations() << " iterations";
LOG(INFO) << "x1: reduced cost = " << x1->reduced_cost();
LOG(INFO) << "x2: reduced cost = " << x2->reduced_cost();
LOG(INFO) << "x3: reduced cost = " << x3->reduced_cost();
LOG(INFO) << "c0: dual value = " << c0->dual_value()
<< " activity = " << c0->activity();
LOG(INFO) << "c1: dual value = " << c1->dual_value()
<< " activity = " << c1->activity();
LOG(INFO) << "c2: dual value = " << c2->dual_value()
<< " activity = " << c2->activity();
}
void RunAllExamples() {
#if defined(USE_GLPK)
LOG(INFO) << "---- Linear programming example with GLPK ----";
RunLinearProgrammingExample(MPSolver::GLPK_LINEAR_PROGRAMMING);
#endif // USE_GLPK
#if defined(USE_CLP)
LOG(INFO) << "---- Linear programming example with CLP ----";
RunLinearProgrammingExample(MPSolver::CLP_LINEAR_PROGRAMMING);
#endif // USE_CLP
#if defined(USE_SLM)
LOG(INFO) << "---- Linear programming example with Sulum ----";
RunLinearProgrammingExample(MPSolver::SULUM_LINEAR_PROGRAMMING);
#endif // USE_SLM
#if defined(USE_GUROBI)
LOG(INFO) << "---- Linear programming example with Gurobi ----";
RunLinearProgrammingExample(MPSolver::GUROBI_LINEAR_PROGRAMMING);
#endif // USE_GUROBI
}
} // namespace operations_research
int main(int argc, char** argv) {
google::ParseCommandLineFlags(&argc, &argv, true);
operations_research::RunAllExamples();
return 0;
}

View File

@@ -1,164 +0,0 @@
// Copyright 2010-2025 Google
// 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.
//
// Traveling Salesman Sample.
//
// This is a sample using the routing library to solve a Traveling Salesman
// Problem.
// The description of the problem can be found here:
// http://en.wikipedia.org/wiki/Travelling_salesman_problem.
// For small problems one can use the hamiltonian path library directly (cf
// graph/hamiltonian_path.h).
// The optimization engine uses local search to improve solutions, first
// solutions being generated using a cheapest addition heuristic.
// Optionally one can randomly forbid a set of random connections between nodes
// (forbidden arcs).
#include "base/callback.h"
#include "base/commandlineflags.h"
#include "base/join.h"
#include "base/random.h"
#include "base/types.h"
#include "base/unique_ptr.h"
#include "constraint_solver/routing.h"
using operations_research::ACMRandom;
using operations_research::Assignment;
using operations_research::RoutingModel;
using operations_research::scoped_ptr;
using operations_research::StrCat;
DEFINE_int32(tsp_size, 10, "Size of Traveling Salesman Problem instance.");
DEFINE_bool(tsp_use_random_matrix, true, "Use random cost matrix.");
DEFINE_int32(tsp_random_forbidden_connections, 0,
"Number of random forbidden connections.");
DEFINE_bool(tsp_use_deterministic_random_seed, false,
"Use deterministic random seeds.");
DECLARE_string(routing_first_solution);
DECLARE_bool(routing_no_lns);
// Random seed generator.
int32_t GetSeed() {
if (absl::GetFlag(FLAGS_tsp_use_deterministic_random_seed)) {
return ACMRandom::DeterministicSeed();
} else {
return ACMRandom::HostnamePidTimeSeed();
}
}
// Cost/distance functions.
// Sample function.
int64_t MyDistance(RoutingModel::NodeIndex from, RoutingModel::NodeIndex to) {
// Put your distance code here.
return (from + to).value(); // for instance
}
// Random matrix.
class RandomMatrix {
public:
explicit RandomMatrix(int size) : size_(size) {}
void Initialize() {
matrix_.reset(new int64_t[size_ * size_]);
const int64_t kDistanceMax = 100;
ACMRandom randomizer(GetSeed());
for (RoutingModel::NodeIndex from = RoutingModel::kFirstNode; from < size_;
++from) {
for (RoutingModel::NodeIndex to = RoutingModel::kFirstNode; to < size_;
++to) {
if (to != from) {
matrix_[MatrixIndex(from, to)] = randomizer.Uniform(kDistanceMax);
} else {
matrix_[MatrixIndex(from, to)] = 0LL;
}
}
}
}
int64_t Distance(RoutingModel::NodeIndex from,
RoutingModel::NodeIndex to) const {
return matrix_[MatrixIndex(from, to)];
}
private:
int64_t MatrixIndex(RoutingModel::NodeIndex from,
RoutingModel::NodeIndex to) const {
return (from * size_ + to).value();
}
std::unique_ptr<int64_t[]> matrix_;
const int size_;
};
int main(int argc, char** argv) {
google::ParseCommandLineFlags(&argc, &argv, true);
if (absl::GetFlag(FLAGS_tsp_size) > 0) {
// TSP of size absl::GetFlag(FLAGS_tsp_size).
// Second argument = 1 to build a single tour (it's a TSP).
// Nodes are indexed from 0 to absl::GetFlag(FLAGS_tsp_size) - 1, by default
// the start of the route is node 0.
RoutingModel routing(absl::GetFlag(FLAGS_tsp_size), 1);
// Setting first solution heuristic (cheapest addition).
absl::GetFlag(FLAGS_routing_first_solution) = "PathCheapestArc";
// Disabling Large Neighborhood Search, comment out to activate it.
absl::GetFlag(FLAGS_routing_no_lns) = true;
// Setting the cost function.
// Put a permanent callback to the distance accessor here. The callback
// has the following signature: ResultCallback2<int64_t, int64_t, int64_t>.
// The two arguments are the from and to node inidices.
RandomMatrix matrix(absl::GetFlag(FLAGS_tsp_size));
if (absl::GetFlag(FLAGS_tsp_use_random_matrix)) {
matrix.Initialize();
routing.SetArcCostEvaluatorOfAllVehicles(
NewPermanentCallback(&matrix, &RandomMatrix::Distance));
} else {
routing.SetArcCostEvaluatorOfAllVehicles(
NewPermanentCallback(MyDistance));
}
// Forbid node connections (randomly).
ACMRandom randomizer(GetSeed());
int64_t forbidden_connections = 0;
while (forbidden_connections <
absl::GetFlag(FLAGS_tsp_random_forbidden_connections)) {
const int64_t from =
randomizer.Uniform(absl::GetFlag(FLAGS_tsp_size) - 1);
const int64_t to =
randomizer.Uniform(absl::GetFlag(FLAGS_tsp_size) - 1) + 1;
if (routing.NextVar(from)->Contains(to)) {
LOG(INFO) << "Forbidding connection " << from << " -> " << to;
routing.NextVar(from)->RemoveValue(to);
++forbidden_connections;
}
}
// Solve, returns a solution if any (owned by RoutingModel).
const Assignment* solution = routing.Solve();
if (solution != NULL) {
// Solution cost.
LOG(INFO) << "Cost " << solution->ObjectiveValue();
// Inspect solution.
// Only one route here; otherwise iterate from 0 to routing.vehicles() - 1
const int route_number = 0;
std::string route;
for (int64_t node = routing.Start(route_number); !routing.IsEnd(node);
node = solution->Value(routing.NextVar(node))) {
route = StrCat(route, StrCat(node, " -> "));
}
route = StrCat(route, "0");
LOG(INFO) << route;
} else {
LOG(INFO) << "No solution found.";
}
} else {
LOG(INFO) << "Specify an instance size greater than 0.";
}
return 0;
}