Initial commit to unify all dotnet under one project

This commit is contained in:
Matthew Moore
2018-04-24 02:40:11 -07:00
committed by Corentin Le Molgat
parent 8d7eb4774c
commit b51e77c27d
27 changed files with 5383 additions and 2 deletions

5
.gitignore vendored
View File

@@ -82,3 +82,8 @@ tools/netstandard/CreateSigningKey/obj
ortools/fsharp/**/bin
ortools/fsharp/**/obj
ortools/fsharp/**/packages
ortools/dotnet/**/bin
ortools/dotnet/**/obj
ortools/dotnet/**/packages
*.userprefs

View File

@@ -55,8 +55,9 @@ include $(OR_ROOT)makefiles/Makefile.third_party.$(SYSTEM).mk
include $(OR_ROOT)makefiles/Makefile.cpp.mk
include $(OR_ROOT)makefiles/Makefile.python.mk
include $(OR_ROOT)makefiles/Makefile.java.mk
include $(OR_ROOT)makefiles/Makefile.csharp.mk
include $(OR_ROOT)makefiles/Makefile.fsharp.mk
include $(OR_ROOT)makefiles/Makefile.dotnet.mk
# include $(OR_ROOT)makefiles/Makefile.csharp.mk
# include $(OR_ROOT)makefiles/Makefile.fsharp.mk
include $(OR_ROOT)makefiles/Makefile.archive.mk
include $(OR_ROOT)makefiles/Makefile.install.mk

View File

@@ -0,0 +1,169 @@
# ---------- CSharp support using SWIG ----------
.PHONY: help_dotnet # Generate list of dotnet targets with descriptions.
help_dotnet:
@echo Use one of the following dotnet targets:
ifeq ($(SYSTEM),win)
@tools\grep.exe "^.PHONY: .* #" $(CURDIR)/makefiles/Makefile.dotnet.mk | tools\sed.exe "s/\.PHONY: \(.*\) # \(.*\)/\1\t\2/"
@echo off & echo(
else
@grep "^.PHONY: .* #" $(CURDIR)/makefiles/Makefile.dotnet.mk | sed "s/\.PHONY: \(.*\) # \(.*\)/\1\t\2/" | expand -t20
@echo
endif
ORTOOLS_DLL_NAME=OrTools
ORTOOLS_NUSPEC_FILE=$(ORTOOLS_DLL_NAME).nuspec
# Check for required build tools
ifeq ($(SYSTEM), win)
DOTNET_EXECUTABLE := $(shell $(WHICH) dotnet.exe 2>nul)
else # UNIX
ifeq ($(PLATFORM),MACOSX)
DOTNET_EXECUTABLE := $(shell dirname ${DOTNET_INSTALL_PATH})$Sdotnet
else # LINUX
DOTNET_EXECUTABLE := $(shell which dotnet)
endif
endif
.PHONY: csharp_dotnet # Build OrTools
csharp_dotnet: ortoolslib \
$(GEN_DIR)/com/google/ortools/properties/CommonAssemblyInfo.cs \
$(OBJ_DIR)/swig/linear_solver_csharp_wrap.$O \
$(OBJ_DIR)/swig/constraint_solver_csharp_wrap.$O \
$(OBJ_DIR)/swig/knapsack_solver_csharp_wrap.$O \
$(OBJ_DIR)/swig/graph_csharp_wrap.$O \
$(OBJ_DIR)/swig/sat_csharp_wrap.$O \
$(GEN_DIR)/com/google/ortools/constraintsolver/SearchLimit.g.cs \
$(GEN_DIR)/com/google/ortools/constraintsolver/SolverParameters.g.cs \
$(GEN_DIR)/com/google/ortools/constraintsolver/Model.g.cs \
$(GEN_DIR)/com/google/ortools/constraintsolver/RoutingParameters.g.cs \
$(GEN_DIR)/com/google/ortools/constraintsolver/RoutingEnums.g.cs \
$(GEN_DIR)/com/google/ortools/sat/CpModel.g.cs \
$(GEN_DIR)/com/google/ortools/sat/SatParameters.g.cs
$(SED) -i -e "s/0.0.0.0/$(OR_TOOLS_VERSION)/" ortools$Sdotnet$S$(ORTOOLS_DLL_NAME)$S$(ORTOOLS_DLL_NAME).csproj
"$(DOTNET_EXECUTABLE)" build ortools$Sdotnet$S$(ORTOOLS_DLL_NAME)$S$(ORTOOLS_DLL_NAME).csproj
$(GEN_DIR)/com/google/ortools/properties/GitVersion$(OR_TOOLS_VERSION).txt: \
| $(GEN_DIR)/com/google/ortools/properties
@echo $(OR_TOOLS_VERSION) > $(GEN_DIR)$Scom$Sgoogle$Sortools$Sproperties$SGitVersion$(OR_TOOLS_VERSION).txt
# See for background on Windows Explorer File Info Details:
# https://social.msdn.microsoft.com/Forums/vstudio/en-US/27894a09-1eed-48d9-8a0f-2198388d492c/csc-modulelink-or-just-csc-dll-plus-some-external-dllobj-references
# also, https://blogs.msdn.microsoft.com/texblog/2007/04/05/linking-native-c-into-c-applications/
$(GEN_DIR)/com/google/ortools/properties/CommonAssemblyInfo.cs: \
$(GEN_DIR)/com/google/ortools/properties/GitVersion$(OR_TOOLS_VERSION).txt
$(COPY) tools$Scsharp$SCommonAssemblyInfo.cs $(GEN_DIR)$Scom$Sgoogle$Sortools$Sproperties
$(SED) -i -e "s/XXXX/$(OR_TOOLS_VERSION)/" $(GEN_DIR)$Scom$Sgoogle$Sortools$Sproperties$SCommonAssemblyInfo.cs
$(GEN_DIR)/ortools/linear_solver/linear_solver_csharp_wrap.cc: \
$(SRC_DIR)/ortools/linear_solver/csharp/linear_solver.i \
$(SRC_DIR)/ortools/base/base.i \
$(SRC_DIR)/ortools/util/csharp/proto.i \
$(LP_DEPS)
$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp -o $(GEN_DIR)$Sortools$Slinear_solver$Slinear_solver_csharp_wrap.cc -module operations_research_linear_solver -namespace $(BASE_CLR_ORTOOLS_DLL_NAME).LinearSolver -dllimport "$(CLR_ORTOOLS_IMPORT_DLL_NAME).$(SWIG_LIB_SUFFIX)" -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Slinearsolver $(SRC_DIR)$Sortools$Slinear_solver$Scsharp$Slinear_solver.i
$(OBJ_DIR)/swig/linear_solver_csharp_wrap.$O: $(GEN_DIR)/ortools/linear_solver/linear_solver_csharp_wrap.cc
$(CCC) $(CFLAGS) -c $(GEN_DIR)/ortools/linear_solver/linear_solver_csharp_wrap.cc $(OBJ_OUT)$(OBJ_DIR)$Sswig$Slinear_solver_csharp_wrap.$O
$(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.cc: \
$(SRC_DIR)/ortools/constraint_solver/csharp/routing.i \
$(SRC_DIR)/ortools/constraint_solver/csharp/constraint_solver.i \
$(SRC_DIR)/ortools/base/base.i \
$(SRC_DIR)/ortools/util/csharp/proto.i \
$(SRC_DIR)/ortools/util/csharp/functions.i \
$(CP_DEPS)
$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp -o $(GEN_DIR)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.cc -module operations_research_constraint_solver -namespace $(BASE_CLR_ORTOOLS_DLL_NAME).ConstraintSolver -dllimport "$(CLR_ORTOOLS_IMPORT_DLL_NAME).$(SWIG_LIB_SUFFIX)" -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver $(SRC_DIR)$Sortools$Sconstraint_solver$Scsharp$Srouting.i
$(SED) -i -e 's/CSharp_new_Solver/CSharp_new_CpSolver/g' $(GEN_DIR)/com/google/ortools/constraintsolver/*cs $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.*
$(SED) -i -e 's/CSharp_delete_Solver/CSharp_delete_CpSolver/g' $(GEN_DIR)/com/google/ortools/constraintsolver/*cs $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.*
$(SED) -i -e 's/CSharp_Solver/CSharp_CpSolver/g' $(GEN_DIR)/com/google/ortools/constraintsolver/*cs $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.*
$(SED) -i -e 's/CSharp_new_Constraint/CSharp_new_CpConstraint/g' $(GEN_DIR)/com/google/ortools/constraintsolver/*cs $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.*
$(SED) -i -e 's/CSharp_delete_Constraint/CSharp_delete_CpConstraint/g' $(GEN_DIR)/com/google/ortools/constraintsolver/*cs $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.*
$(SED) -i -e 's/CSharp_Constraint/CSharp_CpConstraint/g' $(GEN_DIR)/com/google/ortools/constraintsolver/*cs $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.*
$(OBJ_DIR)/swig/constraint_solver_csharp_wrap.$O: \
$(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.cc
$(CCC) $(CFLAGS) -c $(GEN_DIR)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.cc $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sconstraint_solver_csharp_wrap.$O
$(GEN_DIR)/ortools/algorithms/knapsack_solver_csharp_wrap.cc: \
$(SRC_DIR)/ortools/algorithms/csharp/knapsack_solver.i \
$(SRC_DIR)/ortools/base/base.i \
$(SRC_DIR)/ortools/util/csharp/proto.i \
$(SRC_DIR)/ortools/algorithms/knapsack_solver.h
$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp -o $(GEN_DIR)$Sortools$Salgorithms$Sknapsack_solver_csharp_wrap.cc -module operations_research_algorithms -namespace $(BASE_CLR_ORTOOLS_DLL_NAME).Algorithms -dllimport "$(CLR_ORTOOLS_IMPORT_DLL_NAME).$(SWIG_LIB_SUFFIX)" -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Salgorithms $(SRC_DIR)$Sortools$Salgorithms$Scsharp$Sknapsack_solver.i
$(OBJ_DIR)/swig/knapsack_solver_csharp_wrap.$O: $(GEN_DIR)/ortools/algorithms/knapsack_solver_csharp_wrap.cc
$(CCC) $(CFLAGS) -c $(GEN_DIR)/ortools/algorithms/knapsack_solver_csharp_wrap.cc $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sknapsack_solver_csharp_wrap.$O
$(GEN_DIR)/ortools/graph/graph_csharp_wrap.cc: \
$(SRC_DIR)/ortools/graph/csharp/graph.i \
$(SRC_DIR)/ortools/base/base.i \
$(SRC_DIR)/ortools/util/csharp/proto.i \
$(GRAPH_DEPS)
$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp -o $(GEN_DIR)$Sortools$Sgraph$Sgraph_csharp_wrap.cc -module operations_research_graph -namespace $(BASE_CLR_ORTOOLS_DLL_NAME).Graph -dllimport "$(CLR_ORTOOLS_IMPORT_DLL_NAME).$(SWIG_LIB_SUFFIX)" -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Sgraph $(SRC_DIR)$Sortools$Sgraph$Scsharp$Sgraph.i
$(OBJ_DIR)/swig/graph_csharp_wrap.$O: $(GEN_DIR)/ortools/graph/graph_csharp_wrap.cc
$(CCC) $(CFLAGS) -c $(GEN_DIR)$Sortools$Sgraph$Sgraph_csharp_wrap.cc $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sgraph_csharp_wrap.$O
$(GEN_DIR)/ortools/sat/sat_csharp_wrap.cc: \
$(SRC_DIR)/ortools/base/base.i \
$(SRC_DIR)/ortools/sat/csharp/sat.i \
$(SRC_DIR)/ortools/sat/swig_helper.h \
$(SRC_DIR)/ortools/util/csharp/proto.i \
$(SAT_DEPS)
$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp -o $(GEN_DIR)$Sortools$Ssat$Ssat_csharp_wrap.cc -module operations_research_sat -namespace $(BASE_CLR_ORTOOLS_DLL_NAME).Sat -dllimport "$(CLR_ORTOOLS_IMPORT_DLL_NAME).$(SWIG_LIB_SUFFIX)" -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Ssat $(SRC_DIR)$Sortools$Ssat$Scsharp$Ssat.i
$(OBJ_DIR)/swig/sat_csharp_wrap.$O: $(GEN_DIR)/ortools/sat/sat_csharp_wrap.cc
$(CCC) $(CFLAGS) -c $(GEN_DIR)/ortools/sat/sat_csharp_wrap.cc $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssat_csharp_wrap.$O
# Protobufs
$(GEN_DIR)/com/google/ortools/constraintsolver/SearchLimit.g.cs: $(SRC_DIR)/ortools/constraint_solver/search_limit.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Sconstraint_solver$Ssearch_limit.proto
$(GEN_DIR)/com/google/ortools/constraintsolver/SolverParameters.g.cs: $(SRC_DIR)/ortools/constraint_solver/solver_parameters.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Sconstraint_solver$Ssolver_parameters.proto
$(GEN_DIR)/com/google/ortools/constraintsolver/Model.g.cs: $(SRC_DIR)/ortools/constraint_solver/solver_parameters.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Sconstraint_solver$Smodel.proto
$(GEN_DIR)/com/google/ortools/constraintsolver/RoutingParameters.g.cs: $(SRC_DIR)/ortools/constraint_solver/routing_parameters.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Sconstraint_solver$Srouting_parameters.proto
$(GEN_DIR)/com/google/ortools/constraintsolver/RoutingEnums.g.cs: $(SRC_DIR)/ortools/constraint_solver/routing_enums.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Sconstraint_solver$Srouting_enums.proto
$(GEN_DIR)/com/google/ortools/sat/CpModel.g.cs: $(SRC_DIR)/ortools/sat/cp_model.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Ssat --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Ssat$Scp_model.proto
$(GEN_DIR)/com/google/ortools/sat/SatParameters.g.cs: $(SRC_DIR)/ortools/sat/sat_parameters.proto
$(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Ssat --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sortools$Ssat$Ssat_parameters.proto
.PHONY: pkg_dotnet # Build Nuget Package for distribution.
pkg_dotnet:
$(warning Not Implemented)
.PHONY: pkg_dotnet-upload # Upload Nuget Package
nuget-pkg_dotnet-upload: nuget_archive
$(warning Not Implemented)
.PHONY: detect_dotnet # Show variables used to build dotnet OR-Tools.
detect_dotnet:
ifeq ($(SYSTEM),win)
@echo Relevant info for the dotnet build:
else
@echo Relevant info for the dotnet build:
endif
@echo DOTNET_EXECUTABLE = "$(DOTNET_EXECUTABLE)"
@echo MONO_EXECUTABLE = "$(MONO_EXECUTABLE)"
ifeq ($(SYSTEM),win)
@echo off & echo(
else
@echo
endif

34
ortools/dotnet/Google.sln Normal file
View File

@@ -0,0 +1,34 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrTools", "OrTools\OrTools.csproj", "{AFA3F878-FB56-4314-B31E-3DA5583B548B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Debug|x64.ActiveCfg = Debug|x64
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Debug|x64.Build.0 = Debug|x64
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Debug|x86.ActiveCfg = Debug|x86
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Debug|x86.Build.0 = Debug|x86
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Release|Any CPU.Build.0 = Release|Any CPU
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Release|x64.ActiveCfg = Release|x64
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Release|x64.Build.0 = Release|x64
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Release|x86.ActiveCfg = Release|x86
{AFA3F878-FB56-4314-B31E-3DA5583B548B}.Release|x86.Build.0 = Release|x86
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,11 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Google.OrTools")]
[assembly: AssemblyDescription(".NET Assembly for the Operations Research Tools project")]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0a227c4c-8bb3-4db0-808f-55dae227d8c5")]

View File

@@ -0,0 +1,536 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<AssemblyTitle>Google.OrTools</AssemblyTitle>
<TargetFrameworks>netcoreapp2.0</TargetFrameworks>
<AssemblyName>Google.OrTools</AssemblyName>
<UseSharedCompilation>False</UseSharedCompilation>
<NuspecFile>OrTools.nuspec</NuspecFile>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Version>0.0.0.0</Version>
<AssemblyVersion>0.0.0.0</AssemblyVersion>
<FileVersion>0.0.0.0</FileVersion>
<RootNamespace>Google.OrTools</RootNamespace>
<AssemblyOriginatorKeyFile>..\..\..\bin\or-tools.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
<PublicSign Condition="'$(OS)' != 'Windows_NT'">true</PublicSign>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\..\..\ortools\gen\com\google\ortools\properties\CommonAssemblyInfo.cs" Link="CommonAssemblyInfo.cs" />
<Compile Include="..\..\..\ortools\gen\com\google\ortools\linearsolver\*.cs">
<Link>linearsolver\%(Filename)%(Extension)</Link>
</Compile>
<Compile Include="..\..\..\ortools\gen\com\google\ortools\constraintsolver\*.cs">
<Link>constraintsolver\%(Filename)%(Extension)</Link>
</Compile>
<Compile Include="..\..\..\ortools\gen\com\google\ortools\algorithms\*.cs">
<Link>algorithms\%(Filename)%(Extension)</Link>
</Compile>
<Compile Include="..\..\..\ortools\gen\com\google\ortools\graph\*.cs">
<Link>graph\%(Filename)%(Extension)</Link>
</Compile>
<Compile Include="..\..\..\ortools\gen\com\google\ortools\sat\*.cs">
<Link>sat\%(Filename)%(Extension)</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.5.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\Constraint.cs">
<Link>linearsolver\Constraint.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\MPSolverParameters.cs">
<Link>linearsolver\MPSolverParameters.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\MpDoubleVector.cs">
<Link>linearsolver\MpDoubleVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\Objective.cs">
<Link>linearsolver\Objective.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\Solver.cs">
<Link>linearsolver\Solver.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\Variable.cs">
<Link>linearsolver\Variable.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\operations_research_linear_solver.cs">
<Link>linearsolver\operations_research_linear_solver.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\linearsolver\operations_research_linear_solverPINVOKE.cs">
<Link>linearsolver\operations_research_linear_solverPINVOKE.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Assignment.cs">
<Link>constraintsolver\Assignment.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\AssignmentElement.cs">
<Link>constraintsolver\AssignmentElement.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\AssignmentIntContainer.cs">
<Link>constraintsolver\AssignmentIntContainer.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\BaseIntExpr.cs">
<Link>constraintsolver\BaseIntExpr.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\BaseLns.cs">
<Link>constraintsolver\BaseLns.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\BaseObject.cs">
<Link>constraintsolver\BaseObject.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\BasePathFilter.cs">
<Link>constraintsolver\BasePathFilter.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\BooleanVar.cs">
<Link>constraintsolver\BooleanVar.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CastConstraint.cs">
<Link>constraintsolver\CastConstraint.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\ChangeValue.cs">
<Link>constraintsolver\ChangeValue.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CheapestAdditionFilteredDecisionBuilder.cs">
<Link>constraintsolver\CheapestAdditionFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CheapestInsertionFilteredDecisionBuilder.cs">
<Link>constraintsolver\CheapestInsertionFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\ChristofidesFilteredDecisionBuilder.cs">
<Link>constraintsolver\ChristofidesFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\ComparatorCheapestAdditionFilteredDecisionBuilder.cs">
<Link>constraintsolver\ComparatorCheapestAdditionFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Constraint.cs">
<Link>constraintsolver\Constraint.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CpInt64Vector.cs">
<Link>constraintsolver\CpInt64Vector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CpInt64VectorVector.cs">
<Link>constraintsolver\CpInt64VectorVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CpIntVector.cs">
<Link>constraintsolver\CpIntVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CpIntVectorVector.cs">
<Link>constraintsolver\CpIntVectorVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\CpModelLoader.cs">
<Link>constraintsolver\CpModelLoader.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Decision.cs">
<Link>constraintsolver\Decision.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\DecisionBuilder.cs">
<Link>constraintsolver\DecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\DecisionBuilderVector.cs">
<Link>constraintsolver\DecisionBuilderVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\DecisionVisitor.cs">
<Link>constraintsolver\DecisionVisitor.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\DefaultPhaseParameters.cs">
<Link>constraintsolver\DefaultPhaseParameters.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Demon.cs">
<Link>constraintsolver\Demon.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\DisjunctiveConstraint.cs">
<Link>constraintsolver\DisjunctiveConstraint.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\EvaluatorCheapestAdditionFilteredDecisionBuilder.cs">
<Link>constraintsolver\EvaluatorCheapestAdditionFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\GlobalCheapestInsertionFilteredDecisionBuilder.cs">
<Link>constraintsolver\GlobalCheapestInsertionFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntExpr.cs">
<Link>constraintsolver\IntExpr.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntIntToLong.cs">
<Link>constraintsolver\IntIntToLong.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntTupleSet.cs">
<Link>constraintsolver\IntTupleSet.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVar.cs">
<Link>constraintsolver\IntVar.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarElement.cs">
<Link>constraintsolver\IntVarElement.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarFilteredDecisionBuilder.cs">
<Link>constraintsolver\IntVarFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarIterator.cs">
<Link>constraintsolver\IntVarIterator.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarLocalSearchFilter.cs">
<Link>constraintsolver\IntVarLocalSearchFilter.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarLocalSearchHandler.cs">
<Link>constraintsolver\IntVarLocalSearchHandler.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarLocalSearchOperator.cs">
<Link>constraintsolver\IntVarLocalSearchOperator.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarLocalSearchOperatorTemplate.cs">
<Link>constraintsolver\IntVarLocalSearchOperatorTemplate.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntVarVector.cs">
<Link>constraintsolver\IntVarVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntervalVar.cs">
<Link>constraintsolver\IntervalVar.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntervalVarElement.cs">
<Link>constraintsolver\IntervalVarElement.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\IntervalVarVector.cs">
<Link>constraintsolver\IntervalVarVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalCheapestInsertionFilteredDecisionBuilder.cs">
<Link>constraintsolver\LocalCheapestInsertionFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalSearchFilter.cs">
<Link>constraintsolver\LocalSearchFilter.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalSearchFilterVector.cs">
<Link>constraintsolver\LocalSearchFilterVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalSearchMonitor.cs">
<Link>constraintsolver\LocalSearchMonitor.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalSearchOperator.cs">
<Link>constraintsolver\LocalSearchOperator.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalSearchOperatorVector.cs">
<Link>constraintsolver\LocalSearchOperatorVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LocalSearchPhaseParameters.cs">
<Link>constraintsolver\LocalSearchPhaseParameters.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LongLongLongToBoolean.cs">
<Link>constraintsolver\LongLongLongToBoolean.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LongLongLongToLong.cs">
<Link>constraintsolver\LongLongLongToLong.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LongLongToLong.cs">
<Link>constraintsolver\LongLongToLong.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LongToBoolean.cs">
<Link>constraintsolver\LongToBoolean.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LongToLong.cs">
<Link>constraintsolver\LongToLong.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\LongToVoid.cs">
<Link>constraintsolver\LongToVoid.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Model.g.cs">
<Link>constraintsolver\Model.g.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\ModelCache.cs">
<Link>constraintsolver\ModelCache.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\ModelVisitor.cs">
<Link>constraintsolver\ModelVisitor.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\NoGood.cs">
<Link>constraintsolver\NoGood.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\NoGoodManager.cs">
<Link>constraintsolver\NoGoodManager.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\NodeEvaluator2.cs">
<Link>constraintsolver\NodeEvaluator2.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\NodeEvaluator2Vector.cs">
<Link>constraintsolver\NodeEvaluator2Vector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\OptimizeVar.cs">
<Link>constraintsolver\OptimizeVar.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Pack.cs">
<Link>constraintsolver\Pack.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\PathOperator.cs">
<Link>constraintsolver\PathOperator.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\PathWithPreviousNodesOperator.cs">
<Link>constraintsolver\PathWithPreviousNodesOperator.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\PropagationBaseObject.cs">
<Link>constraintsolver\PropagationBaseObject.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\PropagationMonitor.cs">
<Link>constraintsolver\PropagationMonitor.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RevBool.cs">
<Link>constraintsolver\RevBool.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RevInteger.cs">
<Link>constraintsolver\RevInteger.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RevPartialSequence.cs">
<Link>constraintsolver\RevPartialSequence.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingDimension.cs">
<Link>constraintsolver\RoutingDimension.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingEnums.g.cs">
<Link>constraintsolver\RoutingEnums.g.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingFilteredDecisionBuilder.cs">
<Link>constraintsolver\RoutingFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingLocalSearchFilter.cs">
<Link>constraintsolver\RoutingLocalSearchFilter.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingModel.cs">
<Link>constraintsolver\RoutingModel.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingModelVisitor.cs">
<Link>constraintsolver\RoutingModelVisitor.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\RoutingParameters.g.cs">
<Link>constraintsolver\RoutingParameters.g.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_ResultCallback2T_long_long_RoutingNodeIndex_RoutingNodeIndex_t.cs">
<Link>constraintsolver\SWIGTYPE_p_ResultCallback2T_long_long_RoutingNodeIndex_RoutingNodeIndex_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_RoutingCostClassIndex.cs">
<Link>constraintsolver\SWIGTYPE_p_RoutingCostClassIndex.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_RoutingDimensionIndex.cs">
<Link>constraintsolver\SWIGTYPE_p_RoutingDimensionIndex.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_RoutingDisjunctionIndex.cs">
<Link>constraintsolver\SWIGTYPE_p_RoutingDisjunctionIndex.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_RoutingVehicleClassIndex.cs">
<Link>constraintsolver\SWIGTYPE_p_RoutingVehicleClassIndex.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_int.cs">
<Link>constraintsolver\SWIGTYPE_p_int.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_long_long.cs">
<Link>constraintsolver\SWIGTYPE_p_long_long.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__AssignmentContainerT_operations_research__IntervalVar_operations_research__IntervalVarElement_t.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__AssignmentContainerT_operations_research__IntervalVar_operations_research__IntervalVarElement_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__AssignmentContainerT_operations_research__SequenceVar_operations_research__SequenceVarElement_t.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__AssignmentContainerT_operations_research__SequenceVar_operations_research__SequenceVarElement_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__AssignmentProto.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__AssignmentProto.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__CpModel.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__CpModel.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__DemonProfiler.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__DemonProfiler.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__IntVarAssignment.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__IntVarAssignment.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__IntervalVarAssignment.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__IntervalVarAssignment.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__RevIntSetT_int_t.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__RevIntSetT_int_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__Search.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__Search.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__SequenceVarAssignment.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__SequenceVarAssignment.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_operations_research__SimpleRevFIFOT_operations_research__Demon_p_t.cs">
<Link>constraintsolver\SWIGTYPE_p_operations_research__SimpleRevFIFOT_operations_research__Demon_p_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__functionT_int_flong_longF_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__functionT_int_flong_longF_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__functionT_long_long_flong_longF_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__functionT_long_long_flong_longF_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__functionT_long_long_flong_long_long_longF_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__functionT_long_long_flong_long_long_longF_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__functionT_operations_research__Solver__DecisionModification_fF_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__functionT_operations_research__Solver__DecisionModification_fF_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__functionT_void_fF_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__functionT_void_fF_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__functionT_void_flong_longF_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__functionT_void_flong_longF_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_RoutingDisjunctionIndex_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_RoutingDisjunctionIndex_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_operations_research__IntVarElement_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_operations_research__IntVarElement_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_std__pairT_RoutingNodeIndex_RoutingNodeIndex_t_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_std__pairT_RoutingNodeIndex_RoutingNodeIndex_t_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_std__pairT_int_int_t_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_std__pairT_int_int_t_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_std__string_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_std__string_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_std__vectorT_RoutingNodeIndex_t_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_std__vectorT_RoutingNodeIndex_t_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SWIGTYPE_p_std__vectorT_unsigned_long_long_t.cs">
<Link>constraintsolver\SWIGTYPE_p_std__vectorT_unsigned_long_long_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SavingsFilteredDecisionBuilder.cs">
<Link>constraintsolver\SavingsFilteredDecisionBuilder.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SearchLimit.cs">
<Link>constraintsolver\SearchLimit.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SearchLimit.g.cs">
<Link>constraintsolver\SearchLimit.g.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SearchLog.cs">
<Link>constraintsolver\SearchLog.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SearchMonitor.cs">
<Link>constraintsolver\SearchMonitor.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SearchMonitorVector.cs">
<Link>constraintsolver\SearchMonitorVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SequenceVar.cs">
<Link>constraintsolver\SequenceVar.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SequenceVarElement.cs">
<Link>constraintsolver\SequenceVarElement.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SequenceVarLocalSearchHandler.cs">
<Link>constraintsolver\SequenceVarLocalSearchHandler.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SequenceVarLocalSearchOperator.cs">
<Link>constraintsolver\SequenceVarLocalSearchOperator.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SequenceVarLocalSearchOperatorTemplate.cs">
<Link>constraintsolver\SequenceVarLocalSearchOperatorTemplate.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SequenceVarVector.cs">
<Link>constraintsolver\SequenceVarVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SolutionCollector.cs">
<Link>constraintsolver\SolutionCollector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SolutionPool.cs">
<Link>constraintsolver\SolutionPool.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\Solver.cs">
<Link>constraintsolver\Solver.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SolverParameters.g.cs">
<Link>constraintsolver\SolverParameters.g.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SymmetryBreaker.cs">
<Link>constraintsolver\SymmetryBreaker.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\SymmetryBreakerVector.cs">
<Link>constraintsolver\SymmetryBreakerVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\UnsortedNullableRevBitset.cs">
<Link>constraintsolver\UnsortedNullableRevBitset.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\VoidToBoolean.cs">
<Link>constraintsolver\VoidToBoolean.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\VoidToString.cs">
<Link>constraintsolver\VoidToString.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\VoidToVoid.cs">
<Link>constraintsolver\VoidToVoid.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\operations_research_constraint_solver.cs">
<Link>constraintsolver\operations_research_constraint_solver.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\constraintsolver\operations_research_constraint_solverPINVOKE.cs">
<Link>constraintsolver\operations_research_constraint_solverPINVOKE.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\algorithms\KInt64Vector.cs">
<Link>algorithms\KInt64Vector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\algorithms\KInt64VectorVector.cs">
<Link>algorithms\KInt64VectorVector.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\algorithms\KnapsackSolver.cs">
<Link>algorithms\KnapsackSolver.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\algorithms\operations_research_algorithms.cs">
<Link>algorithms\operations_research_algorithms.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\algorithms\operations_research_algorithmsPINVOKE.cs">
<Link>algorithms\operations_research_algorithmsPINVOKE.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\LinearSumAssignment.cs">
<Link>graph\LinearSumAssignment.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\MaxFlow.cs">
<Link>graph\MaxFlow.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\MinCostFlow.cs">
<Link>graph\MinCostFlow.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\MinCostFlowBase.cs">
<Link>graph\MinCostFlowBase.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\SWIGTYPE_p_std__vectorT_int_t.cs">
<Link>graph\SWIGTYPE_p_std__vectorT_int_t.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\operations_research_graph.cs">
<Link>graph\operations_research_graph.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\graph\operations_research_graphPINVOKE.cs">
<Link>graph\operations_research_graphPINVOKE.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\sat\CpModel.g.cs">
<Link>sat\CpModel.g.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\sat\SatHelper.cs">
<Link>sat\SatHelper.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\sat\SolutionCallback.cs">
<Link>sat\SolutionCallback.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\sat\operations_research_sat.cs">
<Link>sat\operations_research_sat.cs</Link>
</Compile>
<Compile Update="..\..\gen\com\google\ortools\sat\operations_research_satPINVOKE.cs">
<Link>sat\operations_research_satPINVOKE.cs</Link>
</Compile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0"?>
<package >
<metadata>
<id>NNNN</id>
<version>VVVV</version>
<authors>Google</authors>
<licenseUrl>https://github.com/google/or-tools/blob/master/LICENSE-2.0.txt</licenseUrl>
<projectUrl>https://developers.google.com/optimization</projectUrl>
<description>.NET Assembly for the Operations Research Tools project</description>
<copyright>Copyright 2018 Google, Inc</copyright>
<tags>Operations Research Math Linear Constraint Programming C# .NET SWIG C++</tags>
<dependencies>
<dependency id="MMMM" version="PROTOBUF_TAG" />
</dependencies>
</metadata>
<files>
<file src="bin\NNNN.dll" target="lib\net40"/>
<file src="examples\**\*.*" target="examples"/>
<file src="examples\data\**\*.*" target="data"/>
<file src="LICENSE-2.0.txt"/>
</files>
</package>

View File

@@ -0,0 +1,76 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.Algorithms {
using System;
using System.Collections.Generic;
public partial class KInt64Vector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<long>
#endif
{
// cast from C# long array
public static implicit operator KInt64Vector(long[] inVal) {
var outVal= new KInt64Vector();
foreach (long element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# long array
public static implicit operator long[](KInt64Vector inVal) {
var outVal= new long[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class KInt64VectorVector : IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IEnumerable<KInt64Vector>
#endif
{
// cast from C# long matrix
public static implicit operator KInt64VectorVector(long[,] inVal) {
int x_size = inVal.GetLength(0);
int y_size = inVal.GetLength(1);
KInt64VectorVector outVal = new KInt64VectorVector();
for (int i = 0; i < x_size; ++i)
{
outVal.Add(new KInt64Vector());
for (int j = 0; j < y_size; ++j)
{
outVal[i].Add(inVal[i, j]);
}
}
return outVal;
}
// cast to C# long matrix
public static implicit operator long[,](KInt64VectorVector inVal) {
int x_size = inVal.Count;
int y_size = inVal.Count == 0 ? 0 : inVal[0].Count;
var outVal= new long[x_size, y_size];
for (int i = 0; i < x_size; ++i)
{
for (int j = 0; j < y_size; ++j)
{
outVal[i, j] = inVal[i][j];
}
}
return outVal;
}
}
} // namespace Google.OrTools.Algorithms

View File

@@ -0,0 +1,145 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.ConstraintSolver {
using System;
using System.Collections.Generic;
// int[] and long[] helper class.
public static class IntArrayHelper {
public static IntExpr Element(this int[] array, IntExpr index) {
return index.solver().MakeElement(array, index.Var());
}
public static IntExpr Element(this long[] array, IntExpr index) {
return index.solver().MakeElement(array, index.Var());
}
}
public partial class CpInt64Vector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<long>
#endif
{
// cast from C# long array
public static implicit operator CpInt64Vector(long[] inVal) {
var outVal= new CpInt64Vector();
foreach (long element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# long array
public static implicit operator long[](CpInt64Vector inVal) {
var outVal= new long[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class CpIntVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<int>
#endif
{
// cast from C# int array
public static implicit operator CpIntVector(int[] inVal) {
var outVal= new CpIntVector();
foreach (int element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# int array
public static implicit operator int[](CpIntVector inVal) {
var outVal= new int[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class CpIntVectorVector : IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IEnumerable<CpIntVector>
#endif
{
// cast from C# int matrix
public static implicit operator CpIntVectorVector(int[,] inVal) {
int x_size = inVal.GetLength(0);
int y_size = inVal.GetLength(1);
CpIntVectorVector outVal = new CpIntVectorVector();
for (int i = 0; i < x_size; ++i)
{
outVal.Add(new CpIntVector());
for (int j = 0; j < y_size; ++j)
{
outVal[i].Add(inVal[i, j]);
}
}
return outVal;
}
// cast to C# int matrix
public static implicit operator int[,](CpIntVectorVector inVal) {
int x_size = inVal.Count;
int y_size = inVal.Count == 0 ? 0 : inVal[0].Count;
var outVal= new int[x_size, y_size];
for (int i = 0; i < x_size; ++i)
{
for (int j = 0; j < y_size; ++j)
{
outVal[i, j] = inVal[i][j];
}
}
return outVal;
}
}
public partial class CpInt64VectorVector : IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IEnumerable<CpInt64Vector>
#endif
{
// cast from C# long matrix
public static implicit operator CpInt64VectorVector(long[,] inVal) {
int x_size = inVal.GetLength(0);
int y_size = inVal.GetLength(1);
CpInt64VectorVector outVal = new CpInt64VectorVector();
for (int i = 0; i < x_size; ++i)
{
outVal.Add(new CpInt64Vector());
for (int j = 0; j < y_size; ++j)
{
outVal[i].Add(inVal[i, j]);
}
}
return outVal;
}
// cast to C# long matrix
public static implicit operator long[,](CpInt64VectorVector inVal) {
int x_size = inVal.Count;
int y_size = inVal.Count == 0 ? 0 : inVal[0].Count;
var outVal= new long[x_size, y_size];
for (int i = 0; i < x_size; ++i)
{
for (int j = 0; j < y_size; ++j)
{
outVal[i, j] = inVal[i][j];
}
}
return outVal;
}
}
} // namespace Google.OrTools.ConstraintSolver

View File

@@ -0,0 +1,370 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.ConstraintSolver
{
using System;
using System.Collections.Generic;
// IntVar[] helper class.
public static class IntVarArrayHelper
{
// All Different
public static Constraint AllDifferent(this IntVar[] vars)
{
Solver solver = GetSolver(vars);
return solver.MakeAllDifferent(vars);
}
// Allowed assignment
public static Constraint AllowedAssignments(this IntVar[] vars,
IntTupleSet tuples)
{
Solver solver = GetSolver(vars);
return solver.MakeAllowedAssignments(vars, tuples);
}
// sum of all vars.
public static IntExpr Sum(this IntVar[] vars)
{
Solver solver = GetSolver(vars);
return solver.MakeSum(vars);
}
// sum of all constraints.
public static IntExpr Sum(this IConstraintWithStatus[] cts)
{
Solver solver = GetSolver(cts);
IntVar[] vars = new IntVar[cts.Length];
for (int i = 0; i < cts.Length; ++i)
{
vars[i] = cts[i].Var();
}
return solver.MakeSum(vars);
}
public static IntExpr Sum(this IntExpr[] exprs)
{
Solver solver = GetSolver(exprs);
IntVar[] vars = new IntVar[exprs.Length];
for (int i = 0; i < exprs.Length; ++i)
{
vars[i] = exprs[i].Var();
}
return solver.MakeSum(vars);
}
// scalar product
public static IntExpr ScalProd(this IntVar[] vars, long[] coefs)
{
Solver solver = GetSolver(vars);
return solver.MakeScalProd(vars, coefs);
}
// scalar product
public static IntExpr ScalProd(this IntVar[] vars, int[] coefs)
{
Solver solver = GetSolver(vars);
return solver.MakeScalProd(vars, coefs);
}
// get solver from array of integer variables
private static Solver GetSolver(IntVar[] vars)
{
if (vars == null || vars.Length <= 0)
throw new ArgumentException("Array <vars> cannot be null or empty");
return vars[0].solver();
}
// get solver from array of integer expressions
private static Solver GetSolver(IntExpr[] expressions)
{
if (expressions == null || expressions.Length <= 0)
throw new ArgumentException("Array <expr> cannot be null or empty");
return expressions[0].solver();
}
private static Solver GetSolver(IConstraintWithStatus[] cts)
{
if (cts == null || cts.Length <= 0)
throw new ArgumentException("Array <cts> cannot be null or empty");
return cts[0].solver();
}
public static IntExpr Element(this IntVar[] array, IntExpr index) {
return index.solver().MakeElement(array, index.Var());
}
// min of all vars.
public static IntExpr Min(this IntVar[] vars)
{
Solver solver = GetSolver(vars);
return solver.MakeMin(vars);
}
// min of all vars.
public static IntExpr Max(this IntVar[] vars)
{
Solver solver = GetSolver(vars);
return solver.MakeMax(vars);
}
// count of all vars.
public static Constraint Count(this IntVar[] vars, long value, long count)
{
Solver solver = GetSolver(vars);
return solver.MakeCount(vars, value, count);
}
// count of all vars.
public static Constraint Count(this IntVar[] vars,
long value,
IntExpr count)
{
Solver solver = GetSolver(vars);
return solver.MakeCount(vars, value, count.Var());
}
public static Constraint Distribute(this IntVar[] vars,
long[] values,
IntVar[] cards)
{
Solver solver = GetSolver(vars);
return solver.MakeDistribute(vars, values, cards);
}
public static Constraint Distribute(this IntVar[] vars,
int[] values,
IntVar[] cards)
{
Solver solver = GetSolver(vars);
return solver.MakeDistribute(vars, values, cards);
}
public static Constraint Distribute(this IntVar[] vars,
IntVar[] cards)
{
Solver solver = GetSolver(vars);
return solver.MakeDistribute(vars, cards);
}
public static Constraint Distribute(this IntVar[] vars,
long card_min,
long card_max,
long card_size)
{
Solver solver = GetSolver(vars);
return solver.MakeDistribute(vars, card_min, card_max, card_size);
}
public static Constraint Transition(this IntVar[] vars,
IntTupleSet transitions,
long initial_state,
long[] final_states) {
Solver solver = GetSolver(vars);
return solver.MakeTransitionConstraint(vars,
transitions,
initial_state,
final_states);
}
public static Constraint Transition(this IntVar[] vars,
IntTupleSet transitions,
long initial_state,
int[] final_states) {
Solver solver = GetSolver(vars);
return solver.MakeTransitionConstraint(vars,
transitions,
initial_state,
final_states);
}
// Matrix API
public static IntVar[] Flatten(this IntVar[,] vars)
{
int rows = vars.GetLength(0);
int cols = vars.GetLength(1);
IntVar[] flat = new IntVar[cols * rows];
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
flat[i * cols + j] = vars[i, j];
}
}
return flat;
}
}
// TODO(user): Try to move this code back to the .swig with @define macros.
public partial class IntVarVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<IntVar>
#endif
{
// cast from C# IntVar array
public static implicit operator IntVarVector(IntVar[] inVal) {
var outVal= new IntVarVector();
foreach (IntVar element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# IntVar array
public static implicit operator IntVar[](IntVarVector inVal) {
var outVal= new IntVar[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class SearchMonitorVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<SearchMonitor>
#endif
{
// cast from C# SearchMonitor array
public static implicit operator SearchMonitorVector(SearchMonitor[] inVal) {
var outVal= new SearchMonitorVector();
foreach (SearchMonitor element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# SearchMonitor array
public static implicit operator SearchMonitor[](SearchMonitorVector inVal) {
var outVal= new SearchMonitor[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class DecisionBuilderVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<DecisionBuilder>
#endif
{
// cast from C# DecisionBuilder array
public static implicit operator DecisionBuilderVector(DecisionBuilder[] inVal) {
var outVal= new DecisionBuilderVector();
foreach (DecisionBuilder element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# DecisionBuilder array
public static implicit operator DecisionBuilder[](DecisionBuilderVector inVal) {
var outVal= new DecisionBuilder[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class IntervalVarVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<IntervalVar>
#endif
{
// cast from C# IntervalVar array
public static implicit operator IntervalVarVector(IntervalVar[] inVal) {
var outVal= new IntervalVarVector();
foreach (IntervalVar element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# IntervalVar array
public static implicit operator IntervalVar[](IntervalVarVector inVal) {
var outVal= new IntervalVar[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class SequenceVarVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<SequenceVar>
#endif
{
// cast from C# SequenceVar array
public static implicit operator SequenceVarVector(SequenceVar[] inVal) {
var outVal= new SequenceVarVector();
foreach (SequenceVar element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# SequenceVar array
public static implicit operator SequenceVar[](SequenceVarVector inVal) {
var outVal= new SequenceVar[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class LocalSearchOperatorVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<LocalSearchOperator>
#endif
{
// cast from C# LocalSearchOperator array
public static implicit operator LocalSearchOperatorVector(LocalSearchOperator[] inVal) {
var outVal= new LocalSearchOperatorVector();
foreach (LocalSearchOperator element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# LocalSearchOperator array
public static implicit operator LocalSearchOperator[](LocalSearchOperatorVector inVal) {
var outVal= new LocalSearchOperator[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class LocalSearchFilterVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<LocalSearchFilter>
#endif
{
// cast from C# LocalSearchFilter array
public static implicit operator LocalSearchFilterVector(LocalSearchFilter[] inVal) {
var outVal= new LocalSearchFilterVector();
foreach (LocalSearchFilter element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# LocalSearchFilter array
public static implicit operator LocalSearchFilter[](LocalSearchFilterVector inVal) {
var outVal= new LocalSearchFilter[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
public partial class SymmetryBreakerVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<SymmetryBreaker>
#endif
{
// cast from C# SymmetryBreaker array
public static implicit operator SymmetryBreakerVector(SymmetryBreaker[] inVal) {
var outVal= new SymmetryBreakerVector();
foreach (SymmetryBreaker element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# SymmetryBreaker array
public static implicit operator SymmetryBreaker[](SymmetryBreakerVector inVal) {
var outVal= new SymmetryBreaker[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
} // namespace Google.OrTools.ConstraintSolver

View File

@@ -0,0 +1,53 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.ConstraintSolver
{
using System;
using System.Collections.Generic;
// IntervalVar[] helper class.
public static class IntervalVarArrayHelper
{
// get solver from array of interval variables
private static Solver GetSolver(IntervalVar[] vars)
{
if (vars == null || vars.Length <= 0)
throw new ArgumentException("Array <vars> cannot be null or empty");
return vars[0].solver();
}
public static DisjunctiveConstraint Disjunctive(this IntervalVar[] vars,
String name)
{
Solver solver = GetSolver(vars);
return solver.MakeDisjunctiveConstraint(vars, name);
}
public static Constraint Cumulative(this IntervalVar[] vars,
long[] demands,
long capacity,
String name)
{
Solver solver = GetSolver(vars);
return solver.MakeCumulative(vars, demands, capacity, name);
}
public static Constraint Cumulative(this IntervalVar[] vars,
int[] demands,
long capacity,
String name)
{
Solver solver = GetSolver(vars);
return solver.MakeCumulative(vars, demands, capacity, name);
}
}
} // namespace Google.OrTools.ConstraintSolver

View File

@@ -0,0 +1,205 @@
// Copyright 2010-2017 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.
using System;
using System.Collections;
namespace Google.OrTools.ConstraintSolver
{
/**
* This class acts as a intermediate step between a c++ decision builder and a
* .Net one. Its main purpose is to catch the .Net application exception
* launched when a failure occurs during the Next() call, and to return
* silently a System.ApplicationException that will propagate the failure back
* to the C++ code.
*
*/
public class NetDecisionBuilder : DecisionBuilder
{
/**
* This methods wraps the calls to next() and catches fail exceptions.
* It currently catches all application exceptions.
*/
public override Decision NextWrapper(Solver solver)
{
try
{
return Next(solver);
}
catch (ApplicationException e)
{
// TODO(user): Catch only fail exceptions.
return solver.MakeFailDecision();
}
}
/**
* This is the new method to subclass when defining a .Net decision builder.
*/
public virtual Decision Next(Solver solver)
{
return null;
}
}
/**
* This class acts as a intermediate step between a c++ decision and a
* .Net one. Its main purpose is to catch the .Net application
* exception launched when a failure occurs during the
* Apply()/Refute() calls, and to set the ShouldFail() flag on the
* solver that will propagate the failure back to the C++ code.
*
*/
public class NetDecision : Decision
{
/**
* This methods wraps the calls to Apply() and catches fail exceptions.
* It currently catches all application exceptions.
*/
public override void ApplyWrapper(Solver solver)
{
try
{
Apply(solver);
}
catch (ApplicationException e)
{
// TODO(user): Catch only fail exceptions.
solver.ShouldFail();
}
}
/**
* This is a new method to subclass when defining a .Net decision.
*/
public virtual void Apply(Solver solver)
{
// By default, do nothing
}
public override void RefuteWrapper(Solver solver)
{
try
{
Refute(solver);
}
catch (ApplicationException e)
{
// TODO(user): Catch only fail exceptions.
solver.ShouldFail();
}
}
/**
* This is a new method to subclass when defining a .Net decision.
*/
public virtual void Refute(Solver solver)
{
}
}
public class NetDemon : Demon
{
/**
* This methods wraps the calls to next() and catches fail exceptions.
*/
public override void RunWrapper(Solver solver)
{
try
{
Run(solver);
}
catch (ApplicationException e)
{
// TODO(user): Check that this is indeed a fail. Try implementing
// custom exceptions (hard).
solver.ShouldFail();
}
}
/**
* This is the new method to subclass when defining a .Net decision builder.
*/
public virtual void Run(Solver solver) {}
public override int Priority() {
return Solver.NORMAL_PRIORITY;
}
public override string ToString() {
return "NetDemon";
}
}
public class NetConstraint : Constraint {
public NetConstraint(Solver s) : base(s) {}
public override void InitialPropagateWrapper() {
try {
InitialPropagate();
} catch (ApplicationException e) {
solver().ShouldFail();
}
}
public virtual void InitialPropagate() {}
public override string ToString() {
return "NetConstraint";
}
}
public class IntVarEnumerator : IEnumerator {
private IntVarIterator iterator_;
// Enumerators are positioned before the first element
// until the first MoveNext() call.
private bool first_ = true;
public IntVarEnumerator(IntVarIterator iterator) {
iterator_ = iterator;
}
public bool MoveNext() {
if (first_) {
iterator_.Init();
first_ = false;
} else {
iterator_.Next();
}
return iterator_.Ok();
}
public void Reset() {
first_ = true;
}
object IEnumerator.Current {
get {
return Current;
}
}
public long Current {
get {
if (!first_ && iterator_.Ok()) {
return iterator_.Value();
} else {
throw new InvalidOperationException();
}
}
}
}
public partial class IntVarIterator : BaseObject, IEnumerable {
IEnumerator IEnumerable.GetEnumerator() {
return (IEnumerator) GetEnumerator();
}
public IntVarEnumerator GetEnumerator() {
return new IntVarEnumerator(this);
}
}
} // namespace Google.OrTools.ConstraintSolver

View File

@@ -0,0 +1,517 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.ConstraintSolver {
using System;
using System.Collections.Generic;
public partial class Solver : IDisposable {
public IntVar[] MakeIntVarArray(int count, long min, long max) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeIntVar(min, max);
}
return array;
}
public IntVar[] MakeIntVarArray(int count, long min, long max, string name) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
string var_name = name + i;
array[i] = MakeIntVar(min, max, var_name);
}
return array;
}
public IntVar[] MakeIntVarArray(int count, long[] values) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeIntVar(values);
}
return array;
}
public IntVar[] MakeIntVarArray(int count, long[] values, string name) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
string var_name = name + i;
array[i] = MakeIntVar(values, var_name);
}
return array;
}
public IntVar[] MakeIntVarArray(int count, int[] values) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeIntVar(values);
}
return array;
}
public IntVar[] MakeIntVarArray(int count, int[] values, string name) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
string var_name = name + i;
array[i] = MakeIntVar(values, var_name);
}
return array;
}
public IntVar[] MakeBoolVarArray(int count) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeBoolVar();
}
return array;
}
public IntVar[] MakeBoolVarArray(int count, string name) {
IntVar[] array = new IntVar[count];
for (int i = 0; i < count; ++i) {
string var_name = name + i;
array[i] = MakeBoolVar(var_name);
}
return array;
}
public IntVar[,] MakeIntVarMatrix(int rows, int cols, long min, long max) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
array[i,j] = MakeIntVar(min, max);
}
}
return array;
}
public IntVar[,] MakeIntVarMatrix(int rows, int cols,
long min, long max, string name) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "["+ i + ", " + j +"]";
array[i,j] = MakeIntVar(min, max, var_name);
}
}
return array;
}
public IntVar[,] MakeIntVarMatrix(int rows, int cols, long[] values) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
array[i,j] = MakeIntVar(values);
}
}
return array;
}
public IntVar[,] MakeIntVarMatrix(int rows, int cols,
long[] values, string name) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "["+ i + ", " + j +"]";
array[i,j] = MakeIntVar(values, var_name);
}
}
return array;
}
public IntVar[,] MakeIntVarMatrix(int rows, int cols, int[] values) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
array[i,j] = MakeIntVar(values);
}
}
return array;
}
public IntVar[,] MakeIntVarMatrix(int rows, int cols,
int[] values, string name) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "["+ i + ", " + j +"]";
array[i,j] = MakeIntVar(values, var_name);
}
}
return array;
}
public IntVar[,] MakeBoolVarMatrix(int rows, int cols) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
array[i,j] = MakeBoolVar();
}
}
return array;
}
public IntVar[,] MakeBoolVarMatrix(int rows, int cols, string name) {
IntVar[,] array = new IntVar[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "["+ i + ", " + j +"]";
array[i,j] = MakeBoolVar(var_name);
}
}
return array;
}
public IntervalVar[] MakeFixedDurationIntervalVarArray(int count,
long start_min,
long start_max,
long duration,
bool optional) {
IntervalVar[] array = new IntervalVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeFixedDurationIntervalVar(start_min,
start_max,
duration,
optional,
"");
}
return array;
}
public IntervalVar[] MakeFixedDurationIntervalVarArray(int count,
long start_min,
long start_max,
long duration,
bool optional,
string name) {
IntervalVar[] array = new IntervalVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeFixedDurationIntervalVar(start_min,
start_max,
duration,
optional,
name + i);
}
return array;
}
public IntervalVar[] MakeFixedDurationIntervalVarArray(int count,
long[] start_min,
long[] start_max,
long[] duration,
bool optional,
string name) {
IntervalVar[] array = new IntervalVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeFixedDurationIntervalVar(start_min[i],
start_max[i],
duration[i],
optional,
name + i);
}
return array;
}
public IntervalVar[] MakeFixedDurationIntervalVarArray(int count,
int[] start_min,
int[] start_max,
int[] duration,
bool optional,
string name) {
IntervalVar[] array = new IntervalVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeFixedDurationIntervalVar(start_min[i],
start_max[i],
duration[i],
optional,
name + i);
}
return array;
}
public IntervalVar[] MakeFixedDurationIntervalVarArray(IntVar[] starts,
int[] durations,
string name) {
int count = starts.Length;
IntervalVar[] array = new IntervalVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeFixedDurationIntervalVar(starts[i],
durations[i],
name + i);
}
return array;
}
public IntervalVar[] MakeFixedDurationIntervalVarArray(IntVar[] starts,
long[] durations,
string name) {
int count = starts.Length;
IntervalVar[] array = new IntervalVar[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeFixedDurationIntervalVar(starts[i],
durations[i],
name + i);
}
return array;
}
public void NewSearch(DecisionBuilder db) {
pinned_decision_builder_ = db;
pinned_search_monitors_.Clear();
NewSearchAux(db);
}
public void NewSearch(DecisionBuilder db, SearchMonitor sm1) {
pinned_decision_builder_ = db;
pinned_search_monitors_.Clear();
pinned_search_monitors_.Add(sm1);
NewSearchAux(db, sm1);
}
public void NewSearch(DecisionBuilder db,
SearchMonitor sm1,
SearchMonitor sm2) {
pinned_decision_builder_ = db;
pinned_search_monitors_.Clear();
pinned_search_monitors_.Add(sm1);
pinned_search_monitors_.Add(sm2);
NewSearchAux(db, sm1, sm2);
}
public void NewSearch(DecisionBuilder db,
SearchMonitor sm1,
SearchMonitor sm2,
SearchMonitor sm3) {
pinned_decision_builder_ = db;
pinned_search_monitors_.Clear();
pinned_search_monitors_.Add(sm1);
pinned_search_monitors_.Add(sm2);
pinned_search_monitors_.Add(sm3);
NewSearchAux(db, sm1, sm2, sm3);
}
public void NewSearch(DecisionBuilder db,
SearchMonitor sm1,
SearchMonitor sm2,
SearchMonitor sm3,
SearchMonitor sm4) {
pinned_decision_builder_ = db;
pinned_search_monitors_.Clear();
pinned_search_monitors_.Add(sm1);
pinned_search_monitors_.Add(sm2);
pinned_search_monitors_.Add(sm3);
pinned_search_monitors_.Add(sm4);
NewSearchAux(db, sm1, sm2, sm3, sm4);
}
public void NewSearch(DecisionBuilder db, SearchMonitor[] monitors) {
pinned_decision_builder_ = db;
pinned_search_monitors_.Clear();
pinned_search_monitors_.AddRange(monitors);
NewSearchAux(db, monitors);
}
public void EndSearch() {
pinned_decision_builder_ = null;
pinned_search_monitors_.Clear();
EndSearchAux();
}
private System.Collections.Generic.List<SearchMonitor> pinned_search_monitors_
= new System.Collections.Generic.List<SearchMonitor>();
private DecisionBuilder pinned_decision_builder_;
}
public partial class IntExpr : PropagationBaseObject {
public static IntExpr operator+(IntExpr a, IntExpr b) {
return a.solver().MakeSum(a, b);
}
public static IntExpr operator+(IntExpr a, long v) {
return a.solver().MakeSum(a, v);
}
public static IntExpr operator+(long v, IntExpr a) {
return a.solver().MakeSum(a, v);
}
public static IntExpr operator-(IntExpr a, IntExpr b) {
return a.solver().MakeDifference(a, b);
}
public static IntExpr operator-(IntExpr a, long v) {
return a.solver().MakeSum(a, -v);
}
public static IntExpr operator-(long v, IntExpr a) {
return a.solver().MakeDifference(v, a);
}
public static IntExpr operator*(IntExpr a, IntExpr b) {
return a.solver().MakeProd(a, b);
}
public static IntExpr operator*(IntExpr a, long v) {
return a.solver().MakeProd(a, v);
}
public static IntExpr operator*(long v, IntExpr a) {
return a.solver().MakeProd(a, v);
}
public static IntExpr operator/(IntExpr a, long v) {
return a.solver().MakeDiv(a, v);
}
public static IntExpr operator%(IntExpr a, long v) {
return a.solver().MakeModulo(a, v);
}
public static IntExpr operator-(IntExpr a) {
return a.solver().MakeOpposite(a);
}
public IntExpr Abs() {
return this.solver().MakeAbs(this);
}
public IntExpr Square() {
return this.solver().MakeSquare(this);
}
public static IntExprEquality operator ==(IntExpr a, IntExpr b) {
return new IntExprEquality(a, b, true);
}
public static IntExprEquality operator !=(IntExpr a, IntExpr b) {
return new IntExprEquality(a, b, false);
}
public static WrappedConstraint operator ==(IntExpr a, long v) {
return new WrappedConstraint(a.solver().MakeEquality(a, v));
}
public static WrappedConstraint operator !=(IntExpr a, long v) {
return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
}
public static WrappedConstraint operator >=(IntExpr a, long v) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a, v));
}
public static WrappedConstraint operator >(IntExpr a, long v) {
return new WrappedConstraint(a.solver().MakeGreater(a, v));
}
public static WrappedConstraint operator <=(IntExpr a, long v) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a, v));
}
public static WrappedConstraint operator <(IntExpr a, long v) {
return new WrappedConstraint(a.solver().MakeLess(a, v));
}
public static WrappedConstraint operator >=(IntExpr a, IntExpr b) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), b.Var()));
}
public static WrappedConstraint operator >(IntExpr a, IntExpr b) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), b.Var()));
}
public static WrappedConstraint operator <=(IntExpr a, IntExpr b) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), b.Var()));
}
public static WrappedConstraint operator <(IntExpr a, IntExpr b) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), b.Var()));
}
}
public partial class Constraint : PropagationBaseObject, IConstraintWithStatus {
public static implicit operator IntVar(Constraint eq)
{
return eq.Var();
}
public static implicit operator IntExpr(Constraint eq)
{
return eq.Var();
}
public static IntExpr operator+(Constraint a, Constraint b) {
return a.solver().MakeSum(a.Var(), b.Var());
}
public static IntExpr operator+(Constraint a, long v) {
return a.solver().MakeSum(a.Var(), v);
}
public static IntExpr operator+(long v, Constraint a) {
return a.solver().MakeSum(a.Var(), v);
}
public static IntExpr operator-(Constraint a, Constraint b) {
return a.solver().MakeDifference(a.Var(), b.Var());
}
public static IntExpr operator-(Constraint a, long v) {
return a.solver().MakeSum(a.Var(), -v);
}
public static IntExpr operator-(long v, Constraint a) {
return a.solver().MakeDifference(v, a.Var());
}
public static IntExpr operator*(Constraint a, Constraint b) {
return a.solver().MakeProd(a.Var(), b.Var());
}
public static IntExpr operator*(Constraint a, long v) {
return a.solver().MakeProd(a.Var(), v);
}
public static IntExpr operator*(long v, Constraint a) {
return a.solver().MakeProd(a.Var(), v);
}
public static IntExpr operator/(Constraint a, long v) {
return a.solver().MakeDiv(a.Var(), v);
}
public static IntExpr operator-(Constraint a) {
return a.solver().MakeOpposite(a.Var());
}
public IntExpr Abs() {
return this.solver().MakeAbs(this.Var());
}
public IntExpr Square() {
return this.solver().MakeSquare(this.Var());
}
public static WrappedConstraint operator ==(Constraint a, long v) {
return new WrappedConstraint(a.solver().MakeEquality(a.Var(), v));
}
public static WrappedConstraint operator ==(long v, Constraint a) {
return new WrappedConstraint(a.solver().MakeEquality(a.Var(), v));
}
public static WrappedConstraint operator !=(Constraint a, long v) {
return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
}
public static WrappedConstraint operator !=(long v, Constraint a) {
return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
}
public static WrappedConstraint operator >=(Constraint a, long v) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), v));
}
public static WrappedConstraint operator >=(long v, Constraint a) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), v));
}
public static WrappedConstraint operator >(Constraint a, long v) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), v));
}
public static WrappedConstraint operator >(long v, Constraint a) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), v));
}
public static WrappedConstraint operator <=(Constraint a, long v) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), v));
}
public static WrappedConstraint operator <=(long v, Constraint a) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), v));
}
public static WrappedConstraint operator <(Constraint a, long v) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), v));
}
public static WrappedConstraint operator <(long v, Constraint a) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), v));
}
public static WrappedConstraint operator >=(Constraint a, Constraint b) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), b.Var()));
}
public static WrappedConstraint operator >(Constraint a, Constraint b) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), b.Var()));
}
public static WrappedConstraint operator <=(Constraint a, Constraint b) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), b.Var()));
}
public static WrappedConstraint operator <(Constraint a, Constraint b) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), b.Var()));
}
public static ConstraintEquality operator ==(Constraint a, Constraint b) {
return new ConstraintEquality(a, b, true);
}
public static ConstraintEquality operator !=(Constraint a, Constraint b) {
return new ConstraintEquality(a, b, false);
}
}
} // namespace Google.OrTools.ConstraintSolver

View File

@@ -0,0 +1,300 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.ConstraintSolver
{
using System;
using System.Collections.Generic;
public interface IConstraintWithStatus
{
Solver solver();
IntVar Var();
}
public abstract class BaseEquality : IConstraintWithStatus
{
abstract public Solver solver();
abstract public IntVar Var();
public static IntExpr operator+(BaseEquality a, BaseEquality b) {
return a.solver().MakeSum(a.Var(), b.Var());
}
public static IntExpr operator+(BaseEquality a, long v) {
return a.solver().MakeSum(a.Var(), v);
}
public static IntExpr operator+(long v, BaseEquality a) {
return a.solver().MakeSum(a.Var(), v);
}
public static IntExpr operator-(BaseEquality a, BaseEquality b) {
return a.solver().MakeDifference(a.Var(), b.Var());
}
public static IntExpr operator-(BaseEquality a, long v) {
return a.solver().MakeSum(a.Var(), -v);
}
public static IntExpr operator-(long v, BaseEquality a) {
return a.solver().MakeDifference(v, a.Var());
}
public static IntExpr operator*(BaseEquality a, BaseEquality b) {
return a.solver().MakeProd(a.Var(), b.Var());
}
public static IntExpr operator*(BaseEquality a, long v) {
return a.solver().MakeProd(a.Var(), v);
}
public static IntExpr operator*(long v, BaseEquality a) {
return a.solver().MakeProd(a.Var(), v);
}
public static IntExpr operator/(BaseEquality a, long v) {
return a.solver().MakeDiv(a.Var(), v);
}
public static IntExpr operator-(BaseEquality a) {
return a.solver().MakeOpposite(a.Var());
}
public IntExpr Abs() {
return this.solver().MakeAbs(this.Var());
}
public IntExpr Square() {
return this.solver().MakeSquare(this.Var());
}
public static WrappedConstraint operator ==(BaseEquality a, long v) {
return new WrappedConstraint(a.solver().MakeEquality(a.Var(), v));
}
public static WrappedConstraint operator ==(long v, BaseEquality a) {
return new WrappedConstraint(a.solver().MakeEquality(a.Var(), v));
}
public static WrappedConstraint operator !=(BaseEquality a, long v) {
return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
}
public static WrappedConstraint operator !=(long v, BaseEquality a) {
return new WrappedConstraint(a.solver().MakeNonEquality(a.Var(), v));
}
public static WrappedConstraint operator >=(BaseEquality a, long v) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), v));
}
public static WrappedConstraint operator >=(long v, BaseEquality a) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), v));
}
public static WrappedConstraint operator >(BaseEquality a, long v) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), v));
}
public static WrappedConstraint operator >(long v, BaseEquality a) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), v));
}
public static WrappedConstraint operator <=(BaseEquality a, long v) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), v));
}
public static WrappedConstraint operator <=(long v, BaseEquality a) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(), v));
}
public static WrappedConstraint operator <(BaseEquality a, long v) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), v));
}
public static WrappedConstraint operator <(long v, BaseEquality a) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), v));
}
public static WrappedConstraint operator >=(BaseEquality a, BaseEquality b) {
return new WrappedConstraint(a.solver().MakeGreaterOrEqual(a.Var(),
b.Var()));
}
public static WrappedConstraint operator >(BaseEquality a, BaseEquality b) {
return new WrappedConstraint(a.solver().MakeGreater(a.Var(), b.Var()));
}
public static WrappedConstraint operator <=(BaseEquality a, BaseEquality b) {
return new WrappedConstraint(a.solver().MakeLessOrEqual(a.Var(), b.Var()));
}
public static WrappedConstraint operator <(BaseEquality a, BaseEquality b) {
return new WrappedConstraint(a.solver().MakeLess(a.Var(), b.Var()));
}
public static ConstraintEquality operator ==(BaseEquality a, BaseEquality b) {
return new ConstraintEquality(a, b, true);
}
public static ConstraintEquality operator !=(BaseEquality a, BaseEquality b) {
return new ConstraintEquality(a, b, false);
}
}
public class WrappedConstraint : BaseEquality
{
public bool Val { get; set; }
public Constraint Cst { get; set; }
public WrappedConstraint(Constraint cst) : this(true, cst) {}
public WrappedConstraint(bool val) : this(val, null) {}
public WrappedConstraint(bool val, Constraint cst)
{
this.Val = val;
this.Cst = cst;
}
public static implicit operator bool(WrappedConstraint valCstPair)
{
return valCstPair.Val;
}
public static implicit operator Constraint(WrappedConstraint valCstPair)
{
return valCstPair.Cst;
}
public static implicit operator IntVar(WrappedConstraint eq)
{
return eq.Var();
}
public static implicit operator IntExpr(WrappedConstraint eq)
{
return eq.Var();
}
public override Solver solver()
{
return this.Cst.solver();
}
public override IntVar Var()
{
return Cst.Var();
}
}
public class IntExprEquality : BaseEquality
{
public IntExprEquality(IntExpr a, IntExpr b, bool equality)
{
this.left_ = a;
this.right_ = b;
this.equality_ = equality;
}
bool IsTrue()
{
return (object)left_ == (object)right_ ? equality_ : !equality_;
}
Constraint ToConstraint()
{
return equality_ ?
left_.solver().MakeEquality(left_.Var(), right_.Var()) :
left_.solver().MakeNonEquality(left_.Var(), right_.Var());
}
public static bool operator true(IntExprEquality eq)
{
return eq.IsTrue();
}
public static bool operator false(IntExprEquality eq)
{
return !eq.IsTrue();
}
public static implicit operator Constraint(IntExprEquality eq)
{
return eq.ToConstraint();
}
public override IntVar Var()
{
return equality_ ?
left_.solver().MakeIsEqualVar(left_, right_) :
left_.solver().MakeIsDifferentVar(left_, right_);
}
public static implicit operator IntVar(IntExprEquality eq)
{
return eq.Var();
}
public static implicit operator IntExpr(IntExprEquality eq)
{
return eq.Var();
}
public override Solver solver()
{
return left_.solver();
}
private IntExpr left_;
private IntExpr right_;
private bool equality_;
}
public class ConstraintEquality : BaseEquality
{
public ConstraintEquality(IConstraintWithStatus a,
IConstraintWithStatus b,
bool equality)
{
this.left_ = a;
this.right_ = b;
this.equality_ = equality;
}
bool IsTrue()
{
return (object)left_ == (object)right_ ? equality_ : !equality_;
}
Constraint ToConstraint()
{
return equality_ ?
left_.solver().MakeEquality(left_.Var(), right_.Var()) :
left_.solver().MakeNonEquality(left_.Var(), right_.Var());
}
public static bool operator true(ConstraintEquality eq)
{
return eq.IsTrue();
}
public static bool operator false(ConstraintEquality eq)
{
return !eq.IsTrue();
}
public static implicit operator Constraint(ConstraintEquality eq)
{
return eq.ToConstraint();
}
public override IntVar Var()
{
return equality_ ?
left_.solver().MakeIsEqualVar(left_.Var(), right_.Var()) :
left_.solver().MakeIsDifferentVar(left_.Var(), right_.Var());
}
public static implicit operator IntVar(ConstraintEquality eq)
{
return eq.Var();
}
public static implicit operator IntExpr(ConstraintEquality eq)
{
return eq.Var();
}
public override Solver solver()
{
return left_.solver();
}
private IConstraintWithStatus left_;
private IConstraintWithStatus right_;
private bool equality_;
}
} // namespace Google.OrTools.ConstraintSolver

View File

@@ -0,0 +1,40 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.LinearSolver {
using System;
using System.Collections.Generic;
// double[] helper class.
public partial class MpDoubleVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<double>
#endif
{
// cast from C# double array
public static implicit operator MpDoubleVector(double[] inVal) {
var outVal= new MpDoubleVector();
foreach (double element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# double array
public static implicit operator double[](MpDoubleVector inVal) {
var outVal= new double[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
} // namespace Google.OrTools.LinearSolver

View File

@@ -0,0 +1,140 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.LinearSolver
{
using System;
using System.Collections.Generic;
public class LinearConstraint
{
public virtual String ToString()
{
return "LinearConstraint";
}
public virtual Constraint Extract(Solver solver)
{
return null;
}
}
public class RangeConstraint : LinearConstraint
{
public RangeConstraint(LinearExpr expr, double lb, double ub)
{
this.expr_ = expr;
this.lb_ = lb;
this.ub_ = ub;
}
public override String ToString()
{
return "" + lb_ + " <= " + expr_.ToString() + " <= " + ub_;
}
public override Constraint Extract(Solver solver)
{
Dictionary<Variable, double> coefficients =
new Dictionary<Variable, double>();
double constant = expr_.Visit(coefficients);
Constraint ct = solver.MakeConstraint(lb_ - constant, ub_ - constant);
foreach (KeyValuePair<Variable, double> pair in coefficients)
{
ct.SetCoefficient(pair.Key, pair.Value);
}
return ct;
}
public static implicit operator bool(RangeConstraint ct)
{
return false;
}
private LinearExpr expr_;
private double lb_;
private double ub_;
}
public class Equality : LinearConstraint
{
public Equality(LinearExpr left, LinearExpr right, bool equality)
{
this.left_ = left;
this.right_ = right;
this.equality_ = equality;
}
public override String ToString()
{
return "" + left_.ToString() + " == " + right_.ToString();
}
public override Constraint Extract(Solver solver)
{
Dictionary<Variable, double> coefficients =
new Dictionary<Variable, double>();
double constant = left_.Visit(coefficients);
constant += right_.DoVisit(coefficients, -1);
Constraint ct = solver.MakeConstraint(-constant, -constant);
foreach (KeyValuePair<Variable, double> pair in coefficients)
{
ct.SetCoefficient(pair.Key, pair.Value);
}
return ct;
}
public static implicit operator bool(Equality ct)
{
return (object)ct.left_ == (object)ct.right_ ? ct.equality_ : !ct.equality_;
}
private LinearExpr left_;
private LinearExpr right_;
private bool equality_;
}
public class VarEquality : LinearConstraint
{
public VarEquality(Variable left, Variable right, bool equality)
{
this.left_ = left;
this.right_ = right;
this.equality_ = equality;
}
public override String ToString()
{
return "" + left_.Name() + " == " + right_.Name();
}
public override Constraint Extract(Solver solver)
{
Constraint ct = solver.MakeConstraint(0.0, 0.0);
ct.SetCoefficient(left_, 1.0);
ct.SetCoefficient(right_, -1.0);
return ct;
}
public static implicit operator bool(VarEquality ct)
{
return (object)ct.left_ == (object)ct.right_ ? ct.equality_ : !ct.equality_;
}
private Variable left_;
private Variable right_;
private bool equality_;
}
} // namespace Google.OrTools.LinearSolver

View File

@@ -0,0 +1,344 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.LinearSolver
{
using System;
using System.Collections.Generic;
public class LinearExpr
{
public virtual double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier)
{
return 0;
}
public double Visit(Dictionary<Variable, double> coefficients)
{
return DoVisit(coefficients, 1.0);
}
public static LinearExpr operator+(LinearExpr a, double v)
{
return new SumCst(a, v);
}
public static LinearExpr operator+(double v, LinearExpr a)
{
return new SumCst(a, v);
}
public static LinearExpr operator+(LinearExpr a, LinearExpr b)
{
return new Sum(a, b);
}
public static LinearExpr operator-(LinearExpr a, double v)
{
return new SumCst(a, -v);
}
public static LinearExpr operator-(double v, LinearExpr a)
{
return new SumCst(new ProductCst(a, -1.0), v);
}
public static LinearExpr operator-(LinearExpr a, LinearExpr b)
{
return new Sum(a, new ProductCst(b, -1.0));
}
public static LinearExpr operator-(LinearExpr a)
{
return new ProductCst(a, -1.0);
}
public static LinearExpr operator*(LinearExpr a, double v)
{
return new ProductCst(a, v);
}
public static LinearExpr operator/(LinearExpr a, double v)
{
return new ProductCst(a, 1 / v);
}
public static LinearExpr operator*(double v, LinearExpr a)
{
return new ProductCst(a, v);
}
public static RangeConstraint operator==(LinearExpr a, double v)
{
return new RangeConstraint(a, v, v);
}
public static RangeConstraint operator==(double v, LinearExpr a)
{
return new RangeConstraint(a, v, v);
}
public static RangeConstraint operator!=(LinearExpr a, double v)
{
return new RangeConstraint(a, 1, -1);
}
public static RangeConstraint operator!=(double v, LinearExpr a)
{
return new RangeConstraint(a, 1, -1);
}
public static Equality operator==(LinearExpr a, LinearExpr b)
{
return new Equality(a, b, true);
}
public static Equality operator!=(LinearExpr a, LinearExpr b)
{
return new Equality(a, b, false);
}
public static RangeConstraint operator<=(LinearExpr a, double v)
{
return new RangeConstraint(a, double.NegativeInfinity, v);
}
public static RangeConstraint operator>=(LinearExpr a, double v)
{
return new RangeConstraint(a, v, double.PositiveInfinity);
}
public static RangeConstraint operator<=(LinearExpr a, LinearExpr b)
{
return a - b <= 0;
}
public static RangeConstraint operator>=(LinearExpr a, LinearExpr b)
{
return a - b >= 0;
}
public static implicit operator LinearExpr(Variable a)
{
return new VarWrapper(a);
}
}
public static class LinearExprArrayHelper
{
public static LinearExpr Sum(this LinearExpr[] exprs)
{
return new SumArray(exprs);
}
public static LinearExpr Sum(this Variable[] vars)
{
return new SumVarArray(vars);
}
}
// def __ge__(self, arg):
// if isinstance(arg, (int, long, float)):
// return LinearConstraint(self, arg, 1e308)
// else:
// return LinearConstraint(Sum(self, ProductCst(arg, -1)), 0.0, 1e308)
// def __le__(self, arg):
// if isinstance(arg, (int, long, float)):
// return LinearConstraint(self, -1e308, arg)
// else:
// return LinearConstraint(Sum(self, ProductCst(arg, -1)), -1e308, 0.0)
class ProductCst : LinearExpr
{
public ProductCst(LinearExpr expr, double coeff)
{
this.coeff_ = coeff;
this.expr_ = expr;
}
public override String ToString()
{
return "(" + expr_.ToString() + " * " + coeff_ + ")";
}
public override double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier)
{
double current_multiplier = multiplier * coeff_;
if (current_multiplier != 0.0)
{
return expr_.DoVisit(coefficients, current_multiplier);
}
else
{
return 0.0;
}
}
private LinearExpr expr_;
private double coeff_;
}
class SumCst : LinearExpr
{
public SumCst(LinearExpr expr, double coeff)
{
this.coeff_ = coeff;
this.expr_ = expr;
}
public override String ToString()
{
return "(" + expr_.ToString() + " + " + coeff_ + ")";
}
public override double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier)
{
if (multiplier != 0.0)
{
return coeff_ * multiplier + expr_.DoVisit(coefficients, multiplier);
}
else
{
return 0.0;
}
}
private LinearExpr expr_;
private double coeff_;
}
class VarWrapper : LinearExpr
{
public VarWrapper(Variable var)
{
this.var_ = var;
}
public override String ToString()
{
return var_.Name();
}
public override double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier)
{
if (multiplier != 0.0)
{
if (coefficients.ContainsKey(var_))
{
coefficients[var_] += multiplier;
}
else
{
coefficients[var_] = multiplier;
}
}
return 0.0;
}
private Variable var_;
}
class Sum : LinearExpr
{
public Sum(LinearExpr left, LinearExpr right)
{
this.left_ = left;
this.right_ = right;
}
public override String ToString()
{
return "(" + left_.ToString() + " + " + right_.ToString() + ")";
}
public override double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier)
{
if (multiplier != 0.0)
{
return left_.DoVisit(coefficients, multiplier) +
right_.DoVisit(coefficients, multiplier);
}
else
{
return 0.0;
}
}
private LinearExpr left_;
private LinearExpr right_;
}
public class SumArray : LinearExpr
{
public SumArray(LinearExpr[] array)
{
this.array_ = array;
}
public override double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier) {
if (multiplier != 0.0)
{
double constant = 0.0;
foreach (LinearExpr expr in array_)
{
constant += expr.DoVisit(coefficients, multiplier);
}
return constant;
}
else
{
return 0.0;
}
}
private LinearExpr[] array_;
}
public class SumVarArray : LinearExpr
{
public SumVarArray(Variable[] array)
{
this.array_ = array;
}
public override double DoVisit(Dictionary<Variable, double> coefficients,
double multiplier) {
if (multiplier != 0.0)
{
foreach (Variable var in array_)
{
if (coefficients.ContainsKey(var))
{
coefficients[var] += multiplier;
}
else
{
coefficients[var] = multiplier;
}
}
}
return 0.0;
}
private Variable[] array_;
}
} // namespace Google.OrTools.LinearSolver

View File

@@ -0,0 +1,250 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.LinearSolver {
using System;
using System.Collections.Generic;
// Patch the MPSolver class to:
// - support custom versions of the array-based APIs (MakeVarArray, etc).
// - customize the construction, and the OptimizationProblemType enum.
// - support the natural language API.
public partial class Solver {
public Variable[] MakeVarArray(int count,
double lb,
double ub,
bool integer) {
Variable[] array = new Variable[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeVar(lb, ub, integer, "");
}
return array;
}
public Variable[] MakeVarArray(int count,
double lb,
double ub,
bool integer,
string var_name) {
Variable[] array = new Variable[count];
for (int i = 0; i < count; ++i) {
array[i] = MakeVar(lb, ub, integer, var_name + i);
}
return array;
}
public Variable[,] MakeVarMatrix(int rows,
int cols,
double lb,
double ub,
bool integer) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
matrix[i,j] = MakeVar(lb, ub, integer, "");
}
}
return matrix;
}
public Variable[,] MakeVarMatrix(int rows,
int cols,
double lb,
double ub,
bool integer,
string name) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "[" + i + ", " + j +"]";
matrix[i,j] = MakeVar(lb, ub, integer, var_name);
}
}
return matrix;
}
public Variable[] MakeNumVarArray(int count, double lb, double ub) {
return MakeVarArray(count, lb, ub, false);
}
public Variable[] MakeNumVarArray(int count,
double lb,
double ub,
string var_name) {
return MakeVarArray(count, lb, ub, false, var_name);
}
public Variable[,] MakeNumVarMatrix(int rows,
int cols,
double lb,
double ub) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
matrix[i,j] = MakeNumVar(lb, ub, "");
}
}
return matrix;
}
public Variable[,] MakeNumVarMatrix(int rows,
int cols,
double lb,
double ub,
string name) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "[" + i + ", " + j +"]";
matrix[i,j] = MakeNumVar(lb, ub, var_name);
}
}
return matrix;
}
public Variable[] MakeIntVarArray(int count, double lb, double ub) {
return MakeVarArray(count, lb, ub, true);
}
public Variable[] MakeIntVarArray(int count,
double lb,
double ub,
string var_name) {
return MakeVarArray(count, lb, ub, true, var_name);
}
public Variable[,] MakeIntVarMatrix(int rows,
int cols,
double lb,
double ub) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
matrix[i,j] = MakeIntVar(lb, ub, "");
}
}
return matrix;
}
public Variable[,] MakeIntVarMatrix(int rows,
int cols,
double lb,
double ub,
string name) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "[" + i + ", " + j +"]";
matrix[i,j] = MakeIntVar(lb, ub, var_name);
}
}
return matrix;
}
public Variable[] MakeBoolVarArray(int count) {
return MakeVarArray(count, 0.0, 1.0, true);
}
public Variable[] MakeBoolVarArray(int count, string var_name) {
return MakeVarArray(count, 0.0, 1.0, true, var_name);
}
public Variable[,] MakeBoolVarMatrix(int rows, int cols) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
matrix[i,j] = MakeBoolVar("");
}
}
return matrix;
}
public Variable[,] MakeBoolVarMatrix(int rows, int cols, string name) {
Variable[,] matrix = new Variable[rows, cols];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
string var_name = name + "[" + i + ", " + j +"]";
matrix[i,j] = MakeBoolVar(var_name);
}
}
return matrix;
}
public static int GetSolverEnum(String solverType) {
System.Reflection.FieldInfo fieldInfo =
typeof(Solver).GetField(solverType);
if (fieldInfo != null) {
return (int)fieldInfo.GetValue(null);
} else {
throw new System.ApplicationException("Solver not supported");
}
}
public static Solver CreateSolver(String name, String type) {
System.Reflection.FieldInfo fieldInfo =
typeof(Solver).GetField(type);
if (fieldInfo != null) {
return new Solver(name, (int)fieldInfo.GetValue(null));
} else {
return null;
}
}
public Constraint Add(LinearConstraint constraint) {
return constraint.Extract(this);
}
public void Minimize(LinearExpr expr)
{
Objective().Clear();
Objective().SetMinimization();
Dictionary<Variable, double> coefficients =
new Dictionary<Variable, double>();
double constant = expr.Visit(coefficients);
foreach (KeyValuePair<Variable, double> pair in coefficients)
{
Objective().SetCoefficient(pair.Key, pair.Value);
}
Objective().SetOffset(constant);
}
public void Maximize(LinearExpr expr)
{
Objective().Clear();
Objective().SetMaximization();
Dictionary<Variable, double> coefficients =
new Dictionary<Variable, double>();
double constant = expr.Visit(coefficients);
foreach (KeyValuePair<Variable, double> pair in coefficients)
{
Objective().SetCoefficient(pair.Key, pair.Value);
}
Objective().SetOffset(constant);
}
public void Minimize(Variable var)
{
Objective().Clear();
Objective().SetMinimization();
Objective().SetCoefficient(var, 1.0);
}
public void Maximize(Variable var)
{
Objective().Clear();
Objective().SetMaximization();
Objective().SetCoefficient(var, 1.0);
}
}
} // namespace Google.OrTools.LinearSolver

View File

@@ -0,0 +1,191 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.LinearSolver {
using System;
using System.Collections.Generic;
// Patch the MPVariable class to support the natural language API.
public partial class Variable {
public static LinearExpr operator+(Variable a, double v)
{
return new VarWrapper(a) + v;
}
public static LinearExpr operator+(double v, Variable a)
{
return a + v;
}
public static LinearExpr operator+(Variable a, LinearExpr b)
{
return new VarWrapper(a) + b;
}
public static LinearExpr operator+(Variable a, Variable b)
{
return new VarWrapper(a) + new VarWrapper(b);
}
public static LinearExpr operator+(LinearExpr a, Variable b)
{
return a + new VarWrapper(b);
}
public static LinearExpr operator-(Variable a, double v)
{
return new VarWrapper(a) - v;
}
public static LinearExpr operator-(double v, Variable a)
{
return v - new VarWrapper(a);
}
public static LinearExpr operator-(Variable a, LinearExpr b)
{
return new VarWrapper(a) - b;
}
public static LinearExpr operator-(LinearExpr a, Variable b)
{
return a - new VarWrapper(b);
}
public static LinearExpr operator-(Variable a, Variable b)
{
return new VarWrapper(a) - new VarWrapper(b);
}
public static LinearExpr operator-(Variable a)
{
return - new VarWrapper(a);
}
public static LinearExpr operator*(Variable a, double v)
{
return new VarWrapper(a) * v;
}
public static LinearExpr operator/(Variable a, double v)
{
return new VarWrapper(a) / v;
}
public static LinearExpr operator*(double v, Variable a)
{
return v * new VarWrapper(a);
}
public static RangeConstraint operator==(Variable a, double v)
{
return new VarWrapper(a) == v;
}
public static RangeConstraint operator==(double v, Variable a)
{
return v == new VarWrapper(a);
}
public static RangeConstraint operator!=(Variable a, double v)
{
return new VarWrapper(a) != v;
}
public static RangeConstraint operator!=(double v, Variable a)
{
return new VarWrapper(a) != v;
}
public static Equality operator==(Variable a, LinearExpr b)
{
return new VarWrapper(a) == b;
}
public static Equality operator==(LinearExpr a, Variable b)
{
return a == new VarWrapper(b);
}
public static VarEquality operator==(Variable a, Variable b)
{
return new VarEquality(a, b, true);
}
public static Equality operator!=(Variable a, LinearExpr b)
{
return new VarWrapper(a) != b;
}
public static Equality operator!=(LinearExpr a, Variable b)
{
return a != new VarWrapper(b);
}
public static VarEquality operator!=(Variable a, Variable b)
{
return new VarEquality(a, b, false);
}
public static RangeConstraint operator<=(Variable a, double v)
{
return new VarWrapper(a) <= v;
}
public static RangeConstraint operator>=(Variable a, double v)
{
return new VarWrapper(a) >= v;
}
public static RangeConstraint operator<=(double v, Variable a)
{
return new VarWrapper(a) >= v;
}
public static RangeConstraint operator>=(double v, Variable a)
{
return new VarWrapper(a) <= v;
}
public static RangeConstraint operator<=(Variable a, LinearExpr b)
{
return new VarWrapper(a) <= b;
}
public static RangeConstraint operator>=(Variable a, LinearExpr b)
{
return new VarWrapper(a) >= b;
}
public static RangeConstraint operator<=(Variable a, Variable b)
{
return new VarWrapper(a) <= new VarWrapper(b);
}
public static RangeConstraint operator>=(Variable a, Variable b)
{
return new VarWrapper(a) >= new VarWrapper(b);
}
public static RangeConstraint operator<=(LinearExpr a, Variable b)
{
return a <= new VarWrapper(b);
}
public static RangeConstraint operator>=(LinearExpr a, Variable b)
{
return a >= new VarWrapper(b);
}
}
} // namespace Google.OrTools.LinearSolver

View File

@@ -0,0 +1,47 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.Sat
{
using System;
using System.Collections.Generic;
public class Constraint
{
public Constraint(CpModelProto model)
{
index_ = model.Constraints.Count;
constraint_ = new ConstraintProto();
model.Constraints.Add(constraint_);
}
public void OnlyEnforceIf(ILiteral lit)
{
constraint_.EnforcementLiteral.Add(lit.GetIndex());
}
public int Index
{
get { return index_; }
}
public ConstraintProto Proto
{
get { return constraint_; }
}
private int index_;
private ConstraintProto constraint_;
}
} // namespace Google.OrTools.Sat

View File

@@ -0,0 +1,880 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.Sat
{
using System;
using System.Collections.Generic;
public class CpModel
{
public CpModel()
{
model_ = new CpModelProto();
constant_map_ = new Dictionary<long, int>();
}
// Getters.
public CpModelProto Model
{
get { return model_; }
}
int Negated(int index)
{
return -index - 1;
}
// Integer variables and constraints.
public IntVar NewIntVar(long lb, long ub, string name)
{
long[] bounds = { lb, ub };
return new IntVar(model_, bounds, name);
}
public IntVar NewEnumeratedIntVar(IEnumerable<long> bounds, string name)
{
return new IntVar(model_, bounds, name);
}
public IntVar NewOptionalIntVar(
long lb, long ub, ILiteral is_present, string name)
{
long[] bounds = { lb, ub };
return new IntVar(model_, bounds, is_present.GetIndex(), name);
}
public IntVar NewOptionalEnumeratedIntVar(
IEnumerable<long> bounds, ILiteral is_present, string name)
{
return new IntVar(model_, bounds, is_present.GetIndex(), name);
}
// Constants (named or not).
// TODO: Cache constant.
public IntVar NewConstant(long value)
{
long[] bounds = { value, value };
return new IntVar(model_, bounds, String.Format("{0}", value));
}
public IntVar NewConstant(long value, string name)
{
long[] bounds = { value, value };
return new IntVar(model_, bounds, name);
}
public IntVar NewOptionalConstant(
long value, ILiteral is_present, string name)
{
long[] bounds = { value, value };
return new IntVar(model_, bounds, is_present.GetIndex(), name);
}
public IntVar NewBoolVar(string name)
{
long[] bounds = { 0L, 1L };
return new IntVar(model_, bounds, name);
}
public Constraint AddLinearConstraint(IEnumerable<Tuple<IntVar, long>> terms,
long lb, long ub)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (Tuple<IntVar, long> term in terms)
{
lin.Vars.Add(term.Item1.Index);
lin.Coeffs.Add(term.Item2);
}
lin.Domain.Add(lb);
lin.Domain.Add(ub);
ct.Proto.Linear = lin;
return ct;
}
public Constraint AddLinearConstraint(IEnumerable<IntVar> vars,
IEnumerable<long> coeffs,
long lb, long ub)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (IntVar var in vars)
{
lin.Vars.Add(var.Index);
}
foreach (long coeff in coeffs)
{
lin.Coeffs.Add(coeff);
}
lin.Domain.Add(lb);
lin.Domain.Add(ub);
ct.Proto.Linear = lin;
return ct;
}
public Constraint AddLinearConstraint(IEnumerable<IntVar> vars,
IEnumerable<int> coeffs,
long lb, long ub)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (IntVar var in vars)
{
lin.Vars.Add(var.Index);
}
foreach (int coeff in coeffs)
{
lin.Coeffs.Add(coeff);
}
lin.Domain.Add(lb);
lin.Domain.Add(ub);
ct.Proto.Linear = lin;
return ct;
}
public Constraint AddLinearConstraintWithBounds(
IEnumerable<Tuple<IntVar, long>> terms, IEnumerable<long> bounds)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (Tuple<IntVar, long> term in terms)
{
lin.Vars.Add(term.Item1.Index);
lin.Coeffs.Add(term.Item2);
}
foreach (long b in bounds)
{
lin.Domain.Add(b);
}
ct.Proto.Linear = lin;
return ct;
}
public Constraint AddLinearConstraintWithBounds(IEnumerable<IntVar> vars,
IEnumerable<long> coeffs,
IEnumerable<long> bounds)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (IntVar var in vars)
{
lin.Vars.Add(var.Index);
}
foreach (long coeff in coeffs)
{
lin.Coeffs.Add(coeff);
}
foreach (long b in bounds)
{
lin.Domain.Add(b);
}
ct.Proto.Linear = lin;
return ct;
}
public Constraint AddLinearConstraintWithBounds(IEnumerable<IntVar> vars,
IEnumerable<int> coeffs,
IEnumerable<long> bounds)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (IntVar var in vars)
{
lin.Vars.Add(var.Index);
}
foreach (int coeff in coeffs)
{
lin.Coeffs.Add(coeff);
}
foreach (long b in bounds)
{
lin.Domain.Add(b);
}
ct.Proto.Linear = lin;
return ct;
}
public Constraint AddSumConstraint(IEnumerable<IntVar> vars, long lb,
long ub)
{
Constraint ct = new Constraint(model_);
LinearConstraintProto lin = new LinearConstraintProto();
foreach (IntVar var in vars)
{
lin.Vars.Add(var.Index);
lin.Coeffs.Add(1L);
}
lin.Domain.Add(lb);
lin.Domain.Add(ub);
ct.Proto.Linear = lin;
return ct;
}
public Constraint Add(BoundIntegerExpression lin)
{
switch (lin.CtType)
{
case BoundIntegerExpression.Type.BoundExpression:
{
Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
Constraint ct = new Constraint(model_);
LinearConstraintProto linear = new LinearConstraintProto();
foreach (KeyValuePair<IntVar, long> term in dict)
{
linear.Vars.Add(term.Key.Index);
linear.Coeffs.Add(term.Value);
}
linear.Domain.Add(lin.Lb == Int64.MinValue ? Int64.MinValue
: lin.Lb - constant);
linear.Domain.Add(lin.Ub == Int64.MaxValue ? Int64.MaxValue
: lin.Ub - constant);
ct.Proto.Linear = linear;
return ct;
}
case BoundIntegerExpression.Type.VarEqVar:
{
Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
constant += IntegerExpression.GetVarValueMap(lin.Right, -1L, dict);
Constraint ct = new Constraint(model_);
LinearConstraintProto linear = new LinearConstraintProto();
foreach (KeyValuePair<IntVar, long> term in dict)
{
linear.Vars.Add(term.Key.Index);
linear.Coeffs.Add(term.Value);
}
linear.Domain.Add(-constant);
linear.Domain.Add(-constant);
ct.Proto.Linear = linear;
return ct;
}
case BoundIntegerExpression.Type.VarDiffVar:
{
Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
constant += IntegerExpression.GetVarValueMap(lin.Right, -1L, dict);
Constraint ct = new Constraint(model_);
LinearConstraintProto linear = new LinearConstraintProto();
foreach (KeyValuePair<IntVar, long> term in dict)
{
linear.Vars.Add(term.Key.Index);
linear.Coeffs.Add(term.Value);
}
linear.Domain.Add(Int64.MinValue);
linear.Domain.Add(-constant - 1);
linear.Domain.Add(-constant + 1);
linear.Domain.Add(Int64.MaxValue);
ct.Proto.Linear = linear;
return ct;
}
case BoundIntegerExpression.Type.VarEqCst:
{
Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
Constraint ct = new Constraint(model_);
LinearConstraintProto linear = new LinearConstraintProto();
foreach (KeyValuePair<IntVar, long> term in dict)
{
linear.Vars.Add(term.Key.Index);
linear.Coeffs.Add(term.Value);
}
linear.Domain.Add(lin.Lb - constant);
linear.Domain.Add(lin.Lb - constant);
ct.Proto.Linear = linear;
return ct;
}
case BoundIntegerExpression.Type.VarDiffCst:
{
Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
Constraint ct = new Constraint(model_);
LinearConstraintProto linear = new LinearConstraintProto();
foreach (KeyValuePair<IntVar, long> term in dict)
{
linear.Vars.Add(term.Key.Index);
linear.Coeffs.Add(term.Value);
}
linear.Domain.Add(Int64.MinValue);
linear.Domain.Add(lin.Lb - constant - 1);
linear.Domain.Add(lin.Lb - constant + 1);
linear.Domain.Add(Int64.MaxValue);
ct.Proto.Linear = linear;
return ct;
}
}
return null;
}
public Constraint AddAllDifferent(IEnumerable<IntVar> vars)
{
Constraint ct = new Constraint(model_);
AllDifferentConstraintProto alldiff = new AllDifferentConstraintProto();
foreach (IntVar var in vars)
{
alldiff.Vars.Add(var.Index);
}
ct.Proto.AllDiff = alldiff;
return ct;
}
public Constraint AddElement(IntVar index, IEnumerable<IntVar> vars,
IntVar target)
{
Constraint ct = new Constraint(model_);
ElementConstraintProto element = new ElementConstraintProto();
element.Index = index.Index;
foreach (IntVar var in vars)
{
element.Vars.Add(var.Index);
}
element.Target = target.Index;
ct.Proto.Element = element;
return ct;
}
public Constraint AddElement(IntVar index, IEnumerable<long> values,
IntVar target)
{
Constraint ct = new Constraint(model_);
ElementConstraintProto element = new ElementConstraintProto();
element.Index = index.Index;
foreach (long value in values)
{
element.Vars.Add(ConvertConstant(value));
}
element.Target = target.Index;
ct.Proto.Element = element;
return ct;
}
public Constraint AddElement(IntVar index, IEnumerable<int> values,
IntVar target)
{
Constraint ct = new Constraint(model_);
ElementConstraintProto element = new ElementConstraintProto();
element.Index = index.Index;
foreach (int value in values)
{
element.Vars.Add(ConvertConstant(value));
}
element.Target = target.Index;
ct.Proto.Element = element;
return ct;
}
public Constraint AddCircuit(IEnumerable<Tuple<int, int, ILiteral>> arcs)
{
Constraint ct = new Constraint(model_);
CircuitConstraintProto circuit = new CircuitConstraintProto();
foreach (var arc in arcs)
{
circuit.Tails.Add(arc.Item1);
circuit.Heads.Add(arc.Item2);
circuit.Literals.Add(arc.Item3.GetIndex());
}
ct.Proto.Circuit = circuit;
return ct;
}
public Constraint AddAllowedAssignments(IEnumerable<IntVar> vars,
long[,] tuples)
{
Constraint ct = new Constraint(model_);
TableConstraintProto table = new TableConstraintProto();
foreach (IntVar var in vars)
{
table.Vars.Add(var.Index);
}
for (int i = 0; i < tuples.GetLength(0); ++i)
{
for (int j = 0; j < tuples.GetLength(1);++j)
{
table.Values.Add(tuples[i, j]);
}
}
ct.Proto.Table = table;
return ct;
}
public Constraint AddForbiddenAssignments(IEnumerable<IntVar> vars,
long[,] tuples)
{
Constraint ct = AddAllowedAssignments(vars, tuples);
ct.Proto.Table.Negated = true;
return ct;
}
public Constraint AddAutomata(IEnumerable<IntVar> vars,
long starting_state,
long[,] transitions,
IEnumerable<long> final_states) {
Constraint ct = new Constraint(model_);
AutomataConstraintProto aut = new AutomataConstraintProto();
foreach (IntVar var in vars)
{
aut.Vars.Add(var.Index);
}
aut.StartingState = starting_state;
foreach (long f in final_states)
{
aut.FinalStates.Add(f);
}
for (int i = 0; i < transitions.GetLength(0); ++i)
{
aut.TransitionTail.Add(transitions[i, 0]);
aut.TransitionLabel.Add(transitions[i, 1]);
aut.TransitionHead.Add(transitions[i, 2]);
}
ct.Proto.Automata = aut;
return ct;
}
public Constraint AddAutomata(
IEnumerable<IntVar> vars,
long starting_state,
IEnumerable<Tuple<long, long, long>> transitions,
IEnumerable<long> final_states) {
Constraint ct = new Constraint(model_);
AutomataConstraintProto aut = new AutomataConstraintProto();
foreach (IntVar var in vars)
{
aut.Vars.Add(var.Index);
}
aut.StartingState = starting_state;
foreach (long f in final_states)
{
aut.FinalStates.Add(f);
}
foreach (Tuple<long, long, long> transition in transitions)
{
aut.TransitionHead.Add(transition.Item1);
aut.TransitionLabel.Add(transition.Item2);
aut.TransitionTail.Add(transition.Item3);
}
ct.Proto.Automata = aut;
return ct;
}
public Constraint AddInverse(IEnumerable<IntVar> direct,
IEnumerable<IntVar> reverse)
{
Constraint ct = new Constraint(model_);
InverseConstraintProto inverse = new InverseConstraintProto();
foreach (IntVar var in direct)
{
inverse.FDirect.Add(var.Index);
}
foreach (IntVar var in reverse)
{
inverse.FInverse.Add(var.Index);
}
ct.Proto.Inverse = inverse;
return ct;
}
public Constraint AddReservoirConstraint(IEnumerable<IntVar> times,
IEnumerable<long> demands,
long min_level, long max_level)
{
Constraint ct = new Constraint(model_);
ReservoirConstraintProto res = new ReservoirConstraintProto();
foreach (IntVar var in times)
{
res.Times.Add(var.Index);
}
foreach (long d in demands)
{
res.Demands.Add(d);
}
ct.Proto.Reservoir = res;
return ct;
}
public Constraint AddReservoirConstraint(IEnumerable<IntVar> times,
IEnumerable<int> demands,
long min_level, long max_level)
{
Constraint ct = new Constraint(model_);
ReservoirConstraintProto res = new ReservoirConstraintProto();
foreach (IntVar var in times)
{
res.Times.Add(var.Index);
}
foreach (int d in demands)
{
res.Demands.Add(d);
}
ct.Proto.Reservoir = res;
return ct;
}
public void AddMapDomain(
IntVar var, IEnumerable<IntVar> bool_vars, long offset = 0)
{
int i = 0;
foreach (IntVar bool_var in bool_vars)
{
int b_index = bool_var.Index;
int var_index = var.Index;
ConstraintProto ct1 = new ConstraintProto();
LinearConstraintProto lin1 = new LinearConstraintProto();
lin1.Vars.Add(var_index);
lin1.Coeffs.Add(1L);
lin1.Domain.Add(offset + i);
lin1.Domain.Add(offset + i);
ct1.Linear = lin1;
ct1.EnforcementLiteral.Add(b_index);
model_.Constraints.Add(ct1);
ConstraintProto ct2 = new ConstraintProto();
LinearConstraintProto lin2 = new LinearConstraintProto();
lin2.Vars.Add(var_index);
lin2.Coeffs.Add(1L);
lin2.Domain.Add(Int64.MinValue);
lin2.Domain.Add(offset + i - 1);
lin2.Domain.Add(offset + i + 1);
lin2.Domain.Add(Int64.MaxValue);
ct2.Linear = lin2;
ct2.EnforcementLiteral.Add(-b_index - 1);
model_.Constraints.Add(ct2);
i++;
}
}
public Constraint AddImplication(ILiteral a, ILiteral b)
{
Constraint ct = new Constraint(model_);
BoolArgumentProto or = new BoolArgumentProto();
or.Literals.Add(a.Not().GetIndex());
or.Literals.Add(b.GetIndex());
ct.Proto.BoolOr = or;
return ct;
}
public Constraint AddBoolOr(IEnumerable<ILiteral> literals)
{
Constraint ct = new Constraint(model_);
BoolArgumentProto bool_argument = new BoolArgumentProto();
foreach (ILiteral lit in literals)
{
bool_argument.Literals.Add(lit.GetIndex());
}
ct.Proto.BoolOr = bool_argument;
return ct;
}
public Constraint AddBoolAnd(IEnumerable<ILiteral> literals)
{
Constraint ct = new Constraint(model_);
BoolArgumentProto bool_argument = new BoolArgumentProto();
foreach (ILiteral lit in literals)
{
bool_argument.Literals.Add(lit.GetIndex());
}
ct.Proto.BoolAnd = bool_argument;
return ct;
}
public Constraint AddBoolXor(IEnumerable<ILiteral> literals)
{
Constraint ct = new Constraint(model_);
BoolArgumentProto bool_argument = new BoolArgumentProto();
foreach (ILiteral lit in literals)
{
bool_argument.Literals.Add(lit.GetIndex());
}
ct.Proto.BoolXor = bool_argument;
return ct;
}
public Constraint AddMinEquality(IntVar target, IEnumerable<IntVar> vars)
{
Constraint ct = new Constraint(model_);
IntegerArgumentProto args = new IntegerArgumentProto();
foreach (IntVar var in vars)
{
args.Vars.Add(var.Index);
}
args.Target = target.Index;
ct.Proto.IntMin = args;
return ct;
}
public Constraint AddMaxEquality(IntVar target, IEnumerable<IntVar> vars)
{
Constraint ct = new Constraint(model_);
IntegerArgumentProto args = new IntegerArgumentProto();
foreach (IntVar var in vars)
{
args.Vars.Add(var.Index);
}
args.Target = target.Index;
ct.Proto.IntMax = args;
return ct;
}
public Constraint AddDivisionEquality<T, N, D>(T target, N num, D denom)
{
Constraint ct = new Constraint(model_);
IntegerArgumentProto args = new IntegerArgumentProto();
args.Vars.Add(GetOrCreateIndex(num));
args.Vars.Add(GetOrCreateIndex(denom));
args.Target = GetOrCreateIndex(target);
ct.Proto.IntDiv = args;
return ct;
}
public Constraint AddModuloEquality<T, V, M>(T target, V v, M m)
{
Constraint ct = new Constraint(model_);
IntegerArgumentProto args = new IntegerArgumentProto();
args.Vars.Add(GetOrCreateIndex(v));
args.Vars.Add(GetOrCreateIndex(m));
args.Target = GetOrCreateIndex(target);
ct.Proto.IntMod = args;
return ct;
}
public Constraint AddProdEquality(IntVar target, IEnumerable<IntVar> vars)
{
Constraint ct = new Constraint(model_);
IntegerArgumentProto args = new IntegerArgumentProto();
args.Target = target.Index;
foreach (IntVar var in vars)
{
args.Vars.Add(var.Index);
}
ct.Proto.IntProd = args;
return ct;
}
// Scheduling support
public IntervalVar NewIntervalVar<S, D, E>(
S start, D duration, E end, string name) {
return new IntervalVar(model_,
GetOrCreateIndex(start),
GetOrCreateIndex(duration),
GetOrCreateIndex(end),
name);
}
public IntervalVar NewOptionalIntervalVar<S, D, E>(
S start, D duration, E end, ILiteral is_present, string name) {
int i = is_present.GetIndex();
return new IntervalVar(model_,
GetOrCreateOptionalIndex(start, i),
// Size is currently not optional.
GetOrCreateIndex(duration),
GetOrCreateOptionalIndex(end, i),
i,
name);
}
public Constraint AddNoOverlap(IEnumerable<IntervalVar> intervals)
{
Constraint ct = new Constraint(model_);
NoOverlapConstraintProto args = new NoOverlapConstraintProto();
foreach (IntervalVar var in intervals)
{
args.Intervals.Add(var.GetIndex());
}
ct.Proto.NoOverlap = args;
return ct;
}
public Constraint AddNoOverlap2D(IEnumerable<IntervalVar> x_intervals,
IEnumerable<IntervalVar> y_intervals)
{
Constraint ct = new Constraint(model_);
NoOverlap2DConstraintProto args = new NoOverlap2DConstraintProto();
foreach (IntervalVar var in x_intervals)
{
args.XIntervals.Add(var.GetIndex());
}
foreach (IntervalVar var in y_intervals)
{
args.YIntervals.Add(var.GetIndex());
}
ct.Proto.NoOverlap2D = args;
return ct;
}
public Constraint AddCumulative<D, C>(IEnumerable<IntervalVar> intervals,
IEnumerable<D> demands,
C capacity) {
Constraint ct = new Constraint(model_);
CumulativeConstraintProto cumul = new CumulativeConstraintProto();
foreach (IntervalVar var in intervals)
{
cumul.Intervals.Add(var.GetIndex());
}
foreach (D demand in demands)
{
cumul.Demands.Add(GetOrCreateIndex(demand));
}
cumul.Capacity = GetOrCreateIndex(capacity);
ct.Proto.Cumulative = cumul;
return ct;
}
// Objective.
public void Minimize(IntegerExpression obj)
{
SetObjective(obj, true);
}
public void Maximize(IntegerExpression obj)
{
SetObjective(obj, false);
}
bool HasObjective()
{
return model_.Objective == null;
}
// Internal methods.
void SetObjective(IntegerExpression obj, bool minimize)
{
CpObjectiveProto objective = new CpObjectiveProto();
if (obj is IntVar)
{
objective.Coeffs.Add(1L);
objective.Offset = 0L;
if (minimize)
{
objective.Vars.Add(obj.Index);
objective.ScalingFactor = 1L;
}
else
{
objective.Vars.Add(Negated(obj.Index));
objective.ScalingFactor = -1L;
}
}
else
{
Dictionary<IntVar, long> dict = new Dictionary<IntVar, long>();
long constant = IntegerExpression.GetVarValueMap(obj, 1L, dict);
if (minimize)
{
objective.ScalingFactor = 1L;
objective.Offset = constant;
}
else
{
objective.ScalingFactor = -1L;
objective.Offset = -constant;
}
foreach (KeyValuePair<IntVar, long> it in dict)
{
objective.Coeffs.Add(it.Value);
if (minimize)
{
objective.Vars.Add(it.Key.Index);
}
else
{
objective.Vars.Add(Negated(it.Key.Index));
}
}
}
model_.Objective = objective;
}
private int ConvertConstant(long value)
{
if (constant_map_.ContainsKey(value))
{
return constant_map_[value];
}
else
{
int index = model_.Variables.Count;
IntegerVariableProto var = new IntegerVariableProto();
var.Domain.Add(value);
var.Domain.Add(value);
constant_map_.Add(value, index);
model_.Variables.Add(var);
return index;
}
}
private int ConvertOptionalConstant(long value, int is_present_index)
{
if (constant_map_.ContainsKey(value))
{
return constant_map_[value];
}
else
{
int index = model_.Variables.Count;
IntegerVariableProto var = new IntegerVariableProto();
var.Domain.Add(value);
var.Domain.Add(value);
constant_map_.Add(value, index);
var.EnforcementLiteral.Add(is_present_index);
model_.Variables.Add(var);
return index;
}
}
private int GetOrCreateIndex<X>(X x)
{
if (typeof(X) == typeof(IntVar))
{
IntVar vx = (IntVar)(Object)x;
return vx.Index;
}
if (typeof(X) == typeof(long) || typeof(X) == typeof(int))
{
return ConvertConstant(Convert.ToInt64(x));
}
throw new ArgumentException("Cannot extract index from argument");
}
private int GetOrCreateOptionalIndex<X>(X x, int is_present_index)
{
if (typeof(X) == typeof(IntVar))
{
IntVar vx = (IntVar)(Object)x;
return vx.Index;
}
if (typeof(X) == typeof(long) || typeof(X) == typeof(int))
{
return ConvertOptionalConstant(Convert.ToInt64(x), is_present_index);
}
throw new ArgumentException("Cannot extract index from argument");
}
private CpModelProto model_;
private Dictionary<long, int> constant_map_;
}
} // namespace Google.OrTools.Sat

View File

@@ -0,0 +1,257 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.Sat
{
using System;
using System.Collections.Generic;
public class CpSolverSolutionCallback : SolutionCallback
{
public long Value(IntegerExpression e)
{
List<IntegerExpression> exprs = new List<IntegerExpression>();
List<long> coeffs = new List<long>();
exprs.Add(e);
coeffs.Add(1L);
long constant = 0;
while (exprs.Count > 0)
{
IntegerExpression expr = exprs[0];
exprs.RemoveAt(0);
long coeff = coeffs[0];
coeffs.RemoveAt(0);
if (coeff == 0) continue;
if (expr is ProductCst)
{
ProductCst p = (ProductCst)expr;
if (p.Coeff != 0)
{
exprs.Add(p.Expr);
coeffs.Add(p.Coeff * coeff);
}
}
else if (expr is SumArray)
{
SumArray a = (SumArray)expr;
constant += coeff * a.Constant;
foreach (IntegerExpression sub in a.Expressions)
{
exprs.Add(sub);
coeffs.Add(coeff);
}
}
else if (expr is IntVar)
{
int index = expr.Index;
long value = SolutionIntegerValue(index);
constant += coeff * value;
}
else if (expr is NotBooleanVariable)
{
throw new ArgumentException(
"Cannot evaluate a literal in an integer expression.");
}
else
{
throw new ArgumentException("Cannot evaluate '" + expr.ToString() +
"' in an integer expression");
}
}
return constant;
}
public Boolean BooleanValue(ILiteral literal)
{
if (literal is IntVar || literal is NotBooleanVariable)
{
int index = literal.GetIndex();
return SolutionBooleanValue(index);
}
else
{
throw new ArgumentException("Cannot evaluate '" + literal.ToString() +
"' as a boolean literal");
}
}
}
public class CpSolver
{
public CpSolverStatus Solve(CpModel model)
{
if (string_parameters_ != null)
{
response_ = SatHelper.SolveWithStringParameters(model.Model,
string_parameters_);
}
else
{
response_ = SatHelper.Solve(model.Model);
}
return response_.Status;
}
public CpSolverStatus SolveWithSolutionCallback(CpModel model,
SolutionCallback cb)
{
if (string_parameters_ != null)
{
response_ = SatHelper.SolveWithStringParametersAndSolutionCallback(
model.Model, string_parameters_, cb);
}
else
{
response_ = SatHelper.Solve(model.Model);
}
return response_.Status;
}
public CpSolverStatus SearchAllSolutions(CpModel model, SolutionCallback cb)
{
if (string_parameters_ != null)
{
string extra_parameters =
" enumerate_all_solutions:true, cp_model_presolve:false";
response_ =
SatHelper.SolveWithStringParametersAndSolutionCallback(
model.Model, string_parameters_ + extra_parameters, cb);
}
else
{
string parameters =
"enumerate_all_solutions:true, cp_model_presolve:false";
response_ = SatHelper.SolveWithStringParametersAndSolutionCallback(
model.Model, parameters, cb);
}
return response_.Status;
}
public double ObjectiveValue
{
get { return response_.ObjectiveValue; }
}
public string StringParameters
{
get { return string_parameters_; }
set { string_parameters_ = value; }
}
public CpSolverResponse Response
{
get { return response_; }
}
public long Value(IntegerExpression e)
{
List<IntegerExpression> exprs = new List<IntegerExpression>();
List<long> coeffs = new List<long>();
exprs.Add(e);
coeffs.Add(1L);
long constant = 0;
while (exprs.Count > 0)
{
IntegerExpression expr = exprs[0];
exprs.RemoveAt(0);
long coeff = coeffs[0];
coeffs.RemoveAt(0);
if (coeff == 0) continue;
if (expr is ProductCst)
{
ProductCst p = (ProductCst)expr;
if (p.Coeff != 0)
{
exprs.Add(p.Expr);
coeffs.Add(p.Coeff * coeff);
}
}
else if (expr is SumArray)
{
SumArray a = (SumArray)expr;
constant += coeff * a.Constant;
foreach (IntegerExpression sub in a.Expressions)
{
exprs.Add(sub);
coeffs.Add(coeff);
}
}
else if (expr is IntVar)
{
int index = expr.Index;
long value = index >= 0 ? response_.Solution[index]
: -response_.Solution[-index - 1];
constant += coeff * value;
}
else if (expr is NotBooleanVariable)
{
throw new ArgumentException(
"Cannot evaluate a literal in an integer expression.");
}
else
{
throw new ArgumentException("Cannot evaluate '" + expr.ToString() +
"' in an integer expression");
}
}
return constant;
}
public Boolean BooleanValue(ILiteral literal)
{
if (literal is IntVar || literal is NotBooleanVariable)
{
int index = literal.GetIndex();
if (index >= 0)
{
return response_.Solution[index] != 0;
}
else
{
return response_.Solution[index] == 0;
}
}
else
{
throw new ArgumentException("Cannot evaluate '" + literal.ToString() +
"' as a boolean literal");
}
}
public long NumBranches()
{
return response_.NumBranches;
}
public long NumConflicts()
{
return response_.NumConflicts;
}
public double WallTime()
{
return response_.WallTime;
}
private CpModelProto model_;
private CpSolverResponse response_;
string string_parameters_;
}
} // namespace Google.OrTools.Sat

View File

@@ -0,0 +1,635 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.Sat
{
using System;
using System.Collections.Generic;
// Helpers.
// IntVar[] helper class.
public static class IntVarArrayHelper
{
public static SumArray Sum(this IntVar[] vars)
{
return new SumArray(vars);
}
}
public interface ILiteral
{
ILiteral Not();
int GetIndex();
}
// Holds an integer expression.
public class IntegerExpression
{
public int Index
{
get { return GetIndex(); }
}
public virtual int GetIndex()
{
throw new NotImplementedException();
}
public virtual string ShortString()
{
return ToString();
}
public static IntegerExpression operator+(IntegerExpression a,
IntegerExpression b) {
return new SumArray(a, b);
}
public static IntegerExpression operator+(IntegerExpression a, long v) {
return new SumArray(a, v);
}
public static IntegerExpression operator+(long v, IntegerExpression a) {
return new SumArray(a, v);
}
public static IntegerExpression operator-(IntegerExpression a,
IntegerExpression b) {
return new SumArray(a, Prod(b, -1));
}
public static IntegerExpression operator-(IntegerExpression a, long v) {
return new SumArray(a, -v);
}
public static IntegerExpression operator-(long v, IntegerExpression a) {
return new SumArray(Prod(a, -1), v);
}
public static IntegerExpression operator*(IntegerExpression a, long v) {
return Prod(a, v);
}
public static IntegerExpression operator*(long v, IntegerExpression a) {
return Prod(a, v);
}
public static IntegerExpression operator-(IntegerExpression a) {
return Prod(a, -1);
}
public static BoundIntegerExpression operator ==(IntegerExpression a,
IntegerExpression b) {
return new BoundIntegerExpression(a, b, true);
}
public static BoundIntegerExpression operator !=(IntegerExpression a,
IntegerExpression b) {
return new BoundIntegerExpression(a, b, false);
}
public static BoundIntegerExpression operator ==(IntegerExpression a,
long v) {
return new BoundIntegerExpression(a, v, true);
}
public static BoundIntegerExpression operator !=(IntegerExpression a,
long v) {
return new BoundIntegerExpression(a, v, false);
}
public static BoundIntegerExpression operator >=(IntegerExpression a,
long v) {
return new BoundIntegerExpression(v, a, Int64.MaxValue);
}
public static BoundIntegerExpression operator >=(long v,
IntegerExpression a) {
return a <= v;
}
public static BoundIntegerExpression operator >(IntegerExpression a,
long v) {
return new BoundIntegerExpression(v + 1, a, Int64.MaxValue);
}
public static BoundIntegerExpression operator >(long v, IntegerExpression a) {
return a < v;
}
public static BoundIntegerExpression operator <=(IntegerExpression a,
long v) {
return new BoundIntegerExpression(Int64.MinValue, a, v);
}
public static BoundIntegerExpression operator <=(long v,
IntegerExpression a) {
return a >= v;
}
public static BoundIntegerExpression operator <(IntegerExpression a,
long v) {
return new BoundIntegerExpression(Int64.MinValue, a, v - 1);
}
public static BoundIntegerExpression operator <(long v, IntegerExpression a) {
return a > v;
}
public static BoundIntegerExpression operator >=(IntegerExpression a,
IntegerExpression b) {
return new BoundIntegerExpression(0, a - b, Int64.MaxValue);
}
public static BoundIntegerExpression operator >(IntegerExpression a,
IntegerExpression b) {
return new BoundIntegerExpression(1, a - b, Int64.MaxValue);
}
public static BoundIntegerExpression operator <=(IntegerExpression a,
IntegerExpression b) {
return new BoundIntegerExpression(Int64.MinValue, a - b, 0);
}
public static BoundIntegerExpression operator <(IntegerExpression a,
IntegerExpression b) {
return new BoundIntegerExpression(Int64.MinValue, a - b, -1);
}
public static IntegerExpression Prod(IntegerExpression e, long v)
{
if (v == 1)
{
return e;
}
else if (e is ProductCst)
{
ProductCst p = (ProductCst)e;
return new ProductCst(p.Expr, p.Coeff * v);
}
else
{
return new ProductCst(e, v);
}
}
public static long GetVarValueMap(IntegerExpression e,
long initial_coeff,
Dictionary<IntVar, long> dict)
{
List<IntegerExpression> exprs = new List<IntegerExpression>();
List<long> coeffs = new List<long>();
exprs.Add(e);
coeffs.Add(initial_coeff);
long constant = 0;
while (exprs.Count > 0)
{
IntegerExpression expr = exprs[0];
exprs.RemoveAt(0);
long coeff = coeffs[0];
coeffs.RemoveAt(0);
if (coeff == 0) continue;
if (expr is ProductCst)
{
ProductCst p = (ProductCst)expr;
if (p.Coeff != 0)
{
exprs.Add(p.Expr);
coeffs.Add(p.Coeff * coeff);
}
}
else if (expr is SumArray)
{
SumArray a = (SumArray)expr;
constant += coeff * a.Constant;
foreach (IntegerExpression sub in a.Expressions)
{
exprs.Add(sub);
coeffs.Add(coeff);
}
}
else if (expr is IntVar)
{
IntVar i = (IntVar)expr;
if (dict.ContainsKey(i))
{
dict[i] += coeff;
}
else
{
dict.Add(i, coeff);
}
}
else if (expr is NotBooleanVariable)
{
throw new ArgumentException(
"Cannot interpret a literal in an integer expression.");
}
else
{
throw new ArgumentException("Cannot interpret '" + expr.ToString() +
"' in an integer expression");
}
}
return constant;
}
}
public class ProductCst : IntegerExpression
{
public ProductCst(IntegerExpression e, long v)
{
expr_ = e;
coeff_ = v;
}
public IntegerExpression Expr
{
get { return expr_; }
}
public long Coeff
{
get { return coeff_; }
}
private IntegerExpression expr_;
private long coeff_;
}
public class SumArray : IntegerExpression
{
public SumArray(IntegerExpression a, IntegerExpression b)
{
expressions_ = new List<IntegerExpression>();
expressions_.Add(a);
expressions_.Add(b);
constant_ = 0L;
}
public SumArray(IntegerExpression a, long b)
{
expressions_.Add(a);
constant_ = b;
}
public SumArray(IEnumerable<IntegerExpression> exprs)
{
expressions_ = new List<IntegerExpression>();
foreach (IntegerExpression e in exprs)
{
if (e != null)
{
expressions_.Add(e);
}
}
constant_ = 0L;
}
public SumArray(IEnumerable<IntegerExpression> exprs, long cte)
{
expressions_ = new List<IntegerExpression>();
foreach (IntegerExpression e in exprs)
{
if (e != null)
{
expressions_.Add(e);
}
}
constant_ = cte;
}
public List<IntegerExpression> Expressions
{
get { return expressions_; }
}
public long Constant
{
get { return constant_; }
}
public override string ShortString()
{
return String.Format("({0})", ToString());
}
public override string ToString()
{
string result = "";
for (int i = 0; i < expressions_.Count; ++i)
{
bool negated = false;
IntegerExpression expr = expressions_[i];
if (i != 0)
{
if (expr is ProductCst && ((ProductCst)expr).Coeff < 0)
{
result += String.Format(" - ");
negated = true;
}
else
{
result += String.Format(" + ");
}
}
if (expr is IntVar)
{
result += expr.ShortString();
}
else if (expr is ProductCst)
{
ProductCst p = (ProductCst)expr;
long coeff = negated ? -p.Coeff : p.Coeff;
IntegerExpression sub = p.Expr;
if (coeff == 1)
{
result += sub.ShortString();
}
else if (coeff == -1)
{
result += String.Format("-{0}", coeff, sub.ShortString());
}
else
{
result += String.Format("{0}*{1}", coeff, sub.ShortString());
}
}
else
{
result += String.Format("({0})", expr.ShortString());
}
}
return result;
}
private List<IntegerExpression> expressions_;
private long constant_;
}
public class IntVar : IntegerExpression, ILiteral
{
public IntVar(CpModelProto model, IEnumerable<long> bounds,
int is_present_index, string name) {
model_ = model;
index_ = model.Variables.Count;
var_ = new IntegerVariableProto();
var_.Name = name;
var_.Domain.Add(bounds);
var_.EnforcementLiteral.Add(is_present_index);
model.Variables.Add(var_);
negation_ = null;
}
public IntVar(CpModelProto model, IEnumerable<long> bounds, string name) {
model_ = model;
index_ = model.Variables.Count;
var_ = new IntegerVariableProto();
var_.Name = name;
var_.Domain.Add(bounds);
model.Variables.Add(var_);
negation_ = null;
}
public override int GetIndex()
{
return index_;
}
public override string ToString()
{
return var_.ToString();
}
public override string ShortString()
{
if (var_.Name != null)
{
return var_.Name;
}
else
{
return var_.ToString();
}
}
public ILiteral Not()
{
foreach (long b in var_.Domain)
{
if (b < 0 || b > 1)
{
throw new ArgumentException(
"Cannot call Not() on a non boolean variable");
}
}
if (negation_ == null)
{
negation_ = new NotBooleanVariable(this);
}
return negation_;
}
private CpModelProto model_;
private int index_;
private List<long> bounds_;
private IntegerVariableProto var_;
private NotBooleanVariable negation_;
}
public class NotBooleanVariable : IntegerExpression, ILiteral
{
public NotBooleanVariable(IntVar boolvar)
{
boolvar_ = boolvar;
}
public override int GetIndex()
{
return -boolvar_.Index - 1;
}
public ILiteral Not()
{
return boolvar_;
}
public string ShortString()
{
return String.Format("Not({0})", boolvar_.ShortString());
}
private IntVar boolvar_;
}
public class BoundIntegerExpression
{
public enum Type
{
BoundExpression,
VarEqVar,
VarDiffVar,
VarEqCst,
VarDiffCst,
}
public BoundIntegerExpression(long lb, IntegerExpression expr, long ub)
{
left_ = expr;
right_ = null;
lb_ = lb;
ub_ = ub;
type_ = Type.BoundExpression;
}
public BoundIntegerExpression(IntegerExpression left, IntegerExpression right,
bool equality) {
left_ = left;
right_ = right;
lb_ = 0;
ub_ = 0;
type_ = equality ? Type.VarEqVar : Type.VarDiffVar;
}
public BoundIntegerExpression(IntegerExpression left, long v, bool equality) {
left_ = left;
right_ = null;
lb_ = v;
ub_ = 0;
type_ = equality ? Type.VarEqCst : Type.VarDiffCst;
}
bool IsTrue()
{
if (type_ == Type.VarEqVar)
{
return (object)left_ == (object)right_;
}
else if (type_ == Type.VarDiffVar)
{
return (object)left_ != (object)right_;
}
return false;
}
public static bool operator true(BoundIntegerExpression bie)
{
return bie.IsTrue();
}
public static bool operator false(BoundIntegerExpression bie)
{
return !bie.IsTrue();
}
public override string ToString()
{
switch (type_)
{
case Type.BoundExpression:
return String.Format("{0} <= {1} <= {2}", lb_, left_, ub_);
case Type.VarEqVar:
return String.Format("{0} == {1}", left_, right_);
case Type.VarDiffVar:
return String.Format("{0} != {1}", left_, right_);
case Type.VarEqCst:
return String.Format("{0} == {1}", left_, lb_);
case Type.VarDiffCst:
return String.Format("{0} != {1}", left_, lb_);
default:
throw new ArgumentException("Wrong mode in BoundIntegerExpression.");
}
}
public static BoundIntegerExpression operator <=(BoundIntegerExpression a,
long v) {
if (a.CtType != Type.BoundExpression || a.Ub != Int64.MaxValue)
{
throw new ArgumentException(
"Operator <= not supported for this BoundIntegerExpression");
}
return new BoundIntegerExpression(a.Lb, a.Left, v);
}
public static BoundIntegerExpression operator <(BoundIntegerExpression a,
long v) {
if (a.CtType != Type.BoundExpression || a.Ub != Int64.MaxValue)
{
throw new ArgumentException(
"Operator < not supported for this BoundIntegerExpression");
}
return new BoundIntegerExpression(a.Lb, a.Left, v - 1);
}
public static BoundIntegerExpression operator >=(BoundIntegerExpression a,
long v) {
if (a.CtType != Type.BoundExpression || a.Lb != Int64.MinValue)
{
throw new ArgumentException(
"Operator >= not supported for this BoundIntegerExpression");
}
return new BoundIntegerExpression(v, a.Left, a.Ub);
}
public static BoundIntegerExpression operator >(BoundIntegerExpression a,
long v) {
if (a.CtType != Type.BoundExpression || a.Lb != Int64.MinValue)
{
throw new ArgumentException(
"Operator < not supported for this BoundIntegerExpression");
}
return new BoundIntegerExpression(v + 1, a.Left, a.Ub);
}
public IntegerExpression Left
{
get { return left_; }
}
public IntegerExpression Right
{
get { return right_; }
}
public long Lb
{
get { return lb_; }
}
public long Ub
{
get { return ub_; }
}
public Type CtType
{
get { return type_; }
}
private IntegerExpression left_;
private IntegerExpression right_;
private long lb_;
private long ub_;
private Type type_;
}
} // namespace Google.OrTools.Sat

View File

@@ -0,0 +1,69 @@
// Copyright 2010-2017 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.
namespace Google.OrTools.Sat
{
using System;
using System.Collections.Generic;
public class IntervalVar
{
public IntervalVar(CpModelProto model,
int start_index, int size_index, int end_index,
int is_present_index, string name) {
model_ = model;
index_ = model.Constraints.Count;
interval_ = new IntervalConstraintProto();
interval_.Start = start_index;
interval_.Size = size_index;
interval_.End = end_index;
ConstraintProto ct = new ConstraintProto();
ct.Interval = interval_;
ct.Name = name;
ct.EnforcementLiteral.Add(is_present_index);
model.Constraints.Add(ct);
}
public IntervalVar(CpModelProto model,
int start_index, int size_index, int end_index,
string name) {
model_ = model;
index_ = model.Constraints.Count;
interval_ = new IntervalConstraintProto();
interval_.Start = start_index;
interval_.Size = size_index;
interval_.End = end_index;
ConstraintProto ct = new ConstraintProto();
ct.Interval = interval_;
ct.Name = name;
model_.Constraints.Add(ct);
}
public int GetIndex()
{
return index_;
}
public override string ToString()
{
return model_.Constraints[index_].ToString();
}
private CpModelProto model_;
private int index_;
private IntervalConstraintProto interval_;
}
} // namespace Google.OrTools.Sat

View File

@@ -0,0 +1,49 @@
// Copyright 2010-2017 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.
namespace Google.OrTools {
using System;
using System.Collections.Generic;
public static class NestedArrayHelper
{
public static T[] GetFlatArray<T>(T[][] arr)
{
int flatLength = 0;
for (var i = 0; i < arr.GetLength(0); i++)
flatLength += arr[i].GetLength(0);
int idx = 0;
T[] flat = new T[flatLength];
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = 0; j < arr[i].GetLength(0); j++)
flat[idx++] = arr[i][j];
}
return flat;
}
public static int[] GetArraySecondSize<T>(T[][]arr)
{
var result = new int[arr.GetLength(0)];
for (var i=0; i<arr.GetLength(0); i++)
{
if (arr[i] != null)
result[i] = arr[i].Length;
}
return result;
}
}
} // namespace Google.OrTools

View File

@@ -0,0 +1,30 @@
// Copyright 2010-2017 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.
namespace Google.OrTools {
using System;
using Google.Protobuf;
public static class ProtoHelper
{
public static byte[] ProtoToByteArray(IMessage message)
{
int size = message.CalculateSize();
byte[] buffer = new byte[size];
CodedOutputStream output = new CodedOutputStream(buffer);
message.WriteTo(output);
return buffer;
}
}
} // namespace Google.OrTools

5
ortools/dotnet/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Google OrTools
## Pre-requisites
- dotnet core 2.0
- mono 5.4