10271 lines
1.0 MiB
10271 lines
1.0 MiB
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="generator" content="pdoc 10.0.2"/>
|
|
<title>ortools.sat.python.cp_model API documentation</title>
|
|
|
|
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
|
|
<style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pdoc-code .cp{color:#9C6500}.pdoc-code .cpf{color:#3D7B7B; font-style:italic}.pdoc-code .c1{color:#3D7B7B; font-style:italic}.pdoc-code .cs{color:#3D7B7B; font-style:italic}.pdoc-code .gd{color:#A00000}.pdoc-code .ge{font-style:italic}.pdoc-code .gr{color:#E40000}.pdoc-code .gh{color:#000080; font-weight:bold}.pdoc-code .gi{color:#008400}.pdoc-code .go{color:#717171}.pdoc-code .gp{color:#000080; font-weight:bold}.pdoc-code .gs{font-weight:bold}.pdoc-code .gu{color:#800080; font-weight:bold}.pdoc-code .gt{color:#0044DD}.pdoc-code .kc{color:#008000; font-weight:bold}.pdoc-code .kd{color:#008000; font-weight:bold}.pdoc-code .kn{color:#008000; font-weight:bold}.pdoc-code .kp{color:#008000}.pdoc-code .kr{color:#008000; font-weight:bold}.pdoc-code .kt{color:#B00040}.pdoc-code .m{color:#666666}.pdoc-code .s{color:#BA2121}.pdoc-code .na{color:#687822}.pdoc-code .nb{color:#008000}.pdoc-code .nc{color:#0000FF; font-weight:bold}.pdoc-code .no{color:#880000}.pdoc-code .nd{color:#AA22FF}.pdoc-code .ni{color:#717171; font-weight:bold}.pdoc-code .ne{color:#CB3F38; font-weight:bold}.pdoc-code .nf{color:#0000FF}.pdoc-code .nl{color:#767600}.pdoc-code .nn{color:#0000FF; font-weight:bold}.pdoc-code .nt{color:#008000; font-weight:bold}.pdoc-code .nv{color:#19177C}.pdoc-code .ow{color:#AA22FF; font-weight:bold}.pdoc-code .w{color:#bbbbbb}.pdoc-code .mb{color:#666666}.pdoc-code .mf{color:#666666}.pdoc-code .mh{color:#666666}.pdoc-code .mi{color:#666666}.pdoc-code .mo{color:#666666}.pdoc-code .sa{color:#BA2121}.pdoc-code .sb{color:#BA2121}.pdoc-code .sc{color:#BA2121}.pdoc-code .dl{color:#BA2121}.pdoc-code .sd{color:#BA2121; font-style:italic}.pdoc-code .s2{color:#BA2121}.pdoc-code .se{color:#AA5D1F; font-weight:bold}.pdoc-code .sh{color:#BA2121}.pdoc-code .si{color:#A45A77; font-weight:bold}.pdoc-code .sx{color:#008000}.pdoc-code .sr{color:#A45A77}.pdoc-code .s1{color:#BA2121}.pdoc-code .ss{color:#19177C}.pdoc-code .bp{color:#008000}.pdoc-code .fm{color:#0000FF}.pdoc-code .vc{color:#19177C}.pdoc-code .vg{color:#19177C}.pdoc-code .vi{color:#19177C}.pdoc-code .vm{color:#19177C}.pdoc-code .il{color:#666666}</style>
|
|
<style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
|
|
<style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;}nav.pdoc{--pad:1.75rem;--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent }nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc li{display:block;margin:0;padding:.2rem 0 .2rem var(--indent);transition:all 100ms;}nav.pdoc > div > ul > li{padding-left:0;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
|
|
<style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--code);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.pdoc details{filter:opacity(1);}.pdoc details:not([open]){height:0;}.pdoc details > summary{position:absolute;top:-35px;right:0;font-size:.75rem;color:var(--muted);padding:0 .7em;user-select:none;cursor:pointer;}.pdoc details > summary:focus{outline:0;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc > section:first-of-type > .docstring{margin-bottom:2.5rem;}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc .headerlink{position:absolute;width:0;margin-left:-1.5rem;line-height:1.4rem;font-size:1.5rem;font-weight:normal;transition:all 100ms ease-in-out;opacity:0;user-select:none;}.pdoc .attr > .headerlink{margin-left:-2.5rem;}.pdoc *:hover > .headerlink,.pdoc *:target > .attr > .headerlink{opacity:1;}.pdoc .attr{display:block;color:var(--text);margin:.5rem 0 .5rem;padding:.4rem 5rem .4rem 1rem;background-color:var(--accent);}.pdoc .classattr{margin-left:2rem;}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{white-space:pre-wrap;}.pdoc .annotation{color:var(--annotation);}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
|
|
<style>/*! custom.css */</style></head>
|
|
<body>
|
|
<nav class="pdoc">
|
|
<label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
|
|
<input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
|
|
<div>
|
|
<img src="https://developers.google.com/optimization/images/orLogo.png" class="logo" alt="project logo"/>
|
|
|
|
|
|
|
|
|
|
<h2>API Documentation</h2>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#DisplayBounds">DisplayBounds</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ShortName">ShortName</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ShortExprName">ShortExprName</a>
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#LinearExpr">LinearExpr</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#LinearExpr.__init__">LinearExpr</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.Sum">Sum</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.WeightedSum">WeightedSum</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.Term">Term</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.IsEmptyOrAllNull">IsEmptyOrAllNull</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.RebuildFromLinearExpressionProto">RebuildFromLinearExpressionProto</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.GetIntegerVarValueMap">GetIntegerVarValueMap</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#LinearExpr.GetFloatVarValueMap">GetFloatVarValueMap</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#IntVar">IntVar</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#IntVar.__init__">IntVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntVar.Index">Index</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntVar.Proto">Proto</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntVar.IsEqualTo">IsEqualTo</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntVar.Name">Name</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntVar.Not">Not</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#BoundedLinearExpression">BoundedLinearExpression</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#BoundedLinearExpression.__init__">BoundedLinearExpression</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#BoundedLinearExpression.Expression">Expression</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#BoundedLinearExpression.Bounds">Bounds</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#Constraint">Constraint</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#Constraint.__init__">Constraint</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#Constraint.OnlyEnforceIf">OnlyEnforceIf</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#Constraint.Index">Index</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#Constraint.Proto">Proto</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#IntervalVar">IntervalVar</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#IntervalVar.__init__">IntervalVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntervalVar.Index">Index</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntervalVar.Proto">Proto</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntervalVar.Name">Name</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntervalVar.StartExpr">StartExpr</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntervalVar.SizeExpr">SizeExpr</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#IntervalVar.EndExpr">EndExpr</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ObjectIsATrueLiteral">ObjectIsATrueLiteral</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ObjectIsAFalseLiteral">ObjectIsAFalseLiteral</a>
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#CpModel">CpModel</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#CpModel.__init__">CpModel</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewIntVar">NewIntVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewIntVarFromDomain">NewIntVarFromDomain</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewBoolVar">NewBoolVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewConstant">NewConstant</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddLinearConstraint">AddLinearConstraint</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddLinearExpressionInDomain">AddLinearExpressionInDomain</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.Add">Add</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAllDifferent">AddAllDifferent</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddElement">AddElement</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddCircuit">AddCircuit</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddMultipleCircuit">AddMultipleCircuit</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAllowedAssignments">AddAllowedAssignments</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddForbiddenAssignments">AddForbiddenAssignments</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAutomaton">AddAutomaton</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddInverse">AddInverse</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddReservoirConstraint">AddReservoirConstraint</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddReservoirConstraintWithActive">AddReservoirConstraintWithActive</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddMapDomain">AddMapDomain</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddImplication">AddImplication</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddBoolOr">AddBoolOr</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAtLeastOne">AddAtLeastOne</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAtMostOne">AddAtMostOne</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddExactlyOne">AddExactlyOne</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddBoolAnd">AddBoolAnd</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddBoolXOr">AddBoolXOr</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddMinEquality">AddMinEquality</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddMaxEquality">AddMaxEquality</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddDivisionEquality">AddDivisionEquality</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAbsEquality">AddAbsEquality</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddModuloEquality">AddModuloEquality</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddMultiplicationEquality">AddMultiplicationEquality</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewIntervalVar">NewIntervalVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewFixedSizeIntervalVar">NewFixedSizeIntervalVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewOptionalIntervalVar">NewOptionalIntervalVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.NewOptionalFixedSizeIntervalVar">NewOptionalFixedSizeIntervalVar</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddNoOverlap">AddNoOverlap</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddNoOverlap2D">AddNoOverlap2D</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddCumulative">AddCumulative</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.CopyFrom">CopyFrom</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetBoolVarFromProtoIndex">GetBoolVarFromProtoIndex</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetIntVarFromProtoIndex">GetIntVarFromProtoIndex</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetIntervalVarFromProtoIndex">GetIntervalVarFromProtoIndex</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.Proto">Proto</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.Negated">Negated</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetOrMakeIndex">GetOrMakeIndex</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetOrMakeBooleanIndex">GetOrMakeBooleanIndex</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetIntervalIndex">GetIntervalIndex</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.GetOrMakeIndexFromConstant">GetOrMakeIndexFromConstant</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.VarIndexToVarProto">VarIndexToVarProto</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.ParseLinearExpression">ParseLinearExpression</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.Minimize">Minimize</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.Maximize">Maximize</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.HasObjective">HasObjective</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddDecisionStrategy">AddDecisionStrategy</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.ModelStats">ModelStats</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.Validate">Validate</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.ExportToFile">ExportToFile</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AssertIsBooleanVariable">AssertIsBooleanVariable</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddHint">AddHint</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.ClearHints">ClearHints</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAssumption">AddAssumption</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.AddAssumptions">AddAssumptions</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpModel.ClearAssumptions">ClearAssumptions</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ExpandGeneratorOrTuple">ExpandGeneratorOrTuple</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#EvaluateLinearExpr">EvaluateLinearExpr</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#EvaluateBooleanExpression">EvaluateBooleanExpression</a>
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#CpSolver">CpSolver</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#CpSolver.__init__">CpSolver</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.Solve">Solve</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.SolveWithSolutionCallback">SolveWithSolutionCallback</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.SearchForAllSolutions">SearchForAllSolutions</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.StopSearch">StopSearch</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.Value">Value</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.BooleanValue">BooleanValue</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.ObjectiveValue">ObjectiveValue</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.BestObjectiveBound">BestObjectiveBound</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.StatusName">StatusName</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.NumBooleans">NumBooleans</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.NumConflicts">NumConflicts</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.NumBranches">NumBranches</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.WallTime">WallTime</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.UserTime">UserTime</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.ResponseStats">ResponseStats</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.ResponseProto">ResponseProto</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.SufficientAssumptionsForInfeasibility">SufficientAssumptionsForInfeasibility</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolver.SolutionInfo">SolutionInfo</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#CpSolverSolutionCallback.__init__">CpSolverSolutionCallback</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolverSolutionCallback.OnSolutionCallback">OnSolutionCallback</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolverSolutionCallback.BooleanValue">BooleanValue</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolverSolutionCallback.Value">Value</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#CpSolverSolutionCallback.Response">Response</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#ObjectiveSolutionPrinter">ObjectiveSolutionPrinter</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#ObjectiveSolutionPrinter.__init__">ObjectiveSolutionPrinter</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ObjectiveSolutionPrinter.on_solution_callback">on_solution_callback</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#ObjectiveSolutionPrinter.solution_count">solution_count</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#VarArrayAndObjectiveSolutionPrinter">VarArrayAndObjectiveSolutionPrinter</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#VarArrayAndObjectiveSolutionPrinter.__init__">VarArrayAndObjectiveSolutionPrinter</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#VarArrayAndObjectiveSolutionPrinter.on_solution_callback">on_solution_callback</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#VarArrayAndObjectiveSolutionPrinter.solution_count">solution_count</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
<li>
|
|
<a class="class" href="#VarArraySolutionPrinter">VarArraySolutionPrinter</a>
|
|
<ul class="memberlist">
|
|
<li>
|
|
<a class="function" href="#VarArraySolutionPrinter.__init__">VarArraySolutionPrinter</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#VarArraySolutionPrinter.on_solution_callback">on_solution_callback</a>
|
|
</li>
|
|
<li>
|
|
<a class="function" href="#VarArraySolutionPrinter.solution_count">solution_count</a>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
</ul>
|
|
|
|
|
|
<footer>OR-Tools 9.3</footer>
|
|
|
|
<a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
|
|
built with <span class="visually-hidden">pdoc</span><img
|
|
alt="pdoc logo"
|
|
src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
|
|
</a>
|
|
</div>
|
|
</nav>
|
|
<main class="pdoc">
|
|
<section>
|
|
<h1 class="modulename">
|
|
ortools<wbr>.sat<wbr>.python<wbr>.cp_model </h1>
|
|
|
|
<div class="docstring"><p>Methods for building and solving CP-SAT models.</p>
|
|
|
|
<p>The following two sections describe the main
|
|
methods for building and solving CP-SAT models.</p>
|
|
|
|
<ul>
|
|
<li><a href="#cp_model.CpModel"><code>CpModel</code></a>: Methods for creating
|
|
models, including variables and constraints.</li>
|
|
<li><a href="#cp_model.CpSolver"><code>CPSolver</code></a>: Methods for solving
|
|
a model and evaluating solutions.</li>
|
|
</ul>
|
|
|
|
<p>The following methods implement callbacks that the
|
|
solver calls each time it finds a new solution.</p>
|
|
|
|
<ul>
|
|
<li><a href="#cp_model.CpSolverSolutionCallback"><code>CpSolverSolutionCallback</code></a>:
|
|
A general method for implementing callbacks.</li>
|
|
<li><a href="#cp_model.ObjectiveSolutionPrinter"><code>ObjectiveSolutionPrinter</code></a>:
|
|
Print objective values and elapsed time for intermediate solutions.</li>
|
|
<li><a href="#cp_model.VarArraySolutionPrinter"><code>VarArraySolutionPrinter</code></a>:
|
|
Print intermediate solutions (variable values, time).</li>
|
|
<li>[<code><a href="#VarArrayAndObjectiveSolutionPrinter">VarArrayAndObjectiveSolutionPrinter</a></code>]
|
|
(#cp_model.VarArrayAndObjectiveSolutionPrinter):
|
|
Print both intermediate solutions and objective values.</li>
|
|
</ul>
|
|
|
|
<p>Additional methods for solving CP-SAT models:</p>
|
|
|
|
<ul>
|
|
<li><a href="#cp_model.Constraint"><code>Constraint</code></a>: A few utility methods for modifying
|
|
constraints created by <code><a href="#CpModel">CpModel</a></code>.</li>
|
|
<li><a href="#lineacp_model.LinearExpr"><code>LinearExpr</code></a>: Methods for creating constraints
|
|
and the objective from large arrays of coefficients.</li>
|
|
</ul>
|
|
|
|
<p>Other methods and functions listed are primarily used for developing OR-Tools,
|
|
rather than for solving specific optimization problems.</p>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="c1"># Copyright 2010-2021 Google LLC</span>
|
|
<span class="c1"># Licensed under the Apache License, Version 2.0 (the "License");</span>
|
|
<span class="c1"># you may not use this file except in compliance with the License.</span>
|
|
<span class="c1"># You may obtain a copy of the License at</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># Unless required by applicable law or agreed to in writing, software</span>
|
|
<span class="c1"># distributed under the License is distributed on an "AS IS" BASIS,</span>
|
|
<span class="c1"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
|
|
<span class="c1"># See the License for the specific language governing permissions and</span>
|
|
<span class="c1"># limitations under the License.</span>
|
|
<span class="sd">"""Methods for building and solving CP-SAT models.</span>
|
|
|
|
<span class="sd">The following two sections describe the main</span>
|
|
<span class="sd">methods for building and solving CP-SAT models.</span>
|
|
|
|
<span class="sd">* [`CpModel`](#cp_model.CpModel): Methods for creating</span>
|
|
<span class="sd">models, including variables and constraints.</span>
|
|
<span class="sd">* [`CPSolver`](#cp_model.CpSolver): Methods for solving</span>
|
|
<span class="sd">a model and evaluating solutions.</span>
|
|
|
|
<span class="sd">The following methods implement callbacks that the</span>
|
|
<span class="sd">solver calls each time it finds a new solution.</span>
|
|
|
|
<span class="sd">* [`CpSolverSolutionCallback`](#cp_model.CpSolverSolutionCallback):</span>
|
|
<span class="sd"> A general method for implementing callbacks.</span>
|
|
<span class="sd">* [`ObjectiveSolutionPrinter`](#cp_model.ObjectiveSolutionPrinter):</span>
|
|
<span class="sd"> Print objective values and elapsed time for intermediate solutions.</span>
|
|
<span class="sd">* [`VarArraySolutionPrinter`](#cp_model.VarArraySolutionPrinter):</span>
|
|
<span class="sd"> Print intermediate solutions (variable values, time).</span>
|
|
<span class="sd">* [`VarArrayAndObjectiveSolutionPrinter`]</span>
|
|
<span class="sd"> (#cp_model.VarArrayAndObjectiveSolutionPrinter):</span>
|
|
<span class="sd"> Print both intermediate solutions and objective values.</span>
|
|
|
|
<span class="sd">Additional methods for solving CP-SAT models:</span>
|
|
|
|
<span class="sd">* [`Constraint`](#cp_model.Constraint): A few utility methods for modifying</span>
|
|
<span class="sd"> constraints created by `CpModel`.</span>
|
|
<span class="sd">* [`LinearExpr`](#lineacp_model.LinearExpr): Methods for creating constraints</span>
|
|
<span class="sd"> and the objective from large arrays of coefficients.</span>
|
|
|
|
<span class="sd">Other methods and functions listed are primarily used for developing OR-Tools,</span>
|
|
<span class="sd">rather than for solving specific optimization problems.</span>
|
|
<span class="sd">"""</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">collections</span>
|
|
<span class="kn">import</span> <span class="nn">threading</span>
|
|
<span class="kn">import</span> <span class="nn">time</span>
|
|
<span class="kn">import</span> <span class="nn">warnings</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">ortools.sat</span> <span class="kn">import</span> <span class="n">cp_model_pb2</span>
|
|
<span class="kn">from</span> <span class="nn">ortools.sat</span> <span class="kn">import</span> <span class="n">sat_parameters_pb2</span>
|
|
<span class="kn">from</span> <span class="nn">ortools.sat.python</span> <span class="kn">import</span> <span class="n">cp_model_helper</span> <span class="k">as</span> <span class="n">cmh</span>
|
|
<span class="kn">from</span> <span class="nn">ortools.sat.python</span> <span class="kn">import</span> <span class="n">swig_helper</span>
|
|
<span class="kn">from</span> <span class="nn">ortools.util.python</span> <span class="kn">import</span> <span class="n">sorted_interval_list</span>
|
|
|
|
<span class="n">Domain</span> <span class="o">=</span> <span class="n">sorted_interval_list</span><span class="o">.</span><span class="n">Domain</span>
|
|
|
|
<span class="c1"># The classes below allow linear expressions to be expressed naturally with the</span>
|
|
<span class="c1"># usual arithmetic operators + - * / and with constant numbers, which makes the</span>
|
|
<span class="c1"># python API very intuitive. See../ samples/*.py for examples.</span>
|
|
|
|
<span class="n">INT_MIN</span> <span class="o">=</span> <span class="o">-</span><span class="mi">9223372036854775808</span> <span class="c1"># hardcoded to be platform independent.</span>
|
|
<span class="n">INT_MAX</span> <span class="o">=</span> <span class="mi">9223372036854775807</span>
|
|
<span class="n">INT32_MAX</span> <span class="o">=</span> <span class="mi">2147483647</span>
|
|
<span class="n">INT32_MIN</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2147483648</span>
|
|
|
|
<span class="c1"># CpSolver status (exported to avoid importing cp_model_cp2).</span>
|
|
<span class="n">UNKNOWN</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">UNKNOWN</span>
|
|
<span class="n">MODEL_INVALID</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">MODEL_INVALID</span>
|
|
<span class="n">FEASIBLE</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">FEASIBLE</span>
|
|
<span class="n">INFEASIBLE</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">INFEASIBLE</span>
|
|
<span class="n">OPTIMAL</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">OPTIMAL</span>
|
|
|
|
<span class="c1"># Variable selection strategy</span>
|
|
<span class="n">CHOOSE_FIRST</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">CHOOSE_FIRST</span>
|
|
<span class="n">CHOOSE_LOWEST_MIN</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">CHOOSE_LOWEST_MIN</span>
|
|
<span class="n">CHOOSE_HIGHEST_MAX</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">CHOOSE_HIGHEST_MAX</span>
|
|
<span class="n">CHOOSE_MIN_DOMAIN_SIZE</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">CHOOSE_MIN_DOMAIN_SIZE</span><span class="p">)</span>
|
|
<span class="n">CHOOSE_MAX_DOMAIN_SIZE</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">CHOOSE_MAX_DOMAIN_SIZE</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Domain reduction strategy</span>
|
|
<span class="n">SELECT_MIN_VALUE</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">SELECT_MIN_VALUE</span>
|
|
<span class="n">SELECT_MAX_VALUE</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">SELECT_MAX_VALUE</span>
|
|
<span class="n">SELECT_LOWER_HALF</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">SELECT_LOWER_HALF</span>
|
|
<span class="n">SELECT_UPPER_HALF</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">DecisionStrategyProto</span><span class="o">.</span><span class="n">SELECT_UPPER_HALF</span>
|
|
|
|
<span class="c1"># Search branching</span>
|
|
<span class="n">AUTOMATIC_SEARCH</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="o">.</span><span class="n">AUTOMATIC_SEARCH</span>
|
|
<span class="n">FIXED_SEARCH</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="o">.</span><span class="n">FIXED_SEARCH</span>
|
|
<span class="n">PORTFOLIO_SEARCH</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="o">.</span><span class="n">PORTFOLIO_SEARCH</span>
|
|
<span class="n">LP_SEARCH</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="o">.</span><span class="n">LP_SEARCH</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">DisplayBounds</span><span class="p">(</span><span class="n">bounds</span><span class="p">):</span>
|
|
<span class="sd">"""Displays a flattened list of intervals."""</span>
|
|
<span class="n">out</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">bounds</span><span class="p">),</span> <span class="mi">2</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="s1">', '</span>
|
|
<span class="k">if</span> <span class="n">bounds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">bounds</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]:</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">+</span> <span class="s1">'..'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">out</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">ShortName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a short name of an integer variable, or its negation."""</span>
|
|
<span class="k">if</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'Not(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="n">ShortName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">-</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'[</span><span class="si">%s</span><span class="s1">]'</span> <span class="o">%</span> <span class="n">DisplayBounds</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">ShortExprName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
|
|
<span class="sd">"""Pretty-print LinearExpressionProto instances."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">vars</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">var_name</span> <span class="o">=</span> <span class="n">ShortName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">coeff</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">coeffs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="n">coeff</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">var_name</span>
|
|
<span class="k">elif</span> <span class="n">coeff</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'-</span><span class="si">{</span><span class="n">var_name</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">elif</span> <span class="n">coeff</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">coeff</span><span class="si">}</span><span class="s1"> * </span><span class="si">{</span><span class="n">var_name</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">offset</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s1"> + </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">offset</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">elif</span> <span class="n">e</span><span class="o">.</span><span class="n">offset</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s1"> - </span><span class="si">{</span><span class="o">-</span><span class="n">e</span><span class="o">.</span><span class="n">offset</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
<span class="c1"># TODO(user): Support more than affine expressions.</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">LinearExpr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Holds an integer linear expression.</span>
|
|
|
|
<span class="sd"> A linear expression is built from integer constants and variables.</span>
|
|
<span class="sd"> For example, `x + 2 * (y - z + 1)`.</span>
|
|
|
|
<span class="sd"> Linear expressions are used in CP-SAT models in constraints and in the</span>
|
|
<span class="sd"> objective:</span>
|
|
|
|
<span class="sd"> * You can define linear constraints as in:</span>
|
|
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> model.Add(x + 2 * y <= 5)</span>
|
|
<span class="sd"> model.Add(sum(array_of_vars) == 5)</span>
|
|
<span class="sd"> ```</span>
|
|
|
|
<span class="sd"> * In CP-SAT, the objective is a linear expression:</span>
|
|
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> model.Minimize(x + 2 * y + z)</span>
|
|
<span class="sd"> ```</span>
|
|
|
|
<span class="sd"> * For large arrays, using the LinearExpr class is faster that using the python</span>
|
|
<span class="sd"> `sum()` function. You can create constraints and the objective from lists of</span>
|
|
<span class="sd"> linear expressions or coefficients as follows:</span>
|
|
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> model.Minimize(cp_model.LinearExpr.Sum(expressions))</span>
|
|
<span class="sd"> model.Add(cp_model.LinearExpr.WeightedSum(expressions, coefficients) >= 0)</span>
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">Sum</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Creates the expression sum(expressions)."""</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">_SumArray</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">WeightedSum</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="sd">"""Creates the expression sum(expressions[i] * coefficients[i])."""</span>
|
|
<span class="k">if</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">IsEmptyOrAllNull</span><span class="p">(</span><span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">coefficients</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_WeightedSum</span><span class="p">(</span><span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">)</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">Term</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">coefficient</span><span class="p">):</span>
|
|
<span class="sd">"""Creates `expression * coefficient`."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">coefficient</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expression</span> <span class="o">*</span> <span class="n">coefficient</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">IsEmptyOrAllNull</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">coefficients</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">c</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">RebuildFromLinearExpressionProto</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">proto</span><span class="p">):</span>
|
|
<span class="sd">"""Recreate a LinearExpr from a LinearExpressionProto."""</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="n">proto</span><span class="o">.</span><span class="n">offset</span>
|
|
<span class="n">num_elements</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">num_elements</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">offset</span>
|
|
<span class="k">elif</span> <span class="n">num_elements</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span> <span class="o">*</span> <span class="n">proto</span><span class="o">.</span><span class="n">coeffs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">offset</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">variables</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">all_ones</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">(),</span> <span class="n">proto</span><span class="o">.</span><span class="n">coeffs</span><span class="p">()):</span>
|
|
<span class="n">variables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">IntVar</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
|
|
<span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">all_ones</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">all_ones</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_SumArray</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_WeightedSum</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntegerVarValueMap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Scans the expression, and returns (var_coef_map, constant)."""</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">constant</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span> <span class="c1"># Flatten to avoid recursion.</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">-=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Unrecognized linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
|
|
<span class="k">return</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">constant</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetFloatVarValueMap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Scans the expression. Returns (var_coef_map, constant, is_integer)."""</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="n">constant</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span> <span class="c1"># Flatten to avoid recursion.</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span> <span class="c1"># Keep integrality.</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">float</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">=</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">if</span> <span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">-=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">=</span> <span class="o">-</span><span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Unrecognized linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="n">is_integer</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">constant</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_integer</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">is_integer</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">break</span>
|
|
<span class="k">return</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">constant</span><span class="p">,</span> <span class="n">is_integer</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__abs__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling abs() on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddAbsEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">-</span><span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">_ProductCst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">_ProductCst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__div__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling / on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddDivisionEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling // on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddDivisionEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__mod__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling </span><span class="si">%%</span><span class="s1"> on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddModuloEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__pow__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling ** on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddMultiplicationEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__lshift__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling left shift on a linear expression is not supported'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rshift__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling right shift on a linear expression is not supported'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__and__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling and on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddBoolAnd'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__or__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling or on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddBoolOr'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__xor__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling xor on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddBoolXor'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">_ProductCst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'Evaluating a LinearExpr instance as a Boolean is not implemented.'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span><span class="p">,</span> <span class="n">arg</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__ge__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__le__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">arg</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ArithmeticError</span><span class="p">(</span><span class="s1">'< INT_MIN is not supported'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">arg</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ArithmeticError</span><span class="p">(</span><span class="s1">'> INT_MAX is not supported'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">INT_MAX</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">arg</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">arg</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span>
|
|
<span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_Sum</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""Represents the sum of two LinearExprs."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">]:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Not an linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__left</span> <span class="o">=</span> <span class="n">left</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__right</span> <span class="o">=</span> <span class="n">right</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Left</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__left</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Right</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__right</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s1">'(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">__left</span><span class="si">}</span><span class="s1"> + </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">__right</span><span class="si">}</span><span class="s1">)'</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s1">'Sum(</span><span class="si">{</span><span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__left</span><span class="p">)</span><span class="si">}</span><span class="s1">, </span><span class="si">{</span><span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__right</span><span class="p">)</span><span class="si">}</span><span class="s1">)'</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_ProductCst</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""Represents the product of a LinearExpr by a constant."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">coeff</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span> <span class="o">=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__coef</span> <span class="o">=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span> <span class="o">=</span> <span class="n">expr</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__coef</span> <span class="o">=</span> <span class="n">coeff</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__coef</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'-'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__coef</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' * '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'ProductCst('</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">', '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__coef</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Coefficient</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__coef</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Expression</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expr</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_SumArray</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""Represents the sum of a list of LinearExpr and a constant."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expressions</span><span class="p">,</span> <span class="n">constant</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o">=</span> <span class="n">constant</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
<span class="n">x</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o">+=</span> <span class="n">x</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Not an linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'(</span><span class="si">{}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">' + '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="p">)))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'(</span><span class="si">{}</span><span class="s1"> + </span><span class="si">{}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">' + '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="p">)),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'SumArray(</span><span class="si">{}</span><span class="s1">, </span><span class="si">{}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="p">)),</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_WeightedSum</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""Represents sum(ai * xi) + b."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">,</span> <span class="n">constant</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__coefficients</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o">=</span> <span class="n">constant</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'In the LinearExpr.WeightedSum method, the expression array and the '</span>
|
|
<span class="s1">' coefficient array must have the same length.'</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">c</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
|
|
<span class="n">e</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o">+=</span> <span class="n">e</span> <span class="o">*</span> <span class="n">c</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__coefficients</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Not an linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">output</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">for</span> <span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__coefficients</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">output</span> <span class="ow">and</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">output</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">output</span> <span class="ow">and</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_minus_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">output</span> <span class="o">=</span> <span class="s1">'-'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">output</span><span class="p">:</span>
|
|
<span class="n">output</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{}</span><span class="s1"> * </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coeff</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="s1">' + </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_minus_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="s1">' - </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">coeff</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="s1">' + </span><span class="si">{}</span><span class="s1"> * </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coeff</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">coeff</span> <span class="o"><</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="s1">' - </span><span class="si">{}</span><span class="s1"> * </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">-</span><span class="n">coeff</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="s1">' + </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__constant</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="s1">' - </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">__constant</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">output</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">output</span> <span class="o">=</span> <span class="s1">'0'</span>
|
|
<span class="k">return</span> <span class="n">output</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'WeightedSum([</span><span class="si">{}</span><span class="s1">], [</span><span class="si">{}</span><span class="s1">], </span><span class="si">{}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span><span class="p">)),</span>
|
|
<span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__coefficients</span><span class="p">)),</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expressions</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Coefficients</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__coefficients</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">IntVar</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""An integer variable.</span>
|
|
|
|
<span class="sd"> An IntVar is an object that can take on any integer value within defined</span>
|
|
<span class="sd"> ranges. Variables appear in constraint like:</span>
|
|
|
|
<span class="sd"> x + y >= 5</span>
|
|
<span class="sd"> AllDifferent([x, y, z])</span>
|
|
|
|
<span class="sd"> Solving a model is equivalent to finding, for each variable, a single value</span>
|
|
<span class="sd"> from the set of initial values (called the initial domain), such that the</span>
|
|
<span class="sd"> model is feasible, or optimal if you provided an objective function.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""See CpModel.NewIntVar below."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">model</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="c1"># Python do not support multiple __init__ methods.</span>
|
|
<span class="c1"># This method is only called from the CpModel class.</span>
|
|
<span class="c1"># We hack the parameter to support the two cases:</span>
|
|
<span class="c1"># case 1:</span>
|
|
<span class="c1"># model is a CpModelProto, domain is a Domain, and name is a string.</span>
|
|
<span class="c1"># case 2:</span>
|
|
<span class="c1"># model is a CpModelProto, domain is an index (int), and name is None.</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">domain</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">domain</span><span class="o">.</span><span class="n">FlattenedIntervals</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the variable in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the variable protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span>
|
|
|
|
<span class="k">def</span> <span class="nf">IsEqualTo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sd">"""Returns true if self == other in the python sense."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span>
|
|
<span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="c1"># Special case for constants.</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'unnamed_var_</span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">DisplayBounds</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Not</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the negation of a Boolean variable.</span>
|
|
|
|
<span class="sd"> This method implements the logical negation of a Boolean variable.</span>
|
|
<span class="sd"> It is only valid if the variable has a Boolean domain (0 or 1).</span>
|
|
|
|
<span class="sd"> Note that this method is nilpotent: `x.Not().Not() == x`.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">for</span> <span class="n">bound</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">bound</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">bound</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'Cannot call Not on a non boolean variable: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="o">=</span> <span class="n">_NotBooleanVariable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__negation</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_NotBooleanVariable</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""Negation of a boolean variable."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__boolvar</span> <span class="o">=</span> <span class="n">boolvar</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">__boolvar</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Not</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__boolvar</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'not(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__boolvar</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'Evaluating a literal as a Boolean value is not implemented.'</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">BoundedLinearExpression</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Represents a linear constraint: `lb <= linear expression <= ub`.</span>
|
|
|
|
<span class="sd"> The only use of this class is to be added to the CpModel through</span>
|
|
<span class="sd"> `CpModel.Add(expression)`, as in:</span>
|
|
|
|
<span class="sd"> model.Add(x + 2 * y -1 >= z)</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">bounds</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span> <span class="o">=</span> <span class="n">expr</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">=</span> <span class="n">bounds</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">lb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">ub</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">lb</span> <span class="o">></span> <span class="n">INT_MIN</span> <span class="ow">and</span> <span class="n">ub</span> <span class="o"><</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">lb</span> <span class="o">==</span> <span class="n">ub</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' == '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' <= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' <= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ub</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">lb</span> <span class="o">></span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' >= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">ub</span> <span class="o"><</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' <= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ub</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'True (unbounded expr '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span>
|
|
<span class="k">elif</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">4</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">INT_MIN</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' != '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' in ['</span> <span class="o">+</span> <span class="n">DisplayBounds</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">)</span> <span class="o">+</span> <span class="s1">']'</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Expression</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expr</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Bounds</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="n">all_coeffs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">coeffs_map</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
|
|
<span class="n">same_var</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">eq_bounds</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">different_vars</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">ne_bounds</span> <span class="o">=</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">coeffs_map</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">all_coeffs</span> <span class="o">==</span> <span class="n">same_var</span> <span class="ow">and</span>
|
|
<span class="n">constant</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">eq_bounds</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">ne_bounds</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">eq_bounds</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">coeffs_map</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">all_coeffs</span> <span class="o">==</span> <span class="n">different_vars</span> <span class="ow">and</span>
|
|
<span class="n">constant</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">eq_bounds</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">ne_bounds</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">ne_bounds</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Evaluating a BoundedLinearExpression </span><span class="se">\'</span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="se">\'</span><span class="s1"> as a Boolean value'</span>
|
|
<span class="o">+</span> <span class="s1">' is not supported.'</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">Constraint</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Base class for constraints.</span>
|
|
|
|
<span class="sd"> Constraints are built by the CpModel through the Add<XXX> methods.</span>
|
|
<span class="sd"> Once created by the CpModel class, they are automatically added to the model.</span>
|
|
<span class="sd"> The purpose of this class is to allow specification of enforcement literals</span>
|
|
<span class="sd"> for this constraint.</span>
|
|
|
|
<span class="sd"> b = model.NewBoolVar('b')</span>
|
|
<span class="sd"> x = model.NewIntVar(0, 10, 'x')</span>
|
|
<span class="sd"> y = model.NewIntVar(0, 10, 'y')</span>
|
|
|
|
<span class="sd"> model.Add(x + 2 * y == 5).OnlyEnforceIf(b.Not())</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">constraints</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span> <span class="o">=</span> <span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">OnlyEnforceIf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="sd">"""Adds an enforcement literal to the constraint.</span>
|
|
|
|
<span class="sd"> This method adds one or more literals (that is, a boolean variable or its</span>
|
|
<span class="sd"> negation) as enforcement literals. The conjunction of all these literals</span>
|
|
<span class="sd"> determines whether the constraint is active or not. It acts as an</span>
|
|
<span class="sd"> implication, so if the conjunction is true, it implies that the constraint</span>
|
|
<span class="sd"> must be enforced. If it is false, then the constraint is ignored.</span>
|
|
|
|
<span class="sd"> BoolOr, BoolAnd, and linear constraints all support enforcement literals.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *boolvar: One or more Boolean literals.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> self.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">lit</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">bool</span><span class="p">(</span><span class="n">lit</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="c1"># Always true. Do nothing.</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the constraint in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the constraint protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">IntervalVar</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Represents an Interval variable.</span>
|
|
|
|
<span class="sd"> An interval variable is both a constraint and a variable. It is defined by</span>
|
|
<span class="sd"> three integer variables: start, size, and end.</span>
|
|
|
|
<span class="sd"> It is a constraint because, internally, it enforces that start + size == end.</span>
|
|
|
|
<span class="sd"> It is also a variable as it can appear in specific scheduling constraints:</span>
|
|
<span class="sd"> NoOverlap, NoOverlap2D, Cumulative.</span>
|
|
|
|
<span class="sd"> Optionally, an enforcement literal can be added to this constraint, in which</span>
|
|
<span class="sd"> case these scheduling constraints will ignore interval variables with</span>
|
|
<span class="sd"> enforcement literals assigned to false. Conversely, these constraints will</span>
|
|
<span class="sd"> also set these enforcement literals to false if they cannot fit these</span>
|
|
<span class="sd"> intervals into the schedule.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">model</span>
|
|
<span class="c1"># As with the IntVar::__init__ method, we hack the __init__ method to</span>
|
|
<span class="c1"># support two use cases:</span>
|
|
<span class="c1"># case 1: called when creating a new interval variable.</span>
|
|
<span class="c1"># {start|size|end} are linear expressions, is_present_index is either</span>
|
|
<span class="c1"># None or the index of a Boolean literal. name is a string</span>
|
|
<span class="c1"># case 2: called when querying an existing interval variable.</span>
|
|
<span class="c1"># start_index is an int, all parameters after are None.</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">size</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">end</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">is_present_index</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">start</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">start</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_present_index</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">is_present_index</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the interval constraint in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the interval protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">interval</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(start = </span><span class="si">%s</span><span class="s1">, size = </span><span class="si">%s</span><span class="s1">, end = </span><span class="si">%s</span><span class="s1">, is_present = </span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">),</span>
|
|
<span class="n">ShortName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(start = </span><span class="si">%s</span><span class="s1">, size = </span><span class="si">%s</span><span class="s1">, end = </span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">StartExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SizeExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">EndExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">ObjectIsATrueLiteral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Checks if literal is either True, or a Boolean literals fixed to True."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">literal</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">ObjectIsAFalseLiteral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Checks if literal is either False, or a Boolean literals fixed to False."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">literal</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">CpModel</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Methods for building a CP model.</span>
|
|
|
|
<span class="sd"> Methods beginning with:</span>
|
|
|
|
<span class="sd"> * ```New``` create integer, boolean, or interval variables.</span>
|
|
<span class="sd"> * ```Add``` create new constraints and add them to the model.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpModelProto</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="c1"># Integer variable.</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewIntVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Create an integer variable with domain [lb, ub].</span>
|
|
|
|
<span class="sd"> The CP-SAT solver is limited to integer variables. If you have fractional</span>
|
|
<span class="sd"> values, scale them up so that they become integers; if you have strings,</span>
|
|
<span class="sd"> encode them as integers.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> lb: Lower bound for the variable.</span>
|
|
<span class="sd"> ub: Upper bound for the variable.</span>
|
|
<span class="sd"> name: The name of the variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> a variable whose domain is [lb, ub].</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewIntVarFromDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Create an integer variable from a domain.</span>
|
|
|
|
<span class="sd"> A domain is a set of integers specified by a collection of intervals.</span>
|
|
<span class="sd"> For example, `model.NewIntVarFromDomain(cp_model.</span>
|
|
<span class="sd"> Domain.FromIntervals([[1, 2], [4, 6]]), 'x')`</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> domain: An instance of the Domain class.</span>
|
|
<span class="sd"> name: The name of the variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> a variable whose domain is the given domain.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewBoolVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates a 0-1 variable with the given name."""</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""Declares a constant integer."""</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
|
|
<span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Linear constraints.</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddLinearConstraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the constraint: `lb <= linear_expr <= ub`."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddLinearExpressionInDomain</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddLinearExpressionInDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">domain</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the constraint: `linear_expr` in `domain`."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="n">linear_expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Wrong argument'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="n">cmh</span><span class="o">.</span><span class="n">capped_subtraction</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">constant</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">domain</span><span class="o">.</span><span class="n">FlattenedIntervals</span><span class="p">()</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">domain</span><span class="o">.</span><span class="n">Contains</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([])</span> <span class="c1"># Evaluate to false.</span>
|
|
<span class="c1"># Nothing to do otherwise.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'Not supported: CpModel.AddLinearExpressionInDomain('</span> <span class="o">+</span>
|
|
<span class="nb">str</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ct</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a `BoundedLinearExpression` to the model.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> ct: A [`BoundedLinearExpression`](#boundedlinearexpression).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="n">BoundedLinearExpression</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddLinearExpressionInDomain</span><span class="p">(</span>
|
|
<span class="n">ct</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">Domain</span><span class="o">.</span><span class="n">FromFlatIntervals</span><span class="p">(</span><span class="n">ct</span><span class="o">.</span><span class="n">Bounds</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="n">ct</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([</span><span class="kc">True</span><span class="p">])</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">ct</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([])</span> <span class="c1"># Evaluate to false.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Not supported: CpModel.Add('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ct</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="c1"># General Integer Constraints.</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAllDifferent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AllDifferent(expressions).</span>
|
|
|
|
<span class="sd"> This constraint forces all expressions to have different values.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *expressions: simple expressions of the form a * var + constant.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">expanded</span> <span class="o">=</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">all_diff</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">expanded</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddElement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the element constraint: `variables[index] == target`."""</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddElement expects a non-empty variables array'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">variables</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="n">index</span><span class="p">)]</span> <span class="o">==</span> <span class="n">target</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddCircuit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arcs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Circuit(arcs).</span>
|
|
|
|
<span class="sd"> Adds a circuit constraint from a sparse list of arcs that encode the graph.</span>
|
|
|
|
<span class="sd"> A circuit is a unique Hamiltonian path in a subgraph of the total</span>
|
|
<span class="sd"> graph. In case a node 'i' is not in the path, then there must be a</span>
|
|
<span class="sd"> loop arc 'i -> i' associated with a true literal. Otherwise</span>
|
|
<span class="sd"> this constraint will fail.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> arcs: a list of arcs. An arc is a tuple (source_node, destination_node,</span>
|
|
<span class="sd"> literal). The arc is selected in the circuit if the literal is true.</span>
|
|
<span class="sd"> Both source_node and destination_node must be integers between 0 and the</span>
|
|
<span class="sd"> number of nodes - 1.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: If the list of arcs is empty.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddCircuit expects a non-empty array of arcs'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">for</span> <span class="n">arc</span> <span class="ow">in</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">lit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">tails</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMultipleCircuit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arcs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a multiple circuit constraint, aka the "VRP" constraint.</span>
|
|
|
|
<span class="sd"> The direct graph where arc #i (from tails[i] to head[i]) is present iff</span>
|
|
<span class="sd"> literals[i] is true must satisfy this set of properties:</span>
|
|
<span class="sd"> - #incoming arcs == 1 except for node 0.</span>
|
|
<span class="sd"> - #outgoing arcs == 1 except for node 0.</span>
|
|
<span class="sd"> - for node zero, #incoming arcs == #outgoing arcs.</span>
|
|
<span class="sd"> - There are no duplicate arcs.</span>
|
|
<span class="sd"> - Self-arcs are allowed except for node 0.</span>
|
|
<span class="sd"> - There is no cycle in this graph, except through node 0.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> arcs: a list of arcs. An arc is a tuple (source_node, destination_node,</span>
|
|
<span class="sd"> literal). The arc is selected in the circuit if the literal is true.</span>
|
|
<span class="sd"> Both source_node and destination_node must be integers between 0 and the</span>
|
|
<span class="sd"> number of nodes - 1.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: If the list of arcs is empty.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddMultipleCircuit expects a non-empty array of arcs'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">for</span> <span class="n">arc</span> <span class="ow">in</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">lit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">tails</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAllowedAssignments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AllowedAssignments(variables, tuples_list).</span>
|
|
|
|
<span class="sd"> An AllowedAssignments constraint is a constraint on an array of variables,</span>
|
|
<span class="sd"> which requires that when all variables are assigned values, the resulting</span>
|
|
<span class="sd"> array equals one of the tuples in `tuple_list`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: A list of variables.</span>
|
|
<span class="sd"> tuples_list: A list of admissible tuples. Each tuple must have the same</span>
|
|
<span class="sd"> length as the variables, and the ith value of a tuple corresponds to the</span>
|
|
<span class="sd"> ith variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: If a tuple does not have the same size as the list of</span>
|
|
<span class="sd"> variables.</span>
|
|
<span class="sd"> ValueError: If the array of variables is empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddAllowedAssignments expects a non-empty variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">arity</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tuples_list</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">!=</span> <span class="n">arity</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Tuple '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' has the wrong arity'</span><span class="p">)</span>
|
|
<span class="n">ar</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">t</span><span class="p">:</span>
|
|
<span class="n">ar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">v</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">ar</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddForbiddenAssignments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AddForbiddenAssignments(variables, [tuples_list]).</span>
|
|
|
|
<span class="sd"> A ForbiddenAssignments constraint is a constraint on an array of variables</span>
|
|
<span class="sd"> where the list of impossible combinations is provided in the tuples list.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: A list of variables.</span>
|
|
<span class="sd"> tuples_list: A list of forbidden tuples. Each tuple must have the same</span>
|
|
<span class="sd"> length as the variables, and the *i*th value of a tuple corresponds to</span>
|
|
<span class="sd"> the *i*th variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: If a tuple does not have the same size as the list of</span>
|
|
<span class="sd"> variables.</span>
|
|
<span class="sd"> ValueError: If the array of variables is empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddForbiddenAssignments expects a non-empty variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
|
|
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddAllowedAssignments</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">negated</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAutomaton</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transition_variables</span><span class="p">,</span> <span class="n">starting_state</span><span class="p">,</span> <span class="n">final_states</span><span class="p">,</span>
|
|
<span class="n">transition_triples</span><span class="p">):</span>
|
|
<span class="sd">"""Adds an automaton constraint.</span>
|
|
|
|
<span class="sd"> An automaton constraint takes a list of variables (of size *n*), an initial</span>
|
|
<span class="sd"> state, a set of final states, and a set of transitions. A transition is a</span>
|
|
<span class="sd"> triplet (*tail*, *transition*, *head*), where *tail* and *head* are states,</span>
|
|
<span class="sd"> and *transition* is the label of an arc from *head* to *tail*,</span>
|
|
<span class="sd"> corresponding to the value of one variable in the list of variables.</span>
|
|
|
|
<span class="sd"> This automaton will be unrolled into a flow with *n* + 1 phases. Each phase</span>
|
|
<span class="sd"> contains the possible states of the automaton. The first state contains the</span>
|
|
<span class="sd"> initial state. The last phase contains the final states.</span>
|
|
|
|
<span class="sd"> Between two consecutive phases *i* and *i* + 1, the automaton creates a set</span>
|
|
<span class="sd"> of arcs. For each transition (*tail*, *transition*, *head*), it will add</span>
|
|
<span class="sd"> an arc from the state *tail* of phase *i* and the state *head* of phase</span>
|
|
<span class="sd"> *i* + 1. This arc is labeled by the value *transition* of the variables</span>
|
|
<span class="sd"> `variables[i]`. That is, this arc can only be selected if `variables[i]`</span>
|
|
<span class="sd"> is assigned the value *transition*.</span>
|
|
|
|
<span class="sd"> A feasible solution of this constraint is an assignment of variables such</span>
|
|
<span class="sd"> that, starting from the initial state in phase 0, there is a path labeled by</span>
|
|
<span class="sd"> the values of the variables that ends in one of the final states in the</span>
|
|
<span class="sd"> final phase.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> transition_variables: A non-empty list of variables whose values</span>
|
|
<span class="sd"> correspond to the labels of the arcs traversed by the automaton.</span>
|
|
<span class="sd"> starting_state: The initial state of the automaton.</span>
|
|
<span class="sd"> final_states: A non-empty list of admissible final states.</span>
|
|
<span class="sd"> transition_triples: A list of transitions for the automaton, in the</span>
|
|
<span class="sd"> following format (current_state, variable_value, next_state).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if `transition_variables`, `final_states`, or</span>
|
|
<span class="sd"> `transition_triples` are empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">transition_variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddAutomaton expects a non-empty transition_variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">final_states</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddAutomaton expects some final states'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">transition_triples</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddAutomaton expects some transition triples'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">transition_variables</span><span class="p">])</span>
|
|
<span class="n">starting_state</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">starting_state</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">starting_state</span> <span class="o">=</span> <span class="n">starting_state</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">final_states</span><span class="p">:</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">final_states</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transition_triples</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Tuple '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' has the wrong arity (!= 3)'</span><span class="p">)</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">label</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_tail</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_label</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">label</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_head</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddInverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">inverse_variables</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Inverse(variables, inverse_variables).</span>
|
|
|
|
<span class="sd"> An inverse constraint enforces that if `variables[i]` is assigned a value</span>
|
|
<span class="sd"> `j`, then `inverse_variables[j]` is assigned a value `i`. And vice versa.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: An array of integer variables.</span>
|
|
<span class="sd"> inverse_variables: An array of integer variables.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: if variables and inverse_variables have different lengths, or</span>
|
|
<span class="sd"> if they are empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">inverse_variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'The Inverse constraint does not accept empty arrays'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">inverse_variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'In the inverse constraint, the two array variables and'</span>
|
|
<span class="s1">' inverse_variables must have the same length.'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">inverse</span><span class="o">.</span><span class="n">f_direct</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">inverse</span><span class="o">.</span><span class="n">f_inverse</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">inverse_variables</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddReservoirConstraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">level_changes</span><span class="p">,</span> <span class="n">min_level</span><span class="p">,</span>
|
|
<span class="n">max_level</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Reservoir(times, level_changes, min_level, max_level).</span>
|
|
|
|
<span class="sd"> Maintains a reservoir level within bounds. The water level starts at 0, and</span>
|
|
<span class="sd"> at any time, it must be between min_level and max_level.</span>
|
|
|
|
<span class="sd"> If the affine expression `times[i]` is assigned a value t, then the current</span>
|
|
<span class="sd"> level changes by `level_changes[i]`, which is constant, at time t.</span>
|
|
|
|
<span class="sd"> Note that min level must be <= 0, and the max level must be >= 0. Please</span>
|
|
<span class="sd"> use fixed level_changes to simulate initial state.</span>
|
|
|
|
<span class="sd"> Therefore, at any time:</span>
|
|
<span class="sd"> sum(level_changes[i] if times[i] <= t) in [min_level, max_level]</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> times: A list of affine expressions which specify the time of the filling</span>
|
|
<span class="sd"> or emptying the reservoir.</span>
|
|
<span class="sd"> level_changes: A list of integer values that specifies the amount of the</span>
|
|
<span class="sd"> emptying or filling.</span>
|
|
<span class="sd"> min_level: At any time, the level of the reservoir must be greater or</span>
|
|
<span class="sd"> equal than the min level.</span>
|
|
<span class="sd"> max_level: At any time, the level of the reservoir must be less or equal</span>
|
|
<span class="sd"> than the max level.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if max_level < min_level.</span>
|
|
|
|
<span class="sd"> ValueError: if max_level < 0.</span>
|
|
|
|
<span class="sd"> ValueError: if min_level > 0</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="n">min_level</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Reservoir constraint must have a max_level >= min_level'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a max_level >= 0'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">min_level</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a min_level <= 0'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">time_exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">times</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">level_changes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">level_changes</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">min_level</span> <span class="o">=</span> <span class="n">min_level</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">max_level</span> <span class="o">=</span> <span class="n">max_level</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddReservoirConstraintWithActive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">level_changes</span><span class="p">,</span> <span class="n">actives</span><span class="p">,</span>
|
|
<span class="n">min_level</span><span class="p">,</span> <span class="n">max_level</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Reservoir(times, level_changes, actives, min_level, max_level).</span>
|
|
|
|
<span class="sd"> Maintains a reservoir level within bounds. The water level starts at 0, and</span>
|
|
<span class="sd"> at any time, it must be between min_level and max_level.</span>
|
|
|
|
<span class="sd"> If the variable `times[i]` is assigned a value t, and `actives[i]` is</span>
|
|
<span class="sd"> `True`, then the current level changes by `level_changes[i]`, which is</span>
|
|
<span class="sd"> constant,</span>
|
|
<span class="sd"> at time t.</span>
|
|
|
|
<span class="sd"> Note that min level must be <= 0, and the max level must be >= 0. Please</span>
|
|
<span class="sd"> use fixed level_changes to simulate initial state.</span>
|
|
|
|
<span class="sd"> Therefore, at any time:</span>
|
|
<span class="sd"> sum(level_changes[i] * actives[i] if times[i] <= t) in [min_level,</span>
|
|
<span class="sd"> max_level]</span>
|
|
|
|
|
|
<span class="sd"> The array of boolean variables 'actives', if defined, indicates which</span>
|
|
<span class="sd"> actions are actually performed.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> times: A list of affine expressions which specify the time of the filling</span>
|
|
<span class="sd"> or emptying the reservoir.</span>
|
|
<span class="sd"> level_changes: A list of integer values that specifies the amount of the</span>
|
|
<span class="sd"> emptying or filling.</span>
|
|
<span class="sd"> actives: a list of boolean variables. They indicates if the</span>
|
|
<span class="sd"> emptying/refilling events actually take place.</span>
|
|
<span class="sd"> min_level: At any time, the level of the reservoir must be greater or</span>
|
|
<span class="sd"> equal than the min level.</span>
|
|
<span class="sd"> max_level: At any time, the level of the reservoir must be less or equal</span>
|
|
<span class="sd"> than the max level.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if max_level < min_level.</span>
|
|
|
|
<span class="sd"> ValueError: if max_level < 0.</span>
|
|
|
|
<span class="sd"> ValueError: if min_level > 0</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="n">min_level</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Reservoir constraint must have a max_level >= min_level'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a max_level >= 0'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">min_level</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a min_level <= 0'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">time_exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">times</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">level_changes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">level_changes</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">active_literals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">actives</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">min_level</span> <span class="o">=</span> <span class="n">min_level</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">max_level</span> <span class="o">=</span> <span class="n">max_level</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMapDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">bool_var_array</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `var == i + offset <=> bool_var_array[i] == true for all i`."""</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">bool_var</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">bool_var_array</span><span class="p">):</span>
|
|
<span class="n">b_index</span> <span class="o">=</span> <span class="n">bool_var</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="n">var_index</span> <span class="o">=</span> <span class="n">var</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var_index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">offset</span> <span class="o">+</span> <span class="n">i</span><span class="p">,</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">b_index</span><span class="p">)</span>
|
|
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var_index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="o">-</span><span class="n">b_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">>=</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddImplication</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `a => b` (`a` implies `b`)."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_or</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddBoolOr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `Or(literals) == true`: Sum(literals) >= 1."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_or</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAtLeastOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Same as `AddBoolOr`: `Sum(literals) >= 1`."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">(</span><span class="o">*</span><span class="n">literals</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAtMostOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `AtMostOne(literals)`: `Sum(literals) <= 1`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">at_most_one</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddExactlyOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `ExactlyOne(literals)`: `Sum(literals) == 1`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">exactly_one</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddBoolAnd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `And(literals) == true`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_and</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddBoolXOr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `XOr(literals) == true`.</span>
|
|
|
|
<span class="sd"> In contrast to AddBoolOr and AddBoolAnd, it does not support</span>
|
|
<span class="sd"> .OnlyEnforceIf().</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *literals: the list of literals in the constraint.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `Constraint` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_xor</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMinEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Min(exprs)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="kc">True</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMaxEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Max(exprs)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddDivisionEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="n">denom</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == num // denom` (integer division rounded towards 0)."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">num</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">denom</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAbsEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Abs(var)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddModuloEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target = var % mod`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">mod</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMultiplicationEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == expressions[0] * .. * expressions[n]`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_prod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_prod</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="c1"># Scheduling support</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, size, and end.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Internally, it ensures that `start + size == end`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> end: The end of the interval. It can be an affine or constant expression.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span> <span class="o">==</span> <span class="n">end</span><span class="p">)</span>
|
|
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">size_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: size must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">end_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: end must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewFixedSizeIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, and a fixed size.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It must be an integer value.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewOptionalIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">is_present</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an optional interval var from start, size, end, and is_present.</span>
|
|
|
|
<span class="sd"> An optional interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap. This constraint is protected by an is_present</span>
|
|
<span class="sd"> literal that indicates if it is active or not.</span>
|
|
|
|
<span class="sd"> Internally, it ensures that `is_present` implies `start + size == end`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an integer value, or an</span>
|
|
<span class="sd"> integer variable.</span>
|
|
<span class="sd"> size: The size of the interval. It can be an integer value, or an integer</span>
|
|
<span class="sd"> variable.</span>
|
|
<span class="sd"> end: The end of the interval. It can be an integer value, or an integer</span>
|
|
<span class="sd"> variable.</span>
|
|
<span class="sd"> is_present: A literal that indicates if the interval is active or not. A</span>
|
|
<span class="sd"> inactive interval is simply ignored by all constraints.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># Add the linear constraint.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span> <span class="o">==</span> <span class="n">end</span><span class="p">)</span><span class="o">.</span><span class="n">OnlyEnforceIf</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Creates the IntervalConstraintProto object.</span>
|
|
<span class="n">is_present_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">size_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: size must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">end_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: end must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span>
|
|
<span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewOptionalFixedSizeIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">is_present</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, and a fixed size.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It must be an integer value.</span>
|
|
<span class="sd"> is_present: A literal that indicates if the interval is active or not. A</span>
|
|
<span class="sd"> inactive interval is simply ignored by all constraints.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="n">is_present_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span>
|
|
<span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddNoOverlap</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interval_vars</span><span class="p">):</span>
|
|
<span class="sd">"""Adds NoOverlap(interval_vars).</span>
|
|
|
|
<span class="sd"> A NoOverlap constraint ensures that all present intervals do not overlap</span>
|
|
<span class="sd"> in time.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> interval_vars: The list of interval variables to constrain.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap</span><span class="o">.</span><span class="n">intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">interval_vars</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddNoOverlap2D</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x_intervals</span><span class="p">,</span> <span class="n">y_intervals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds NoOverlap2D(x_intervals, y_intervals).</span>
|
|
|
|
<span class="sd"> A NoOverlap2D constraint ensures that all present rectangles do not overlap</span>
|
|
<span class="sd"> on a plane. Each rectangle is aligned with the X and Y axis, and is defined</span>
|
|
<span class="sd"> by two intervals which represent its projection onto the X and Y axis.</span>
|
|
|
|
<span class="sd"> Furthermore, one box is optional if at least one of the x or y interval is</span>
|
|
<span class="sd"> optional.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> x_intervals: The X coordinates of the rectangles.</span>
|
|
<span class="sd"> y_intervals: The Y coordinates of the rectangles.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap_2d</span><span class="o">.</span><span class="n">x_intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">x_intervals</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap_2d</span><span class="o">.</span><span class="n">y_intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">y_intervals</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddCumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intervals</span><span class="p">,</span> <span class="n">demands</span><span class="p">,</span> <span class="n">capacity</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Cumulative(intervals, demands, capacity).</span>
|
|
|
|
<span class="sd"> This constraint enforces that:</span>
|
|
|
|
<span class="sd"> for all t:</span>
|
|
<span class="sd"> sum(demands[i]</span>
|
|
<span class="sd"> if (start(intervals[i]) <= t < end(intervals[i])) and</span>
|
|
<span class="sd"> (intervals[i] is present)) <= capacity</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> intervals: The list of intervals.</span>
|
|
<span class="sd"> demands: The list of demands for each interval. Each demand must be >= 0.</span>
|
|
<span class="sd"> Each demand can be an integer value, or an integer variable.</span>
|
|
<span class="sd"> capacity: The maximum capacity of the cumulative constraint. It must be a</span>
|
|
<span class="sd"> positive integer value or variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">])</span>
|
|
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">demands</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">demands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">capacity</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">capacity</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="c1"># Support for deep copy.</span>
|
|
<span class="k">def</span> <span class="nf">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_model</span><span class="p">):</span>
|
|
<span class="sd">"""Reset the model, and creates a new one from a CpModelProto instance."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">other_model</span><span class="o">.</span><span class="n">Proto</span><span class="p">())</span>
|
|
|
|
<span class="c1"># Rebuild constant map.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">i</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetBoolVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created Boolean variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetBoolVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetBoolVarFromProtoIndex: index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1"> does not reference'</span> <span class="o">+</span>
|
|
<span class="s1">' a Boolean variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created integer variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntervalVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created interval variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntervalVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">ct</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s1">'interval'</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntervalVarFromProtoIndex: index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1"> does not reference an'</span>
|
|
<span class="o">+</span> <span class="s1">' interval variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Helpers.</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the underlying CpModelProto."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Negated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetOrMakeIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of a variable, its negation, or a number."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="n">arg</span><span class="o">.</span><span class="n">Expression</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetOrMakeIndex('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an index from a boolean expression."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AssertIsBooleanVariable</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AssertIsBooleanVariable</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">Not</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_boolean</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetOrMakeBooleanIndex('</span> <span class="o">+</span>
|
|
<span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntervalIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntervalVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetIntervalIndex(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">value</span><span class="p">]</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">value</span><span class="p">,</span> <span class="n">value</span><span class="p">])</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">index</span>
|
|
<span class="k">return</span> <span class="n">index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">VarIndexToVarProto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_index</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">var_index</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">var_index</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="o">-</span><span class="n">var_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ParseLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a LinearExpressionProto built from a LinearExpr instance."""</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">LinearExpressionProto</span><span class="p">()</span>
|
|
<span class="n">mult</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">negate</span> <span class="k">else</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">mult</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">))</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mult</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="n">linear_expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span> <span class="o">*</span> <span class="n">mult</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Wrong argument'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span> <span class="o">*</span> <span class="n">mult</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_SetObjective</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'objective'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'floating_point_objective'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">if</span> <span class="n">minimize</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Negated</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span><span class="p">,</span> <span class="n">is_integer</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">GetFloatVarValueMap</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">is_integer</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">minimize</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="o">-</span><span class="n">constant</span>
|
|
<span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">minimize</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Negated</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">maximize</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">minimize</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span>
|
|
<span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a valid objective'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Minimize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model to minimize(obj)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetObjective</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Maximize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model to maximize(obj)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetObjective</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">HasObjective</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s1">'objective'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddDecisionStrategy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">var_strategy</span><span class="p">,</span> <span class="n">domain_strategy</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a search strategy to the model.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: a list of variables this strategy will assign.</span>
|
|
<span class="sd"> var_strategy: heuristic to choose the next variable to assign.</span>
|
|
<span class="sd"> domain_strategy: heuristic to reduce the domain of the selected variable.</span>
|
|
<span class="sd"> Currently, this is advanced code: the union of all strategies added to</span>
|
|
<span class="sd"> the model must be complete, i.e. instantiates all variables.</span>
|
|
<span class="sd"> Otherwise, Solve() will fail.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">strategy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">search_strategy</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">variable_selection_strategy</span> <span class="o">=</span> <span class="n">var_strategy</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">domain_reduction_strategy</span> <span class="o">=</span> <span class="n">domain_strategy</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ModelStats</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a string containing some model statistics."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedModelStats</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a string indicating that the model is invalid."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedValidateModel</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ExportToFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
|
|
<span class="sd">"""Write the model as a protocol buffer to 'file'.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> file: file to write the model to. If the filename ends with 'txt', the</span>
|
|
<span class="sd"> model will be written as a text file, otherwise, the binary format will</span>
|
|
<span class="sd"> be used.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> True if the model was correctly written.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedWriteModelToFile</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">file</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AssertIsBooleanVariable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a boolean variable'</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a boolean variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddHint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""Adds 'var == value' as a hint to the solver."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">solution_hint</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">solution_hint</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ClearHints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Remove any solution hint from the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'solution_hint'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAssumption</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lit</span><span class="p">):</span>
|
|
<span class="sd">"""Add the literal 'lit' to the model as assumptions."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">assumptions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">lit</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAssumptions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Add the literals to the model as assumptions."""</span>
|
|
<span class="k">for</span> <span class="n">lit</span> <span class="ow">in</span> <span class="n">literals</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AddAssumption</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ClearAssumptions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Remove all assumptions from the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'assumptions'</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s1">'__len__'</span><span class="p">):</span> <span class="c1"># Tuple</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">args</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">args</span>
|
|
<span class="c1"># Generator</span>
|
|
<span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">EvaluateLinearExpr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">solution</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluate a linear expression against a solution."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Cannot interpret </span><span class="si">%s</span><span class="s1"> as a linear expression.'</span> <span class="o">%</span>
|
|
<span class="n">expression</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="n">expression</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">expr</span><span class="si">}</span><span class="s1"> as a linear expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">value</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">EvaluateBooleanExpression</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">solution</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluate a boolean expression against a solution."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">literal</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span>
|
|
<span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ow">not</span> <span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="o">-</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">literal</span><span class="si">}</span><span class="s1"> as a boolean expression.'</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">CpSolver</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Main solver class.</span>
|
|
|
|
<span class="sd"> The purpose of this class is to search for a solution to the model provided</span>
|
|
<span class="sd"> to the Solve() method.</span>
|
|
|
|
<span class="sd"> Once Solve() is called, this class allows inspecting the solution found</span>
|
|
<span class="sd"> with the Value() and BooleanValue() methods, as well as general statistics</span>
|
|
<span class="sd"> about the solve procedure.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="p">:</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">solution_callback</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sd">"""Solves a problem and passes each solution to the callback if not null."""</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span> <span class="o">=</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="p">()</span>
|
|
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="o">.</span><span class="n">SetSerializedParameters</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">solve_wrapper</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">solution_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">AddSolutionCallback</span><span class="p">(</span><span class="n">solution_callback</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">AddLogCallback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span><span class="o">.</span><span class="n">FromString</span><span class="p">(</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="o">.</span><span class="n">SerializedSolve</span><span class="p">(</span>
|
|
<span class="n">model</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">solve_wrapper</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="n">solution_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">ClearSolutionCallback</span><span class="p">(</span><span class="n">solution_callback</span><span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SolveWithSolutionCallback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
|
|
<span class="sd">"""DEPRECATED Use Solve() with the callback argument."""</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s1">'SolveWithSolutionCallback is deprecated; use Solve() with'</span> <span class="o">+</span>
|
|
<span class="s1">'the callback argument.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Solve</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SearchForAllSolutions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
|
|
<span class="sd">"""DEPRECATED Use Solve() with the right parameter.</span>
|
|
|
|
<span class="sd"> Search for all solutions of a satisfiability problem.</span>
|
|
|
|
<span class="sd"> This method searches for all feasible solutions of a given model.</span>
|
|
<span class="sd"> Then it feeds the solution to the callback.</span>
|
|
|
|
<span class="sd"> Note that the model cannot contain an objective.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> model: The model to solve.</span>
|
|
<span class="sd"> callback: The callback that will be called at each solution.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> The status of the solve:</span>
|
|
|
|
<span class="sd"> * *FEASIBLE* if some solutions have been found</span>
|
|
<span class="sd"> * *INFEASIBLE* if the solver has proved there are no solution</span>
|
|
<span class="sd"> * *OPTIMAL* if all solutions have been found</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s1">'SearchForAllSolutions is deprecated; use Solve() with'</span> <span class="o">+</span>
|
|
<span class="s1">'enumerate_all_solutions = True.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">HasObjective</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Search for all solutions is only defined on '</span>
|
|
<span class="s1">'satisfiability problems'</span><span class="p">)</span>
|
|
<span class="c1"># Store old parameter.</span>
|
|
<span class="n">enumerate_all</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Solve</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Restore parameter.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span> <span class="o">=</span> <span class="n">enumerate_all</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
|
|
<span class="k">def</span> <span class="nf">StopSearch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Stops the current search asynchronously."""</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="o">.</span><span class="n">StopSearch</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the value of a linear expression after solve."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">EvaluateLinearExpr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">BooleanValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the boolean value of a literal after solve."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">EvaluateBooleanExpression</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ObjectiveValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the value of the objective after solve."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">objective_value</span>
|
|
|
|
<span class="k">def</span> <span class="nf">BestObjectiveBound</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the best lower (upper) bound found when min(max)imizing."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">best_objective_bound</span>
|
|
|
|
<span class="k">def</span> <span class="nf">StatusName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the name of the status returned by Solve()."""</span>
|
|
<span class="k">if</span> <span class="n">status</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">status</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
<span class="k">return</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverStatus</span><span class="o">.</span><span class="n">Name</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NumBooleans</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of boolean variables managed by the SAT solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_booleans</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NumConflicts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of conflicts since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_conflicts</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NumBranches</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of search branches explored by the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_branches</span>
|
|
|
|
<span class="k">def</span> <span class="nf">WallTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the wall time in seconds since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">wall_time</span>
|
|
|
|
<span class="k">def</span> <span class="nf">UserTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the user time in seconds since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">user_time</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ResponseStats</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns some statistics on the solution found as a string."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedSolverResponseStats</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ResponseProto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the response object."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SufficientAssumptionsForInfeasibility</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the indices of the infeasible assumptions."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">sufficient_assumptions_for_infeasibility</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SolutionInfo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns some information on the solve process.</span>
|
|
|
|
<span class="sd"> Returns some information on how the solution was found, or the reason</span>
|
|
<span class="sd"> why the model or the parameters are invalid.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">solution_info</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">CpSolverSolutionCallback</span><span class="p">(</span><span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Solution callback.</span>
|
|
|
|
<span class="sd"> This class implements a callback that will be called at each new solution</span>
|
|
<span class="sd"> found during search.</span>
|
|
|
|
<span class="sd"> The method OnSolutionCallback() will be called by the solver, and must be</span>
|
|
<span class="sd"> implemented. The current solution can be queried using the BooleanValue()</span>
|
|
<span class="sd"> and Value() methods.</span>
|
|
|
|
<span class="sd"> It inherits the following methods from its base class:</span>
|
|
|
|
<span class="sd"> * `ObjectiveValue(self)`</span>
|
|
<span class="sd"> * `BestObjectiveBound(self)`</span>
|
|
<span class="sd"> * `NumBooleans(self)`</span>
|
|
<span class="sd"> * `NumConflicts(self)`</span>
|
|
<span class="sd"> * `NumBranches(self)`</span>
|
|
<span class="sd"> * `WallTime(self)`</span>
|
|
<span class="sd"> * `UserTime(self)`</span>
|
|
|
|
<span class="sd"> These methods returns the same information as their counterpart in the</span>
|
|
<span class="sd"> `CpSolver` class.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">OnSolutionCallback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Proxy for the same method in snake case."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">on_solution_callback</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">BooleanValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lit</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the boolean value of a boolean literal.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> lit: A boolean variable or its negation.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> The Boolean value of the literal in the solution.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> RuntimeError: if `lit` is not a boolean variable or its negation.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">HasResponse</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">lit</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="n">lit</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">SolutionBooleanValue</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">lit</span><span class="si">}</span><span class="s1"> as a boolean expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluates an linear expression in the current solution.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> expression: a linear expression of the model.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An integer value equal to the evaluation of the linear expression</span>
|
|
<span class="sd"> against the current solution.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> RuntimeError: if 'expression' is not a LinearExpr.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">HasResponse</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="n">expression</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">SolutionIntegerValue</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">SolutionIntegerValue</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s1"> as a linear expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">value</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Response</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the current solution response."""</span>
|
|
<span class="k">return</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span><span class="o">.</span><span class="n">FromString</span><span class="p">(</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="o">.</span><span class="n">SerializedResponse</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">ObjectiveSolutionPrinter</span><span class="p">(</span><span class="n">CpSolverSolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Display the objective value and time of intermediate solutions."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ObjectiveValue</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s, objective = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">VarArrayAndObjectiveSolutionPrinter</span><span class="p">(</span><span class="n">CpSolverSolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Print intermediate solutions (objective, variable values, time)."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__variables</span> <span class="o">=</span> <span class="n">variables</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ObjectiveValue</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s, objective = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__variables</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">VarArraySolutionPrinter</span><span class="p">(</span><span class="n">CpSolverSolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Print intermediate solutions (variable values, time)."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__variables</span> <span class="o">=</span> <span class="n">variables</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__variables</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
</section>
|
|
<section id="DisplayBounds">
|
|
<div class="attr function"><a class="headerlink" href="#DisplayBounds">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">DisplayBounds</span><span class="signature">(bounds)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">DisplayBounds</span><span class="p">(</span><span class="n">bounds</span><span class="p">):</span>
|
|
<span class="sd">"""Displays a flattened list of intervals."""</span>
|
|
<span class="n">out</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">bounds</span><span class="p">),</span> <span class="mi">2</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="s1">', '</span>
|
|
<span class="k">if</span> <span class="n">bounds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">bounds</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]:</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">out</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">+</span> <span class="s1">'..'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">bounds</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">out</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Displays a flattened list of intervals.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="ShortName">
|
|
<div class="attr function"><a class="headerlink" href="#ShortName">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ShortName</span><span class="signature">(model, i)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">ShortName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a short name of an integer variable, or its negation."""</span>
|
|
<span class="k">if</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'Not(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="n">ShortName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">-</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'[</span><span class="si">%s</span><span class="s1">]'</span> <span class="o">%</span> <span class="n">DisplayBounds</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns a short name of an integer variable, or its negation.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="ShortExprName">
|
|
<div class="attr function"><a class="headerlink" href="#ShortExprName">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ShortExprName</span><span class="signature">(model, e)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">ShortExprName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
|
|
<span class="sd">"""Pretty-print LinearExpressionProto instances."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">vars</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">offset</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">var_name</span> <span class="o">=</span> <span class="n">ShortName</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">coeff</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">coeffs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="n">coeff</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">var_name</span>
|
|
<span class="k">elif</span> <span class="n">coeff</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'-</span><span class="si">{</span><span class="n">var_name</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">elif</span> <span class="n">coeff</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">coeff</span><span class="si">}</span><span class="s1"> * </span><span class="si">{</span><span class="n">var_name</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">offset</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s1"> + </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">offset</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">elif</span> <span class="n">e</span><span class="o">.</span><span class="n">offset</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s1"> - </span><span class="si">{</span><span class="o">-</span><span class="n">e</span><span class="o">.</span><span class="n">offset</span><span class="si">}</span><span class="s1">'</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
<span class="c1"># TODO(user): Support more than affine expressions.</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Pretty-print LinearExpressionProto instances.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="LinearExpr">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#LinearExpr">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">LinearExpr</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">LinearExpr</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Holds an integer linear expression.</span>
|
|
|
|
<span class="sd"> A linear expression is built from integer constants and variables.</span>
|
|
<span class="sd"> For example, `x + 2 * (y - z + 1)`.</span>
|
|
|
|
<span class="sd"> Linear expressions are used in CP-SAT models in constraints and in the</span>
|
|
<span class="sd"> objective:</span>
|
|
|
|
<span class="sd"> * You can define linear constraints as in:</span>
|
|
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> model.Add(x + 2 * y <= 5)</span>
|
|
<span class="sd"> model.Add(sum(array_of_vars) == 5)</span>
|
|
<span class="sd"> ```</span>
|
|
|
|
<span class="sd"> * In CP-SAT, the objective is a linear expression:</span>
|
|
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> model.Minimize(x + 2 * y + z)</span>
|
|
<span class="sd"> ```</span>
|
|
|
|
<span class="sd"> * For large arrays, using the LinearExpr class is faster that using the python</span>
|
|
<span class="sd"> `sum()` function. You can create constraints and the objective from lists of</span>
|
|
<span class="sd"> linear expressions or coefficients as follows:</span>
|
|
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> model.Minimize(cp_model.LinearExpr.Sum(expressions))</span>
|
|
<span class="sd"> model.Add(cp_model.LinearExpr.WeightedSum(expressions, coefficients) >= 0)</span>
|
|
<span class="sd"> ```</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">Sum</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Creates the expression sum(expressions)."""</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">_SumArray</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">WeightedSum</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="sd">"""Creates the expression sum(expressions[i] * coefficients[i])."""</span>
|
|
<span class="k">if</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">IsEmptyOrAllNull</span><span class="p">(</span><span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">coefficients</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_WeightedSum</span><span class="p">(</span><span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">)</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">Term</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">coefficient</span><span class="p">):</span>
|
|
<span class="sd">"""Creates `expression * coefficient`."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">coefficient</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expression</span> <span class="o">*</span> <span class="n">coefficient</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">IsEmptyOrAllNull</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">coefficients</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">c</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">RebuildFromLinearExpressionProto</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">proto</span><span class="p">):</span>
|
|
<span class="sd">"""Recreate a LinearExpr from a LinearExpressionProto."""</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="n">proto</span><span class="o">.</span><span class="n">offset</span>
|
|
<span class="n">num_elements</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">num_elements</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">offset</span>
|
|
<span class="k">elif</span> <span class="n">num_elements</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span> <span class="o">*</span> <span class="n">proto</span><span class="o">.</span><span class="n">coeffs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">offset</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">variables</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">all_ones</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">(),</span> <span class="n">proto</span><span class="o">.</span><span class="n">coeffs</span><span class="p">()):</span>
|
|
<span class="n">variables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">IntVar</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
|
|
<span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">all_ones</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">all_ones</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_SumArray</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_WeightedSum</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntegerVarValueMap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Scans the expression, and returns (var_coef_map, constant)."""</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">constant</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span> <span class="c1"># Flatten to avoid recursion.</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">-=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Unrecognized linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
|
|
<span class="k">return</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">constant</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetFloatVarValueMap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Scans the expression. Returns (var_coef_map, constant, is_integer)."""</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="n">constant</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span> <span class="c1"># Flatten to avoid recursion.</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span> <span class="c1"># Keep integrality.</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">float</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">=</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">if</span> <span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">-=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">=</span> <span class="o">-</span><span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Unrecognized linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="n">is_integer</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">constant</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_integer</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">is_integer</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">break</span>
|
|
<span class="k">return</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">constant</span><span class="p">,</span> <span class="n">is_integer</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__abs__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling abs() on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddAbsEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">-</span><span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">_Sum</span><span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">_ProductCst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_a_number</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="n">_ProductCst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__div__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling / on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddDivisionEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling // on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddDivisionEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__mod__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling </span><span class="si">%%</span><span class="s1"> on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddModuloEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__pow__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling ** on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddMultiplicationEquality'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__lshift__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling left shift on a linear expression is not supported'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rshift__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling right shift on a linear expression is not supported'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__and__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling and on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddBoolAnd'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__or__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling or on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddBoolOr'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__xor__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'calling xor on a linear expression is not supported, '</span>
|
|
<span class="s1">'please use CpModel.AddBoolXor'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">_ProductCst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="s1">'Evaluating a LinearExpr instance as a Boolean is not implemented.'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span><span class="p">,</span> <span class="n">arg</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__ge__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__le__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">arg</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ArithmeticError</span><span class="p">(</span><span class="s1">'< INT_MIN is not supported'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">arg</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ArithmeticError</span><span class="p">(</span><span class="s1">'> INT_MAX is not supported'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">arg</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">INT_MAX</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">elif</span> <span class="n">arg</span> <span class="o">==</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="p">,</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">arg</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">arg</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">BoundedLinearExpression</span><span class="p">(</span><span class="bp">self</span> <span class="o">-</span> <span class="n">arg</span><span class="p">,</span>
|
|
<span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Holds an integer linear expression.</p>
|
|
|
|
<p>A linear expression is built from integer constants and variables.
|
|
For example, <code>x + 2 * (y - z + 1)</code>.</p>
|
|
|
|
<p>Linear expressions are used in CP-SAT models in constraints and in the
|
|
objective:</p>
|
|
|
|
<ul>
|
|
<li>You can define linear constraints as in:</li>
|
|
</ul>
|
|
|
|
<pre><code>model.Add(x + 2 * y <= 5)
|
|
model.Add(sum(array_of_vars) == 5)
|
|
</code></pre>
|
|
|
|
<ul>
|
|
<li>In CP-SAT, the objective is a linear expression:</li>
|
|
</ul>
|
|
|
|
<pre><code>model.Minimize(x + 2 * y + z)
|
|
</code></pre>
|
|
|
|
<ul>
|
|
<li>For large arrays, using the LinearExpr class is faster that using the python
|
|
<code>sum()</code> function. You can create constraints and the objective from lists of
|
|
linear expressions or coefficients as follows:</li>
|
|
</ul>
|
|
|
|
<pre><code>model.Minimize(cp_model.LinearExpr.Sum(expressions))
|
|
model.Add(cp_model.LinearExpr.WeightedSum(expressions, coefficients) >= 0)
|
|
</code></pre>
|
|
</div>
|
|
|
|
|
|
<div id="LinearExpr.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.__init__">#  </a>
|
|
|
|
|
|
<span class="name">LinearExpr</span><span class="signature">()</span>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.Sum" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.Sum">#  </a>
|
|
|
|
<div class="decorator">@classmethod</div>
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Sum</span><span class="signature">(cls, expressions)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">Sum</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Creates the expression sum(expressions)."""</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">_SumArray</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates the expression sum(expressions).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.WeightedSum" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.WeightedSum">#  </a>
|
|
|
|
<div class="decorator">@classmethod</div>
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">WeightedSum</span><span class="signature">(cls, expressions, coefficients)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">WeightedSum</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="sd">"""Creates the expression sum(expressions[i] * coefficients[i])."""</span>
|
|
<span class="k">if</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">IsEmptyOrAllNull</span><span class="p">(</span><span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">coefficients</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_WeightedSum</span><span class="p">(</span><span class="n">expressions</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates the expression sum(expressions[i] * coefficients[i]).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.Term" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.Term">#  </a>
|
|
|
|
<div class="decorator">@classmethod</div>
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Term</span><span class="signature">(cls, expression, coefficient)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">Term</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">coefficient</span><span class="p">):</span>
|
|
<span class="sd">"""Creates `expression * coefficient`."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">coefficient</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">expression</span> <span class="o">*</span> <span class="n">coefficient</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates <code>expression * coefficient</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.IsEmptyOrAllNull" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.IsEmptyOrAllNull">#  </a>
|
|
|
|
<div class="decorator">@classmethod</div>
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">IsEmptyOrAllNull</span><span class="signature">(cls, coefficients)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">IsEmptyOrAllNull</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">coefficients</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">coefficients</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_zero</span><span class="p">(</span><span class="n">c</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.RebuildFromLinearExpressionProto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.RebuildFromLinearExpressionProto">#  </a>
|
|
|
|
<div class="decorator">@classmethod</div>
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">RebuildFromLinearExpressionProto</span><span class="signature">(cls, model, proto)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="nd">@classmethod</span>
|
|
<span class="k">def</span> <span class="nf">RebuildFromLinearExpressionProto</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">proto</span><span class="p">):</span>
|
|
<span class="sd">"""Recreate a LinearExpr from a LinearExpressionProto."""</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="n">proto</span><span class="o">.</span><span class="n">offset</span>
|
|
<span class="n">num_elements</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">num_elements</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">offset</span>
|
|
<span class="k">elif</span> <span class="n">num_elements</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span> <span class="o">*</span> <span class="n">proto</span><span class="o">.</span><span class="n">coeffs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">offset</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">variables</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">all_ones</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">vars</span><span class="p">(),</span> <span class="n">proto</span><span class="o">.</span><span class="n">coeffs</span><span class="p">()):</span>
|
|
<span class="n">variables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">IntVar</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
|
|
<span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_one</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">all_ones</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">all_ones</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_SumArray</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_WeightedSum</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Recreate a LinearExpr from a LinearExpressionProto.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.GetIntegerVarValueMap" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.GetIntegerVarValueMap">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetIntegerVarValueMap</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetIntegerVarValueMap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Scans the expression, and returns (var_coef_map, constant)."""</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
|
|
<span class="n">constant</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span> <span class="c1"># Flatten to avoid recursion.</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">-=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Unrecognized linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
|
|
<span class="k">return</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">constant</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Scans the expression, and returns (var_coef_map, constant).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="LinearExpr.GetFloatVarValueMap" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#LinearExpr.GetFloatVarValueMap">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetFloatVarValueMap</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetFloatVarValueMap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Scans the expression. Returns (var_coef_map, constant, is_integer)."""</span>
|
|
<span class="n">coeffs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="n">constant</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span> <span class="c1"># Flatten to avoid recursion.</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span> <span class="c1"># Keep integrality.</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="nb">float</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="p">]</span> <span class="o">=</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">constant</span> <span class="o">+=</span> <span class="n">coeff</span>
|
|
<span class="k">if</span> <span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">-=</span> <span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">coeffs</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()]</span> <span class="o">=</span> <span class="o">-</span><span class="n">coeff</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Unrecognized linear expression: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="n">is_integer</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">constant</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_integer</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="n">coeffs</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">coeff</span><span class="p">):</span>
|
|
<span class="n">is_integer</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">break</span>
|
|
<span class="k">return</span> <span class="n">coeffs</span><span class="p">,</span> <span class="n">constant</span><span class="p">,</span> <span class="n">is_integer</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Scans the expression. Returns (var_coef_map, constant, is_integer).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</section>
|
|
<section id="IntVar">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#IntVar">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">IntVar</span><wbr>(<span class="base"><a href="#LinearExpr">LinearExpr</a></span>):
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">IntVar</span><span class="p">(</span><span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="sd">"""An integer variable.</span>
|
|
|
|
<span class="sd"> An IntVar is an object that can take on any integer value within defined</span>
|
|
<span class="sd"> ranges. Variables appear in constraint like:</span>
|
|
|
|
<span class="sd"> x + y >= 5</span>
|
|
<span class="sd"> AllDifferent([x, y, z])</span>
|
|
|
|
<span class="sd"> Solving a model is equivalent to finding, for each variable, a single value</span>
|
|
<span class="sd"> from the set of initial values (called the initial domain), such that the</span>
|
|
<span class="sd"> model is feasible, or optimal if you provided an objective function.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""See CpModel.NewIntVar below."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">model</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="c1"># Python do not support multiple __init__ methods.</span>
|
|
<span class="c1"># This method is only called from the CpModel class.</span>
|
|
<span class="c1"># We hack the parameter to support the two cases:</span>
|
|
<span class="c1"># case 1:</span>
|
|
<span class="c1"># model is a CpModelProto, domain is a Domain, and name is a string.</span>
|
|
<span class="c1"># case 2:</span>
|
|
<span class="c1"># model is a CpModelProto, domain is an index (int), and name is None.</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">domain</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">domain</span><span class="o">.</span><span class="n">FlattenedIntervals</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the variable in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the variable protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span>
|
|
|
|
<span class="k">def</span> <span class="nf">IsEqualTo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sd">"""Returns true if self == other in the python sense."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span>
|
|
<span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="c1"># Special case for constants.</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'unnamed_var_</span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">DisplayBounds</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Not</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the negation of a Boolean variable.</span>
|
|
|
|
<span class="sd"> This method implements the logical negation of a Boolean variable.</span>
|
|
<span class="sd"> It is only valid if the variable has a Boolean domain (0 or 1).</span>
|
|
|
|
<span class="sd"> Note that this method is nilpotent: `x.Not().Not() == x`.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">for</span> <span class="n">bound</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">bound</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">bound</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'Cannot call Not on a non boolean variable: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="o">=</span> <span class="n">_NotBooleanVariable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__negation</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>An integer variable.</p>
|
|
|
|
<p>An IntVar is an object that can take on any integer value within defined
|
|
ranges. Variables appear in constraint like:</p>
|
|
|
|
<pre><code>x + y >= 5
|
|
AllDifferent([x, y, z])
|
|
</code></pre>
|
|
|
|
<p>Solving a model is equivalent to finding, for each variable, a single value
|
|
from the set of initial values (called the initial domain), such that the
|
|
model is feasible, or optimal if you provided an objective function.</p>
|
|
</div>
|
|
|
|
|
|
<div id="IntVar.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntVar.__init__">#  </a>
|
|
|
|
|
|
<span class="name">IntVar</span><span class="signature">(model, domain, name)</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""See CpModel.NewIntVar below."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">model</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="c1"># Python do not support multiple __init__ methods.</span>
|
|
<span class="c1"># This method is only called from the CpModel class.</span>
|
|
<span class="c1"># We hack the parameter to support the two cases:</span>
|
|
<span class="c1"># case 1:</span>
|
|
<span class="c1"># model is a CpModelProto, domain is a Domain, and name is a string.</span>
|
|
<span class="c1"># case 2:</span>
|
|
<span class="c1"># model is a CpModelProto, domain is an index (int), and name is None.</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">domain</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">domain</span><span class="o">.</span><span class="n">FlattenedIntervals</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>See <a href="#CpModel.NewIntVar">CpModel.NewIntVar</a> below.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="IntVar.Index" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntVar.Index">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Index</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the variable in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the index of the variable in the model.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="IntVar.Proto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntVar.Proto">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Proto</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the variable protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the variable protobuf.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="IntVar.IsEqualTo" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntVar.IsEqualTo">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">IsEqualTo</span><span class="signature">(self, other)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">IsEqualTo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sd">"""Returns true if self == other in the python sense."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns true if self == other in the python sense.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="IntVar.Name" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntVar.Name">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Name</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">name</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="IntVar.Not" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntVar.Not">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Not</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Not</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the negation of a Boolean variable.</span>
|
|
|
|
<span class="sd"> This method implements the logical negation of a Boolean variable.</span>
|
|
<span class="sd"> It is only valid if the variable has a Boolean domain (0 or 1).</span>
|
|
|
|
<span class="sd"> Note that this method is nilpotent: `x.Not().Not() == x`.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">for</span> <span class="n">bound</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__var</span><span class="o">.</span><span class="n">domain</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">bound</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">bound</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'Cannot call Not on a non boolean variable: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__negation</span> <span class="o">=</span> <span class="n">_NotBooleanVariable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__negation</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the negation of a Boolean variable.</p>
|
|
|
|
<p>This method implements the logical negation of a Boolean variable.
|
|
It is only valid if the variable has a Boolean domain (0 or 1).</p>
|
|
|
|
<p>Note that this method is nilpotent: <code>x.Not().Not() == x</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div class="inherited">
|
|
<h5>Inherited Members</h5>
|
|
<dl>
|
|
<div><dt><a href="#LinearExpr">LinearExpr</a></dt>
|
|
<dd id="IntVar.Sum" class="function"><a href="#LinearExpr.Sum">Sum</a></dd>
|
|
<dd id="IntVar.WeightedSum" class="function"><a href="#LinearExpr.WeightedSum">WeightedSum</a></dd>
|
|
<dd id="IntVar.Term" class="function"><a href="#LinearExpr.Term">Term</a></dd>
|
|
<dd id="IntVar.IsEmptyOrAllNull" class="function"><a href="#LinearExpr.IsEmptyOrAllNull">IsEmptyOrAllNull</a></dd>
|
|
<dd id="IntVar.RebuildFromLinearExpressionProto" class="function"><a href="#LinearExpr.RebuildFromLinearExpressionProto">RebuildFromLinearExpressionProto</a></dd>
|
|
<dd id="IntVar.GetIntegerVarValueMap" class="function"><a href="#LinearExpr.GetIntegerVarValueMap">GetIntegerVarValueMap</a></dd>
|
|
<dd id="IntVar.GetFloatVarValueMap" class="function"><a href="#LinearExpr.GetFloatVarValueMap">GetFloatVarValueMap</a></dd>
|
|
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
</section>
|
|
<section id="BoundedLinearExpression">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#BoundedLinearExpression">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">BoundedLinearExpression</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">BoundedLinearExpression</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Represents a linear constraint: `lb <= linear expression <= ub`.</span>
|
|
|
|
<span class="sd"> The only use of this class is to be added to the CpModel through</span>
|
|
<span class="sd"> `CpModel.Add(expression)`, as in:</span>
|
|
|
|
<span class="sd"> model.Add(x + 2 * y -1 >= z)</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">bounds</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span> <span class="o">=</span> <span class="n">expr</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">=</span> <span class="n">bounds</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="n">lb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">ub</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">lb</span> <span class="o">></span> <span class="n">INT_MIN</span> <span class="ow">and</span> <span class="n">ub</span> <span class="o"><</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">lb</span> <span class="o">==</span> <span class="n">ub</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' == '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' <= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' <= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ub</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">lb</span> <span class="o">></span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' >= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">lb</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">ub</span> <span class="o"><</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' <= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ub</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'True (unbounded expr '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span>
|
|
<span class="k">elif</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">4</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">INT_MIN</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' != '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' in ['</span> <span class="o">+</span> <span class="n">DisplayBounds</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span><span class="p">)</span> <span class="o">+</span> <span class="s1">']'</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Expression</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expr</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Bounds</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="n">all_coeffs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">coeffs_map</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
|
|
<span class="n">same_var</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">eq_bounds</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">different_vars</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">ne_bounds</span> <span class="o">=</span> <span class="p">[</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">coeffs_map</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">all_coeffs</span> <span class="o">==</span> <span class="n">same_var</span> <span class="ow">and</span>
|
|
<span class="n">constant</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">eq_bounds</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">ne_bounds</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">eq_bounds</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">coeffs_map</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">all_coeffs</span> <span class="o">==</span> <span class="n">different_vars</span> <span class="ow">and</span>
|
|
<span class="n">constant</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">eq_bounds</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">ne_bounds</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">==</span> <span class="n">ne_bounds</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Evaluating a BoundedLinearExpression </span><span class="se">\'</span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="se">\'</span><span class="s1"> as a Boolean value'</span>
|
|
<span class="o">+</span> <span class="s1">' is not supported.'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Represents a linear constraint: <code>lb <= linear expression <= ub</code>.</p>
|
|
|
|
<p>The only use of this class is to be added to the CpModel through
|
|
<code><a href="#CpModel.Add">CpModel.Add</a>(expression)</code>, as in:</p>
|
|
|
|
<pre><code>model.Add(x + 2 * y -1 >= z)
|
|
</code></pre>
|
|
</div>
|
|
|
|
|
|
<div id="BoundedLinearExpression.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#BoundedLinearExpression.__init__">#  </a>
|
|
|
|
|
|
<span class="name">BoundedLinearExpression</span><span class="signature">(expr, bounds)</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">bounds</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__expr</span> <span class="o">=</span> <span class="n">expr</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span> <span class="o">=</span> <span class="n">bounds</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="BoundedLinearExpression.Expression" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#BoundedLinearExpression.Expression">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Expression</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Expression</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__expr</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="BoundedLinearExpression.Bounds" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#BoundedLinearExpression.Bounds">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Bounds</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Bounds</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bounds</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
</section>
|
|
<section id="Constraint">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#Constraint">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">Constraint</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Constraint</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Base class for constraints.</span>
|
|
|
|
<span class="sd"> Constraints are built by the CpModel through the Add<XXX> methods.</span>
|
|
<span class="sd"> Once created by the CpModel class, they are automatically added to the model.</span>
|
|
<span class="sd"> The purpose of this class is to allow specification of enforcement literals</span>
|
|
<span class="sd"> for this constraint.</span>
|
|
|
|
<span class="sd"> b = model.NewBoolVar('b')</span>
|
|
<span class="sd"> x = model.NewIntVar(0, 10, 'x')</span>
|
|
<span class="sd"> y = model.NewIntVar(0, 10, 'y')</span>
|
|
|
|
<span class="sd"> model.Add(x + 2 * y == 5).OnlyEnforceIf(b.Not())</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">constraints</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span> <span class="o">=</span> <span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">OnlyEnforceIf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="sd">"""Adds an enforcement literal to the constraint.</span>
|
|
|
|
<span class="sd"> This method adds one or more literals (that is, a boolean variable or its</span>
|
|
<span class="sd"> negation) as enforcement literals. The conjunction of all these literals</span>
|
|
<span class="sd"> determines whether the constraint is active or not. It acts as an</span>
|
|
<span class="sd"> implication, so if the conjunction is true, it implies that the constraint</span>
|
|
<span class="sd"> must be enforced. If it is false, then the constraint is ignored.</span>
|
|
|
|
<span class="sd"> BoolOr, BoolAnd, and linear constraints all support enforcement literals.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *boolvar: One or more Boolean literals.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> self.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">lit</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">bool</span><span class="p">(</span><span class="n">lit</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="c1"># Always true. Do nothing.</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the constraint in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the constraint protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Base class for constraints.</p>
|
|
|
|
<p>Constraints are built by the CpModel through the Add<XXX> methods.
|
|
Once created by the CpModel class, they are automatically added to the model.
|
|
The purpose of this class is to allow specification of enforcement literals
|
|
for this constraint.</p>
|
|
|
|
<pre><code>b = model.NewBoolVar('b')
|
|
x = model.NewIntVar(0, 10, 'x')
|
|
y = model.NewIntVar(0, 10, 'y')
|
|
|
|
model.Add(x + 2 * y == 5).OnlyEnforceIf(b.Not())
|
|
</code></pre>
|
|
</div>
|
|
|
|
|
|
<div id="Constraint.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#Constraint.__init__">#  </a>
|
|
|
|
|
|
<span class="name">Constraint</span><span class="signature">(constraints)</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">constraints</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span> <span class="o">=</span> <span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="Constraint.OnlyEnforceIf" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#Constraint.OnlyEnforceIf">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">OnlyEnforceIf</span><span class="signature">(self, *boolvar)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">OnlyEnforceIf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="sd">"""Adds an enforcement literal to the constraint.</span>
|
|
|
|
<span class="sd"> This method adds one or more literals (that is, a boolean variable or its</span>
|
|
<span class="sd"> negation) as enforcement literals. The conjunction of all these literals</span>
|
|
<span class="sd"> determines whether the constraint is active or not. It acts as an</span>
|
|
<span class="sd"> implication, so if the conjunction is true, it implies that the constraint</span>
|
|
<span class="sd"> must be enforced. If it is false, then the constraint is ignored.</span>
|
|
|
|
<span class="sd"> BoolOr, BoolAnd, and linear constraints all support enforcement literals.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *boolvar: One or more Boolean literals.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> self.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">lit</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">boolvar</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">bool</span><span class="p">(</span><span class="n">lit</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="c1"># Always true. Do nothing.</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds an enforcement literal to the constraint.</p>
|
|
|
|
<p>This method adds one or more literals (that is, a boolean variable or its
|
|
negation) as enforcement literals. The conjunction of all these literals
|
|
determines whether the constraint is active or not. It acts as an
|
|
implication, so if the conjunction is true, it implies that the constraint
|
|
must be enforced. If it is false, then the constraint is ignored.</p>
|
|
|
|
<p>BoolOr, BoolAnd, and linear constraints all support enforcement literals.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>*boolvar:</strong> One or more Boolean literals.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>self.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="Constraint.Index" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#Constraint.Index">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Index</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the constraint in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the index of the constraint in the model.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="Constraint.Proto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#Constraint.Proto">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Proto</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the constraint protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constraint</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the constraint protobuf.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</section>
|
|
<section id="IntervalVar">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#IntervalVar">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">IntervalVar</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">IntervalVar</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Represents an Interval variable.</span>
|
|
|
|
<span class="sd"> An interval variable is both a constraint and a variable. It is defined by</span>
|
|
<span class="sd"> three integer variables: start, size, and end.</span>
|
|
|
|
<span class="sd"> It is a constraint because, internally, it enforces that start + size == end.</span>
|
|
|
|
<span class="sd"> It is also a variable as it can appear in specific scheduling constraints:</span>
|
|
<span class="sd"> NoOverlap, NoOverlap2D, Cumulative.</span>
|
|
|
|
<span class="sd"> Optionally, an enforcement literal can be added to this constraint, in which</span>
|
|
<span class="sd"> case these scheduling constraints will ignore interval variables with</span>
|
|
<span class="sd"> enforcement literals assigned to false. Conversely, these constraints will</span>
|
|
<span class="sd"> also set these enforcement literals to false if they cannot fit these</span>
|
|
<span class="sd"> intervals into the schedule.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">model</span>
|
|
<span class="c1"># As with the IntVar::__init__ method, we hack the __init__ method to</span>
|
|
<span class="c1"># support two use cases:</span>
|
|
<span class="c1"># case 1: called when creating a new interval variable.</span>
|
|
<span class="c1"># {start|size|end} are linear expressions, is_present_index is either</span>
|
|
<span class="c1"># None or the index of a Boolean literal. name is a string</span>
|
|
<span class="c1"># case 2: called when querying an existing interval variable.</span>
|
|
<span class="c1"># start_index is an int, all parameters after are None.</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">size</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">end</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">is_present_index</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">start</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">start</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_present_index</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">is_present_index</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the interval constraint in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the interval protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">interval</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(start = </span><span class="si">%s</span><span class="s1">, size = </span><span class="si">%s</span><span class="s1">, end = </span><span class="si">%s</span><span class="s1">, is_present = </span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">),</span>
|
|
<span class="n">ShortName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">(start = </span><span class="si">%s</span><span class="s1">, size = </span><span class="si">%s</span><span class="s1">, end = </span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">),</span>
|
|
<span class="n">ShortExprName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span>
|
|
|
|
<span class="k">def</span> <span class="nf">StartExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SizeExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">EndExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Represents an Interval variable.</p>
|
|
|
|
<p>An interval variable is both a constraint and a variable. It is defined by
|
|
three integer variables: start, size, and end.</p>
|
|
|
|
<p>It is a constraint because, internally, it enforces that start + size == end.</p>
|
|
|
|
<p>It is also a variable as it can appear in specific scheduling constraints:
|
|
NoOverlap, NoOverlap2D, Cumulative.</p>
|
|
|
|
<p>Optionally, an enforcement literal can be added to this constraint, in which
|
|
case these scheduling constraints will ignore interval variables with
|
|
enforcement literals assigned to false. Conversely, these constraints will
|
|
also set these enforcement literals to false if they cannot fit these
|
|
intervals into the schedule.</p>
|
|
</div>
|
|
|
|
|
|
<div id="IntervalVar.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.__init__">#  </a>
|
|
|
|
|
|
<span class="name">IntervalVar</span><span class="signature">(model, start, size, end, is_present_index, name)</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">model</span>
|
|
<span class="c1"># As with the IntVar::__init__ method, we hack the __init__ method to</span>
|
|
<span class="c1"># support two use cases:</span>
|
|
<span class="c1"># case 1: called when creating a new interval variable.</span>
|
|
<span class="c1"># {start|size|end} are linear expressions, is_present_index is either</span>
|
|
<span class="c1"># None or the index of a Boolean literal. name is a string</span>
|
|
<span class="c1"># case 2: called when querying an existing interval variable.</span>
|
|
<span class="c1"># start_index is an int, all parameters after are None.</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">size</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">end</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">is_present_index</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">start</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">start</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_present_index</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">is_present_index</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">name</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="IntervalVar.Index" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.Index">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Index</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of the interval constraint in the model."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__index</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the index of the interval constraint in the model.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="IntervalVar.Proto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.Proto">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Proto</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the interval protobuf."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the interval protobuf.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="IntervalVar.Name" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.Name">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Name</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">name</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="IntervalVar.StartExpr" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.StartExpr">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">StartExpr</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">StartExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">start</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="IntervalVar.SizeExpr" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.SizeExpr">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">SizeExpr</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">SizeExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="IntervalVar.EndExpr" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#IntervalVar.EndExpr">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">EndExpr</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">EndExpr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">LinearExpr</span><span class="o">.</span><span class="n">RebuildFromLinearExpressionProto</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__ct</span><span class="o">.</span><span class="n">interval</span><span class="o">.</span><span class="n">end</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
</section>
|
|
<section id="ObjectIsATrueLiteral">
|
|
<div class="attr function"><a class="headerlink" href="#ObjectIsATrueLiteral">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ObjectIsATrueLiteral</span><span class="signature">(literal)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">ObjectIsATrueLiteral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Checks if literal is either True, or a Boolean literals fixed to True."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">literal</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Checks if literal is either True, or a Boolean literals fixed to True.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="ObjectIsAFalseLiteral">
|
|
<div class="attr function"><a class="headerlink" href="#ObjectIsAFalseLiteral">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ObjectIsAFalseLiteral</span><span class="signature">(literal)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">ObjectIsAFalseLiteral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Checks if literal is either False, or a Boolean literals fixed to False."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">proto</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span>
|
|
<span class="n">proto</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">literal</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Checks if literal is either False, or a Boolean literals fixed to False.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="CpModel">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#CpModel">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">CpModel</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">CpModel</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Methods for building a CP model.</span>
|
|
|
|
<span class="sd"> Methods beginning with:</span>
|
|
|
|
<span class="sd"> * ```New``` create integer, boolean, or interval variables.</span>
|
|
<span class="sd"> * ```Add``` create new constraints and add them to the model.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpModelProto</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="c1"># Integer variable.</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewIntVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Create an integer variable with domain [lb, ub].</span>
|
|
|
|
<span class="sd"> The CP-SAT solver is limited to integer variables. If you have fractional</span>
|
|
<span class="sd"> values, scale them up so that they become integers; if you have strings,</span>
|
|
<span class="sd"> encode them as integers.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> lb: Lower bound for the variable.</span>
|
|
<span class="sd"> ub: Upper bound for the variable.</span>
|
|
<span class="sd"> name: The name of the variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> a variable whose domain is [lb, ub].</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewIntVarFromDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Create an integer variable from a domain.</span>
|
|
|
|
<span class="sd"> A domain is a set of integers specified by a collection of intervals.</span>
|
|
<span class="sd"> For example, `model.NewIntVarFromDomain(cp_model.</span>
|
|
<span class="sd"> Domain.FromIntervals([[1, 2], [4, 6]]), 'x')`</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> domain: An instance of the Domain class.</span>
|
|
<span class="sd"> name: The name of the variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> a variable whose domain is the given domain.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewBoolVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates a 0-1 variable with the given name."""</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""Declares a constant integer."""</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
|
|
<span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Linear constraints.</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddLinearConstraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the constraint: `lb <= linear_expr <= ub`."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddLinearExpressionInDomain</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddLinearExpressionInDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">domain</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the constraint: `linear_expr` in `domain`."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="n">linear_expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Wrong argument'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="n">cmh</span><span class="o">.</span><span class="n">capped_subtraction</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">constant</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">domain</span><span class="o">.</span><span class="n">FlattenedIntervals</span><span class="p">()</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">domain</span><span class="o">.</span><span class="n">Contains</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([])</span> <span class="c1"># Evaluate to false.</span>
|
|
<span class="c1"># Nothing to do otherwise.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'Not supported: CpModel.AddLinearExpressionInDomain('</span> <span class="o">+</span>
|
|
<span class="nb">str</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ct</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a `BoundedLinearExpression` to the model.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> ct: A [`BoundedLinearExpression`](#boundedlinearexpression).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="n">BoundedLinearExpression</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddLinearExpressionInDomain</span><span class="p">(</span>
|
|
<span class="n">ct</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">Domain</span><span class="o">.</span><span class="n">FromFlatIntervals</span><span class="p">(</span><span class="n">ct</span><span class="o">.</span><span class="n">Bounds</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="n">ct</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([</span><span class="kc">True</span><span class="p">])</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">ct</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([])</span> <span class="c1"># Evaluate to false.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Not supported: CpModel.Add('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ct</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="c1"># General Integer Constraints.</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAllDifferent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AllDifferent(expressions).</span>
|
|
|
|
<span class="sd"> This constraint forces all expressions to have different values.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *expressions: simple expressions of the form a * var + constant.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">expanded</span> <span class="o">=</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">all_diff</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">expanded</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddElement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the element constraint: `variables[index] == target`."""</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddElement expects a non-empty variables array'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">variables</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="n">index</span><span class="p">)]</span> <span class="o">==</span> <span class="n">target</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddCircuit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arcs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Circuit(arcs).</span>
|
|
|
|
<span class="sd"> Adds a circuit constraint from a sparse list of arcs that encode the graph.</span>
|
|
|
|
<span class="sd"> A circuit is a unique Hamiltonian path in a subgraph of the total</span>
|
|
<span class="sd"> graph. In case a node 'i' is not in the path, then there must be a</span>
|
|
<span class="sd"> loop arc 'i -> i' associated with a true literal. Otherwise</span>
|
|
<span class="sd"> this constraint will fail.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> arcs: a list of arcs. An arc is a tuple (source_node, destination_node,</span>
|
|
<span class="sd"> literal). The arc is selected in the circuit if the literal is true.</span>
|
|
<span class="sd"> Both source_node and destination_node must be integers between 0 and the</span>
|
|
<span class="sd"> number of nodes - 1.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: If the list of arcs is empty.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddCircuit expects a non-empty array of arcs'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">for</span> <span class="n">arc</span> <span class="ow">in</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">lit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">tails</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMultipleCircuit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arcs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a multiple circuit constraint, aka the "VRP" constraint.</span>
|
|
|
|
<span class="sd"> The direct graph where arc #i (from tails[i] to head[i]) is present iff</span>
|
|
<span class="sd"> literals[i] is true must satisfy this set of properties:</span>
|
|
<span class="sd"> - #incoming arcs == 1 except for node 0.</span>
|
|
<span class="sd"> - #outgoing arcs == 1 except for node 0.</span>
|
|
<span class="sd"> - for node zero, #incoming arcs == #outgoing arcs.</span>
|
|
<span class="sd"> - There are no duplicate arcs.</span>
|
|
<span class="sd"> - Self-arcs are allowed except for node 0.</span>
|
|
<span class="sd"> - There is no cycle in this graph, except through node 0.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> arcs: a list of arcs. An arc is a tuple (source_node, destination_node,</span>
|
|
<span class="sd"> literal). The arc is selected in the circuit if the literal is true.</span>
|
|
<span class="sd"> Both source_node and destination_node must be integers between 0 and the</span>
|
|
<span class="sd"> number of nodes - 1.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: If the list of arcs is empty.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddMultipleCircuit expects a non-empty array of arcs'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">for</span> <span class="n">arc</span> <span class="ow">in</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">lit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">tails</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAllowedAssignments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AllowedAssignments(variables, tuples_list).</span>
|
|
|
|
<span class="sd"> An AllowedAssignments constraint is a constraint on an array of variables,</span>
|
|
<span class="sd"> which requires that when all variables are assigned values, the resulting</span>
|
|
<span class="sd"> array equals one of the tuples in `tuple_list`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: A list of variables.</span>
|
|
<span class="sd"> tuples_list: A list of admissible tuples. Each tuple must have the same</span>
|
|
<span class="sd"> length as the variables, and the ith value of a tuple corresponds to the</span>
|
|
<span class="sd"> ith variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: If a tuple does not have the same size as the list of</span>
|
|
<span class="sd"> variables.</span>
|
|
<span class="sd"> ValueError: If the array of variables is empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddAllowedAssignments expects a non-empty variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">arity</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tuples_list</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">!=</span> <span class="n">arity</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Tuple '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' has the wrong arity'</span><span class="p">)</span>
|
|
<span class="n">ar</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">t</span><span class="p">:</span>
|
|
<span class="n">ar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">v</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">ar</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddForbiddenAssignments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AddForbiddenAssignments(variables, [tuples_list]).</span>
|
|
|
|
<span class="sd"> A ForbiddenAssignments constraint is a constraint on an array of variables</span>
|
|
<span class="sd"> where the list of impossible combinations is provided in the tuples list.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: A list of variables.</span>
|
|
<span class="sd"> tuples_list: A list of forbidden tuples. Each tuple must have the same</span>
|
|
<span class="sd"> length as the variables, and the *i*th value of a tuple corresponds to</span>
|
|
<span class="sd"> the *i*th variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: If a tuple does not have the same size as the list of</span>
|
|
<span class="sd"> variables.</span>
|
|
<span class="sd"> ValueError: If the array of variables is empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddForbiddenAssignments expects a non-empty variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
|
|
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddAllowedAssignments</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">negated</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAutomaton</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transition_variables</span><span class="p">,</span> <span class="n">starting_state</span><span class="p">,</span> <span class="n">final_states</span><span class="p">,</span>
|
|
<span class="n">transition_triples</span><span class="p">):</span>
|
|
<span class="sd">"""Adds an automaton constraint.</span>
|
|
|
|
<span class="sd"> An automaton constraint takes a list of variables (of size *n*), an initial</span>
|
|
<span class="sd"> state, a set of final states, and a set of transitions. A transition is a</span>
|
|
<span class="sd"> triplet (*tail*, *transition*, *head*), where *tail* and *head* are states,</span>
|
|
<span class="sd"> and *transition* is the label of an arc from *head* to *tail*,</span>
|
|
<span class="sd"> corresponding to the value of one variable in the list of variables.</span>
|
|
|
|
<span class="sd"> This automaton will be unrolled into a flow with *n* + 1 phases. Each phase</span>
|
|
<span class="sd"> contains the possible states of the automaton. The first state contains the</span>
|
|
<span class="sd"> initial state. The last phase contains the final states.</span>
|
|
|
|
<span class="sd"> Between two consecutive phases *i* and *i* + 1, the automaton creates a set</span>
|
|
<span class="sd"> of arcs. For each transition (*tail*, *transition*, *head*), it will add</span>
|
|
<span class="sd"> an arc from the state *tail* of phase *i* and the state *head* of phase</span>
|
|
<span class="sd"> *i* + 1. This arc is labeled by the value *transition* of the variables</span>
|
|
<span class="sd"> `variables[i]`. That is, this arc can only be selected if `variables[i]`</span>
|
|
<span class="sd"> is assigned the value *transition*.</span>
|
|
|
|
<span class="sd"> A feasible solution of this constraint is an assignment of variables such</span>
|
|
<span class="sd"> that, starting from the initial state in phase 0, there is a path labeled by</span>
|
|
<span class="sd"> the values of the variables that ends in one of the final states in the</span>
|
|
<span class="sd"> final phase.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> transition_variables: A non-empty list of variables whose values</span>
|
|
<span class="sd"> correspond to the labels of the arcs traversed by the automaton.</span>
|
|
<span class="sd"> starting_state: The initial state of the automaton.</span>
|
|
<span class="sd"> final_states: A non-empty list of admissible final states.</span>
|
|
<span class="sd"> transition_triples: A list of transitions for the automaton, in the</span>
|
|
<span class="sd"> following format (current_state, variable_value, next_state).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if `transition_variables`, `final_states`, or</span>
|
|
<span class="sd"> `transition_triples` are empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">transition_variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddAutomaton expects a non-empty transition_variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">final_states</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddAutomaton expects some final states'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">transition_triples</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddAutomaton expects some transition triples'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">transition_variables</span><span class="p">])</span>
|
|
<span class="n">starting_state</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">starting_state</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">starting_state</span> <span class="o">=</span> <span class="n">starting_state</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">final_states</span><span class="p">:</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">final_states</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transition_triples</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Tuple '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' has the wrong arity (!= 3)'</span><span class="p">)</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">label</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_tail</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_label</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">label</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_head</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddInverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">inverse_variables</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Inverse(variables, inverse_variables).</span>
|
|
|
|
<span class="sd"> An inverse constraint enforces that if `variables[i]` is assigned a value</span>
|
|
<span class="sd"> `j`, then `inverse_variables[j]` is assigned a value `i`. And vice versa.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: An array of integer variables.</span>
|
|
<span class="sd"> inverse_variables: An array of integer variables.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: if variables and inverse_variables have different lengths, or</span>
|
|
<span class="sd"> if they are empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">inverse_variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'The Inverse constraint does not accept empty arrays'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">inverse_variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'In the inverse constraint, the two array variables and'</span>
|
|
<span class="s1">' inverse_variables must have the same length.'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">inverse</span><span class="o">.</span><span class="n">f_direct</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">inverse</span><span class="o">.</span><span class="n">f_inverse</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">inverse_variables</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddReservoirConstraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">level_changes</span><span class="p">,</span> <span class="n">min_level</span><span class="p">,</span>
|
|
<span class="n">max_level</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Reservoir(times, level_changes, min_level, max_level).</span>
|
|
|
|
<span class="sd"> Maintains a reservoir level within bounds. The water level starts at 0, and</span>
|
|
<span class="sd"> at any time, it must be between min_level and max_level.</span>
|
|
|
|
<span class="sd"> If the affine expression `times[i]` is assigned a value t, then the current</span>
|
|
<span class="sd"> level changes by `level_changes[i]`, which is constant, at time t.</span>
|
|
|
|
<span class="sd"> Note that min level must be <= 0, and the max level must be >= 0. Please</span>
|
|
<span class="sd"> use fixed level_changes to simulate initial state.</span>
|
|
|
|
<span class="sd"> Therefore, at any time:</span>
|
|
<span class="sd"> sum(level_changes[i] if times[i] <= t) in [min_level, max_level]</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> times: A list of affine expressions which specify the time of the filling</span>
|
|
<span class="sd"> or emptying the reservoir.</span>
|
|
<span class="sd"> level_changes: A list of integer values that specifies the amount of the</span>
|
|
<span class="sd"> emptying or filling.</span>
|
|
<span class="sd"> min_level: At any time, the level of the reservoir must be greater or</span>
|
|
<span class="sd"> equal than the min level.</span>
|
|
<span class="sd"> max_level: At any time, the level of the reservoir must be less or equal</span>
|
|
<span class="sd"> than the max level.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if max_level < min_level.</span>
|
|
|
|
<span class="sd"> ValueError: if max_level < 0.</span>
|
|
|
|
<span class="sd"> ValueError: if min_level > 0</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="n">min_level</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Reservoir constraint must have a max_level >= min_level'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a max_level >= 0'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">min_level</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a min_level <= 0'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">time_exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">times</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">level_changes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">level_changes</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">min_level</span> <span class="o">=</span> <span class="n">min_level</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">max_level</span> <span class="o">=</span> <span class="n">max_level</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddReservoirConstraintWithActive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">level_changes</span><span class="p">,</span> <span class="n">actives</span><span class="p">,</span>
|
|
<span class="n">min_level</span><span class="p">,</span> <span class="n">max_level</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Reservoir(times, level_changes, actives, min_level, max_level).</span>
|
|
|
|
<span class="sd"> Maintains a reservoir level within bounds. The water level starts at 0, and</span>
|
|
<span class="sd"> at any time, it must be between min_level and max_level.</span>
|
|
|
|
<span class="sd"> If the variable `times[i]` is assigned a value t, and `actives[i]` is</span>
|
|
<span class="sd"> `True`, then the current level changes by `level_changes[i]`, which is</span>
|
|
<span class="sd"> constant,</span>
|
|
<span class="sd"> at time t.</span>
|
|
|
|
<span class="sd"> Note that min level must be <= 0, and the max level must be >= 0. Please</span>
|
|
<span class="sd"> use fixed level_changes to simulate initial state.</span>
|
|
|
|
<span class="sd"> Therefore, at any time:</span>
|
|
<span class="sd"> sum(level_changes[i] * actives[i] if times[i] <= t) in [min_level,</span>
|
|
<span class="sd"> max_level]</span>
|
|
|
|
|
|
<span class="sd"> The array of boolean variables 'actives', if defined, indicates which</span>
|
|
<span class="sd"> actions are actually performed.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> times: A list of affine expressions which specify the time of the filling</span>
|
|
<span class="sd"> or emptying the reservoir.</span>
|
|
<span class="sd"> level_changes: A list of integer values that specifies the amount of the</span>
|
|
<span class="sd"> emptying or filling.</span>
|
|
<span class="sd"> actives: a list of boolean variables. They indicates if the</span>
|
|
<span class="sd"> emptying/refilling events actually take place.</span>
|
|
<span class="sd"> min_level: At any time, the level of the reservoir must be greater or</span>
|
|
<span class="sd"> equal than the min level.</span>
|
|
<span class="sd"> max_level: At any time, the level of the reservoir must be less or equal</span>
|
|
<span class="sd"> than the max level.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if max_level < min_level.</span>
|
|
|
|
<span class="sd"> ValueError: if max_level < 0.</span>
|
|
|
|
<span class="sd"> ValueError: if min_level > 0</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="n">min_level</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Reservoir constraint must have a max_level >= min_level'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a max_level >= 0'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">min_level</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a min_level <= 0'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">time_exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">times</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">level_changes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">level_changes</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">active_literals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">actives</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">min_level</span> <span class="o">=</span> <span class="n">min_level</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">max_level</span> <span class="o">=</span> <span class="n">max_level</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMapDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">bool_var_array</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `var == i + offset <=> bool_var_array[i] == true for all i`."""</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">bool_var</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">bool_var_array</span><span class="p">):</span>
|
|
<span class="n">b_index</span> <span class="o">=</span> <span class="n">bool_var</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="n">var_index</span> <span class="o">=</span> <span class="n">var</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var_index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">offset</span> <span class="o">+</span> <span class="n">i</span><span class="p">,</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">b_index</span><span class="p">)</span>
|
|
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var_index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="o">-</span><span class="n">b_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">>=</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddImplication</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `a => b` (`a` implies `b`)."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_or</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddBoolOr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `Or(literals) == true`: Sum(literals) >= 1."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_or</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAtLeastOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Same as `AddBoolOr`: `Sum(literals) >= 1`."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">(</span><span class="o">*</span><span class="n">literals</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAtMostOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `AtMostOne(literals)`: `Sum(literals) <= 1`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">at_most_one</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddExactlyOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `ExactlyOne(literals)`: `Sum(literals) == 1`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">exactly_one</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddBoolAnd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `And(literals) == true`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_and</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddBoolXOr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `XOr(literals) == true`.</span>
|
|
|
|
<span class="sd"> In contrast to AddBoolOr and AddBoolAnd, it does not support</span>
|
|
<span class="sd"> .OnlyEnforceIf().</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *literals: the list of literals in the constraint.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `Constraint` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_xor</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMinEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Min(exprs)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="kc">True</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMaxEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Max(exprs)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddDivisionEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="n">denom</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == num // denom` (integer division rounded towards 0)."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">num</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">denom</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAbsEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Abs(var)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddModuloEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target = var % mod`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">mod</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddMultiplicationEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == expressions[0] * .. * expressions[n]`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_prod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_prod</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="c1"># Scheduling support</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, size, and end.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Internally, it ensures that `start + size == end`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> end: The end of the interval. It can be an affine or constant expression.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span> <span class="o">==</span> <span class="n">end</span><span class="p">)</span>
|
|
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">size_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: size must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">end_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: end must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewFixedSizeIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, and a fixed size.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It must be an integer value.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewOptionalIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">is_present</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an optional interval var from start, size, end, and is_present.</span>
|
|
|
|
<span class="sd"> An optional interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap. This constraint is protected by an is_present</span>
|
|
<span class="sd"> literal that indicates if it is active or not.</span>
|
|
|
|
<span class="sd"> Internally, it ensures that `is_present` implies `start + size == end`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an integer value, or an</span>
|
|
<span class="sd"> integer variable.</span>
|
|
<span class="sd"> size: The size of the interval. It can be an integer value, or an integer</span>
|
|
<span class="sd"> variable.</span>
|
|
<span class="sd"> end: The end of the interval. It can be an integer value, or an integer</span>
|
|
<span class="sd"> variable.</span>
|
|
<span class="sd"> is_present: A literal that indicates if the interval is active or not. A</span>
|
|
<span class="sd"> inactive interval is simply ignored by all constraints.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># Add the linear constraint.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span> <span class="o">==</span> <span class="n">end</span><span class="p">)</span><span class="o">.</span><span class="n">OnlyEnforceIf</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Creates the IntervalConstraintProto object.</span>
|
|
<span class="n">is_present_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">size_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: size must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">end_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: end must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span>
|
|
<span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NewOptionalFixedSizeIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">is_present</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, and a fixed size.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It must be an integer value.</span>
|
|
<span class="sd"> is_present: A literal that indicates if the interval is active or not. A</span>
|
|
<span class="sd"> inactive interval is simply ignored by all constraints.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="n">is_present_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span>
|
|
<span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddNoOverlap</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interval_vars</span><span class="p">):</span>
|
|
<span class="sd">"""Adds NoOverlap(interval_vars).</span>
|
|
|
|
<span class="sd"> A NoOverlap constraint ensures that all present intervals do not overlap</span>
|
|
<span class="sd"> in time.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> interval_vars: The list of interval variables to constrain.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap</span><span class="o">.</span><span class="n">intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">interval_vars</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddNoOverlap2D</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x_intervals</span><span class="p">,</span> <span class="n">y_intervals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds NoOverlap2D(x_intervals, y_intervals).</span>
|
|
|
|
<span class="sd"> A NoOverlap2D constraint ensures that all present rectangles do not overlap</span>
|
|
<span class="sd"> on a plane. Each rectangle is aligned with the X and Y axis, and is defined</span>
|
|
<span class="sd"> by two intervals which represent its projection onto the X and Y axis.</span>
|
|
|
|
<span class="sd"> Furthermore, one box is optional if at least one of the x or y interval is</span>
|
|
<span class="sd"> optional.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> x_intervals: The X coordinates of the rectangles.</span>
|
|
<span class="sd"> y_intervals: The Y coordinates of the rectangles.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap_2d</span><span class="o">.</span><span class="n">x_intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">x_intervals</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap_2d</span><span class="o">.</span><span class="n">y_intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">y_intervals</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddCumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intervals</span><span class="p">,</span> <span class="n">demands</span><span class="p">,</span> <span class="n">capacity</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Cumulative(intervals, demands, capacity).</span>
|
|
|
|
<span class="sd"> This constraint enforces that:</span>
|
|
|
|
<span class="sd"> for all t:</span>
|
|
<span class="sd"> sum(demands[i]</span>
|
|
<span class="sd"> if (start(intervals[i]) <= t < end(intervals[i])) and</span>
|
|
<span class="sd"> (intervals[i] is present)) <= capacity</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> intervals: The list of intervals.</span>
|
|
<span class="sd"> demands: The list of demands for each interval. Each demand must be >= 0.</span>
|
|
<span class="sd"> Each demand can be an integer value, or an integer variable.</span>
|
|
<span class="sd"> capacity: The maximum capacity of the cumulative constraint. It must be a</span>
|
|
<span class="sd"> positive integer value or variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">])</span>
|
|
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">demands</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">demands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">capacity</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">capacity</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
|
|
<span class="c1"># Support for deep copy.</span>
|
|
<span class="k">def</span> <span class="nf">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_model</span><span class="p">):</span>
|
|
<span class="sd">"""Reset the model, and creates a new one from a CpModelProto instance."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">other_model</span><span class="o">.</span><span class="n">Proto</span><span class="p">())</span>
|
|
|
|
<span class="c1"># Rebuild constant map.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">i</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetBoolVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created Boolean variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetBoolVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetBoolVarFromProtoIndex: index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1"> does not reference'</span> <span class="o">+</span>
|
|
<span class="s1">' a Boolean variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created integer variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntervalVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created interval variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntervalVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">ct</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s1">'interval'</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntervalVarFromProtoIndex: index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1"> does not reference an'</span>
|
|
<span class="o">+</span> <span class="s1">' interval variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Helpers.</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the underlying CpModelProto."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Negated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetOrMakeIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of a variable, its negation, or a number."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="n">arg</span><span class="o">.</span><span class="n">Expression</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetOrMakeIndex('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an index from a boolean expression."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AssertIsBooleanVariable</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AssertIsBooleanVariable</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">Not</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_boolean</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetOrMakeBooleanIndex('</span> <span class="o">+</span>
|
|
<span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetIntervalIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntervalVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetIntervalIndex(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">value</span><span class="p">]</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">value</span><span class="p">,</span> <span class="n">value</span><span class="p">])</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">index</span>
|
|
<span class="k">return</span> <span class="n">index</span>
|
|
|
|
<span class="k">def</span> <span class="nf">VarIndexToVarProto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_index</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">var_index</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">var_index</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="o">-</span><span class="n">var_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ParseLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a LinearExpressionProto built from a LinearExpr instance."""</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">LinearExpressionProto</span><span class="p">()</span>
|
|
<span class="n">mult</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">negate</span> <span class="k">else</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">mult</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">))</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mult</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="n">linear_expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span> <span class="o">*</span> <span class="n">mult</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Wrong argument'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span> <span class="o">*</span> <span class="n">mult</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_SetObjective</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'objective'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'floating_point_objective'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">if</span> <span class="n">minimize</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Negated</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span><span class="p">,</span> <span class="n">is_integer</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">GetFloatVarValueMap</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">is_integer</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">minimize</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="o">-</span><span class="n">constant</span>
|
|
<span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">minimize</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Negated</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">maximize</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">minimize</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span>
|
|
<span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">floating_point_objective</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">objective</span><span class="o">.</span><span class="n">scaling_factor</span> <span class="o">=</span> <span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a valid objective'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Minimize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model to minimize(obj)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetObjective</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Maximize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model to maximize(obj)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetObjective</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">HasObjective</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s1">'objective'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddDecisionStrategy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">var_strategy</span><span class="p">,</span> <span class="n">domain_strategy</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a search strategy to the model.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: a list of variables this strategy will assign.</span>
|
|
<span class="sd"> var_strategy: heuristic to choose the next variable to assign.</span>
|
|
<span class="sd"> domain_strategy: heuristic to reduce the domain of the selected variable.</span>
|
|
<span class="sd"> Currently, this is advanced code: the union of all strategies added to</span>
|
|
<span class="sd"> the model must be complete, i.e. instantiates all variables.</span>
|
|
<span class="sd"> Otherwise, Solve() will fail.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">strategy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">search_strategy</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">variable_selection_strategy</span> <span class="o">=</span> <span class="n">var_strategy</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">domain_reduction_strategy</span> <span class="o">=</span> <span class="n">domain_strategy</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ModelStats</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a string containing some model statistics."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedModelStats</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a string indicating that the model is invalid."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedValidateModel</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ExportToFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
|
|
<span class="sd">"""Write the model as a protocol buffer to 'file'.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> file: file to write the model to. If the filename ends with 'txt', the</span>
|
|
<span class="sd"> model will be written as a text file, otherwise, the binary format will</span>
|
|
<span class="sd"> be used.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> True if the model was correctly written.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedWriteModelToFile</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">file</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AssertIsBooleanVariable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a boolean variable'</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a boolean variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddHint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""Adds 'var == value' as a hint to the solver."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">solution_hint</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">solution_hint</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ClearHints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Remove any solution hint from the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'solution_hint'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAssumption</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lit</span><span class="p">):</span>
|
|
<span class="sd">"""Add the literal 'lit' to the model as assumptions."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">assumptions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">lit</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">AddAssumptions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Add the literals to the model as assumptions."""</span>
|
|
<span class="k">for</span> <span class="n">lit</span> <span class="ow">in</span> <span class="n">literals</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AddAssumption</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ClearAssumptions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Remove all assumptions from the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'assumptions'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Methods for building a CP model.</p>
|
|
|
|
<p>Methods beginning with:</p>
|
|
|
|
<ul>
|
|
<li><code>New</code> create integer, boolean, or interval variables.</li>
|
|
<li><code><a href="#CpModel.Add">Add</a></code> create new constraints and add them to the model.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
<div id="CpModel.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.__init__">#  </a>
|
|
|
|
|
|
<span class="name">CpModel</span><span class="signature">()</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpModelProto</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span> <span class="o">=</span> <span class="p">{}</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewIntVar" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewIntVar">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewIntVar</span><span class="signature">(self, lb, ub, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewIntVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Create an integer variable with domain [lb, ub].</span>
|
|
|
|
<span class="sd"> The CP-SAT solver is limited to integer variables. If you have fractional</span>
|
|
<span class="sd"> values, scale them up so that they become integers; if you have strings,</span>
|
|
<span class="sd"> encode them as integers.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> lb: Lower bound for the variable.</span>
|
|
<span class="sd"> ub: Upper bound for the variable.</span>
|
|
<span class="sd"> name: The name of the variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> a variable whose domain is [lb, ub].</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Create an integer variable with domain [lb, ub].</p>
|
|
|
|
<p>The CP-SAT solver is limited to integer variables. If you have fractional
|
|
values, scale them up so that they become integers; if you have strings,
|
|
encode them as integers.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>lb:</strong> Lower bound for the variable.</li>
|
|
<li><strong>ub:</strong> Upper bound for the variable.</li>
|
|
<li><strong>name:</strong> The name of the variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>a variable whose domain is [lb, ub].</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewIntVarFromDomain" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewIntVarFromDomain">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewIntVarFromDomain</span><span class="signature">(self, domain, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewIntVarFromDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Create an integer variable from a domain.</span>
|
|
|
|
<span class="sd"> A domain is a set of integers specified by a collection of intervals.</span>
|
|
<span class="sd"> For example, `model.NewIntVarFromDomain(cp_model.</span>
|
|
<span class="sd"> Domain.FromIntervals([[1, 2], [4, 6]]), 'x')`</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> domain: An instance of the Domain class.</span>
|
|
<span class="sd"> name: The name of the variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> a variable whose domain is the given domain.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Create an integer variable from a domain.</p>
|
|
|
|
<p>A domain is a set of integers specified by a collection of intervals.
|
|
For example, <code>model.NewIntVarFromDomain(cp_model.
|
|
Domain.FromIntervals([[1, 2], [4, 6]]), 'x')</code></p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>domain:</strong> An instance of the Domain class.</li>
|
|
<li><strong>name:</strong> The name of the variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>a variable whose domain is the given domain.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewBoolVar" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewBoolVar">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewBoolVar</span><span class="signature">(self, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewBoolVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates a 0-1 variable with the given name."""</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates a 0-1 variable with the given name.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewConstant" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewConstant">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewConstant</span><span class="signature">(self, value)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""Declares a constant integer."""</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
|
|
<span class="kc">None</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Declares a constant integer.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddLinearConstraint" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddLinearConstraint">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddLinearConstraint</span><span class="signature">(self, linear_expr, lb, ub)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddLinearConstraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the constraint: `lb <= linear_expr <= ub`."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddLinearExpressionInDomain</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">Domain</span><span class="p">(</span><span class="n">lb</span><span class="p">,</span> <span class="n">ub</span><span class="p">))</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds the constraint: <code>lb <= linear_expr <= ub</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddLinearExpressionInDomain" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddLinearExpressionInDomain">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddLinearExpressionInDomain</span><span class="signature">(self, linear_expr, domain)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddLinearExpressionInDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">domain</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the constraint: `linear_expr` in `domain`."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="n">linear_expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Wrong argument'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="n">cmh</span><span class="o">.</span><span class="n">capped_subtraction</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">constant</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">domain</span><span class="o">.</span><span class="n">FlattenedIntervals</span><span class="p">()</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">domain</span><span class="o">.</span><span class="n">Contains</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([])</span> <span class="c1"># Evaluate to false.</span>
|
|
<span class="c1"># Nothing to do otherwise.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'Not supported: CpModel.AddLinearExpressionInDomain('</span> <span class="o">+</span>
|
|
<span class="nb">str</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds the constraint: <code>linear_expr</code> in <code>domain</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.Add" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.Add">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Add</span><span class="signature">(self, ct)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ct</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a `BoundedLinearExpression` to the model.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> ct: A [`BoundedLinearExpression`](#boundedlinearexpression).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="n">BoundedLinearExpression</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddLinearExpressionInDomain</span><span class="p">(</span>
|
|
<span class="n">ct</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">Domain</span><span class="o">.</span><span class="n">FromFlatIntervals</span><span class="p">(</span><span class="n">ct</span><span class="o">.</span><span class="n">Bounds</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="n">ct</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([</span><span class="kc">True</span><span class="p">])</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">ct</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">([])</span> <span class="c1"># Evaluate to false.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Not supported: CpModel.Add('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ct</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds a <code><a href="#BoundedLinearExpression">BoundedLinearExpression</a></code> to the model.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>ct:</strong> A <a href="#boundedlinearexpression"><code>BoundedLinearExpression</code></a>.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAllDifferent" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAllDifferent">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAllDifferent</span><span class="signature">(self, *expressions)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAllDifferent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AllDifferent(expressions).</span>
|
|
|
|
<span class="sd"> This constraint forces all expressions to have different values.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *expressions: simple expressions of the form a * var + constant.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">expanded</span> <span class="o">=</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">all_diff</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">expanded</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds AllDifferent(expressions).</p>
|
|
|
|
<p>This constraint forces all expressions to have different values.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>*expressions:</strong> simple expressions of the form a * var + constant.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddElement" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddElement">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddElement</span><span class="signature">(self, index, variables, target)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddElement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
|
|
<span class="sd">"""Adds the element constraint: `variables[index] == target`."""</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddElement expects a non-empty variables array'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">variables</span><span class="p">)[</span><span class="nb">int</span><span class="p">(</span><span class="n">index</span><span class="p">)]</span> <span class="o">==</span> <span class="n">target</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">element</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds the element constraint: <code>variables[index] == target</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddCircuit" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddCircuit">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddCircuit</span><span class="signature">(self, arcs)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddCircuit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arcs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Circuit(arcs).</span>
|
|
|
|
<span class="sd"> Adds a circuit constraint from a sparse list of arcs that encode the graph.</span>
|
|
|
|
<span class="sd"> A circuit is a unique Hamiltonian path in a subgraph of the total</span>
|
|
<span class="sd"> graph. In case a node 'i' is not in the path, then there must be a</span>
|
|
<span class="sd"> loop arc 'i -> i' associated with a true literal. Otherwise</span>
|
|
<span class="sd"> this constraint will fail.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> arcs: a list of arcs. An arc is a tuple (source_node, destination_node,</span>
|
|
<span class="sd"> literal). The arc is selected in the circuit if the literal is true.</span>
|
|
<span class="sd"> Both source_node and destination_node must be integers between 0 and the</span>
|
|
<span class="sd"> number of nodes - 1.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: If the list of arcs is empty.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddCircuit expects a non-empty array of arcs'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">for</span> <span class="n">arc</span> <span class="ow">in</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">lit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">tails</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">circuit</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds Circuit(arcs).</p>
|
|
|
|
<p>Adds a circuit constraint from a sparse list of arcs that encode the graph.</p>
|
|
|
|
<p>A circuit is a unique Hamiltonian path in a subgraph of the total
|
|
graph. In case a node 'i' is not in the path, then there must be a
|
|
loop arc 'i -> i' associated with a true literal. Otherwise
|
|
this constraint will fail.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>arcs:</strong> a list of arcs. An arc is a tuple (source_node, destination_node,
|
|
literal). The arc is selected in the circuit if the literal is true.
|
|
Both source_node and destination_node must be integers between 0 and the
|
|
number of nodes - 1.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>ValueError:</strong> If the list of arcs is empty.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddMultipleCircuit" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddMultipleCircuit">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddMultipleCircuit</span><span class="signature">(self, arcs)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddMultipleCircuit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arcs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a multiple circuit constraint, aka the "VRP" constraint.</span>
|
|
|
|
<span class="sd"> The direct graph where arc #i (from tails[i] to head[i]) is present iff</span>
|
|
<span class="sd"> literals[i] is true must satisfy this set of properties:</span>
|
|
<span class="sd"> - #incoming arcs == 1 except for node 0.</span>
|
|
<span class="sd"> - #outgoing arcs == 1 except for node 0.</span>
|
|
<span class="sd"> - for node zero, #incoming arcs == #outgoing arcs.</span>
|
|
<span class="sd"> - There are no duplicate arcs.</span>
|
|
<span class="sd"> - Self-arcs are allowed except for node 0.</span>
|
|
<span class="sd"> - There is no cycle in this graph, except through node 0.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> arcs: a list of arcs. An arc is a tuple (source_node, destination_node,</span>
|
|
<span class="sd"> literal). The arc is selected in the circuit if the literal is true.</span>
|
|
<span class="sd"> Both source_node and destination_node must be integers between 0 and the</span>
|
|
<span class="sd"> number of nodes - 1.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: If the list of arcs is empty.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddMultipleCircuit expects a non-empty array of arcs'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">for</span> <span class="n">arc</span> <span class="ow">in</span> <span class="n">arcs</span><span class="p">:</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int32</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">lit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">arc</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">tails</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds a multiple circuit constraint, aka the "VRP" constraint.</p>
|
|
|
|
<p>The direct graph where arc #i (from tails[i] to head[i]) is present iff
|
|
literals[i] is true must satisfy this set of properties:</p>
|
|
|
|
<ul>
|
|
<li>#incoming arcs == 1 except for node 0.</li>
|
|
<li>#outgoing arcs == 1 except for node 0.</li>
|
|
<li>for node zero, #incoming arcs == #outgoing arcs.</li>
|
|
<li>There are no duplicate arcs.</li>
|
|
<li>Self-arcs are allowed except for node 0.</li>
|
|
<li>There is no cycle in this graph, except through node 0.</li>
|
|
</ul>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>arcs:</strong> a list of arcs. An arc is a tuple (source_node, destination_node,
|
|
literal). The arc is selected in the circuit if the literal is true.
|
|
Both source_node and destination_node must be integers between 0 and the
|
|
number of nodes - 1.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>ValueError:</strong> If the list of arcs is empty.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAllowedAssignments" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAllowedAssignments">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAllowedAssignments</span><span class="signature">(self, variables, tuples_list)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAllowedAssignments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AllowedAssignments(variables, tuples_list).</span>
|
|
|
|
<span class="sd"> An AllowedAssignments constraint is a constraint on an array of variables,</span>
|
|
<span class="sd"> which requires that when all variables are assigned values, the resulting</span>
|
|
<span class="sd"> array equals one of the tuples in `tuple_list`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: A list of variables.</span>
|
|
<span class="sd"> tuples_list: A list of admissible tuples. Each tuple must have the same</span>
|
|
<span class="sd"> length as the variables, and the ith value of a tuple corresponds to the</span>
|
|
<span class="sd"> ith variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: If a tuple does not have the same size as the list of</span>
|
|
<span class="sd"> variables.</span>
|
|
<span class="sd"> ValueError: If the array of variables is empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddAllowedAssignments expects a non-empty variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">arity</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tuples_list</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">!=</span> <span class="n">arity</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Tuple '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' has the wrong arity'</span><span class="p">)</span>
|
|
<span class="n">ar</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">t</span><span class="p">:</span>
|
|
<span class="n">ar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">v</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">ar</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds AllowedAssignments(variables, tuples_list).</p>
|
|
|
|
<p>An AllowedAssignments constraint is a constraint on an array of variables,
|
|
which requires that when all variables are assigned values, the resulting
|
|
array equals one of the tuples in <code>tuple_list</code>.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>variables:</strong> A list of variables.</li>
|
|
<li><strong>tuples_list:</strong> A list of admissible tuples. Each tuple must have the same
|
|
length as the variables, and the ith value of a tuple corresponds to the
|
|
ith variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>TypeError:</strong> If a tuple does not have the same size as the list of
|
|
variables.</li>
|
|
<li><strong>ValueError:</strong> If the array of variables is empty.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddForbiddenAssignments" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddForbiddenAssignments">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddForbiddenAssignments</span><span class="signature">(self, variables, tuples_list)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddForbiddenAssignments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">):</span>
|
|
<span class="sd">"""Adds AddForbiddenAssignments(variables, [tuples_list]).</span>
|
|
|
|
<span class="sd"> A ForbiddenAssignments constraint is a constraint on an array of variables</span>
|
|
<span class="sd"> where the list of impossible combinations is provided in the tuples list.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: A list of variables.</span>
|
|
<span class="sd"> tuples_list: A list of forbidden tuples. Each tuple must have the same</span>
|
|
<span class="sd"> length as the variables, and the *i*th value of a tuple corresponds to</span>
|
|
<span class="sd"> the *i*th variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: If a tuple does not have the same size as the list of</span>
|
|
<span class="sd"> variables.</span>
|
|
<span class="sd"> ValueError: If the array of variables is empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddForbiddenAssignments expects a non-empty variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
|
|
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddAllowedAssignments</span><span class="p">(</span><span class="n">variables</span><span class="p">,</span> <span class="n">tuples_list</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">negated</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds AddForbiddenAssignments(variables, [tuples_list]).</p>
|
|
|
|
<p>A ForbiddenAssignments constraint is a constraint on an array of variables
|
|
where the list of impossible combinations is provided in the tuples list.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>variables:</strong> A list of variables.</li>
|
|
<li><strong>tuples_list:</strong> A list of forbidden tuples. Each tuple must have the same
|
|
length as the variables, and the <em>i</em>th value of a tuple corresponds to
|
|
the <em>i</em>th variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>TypeError:</strong> If a tuple does not have the same size as the list of
|
|
variables.</li>
|
|
<li><strong>ValueError:</strong> If the array of variables is empty.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAutomaton" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAutomaton">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAutomaton</span><span class="signature">(
|
|
self,
|
|
transition_variables,
|
|
starting_state,
|
|
final_states,
|
|
transition_triples
|
|
)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAutomaton</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transition_variables</span><span class="p">,</span> <span class="n">starting_state</span><span class="p">,</span> <span class="n">final_states</span><span class="p">,</span>
|
|
<span class="n">transition_triples</span><span class="p">):</span>
|
|
<span class="sd">"""Adds an automaton constraint.</span>
|
|
|
|
<span class="sd"> An automaton constraint takes a list of variables (of size *n*), an initial</span>
|
|
<span class="sd"> state, a set of final states, and a set of transitions. A transition is a</span>
|
|
<span class="sd"> triplet (*tail*, *transition*, *head*), where *tail* and *head* are states,</span>
|
|
<span class="sd"> and *transition* is the label of an arc from *head* to *tail*,</span>
|
|
<span class="sd"> corresponding to the value of one variable in the list of variables.</span>
|
|
|
|
<span class="sd"> This automaton will be unrolled into a flow with *n* + 1 phases. Each phase</span>
|
|
<span class="sd"> contains the possible states of the automaton. The first state contains the</span>
|
|
<span class="sd"> initial state. The last phase contains the final states.</span>
|
|
|
|
<span class="sd"> Between two consecutive phases *i* and *i* + 1, the automaton creates a set</span>
|
|
<span class="sd"> of arcs. For each transition (*tail*, *transition*, *head*), it will add</span>
|
|
<span class="sd"> an arc from the state *tail* of phase *i* and the state *head* of phase</span>
|
|
<span class="sd"> *i* + 1. This arc is labeled by the value *transition* of the variables</span>
|
|
<span class="sd"> `variables[i]`. That is, this arc can only be selected if `variables[i]`</span>
|
|
<span class="sd"> is assigned the value *transition*.</span>
|
|
|
|
<span class="sd"> A feasible solution of this constraint is an assignment of variables such</span>
|
|
<span class="sd"> that, starting from the initial state in phase 0, there is a path labeled by</span>
|
|
<span class="sd"> the values of the variables that ends in one of the final states in the</span>
|
|
<span class="sd"> final phase.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> transition_variables: A non-empty list of variables whose values</span>
|
|
<span class="sd"> correspond to the labels of the arcs traversed by the automaton.</span>
|
|
<span class="sd"> starting_state: The initial state of the automaton.</span>
|
|
<span class="sd"> final_states: A non-empty list of admissible final states.</span>
|
|
<span class="sd"> transition_triples: A list of transitions for the automaton, in the</span>
|
|
<span class="sd"> following format (current_state, variable_value, next_state).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if `transition_variables`, `final_states`, or</span>
|
|
<span class="sd"> `transition_triples` are empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">transition_variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'AddAutomaton expects a non-empty transition_variables '</span>
|
|
<span class="s1">'array'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">final_states</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddAutomaton expects some final states'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">transition_triples</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'AddAutomaton expects some transition triples'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">transition_variables</span><span class="p">])</span>
|
|
<span class="n">starting_state</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">starting_state</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">starting_state</span> <span class="o">=</span> <span class="n">starting_state</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">final_states</span><span class="p">:</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">final_states</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transition_triples</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Tuple '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' has the wrong arity (!= 3)'</span><span class="p">)</span>
|
|
<span class="n">tail</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">label</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">head</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_tail</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_label</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">label</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">automaton</span><span class="o">.</span><span class="n">transition_head</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds an automaton constraint.</p>
|
|
|
|
<p>An automaton constraint takes a list of variables (of size <em>n</em>), an initial
|
|
state, a set of final states, and a set of transitions. A transition is a
|
|
triplet (<em>tail</em>, <em>transition</em>, <em>head</em>), where <em>tail</em> and <em>head</em> are states,
|
|
and <em>transition</em> is the label of an arc from <em>head</em> to <em>tail</em>,
|
|
corresponding to the value of one variable in the list of variables.</p>
|
|
|
|
<p>This automaton will be unrolled into a flow with <em>n</em> + 1 phases. Each phase
|
|
contains the possible states of the automaton. The first state contains the
|
|
initial state. The last phase contains the final states.</p>
|
|
|
|
<p>Between two consecutive phases <em>i</em> and <em>i</em> + 1, the automaton creates a set
|
|
of arcs. For each transition (<em>tail</em>, <em>transition</em>, <em>head</em>), it will add
|
|
an arc from the state <em>tail</em> of phase <em>i</em> and the state <em>head</em> of phase
|
|
<em>i</em> + 1. This arc is labeled by the value <em>transition</em> of the variables
|
|
<code>variables[i]</code>. That is, this arc can only be selected if <code>variables[i]</code>
|
|
is assigned the value <em>transition</em>.</p>
|
|
|
|
<p>A feasible solution of this constraint is an assignment of variables such
|
|
that, starting from the initial state in phase 0, there is a path labeled by
|
|
the values of the variables that ends in one of the final states in the
|
|
final phase.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>transition_variables:</strong> A non-empty list of variables whose values
|
|
correspond to the labels of the arcs traversed by the automaton.</li>
|
|
<li><strong>starting_state:</strong> The initial state of the automaton.</li>
|
|
<li><strong>final_states:</strong> A non-empty list of admissible final states.</li>
|
|
<li><strong>transition_triples:</strong> A list of transitions for the automaton, in the
|
|
following format (current_state, variable_value, next_state).</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>ValueError:</strong> if <code>transition_variables</code>, <code>final_states</code>, or
|
|
<code>transition_triples</code> are empty.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddInverse" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddInverse">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddInverse</span><span class="signature">(self, variables, inverse_variables)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddInverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">inverse_variables</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Inverse(variables, inverse_variables).</span>
|
|
|
|
<span class="sd"> An inverse constraint enforces that if `variables[i]` is assigned a value</span>
|
|
<span class="sd"> `j`, then `inverse_variables[j]` is assigned a value `i`. And vice versa.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: An array of integer variables.</span>
|
|
<span class="sd"> inverse_variables: An array of integer variables.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> TypeError: if variables and inverse_variables have different lengths, or</span>
|
|
<span class="sd"> if they are empty.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">variables</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">inverse_variables</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'The Inverse constraint does not accept empty arrays'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">variables</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">inverse_variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'In the inverse constraint, the two array variables and'</span>
|
|
<span class="s1">' inverse_variables must have the same length.'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">inverse</span><span class="o">.</span><span class="n">f_direct</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">inverse</span><span class="o">.</span><span class="n">f_inverse</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">inverse_variables</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds Inverse(variables, inverse_variables).</p>
|
|
|
|
<p>An inverse constraint enforces that if <code>variables[i]</code> is assigned a value
|
|
<code>j</code>, then <code>inverse_variables[j]</code> is assigned a value <code>i</code>. And vice versa.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>variables:</strong> An array of integer variables.</li>
|
|
<li><strong>inverse_variables:</strong> An array of integer variables.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>TypeError:</strong> if variables and inverse_variables have different lengths, or
|
|
if they are empty.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddReservoirConstraint" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddReservoirConstraint">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddReservoirConstraint</span><span class="signature">(self, times, level_changes, min_level, max_level)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddReservoirConstraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">level_changes</span><span class="p">,</span> <span class="n">min_level</span><span class="p">,</span>
|
|
<span class="n">max_level</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Reservoir(times, level_changes, min_level, max_level).</span>
|
|
|
|
<span class="sd"> Maintains a reservoir level within bounds. The water level starts at 0, and</span>
|
|
<span class="sd"> at any time, it must be between min_level and max_level.</span>
|
|
|
|
<span class="sd"> If the affine expression `times[i]` is assigned a value t, then the current</span>
|
|
<span class="sd"> level changes by `level_changes[i]`, which is constant, at time t.</span>
|
|
|
|
<span class="sd"> Note that min level must be <= 0, and the max level must be >= 0. Please</span>
|
|
<span class="sd"> use fixed level_changes to simulate initial state.</span>
|
|
|
|
<span class="sd"> Therefore, at any time:</span>
|
|
<span class="sd"> sum(level_changes[i] if times[i] <= t) in [min_level, max_level]</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> times: A list of affine expressions which specify the time of the filling</span>
|
|
<span class="sd"> or emptying the reservoir.</span>
|
|
<span class="sd"> level_changes: A list of integer values that specifies the amount of the</span>
|
|
<span class="sd"> emptying or filling.</span>
|
|
<span class="sd"> min_level: At any time, the level of the reservoir must be greater or</span>
|
|
<span class="sd"> equal than the min level.</span>
|
|
<span class="sd"> max_level: At any time, the level of the reservoir must be less or equal</span>
|
|
<span class="sd"> than the max level.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if max_level < min_level.</span>
|
|
|
|
<span class="sd"> ValueError: if max_level < 0.</span>
|
|
|
|
<span class="sd"> ValueError: if min_level > 0</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="n">min_level</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Reservoir constraint must have a max_level >= min_level'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a max_level >= 0'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">min_level</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a min_level <= 0'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">time_exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">times</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">level_changes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">level_changes</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">min_level</span> <span class="o">=</span> <span class="n">min_level</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">max_level</span> <span class="o">=</span> <span class="n">max_level</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds Reservoir(times, level_changes, min_level, max_level).</p>
|
|
|
|
<p>Maintains a reservoir level within bounds. The water level starts at 0, and
|
|
at any time, it must be between min_level and max_level.</p>
|
|
|
|
<p>If the affine expression <code>times[i]</code> is assigned a value t, then the current
|
|
level changes by <code>level_changes[i]</code>, which is constant, at time t.</p>
|
|
|
|
<p>Note that min level must be <= 0, and the max level must be >= 0. Please
|
|
use fixed level_changes to simulate initial state.</p>
|
|
|
|
<p>Therefore, at any time:
|
|
sum(level_changes[i] if times[i] <= t) in [min_level, max_level]</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>times:</strong> A list of affine expressions which specify the time of the filling
|
|
or emptying the reservoir.</li>
|
|
<li><strong>level_changes:</strong> A list of integer values that specifies the amount of the
|
|
emptying or filling.</li>
|
|
<li><strong>min_level:</strong> At any time, the level of the reservoir must be greater or
|
|
equal than the min level.</li>
|
|
<li><strong>max_level:</strong> At any time, the level of the reservoir must be less or equal
|
|
than the max level.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>ValueError:</strong> if max_level < min_level.</li>
|
|
<li><strong>ValueError:</strong> if max_level < 0.</li>
|
|
<li><strong>ValueError:</strong> if min_level > 0</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddReservoirConstraintWithActive" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddReservoirConstraintWithActive">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddReservoirConstraintWithActive</span><span class="signature">(self, times, level_changes, actives, min_level, max_level)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddReservoirConstraintWithActive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">level_changes</span><span class="p">,</span> <span class="n">actives</span><span class="p">,</span>
|
|
<span class="n">min_level</span><span class="p">,</span> <span class="n">max_level</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Reservoir(times, level_changes, actives, min_level, max_level).</span>
|
|
|
|
<span class="sd"> Maintains a reservoir level within bounds. The water level starts at 0, and</span>
|
|
<span class="sd"> at any time, it must be between min_level and max_level.</span>
|
|
|
|
<span class="sd"> If the variable `times[i]` is assigned a value t, and `actives[i]` is</span>
|
|
<span class="sd"> `True`, then the current level changes by `level_changes[i]`, which is</span>
|
|
<span class="sd"> constant,</span>
|
|
<span class="sd"> at time t.</span>
|
|
|
|
<span class="sd"> Note that min level must be <= 0, and the max level must be >= 0. Please</span>
|
|
<span class="sd"> use fixed level_changes to simulate initial state.</span>
|
|
|
|
<span class="sd"> Therefore, at any time:</span>
|
|
<span class="sd"> sum(level_changes[i] * actives[i] if times[i] <= t) in [min_level,</span>
|
|
<span class="sd"> max_level]</span>
|
|
|
|
|
|
<span class="sd"> The array of boolean variables 'actives', if defined, indicates which</span>
|
|
<span class="sd"> actions are actually performed.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> times: A list of affine expressions which specify the time of the filling</span>
|
|
<span class="sd"> or emptying the reservoir.</span>
|
|
<span class="sd"> level_changes: A list of integer values that specifies the amount of the</span>
|
|
<span class="sd"> emptying or filling.</span>
|
|
<span class="sd"> actives: a list of boolean variables. They indicates if the</span>
|
|
<span class="sd"> emptying/refilling events actually take place.</span>
|
|
<span class="sd"> min_level: At any time, the level of the reservoir must be greater or</span>
|
|
<span class="sd"> equal than the min level.</span>
|
|
<span class="sd"> max_level: At any time, the level of the reservoir must be less or equal</span>
|
|
<span class="sd"> than the max level.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> ValueError: if max_level < min_level.</span>
|
|
|
|
<span class="sd"> ValueError: if max_level < 0.</span>
|
|
|
|
<span class="sd"> ValueError: if min_level > 0</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="n">min_level</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="s1">'Reservoir constraint must have a max_level >= min_level'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">max_level</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a max_level >= 0'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">min_level</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Reservoir constraint must have a min_level <= 0'</span><span class="p">)</span>
|
|
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">time_exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">times</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">level_changes</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">level_changes</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">active_literals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">actives</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">min_level</span> <span class="o">=</span> <span class="n">min_level</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">reservoir</span><span class="o">.</span><span class="n">max_level</span> <span class="o">=</span> <span class="n">max_level</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds Reservoir(times, level_changes, actives, min_level, max_level).</p>
|
|
|
|
<p>Maintains a reservoir level within bounds. The water level starts at 0, and
|
|
at any time, it must be between min_level and max_level.</p>
|
|
|
|
<p>If the variable <code>times[i]</code> is assigned a value t, and <code>actives[i]</code> is
|
|
<code>True</code>, then the current level changes by <code>level_changes[i]</code>, which is
|
|
constant,
|
|
at time t.</p>
|
|
|
|
<p>Note that min level must be <= 0, and the max level must be >= 0. Please
|
|
use fixed level_changes to simulate initial state.</p>
|
|
|
|
<p>Therefore, at any time:
|
|
sum(level_changes[i] * actives[i] if times[i] <= t) in [min_level,
|
|
max_level]</p>
|
|
|
|
<p>The array of boolean variables 'actives', if defined, indicates which
|
|
actions are actually performed.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>times:</strong> A list of affine expressions which specify the time of the filling
|
|
or emptying the reservoir.</li>
|
|
<li><strong>level_changes:</strong> A list of integer values that specifies the amount of the
|
|
emptying or filling.</li>
|
|
<li><strong>actives:</strong> a list of boolean variables. They indicates if the
|
|
emptying/refilling events actually take place.</li>
|
|
<li><strong>min_level:</strong> At any time, the level of the reservoir must be greater or
|
|
equal than the min level.</li>
|
|
<li><strong>max_level:</strong> At any time, the level of the reservoir must be less or equal
|
|
than the max level.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>ValueError:</strong> if max_level < min_level.</li>
|
|
<li><strong>ValueError:</strong> if max_level < 0.</li>
|
|
<li><strong>ValueError:</strong> if min_level > 0</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddMapDomain" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddMapDomain">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddMapDomain</span><span class="signature">(self, var, bool_var_array, offset=0)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddMapDomain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">bool_var_array</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `var == i + offset <=> bool_var_array[i] == true for all i`."""</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">bool_var</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">bool_var_array</span><span class="p">):</span>
|
|
<span class="n">b_index</span> <span class="o">=</span> <span class="n">bool_var</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="n">var_index</span> <span class="o">=</span> <span class="n">var</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var_index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">offset</span> <span class="o">+</span> <span class="n">i</span><span class="p">,</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">b_index</span><span class="p">)</span>
|
|
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var_index</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="o">-</span><span class="n">b_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">>=</span> <span class="n">INT_MIN</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">INT_MIN</span><span class="p">,</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">INT_MAX</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">linear</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">offset</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">])</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>var == i + offset <=> bool_var_array[i] == true for all i</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddImplication" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddImplication">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddImplication</span><span class="signature">(self, a, b)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddImplication</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `a => b` (`a` implies `b`)."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_or</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">enforcement_literal</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>a => b</code> (<code>a</code> implies <code>b</code>).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddBoolOr" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddBoolOr">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddBoolOr</span><span class="signature">(self, *literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddBoolOr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `Or(literals) == true`: Sum(literals) >= 1."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_or</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>Or(literals) == true</code>: Sum(literals) >= 1.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAtLeastOne" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAtLeastOne">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAtLeastOne</span><span class="signature">(self, *literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAtLeastOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Same as `AddBoolOr`: `Sum(literals) >= 1`."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">AddBoolOr</span><span class="p">(</span><span class="o">*</span><span class="n">literals</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Same as <code><a href="#CpModel.AddBoolOr">AddBoolOr</a></code>: <code>Sum(literals) >= 1</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAtMostOne" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAtMostOne">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAtMostOne</span><span class="signature">(self, *literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAtMostOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `AtMostOne(literals)`: `Sum(literals) <= 1`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">at_most_one</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>AtMostOne(literals)</code>: <code>Sum(literals) <= 1</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddExactlyOne" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddExactlyOne">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddExactlyOne</span><span class="signature">(self, *literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddExactlyOne</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `ExactlyOne(literals)`: `Sum(literals) == 1`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">exactly_one</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>ExactlyOne(literals)</code>: <code>Sum(literals) == 1</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddBoolAnd" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddBoolAnd">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddBoolAnd</span><span class="signature">(self, *literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddBoolAnd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `And(literals) == true`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_and</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>And(literals) == true</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddBoolXOr" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddBoolXOr">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddBoolXOr</span><span class="signature">(self, *literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddBoolXOr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `XOr(literals) == true`.</span>
|
|
|
|
<span class="sd"> In contrast to AddBoolOr and AddBoolAnd, it does not support</span>
|
|
<span class="sd"> .OnlyEnforceIf().</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> *literals: the list of literals in the constraint.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `Constraint` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">bool_xor</span><span class="o">.</span><span class="n">literals</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">literals</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>XOr(literals) == true</code>.</p>
|
|
|
|
<p>In contrast to AddBoolOr and AddBoolAnd, it does not support
|
|
.OnlyEnforceIf().</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>*literals:</strong> the list of literals in the constraint.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An <code><a href="#Constraint">Constraint</a></code> object.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddMinEquality" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddMinEquality">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddMinEquality</span><span class="signature">(self, target, exprs)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddMinEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Min(exprs)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="kc">True</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>target == Min(exprs)</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddMaxEquality" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddMaxEquality">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddMaxEquality</span><span class="signature">(self, target, exprs)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddMaxEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Max(exprs)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>target == Max(exprs)</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddDivisionEquality" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddDivisionEquality">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddDivisionEquality</span><span class="signature">(self, target, num, denom)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddDivisionEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="n">denom</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == num // denom` (integer division rounded towards 0)."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">num</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">denom</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_div</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>target == num // denom</code> (integer division rounded towards 0).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAbsEquality" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAbsEquality">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAbsEquality</span><span class="signature">(self, target, expr)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAbsEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == Abs(var)`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="kc">True</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">lin_max</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>target == Abs(var)</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddModuloEquality" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddModuloEquality">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddModuloEquality</span><span class="signature">(self, target, var, mod)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddModuloEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target = var % mod`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">mod</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_mod</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>target = var % mod</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddMultiplicationEquality" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddMultiplicationEquality">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddMultiplicationEquality</span><span class="signature">(self, target, *expressions)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddMultiplicationEquality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
|
<span class="sd">"""Adds `target == expressions[0] * .. * expressions[n]`."""</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_prod</span><span class="o">.</span><span class="n">exprs</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
|
|
<span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">int_prod</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">target</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds <code>target == expressions[0] * .. * expressions[n]</code>.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewIntervalVar" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewIntervalVar">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewIntervalVar</span><span class="signature">(self, start, size, end, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, size, and end.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Internally, it ensures that `start + size == end`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> end: The end of the interval. It can be an affine or constant expression.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span> <span class="o">==</span> <span class="n">end</span><span class="p">)</span>
|
|
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">size_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: size must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">end_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: end must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates an interval variable from start, size, and end.</p>
|
|
|
|
<p>An interval variable is a constraint, that is itself used in other
|
|
constraints like NoOverlap.</p>
|
|
|
|
<p>Internally, it ensures that <code>start + size == end</code>.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>start:</strong> The start of the interval. It can be an affine or constant
|
|
expression.</li>
|
|
<li><strong>size:</strong> The size of the interval. It can be an affine or constant
|
|
expression.</li>
|
|
<li><strong>end:</strong> The end of the interval. It can be an affine or constant expression.</li>
|
|
<li><strong>name:</strong> The name of the interval variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An <code><a href="#IntervalVar">IntervalVar</a></code> object.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewFixedSizeIntervalVar" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewFixedSizeIntervalVar">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewFixedSizeIntervalVar</span><span class="signature">(self, start, size, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewFixedSizeIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, and a fixed size.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It must be an integer value.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates an interval variable from start, and a fixed size.</p>
|
|
|
|
<p>An interval variable is a constraint, that is itself used in other
|
|
constraints like NoOverlap.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>start:</strong> The start of the interval. It can be an affine or constant
|
|
expression.</li>
|
|
<li><strong>size:</strong> The size of the interval. It must be an integer value.</li>
|
|
<li><strong>name:</strong> The name of the interval variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An <code><a href="#IntervalVar">IntervalVar</a></code> object.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewOptionalIntervalVar" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewOptionalIntervalVar">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewOptionalIntervalVar</span><span class="signature">(self, start, size, end, is_present, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewOptionalIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">is_present</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an optional interval var from start, size, end, and is_present.</span>
|
|
|
|
<span class="sd"> An optional interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap. This constraint is protected by an is_present</span>
|
|
<span class="sd"> literal that indicates if it is active or not.</span>
|
|
|
|
<span class="sd"> Internally, it ensures that `is_present` implies `start + size == end`.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an integer value, or an</span>
|
|
<span class="sd"> integer variable.</span>
|
|
<span class="sd"> size: The size of the interval. It can be an integer value, or an integer</span>
|
|
<span class="sd"> variable.</span>
|
|
<span class="sd"> end: The end of the interval. It can be an integer value, or an integer</span>
|
|
<span class="sd"> variable.</span>
|
|
<span class="sd"> is_present: A literal that indicates if the interval is active or not. A</span>
|
|
<span class="sd"> inactive interval is simply ignored by all constraints.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># Add the linear constraint.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span> <span class="o">==</span> <span class="n">end</span><span class="p">)</span><span class="o">.</span><span class="n">OnlyEnforceIf</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Creates the IntervalConstraintProto object.</span>
|
|
<span class="n">is_present_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">size_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: size must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">end_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: end must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span>
|
|
<span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates an optional interval var from start, size, end, and is_present.</p>
|
|
|
|
<p>An optional interval variable is a constraint, that is itself used in other
|
|
constraints like NoOverlap. This constraint is protected by an is_present
|
|
literal that indicates if it is active or not.</p>
|
|
|
|
<p>Internally, it ensures that <code>is_present</code> implies <code>start + size == end</code>.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>start:</strong> The start of the interval. It can be an integer value, or an
|
|
integer variable.</li>
|
|
<li><strong>size:</strong> The size of the interval. It can be an integer value, or an integer
|
|
variable.</li>
|
|
<li><strong>end:</strong> The end of the interval. It can be an integer value, or an integer
|
|
variable.</li>
|
|
<li><strong>is_present:</strong> A literal that indicates if the interval is active or not. A
|
|
inactive interval is simply ignored by all constraints.</li>
|
|
<li><strong>name:</strong> The name of the interval variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An <code><a href="#IntervalVar">IntervalVar</a></code> object.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.NewOptionalFixedSizeIntervalVar" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.NewOptionalFixedSizeIntervalVar">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NewOptionalFixedSizeIntervalVar</span><span class="signature">(self, start, size, is_present, name)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NewOptionalFixedSizeIntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">is_present</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="sd">"""Creates an interval variable from start, and a fixed size.</span>
|
|
|
|
<span class="sd"> An interval variable is a constraint, that is itself used in other</span>
|
|
<span class="sd"> constraints like NoOverlap.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> start: The start of the interval. It can be an affine or constant</span>
|
|
<span class="sd"> expression.</span>
|
|
<span class="sd"> size: The size of the interval. It must be an integer value.</span>
|
|
<span class="sd"> is_present: A literal that indicates if the interval is active or not. A</span>
|
|
<span class="sd"> inactive interval is simply ignored by all constraints.</span>
|
|
<span class="sd"> name: The name of the interval variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An `IntervalVar` object.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">size</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">start_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">size_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
|
|
<span class="n">end_expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">size</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">start_expr</span><span class="o">.</span><span class="n">vars</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="s1">'cp_model.NewIntervalVar: start must be affine or constant.'</span><span class="p">)</span>
|
|
<span class="n">is_present_index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">is_present</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">start_expr</span><span class="p">,</span> <span class="n">size_expr</span><span class="p">,</span> <span class="n">end_expr</span><span class="p">,</span>
|
|
<span class="n">is_present_index</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Creates an interval variable from start, and a fixed size.</p>
|
|
|
|
<p>An interval variable is a constraint, that is itself used in other
|
|
constraints like NoOverlap.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>start:</strong> The start of the interval. It can be an affine or constant
|
|
expression.</li>
|
|
<li><strong>size:</strong> The size of the interval. It must be an integer value.</li>
|
|
<li><strong>is_present:</strong> A literal that indicates if the interval is active or not. A
|
|
inactive interval is simply ignored by all constraints.</li>
|
|
<li><strong>name:</strong> The name of the interval variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An <code><a href="#IntervalVar">IntervalVar</a></code> object.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddNoOverlap" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddNoOverlap">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddNoOverlap</span><span class="signature">(self, interval_vars)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddNoOverlap</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interval_vars</span><span class="p">):</span>
|
|
<span class="sd">"""Adds NoOverlap(interval_vars).</span>
|
|
|
|
<span class="sd"> A NoOverlap constraint ensures that all present intervals do not overlap</span>
|
|
<span class="sd"> in time.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> interval_vars: The list of interval variables to constrain.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap</span><span class="o">.</span><span class="n">intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">interval_vars</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds NoOverlap(interval_vars).</p>
|
|
|
|
<p>A NoOverlap constraint ensures that all present intervals do not overlap
|
|
in time.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>interval_vars:</strong> The list of interval variables to constrain.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddNoOverlap2D" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddNoOverlap2D">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddNoOverlap2D</span><span class="signature">(self, x_intervals, y_intervals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddNoOverlap2D</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x_intervals</span><span class="p">,</span> <span class="n">y_intervals</span><span class="p">):</span>
|
|
<span class="sd">"""Adds NoOverlap2D(x_intervals, y_intervals).</span>
|
|
|
|
<span class="sd"> A NoOverlap2D constraint ensures that all present rectangles do not overlap</span>
|
|
<span class="sd"> on a plane. Each rectangle is aligned with the X and Y axis, and is defined</span>
|
|
<span class="sd"> by two intervals which represent its projection onto the X and Y axis.</span>
|
|
|
|
<span class="sd"> Furthermore, one box is optional if at least one of the x or y interval is</span>
|
|
<span class="sd"> optional.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> x_intervals: The X coordinates of the rectangles.</span>
|
|
<span class="sd"> y_intervals: The Y coordinates of the rectangles.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap_2d</span><span class="o">.</span><span class="n">x_intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">x_intervals</span><span class="p">])</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">no_overlap_2d</span><span class="o">.</span><span class="n">y_intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">y_intervals</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds NoOverlap2D(x_intervals, y_intervals).</p>
|
|
|
|
<p>A NoOverlap2D constraint ensures that all present rectangles do not overlap
|
|
on a plane. Each rectangle is aligned with the X and Y axis, and is defined
|
|
by two intervals which represent its projection onto the X and Y axis.</p>
|
|
|
|
<p>Furthermore, one box is optional if at least one of the x or y interval is
|
|
optional.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>x_intervals:</strong> The X coordinates of the rectangles.</li>
|
|
<li><strong>y_intervals:</strong> The Y coordinates of the rectangles.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddCumulative" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddCumulative">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddCumulative</span><span class="signature">(self, intervals, demands, capacity)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddCumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">intervals</span><span class="p">,</span> <span class="n">demands</span><span class="p">,</span> <span class="n">capacity</span><span class="p">):</span>
|
|
<span class="sd">"""Adds Cumulative(intervals, demands, capacity).</span>
|
|
|
|
<span class="sd"> This constraint enforces that:</span>
|
|
|
|
<span class="sd"> for all t:</span>
|
|
<span class="sd"> sum(demands[i]</span>
|
|
<span class="sd"> if (start(intervals[i]) <= t < end(intervals[i])) and</span>
|
|
<span class="sd"> (intervals[i] is present)) <= capacity</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> intervals: The list of intervals.</span>
|
|
<span class="sd"> demands: The list of demands for each interval. Each demand must be >= 0.</span>
|
|
<span class="sd"> Each demand can be an integer value, or an integer variable.</span>
|
|
<span class="sd"> capacity: The maximum capacity of the cumulative constraint. It must be a</span>
|
|
<span class="sd"> positive integer value or variable.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An instance of the `Constraint` class.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="n">Constraint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">)</span>
|
|
<span class="n">model_ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">ct</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">intervals</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">GetIntervalIndex</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">])</span>
|
|
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">demands</span><span class="p">:</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">demands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
|
|
<span class="n">model_ct</span><span class="o">.</span><span class="n">cumulative</span><span class="o">.</span><span class="n">capacity</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ParseLinearExpression</span><span class="p">(</span><span class="n">capacity</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">ct</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds Cumulative(intervals, demands, capacity).</p>
|
|
|
|
<h6 id="this-constraint-enforces-that">This constraint enforces that</h6>
|
|
|
|
<blockquote>
|
|
<p>for all t:
|
|
sum(demands[i]
|
|
if (start(intervals[i]) <= t < end(intervals[i])) and
|
|
(intervals[i] is present)) <= capacity</p>
|
|
</blockquote>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>intervals:</strong> The list of intervals.</li>
|
|
<li><strong>demands:</strong> The list of demands for each interval. Each demand must be >= 0.
|
|
Each demand can be an integer value, or an integer variable.</li>
|
|
<li><strong>capacity:</strong> The maximum capacity of the cumulative constraint. It must be a
|
|
positive integer value or variable.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An instance of the <code><a href="#Constraint">Constraint</a></code> class.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.CopyFrom" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.CopyFrom">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">CopyFrom</span><span class="signature">(self, other_model)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">CopyFrom</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_model</span><span class="p">):</span>
|
|
<span class="sd">"""Reset the model, and creates a new one from a CpModelProto instance."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">other_model</span><span class="o">.</span><span class="n">Proto</span><span class="p">())</span>
|
|
|
|
<span class="c1"># Rebuild constant map.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">i</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Reset the model, and creates a new one from a CpModelProto instance.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetBoolVarFromProtoIndex" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetBoolVarFromProtoIndex">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetBoolVarFromProtoIndex</span><span class="signature">(self, index)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetBoolVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created Boolean variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetBoolVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetBoolVarFromProtoIndex: index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1"> does not reference'</span> <span class="o">+</span>
|
|
<span class="s1">' a Boolean variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns an already created Boolean variable from its index.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetIntVarFromProtoIndex" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetIntVarFromProtoIndex">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetIntVarFromProtoIndex</span><span class="signature">(self, index)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetIntVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created integer variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">IntVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns an already created integer variable from its index.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetIntervalVarFromProtoIndex" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetIntervalVarFromProtoIndex">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetIntervalVarFromProtoIndex</span><span class="signature">(self, index)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetIntervalVarFromProtoIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an already created interval variable from its index."""</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntervalVarFromProtoIndex: out of bound index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">constraints</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">ct</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s1">'interval'</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'GetIntervalVarFromProtoIndex: index </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s1"> does not reference an'</span>
|
|
<span class="o">+</span> <span class="s1">' interval variable'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">IntervalVar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns an already created interval variable from its index.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.Proto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.Proto">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Proto</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Proto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the underlying CpModelProto."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the underlying CpModelProto.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.Negated" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.Negated">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Negated</span><span class="signature">(self, index)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Negated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetOrMakeIndex" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetOrMakeIndex">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetOrMakeIndex</span><span class="signature">(self, arg)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetOrMakeIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the index of a variable, its negation, or a number."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">)</span> <span class="ow">and</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">and</span> <span class="n">arg</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="n">arg</span><span class="o">.</span><span class="n">Expression</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">arg</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetOrMakeIndex('</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">')'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the index of a variable, its negation, or a number.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetOrMakeBooleanIndex" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetOrMakeBooleanIndex">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetOrMakeBooleanIndex</span><span class="signature">(self, arg)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="sd">"""Returns an index from a boolean expression."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AssertIsBooleanVariable</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AssertIsBooleanVariable</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">Not</span><span class="p">())</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
|
<span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_boolean</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetOrMakeBooleanIndex('</span> <span class="o">+</span>
|
|
<span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns an index from a boolean expression.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetIntervalIndex" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetIntervalIndex">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetIntervalIndex</span><span class="signature">(self, arg)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetIntervalIndex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">IntervalVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'NotSupported: model.GetIntervalIndex(</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="n">arg</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.GetOrMakeIndexFromConstant" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.GetOrMakeIndexFromConstant">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">GetOrMakeIndexFromConstant</span><span class="signature">(self, value)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">GetOrMakeIndexFromConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">value</span><span class="p">]</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">value</span><span class="p">,</span> <span class="n">value</span><span class="p">])</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__constant_map</span><span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">index</span>
|
|
<span class="k">return</span> <span class="n">index</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.VarIndexToVarProto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.VarIndexToVarProto">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">VarIndexToVarProto</span><span class="signature">(self, var_index)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">VarIndexToVarProto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_index</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">var_index</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">var_index</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="o">-</span><span class="n">var_index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.ParseLinearExpression" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.ParseLinearExpression">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ParseLinearExpression</span><span class="signature">(self, linear_expr, negate=False)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ParseLinearExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linear_expr</span><span class="p">,</span> <span class="n">negate</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a LinearExpressionProto built from a LinearExpr instance."""</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">LinearExpressionProto</span><span class="p">()</span>
|
|
<span class="n">mult</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">negate</span> <span class="k">else</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">mult</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">linear_expr</span><span class="p">))</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mult</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="n">coeffs_map</span><span class="p">,</span> <span class="n">constant</span> <span class="o">=</span> <span class="n">linear_expr</span><span class="o">.</span><span class="n">GetIntegerVarValueMap</span><span class="p">()</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">constant</span> <span class="o">*</span> <span class="n">mult</span>
|
|
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">coeffs_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Wrong argument'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">cmh</span><span class="o">.</span><span class="n">assert_is_int64</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">coeffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span> <span class="o">*</span> <span class="n">mult</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns a LinearExpressionProto built from a LinearExpr instance.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.Minimize" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.Minimize">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Minimize</span><span class="signature">(self, obj)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Minimize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model to minimize(obj)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetObjective</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Sets the objective of the model to minimize(obj).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.Maximize" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.Maximize">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Maximize</span><span class="signature">(self, obj)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Maximize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""Sets the objective of the model to maximize(obj)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetObjective</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">minimize</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Sets the objective of the model to maximize(obj).</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.HasObjective" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.HasObjective">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">HasObjective</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">HasObjective</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s1">'objective'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddDecisionStrategy" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddDecisionStrategy">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddDecisionStrategy</span><span class="signature">(self, variables, var_strategy, domain_strategy)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddDecisionStrategy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">,</span> <span class="n">var_strategy</span><span class="p">,</span> <span class="n">domain_strategy</span><span class="p">):</span>
|
|
<span class="sd">"""Adds a search strategy to the model.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> variables: a list of variables this strategy will assign.</span>
|
|
<span class="sd"> var_strategy: heuristic to choose the next variable to assign.</span>
|
|
<span class="sd"> domain_strategy: heuristic to reduce the domain of the selected variable.</span>
|
|
<span class="sd"> Currently, this is advanced code: the union of all strategies added to</span>
|
|
<span class="sd"> the model must be complete, i.e. instantiates all variables.</span>
|
|
<span class="sd"> Otherwise, Solve() will fail.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">strategy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">search_strategy</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">variables</span><span class="p">:</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">variables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">variable_selection_strategy</span> <span class="o">=</span> <span class="n">var_strategy</span>
|
|
<span class="n">strategy</span><span class="o">.</span><span class="n">domain_reduction_strategy</span> <span class="o">=</span> <span class="n">domain_strategy</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds a search strategy to the model.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>variables:</strong> a list of variables this strategy will assign.</li>
|
|
<li><strong>var_strategy:</strong> heuristic to choose the next variable to assign.</li>
|
|
<li><strong>domain_strategy:</strong> heuristic to reduce the domain of the selected variable.
|
|
Currently, this is advanced code: the union of all strategies added to
|
|
the model must be complete, i.e. instantiates all variables.
|
|
Otherwise, Solve() will fail.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.ModelStats" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.ModelStats">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ModelStats</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ModelStats</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a string containing some model statistics."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedModelStats</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns a string containing some model statistics.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.Validate" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.Validate">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Validate</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a string indicating that the model is invalid."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedValidateModel</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns a string indicating that the model is invalid.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.ExportToFile" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.ExportToFile">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ExportToFile</span><span class="signature">(self, file)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ExportToFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
|
|
<span class="sd">"""Write the model as a protocol buffer to 'file'.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> file: file to write the model to. If the filename ends with 'txt', the</span>
|
|
<span class="sd"> model will be written as a text file, otherwise, the binary format will</span>
|
|
<span class="sd"> be used.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> True if the model was correctly written.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedWriteModelToFile</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">file</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Write the model as a protocol buffer to 'file'.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>file:</strong> file to write the model to. If the filename ends with 'txt', the
|
|
model will be written as a text file, otherwise, the binary format will
|
|
be used.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>True if the model was correctly written.</p>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AssertIsBooleanVariable" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AssertIsBooleanVariable">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AssertIsBooleanVariable</span><span class="signature">(self, x)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AssertIsBooleanVariable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">variables</span><span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">var</span><span class="o">.</span><span class="n">domain</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a boolean variable'</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'TypeError: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="s1">' is not a boolean variable'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddHint" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddHint">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddHint</span><span class="signature">(self, var, value)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddHint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""Adds 'var == value' as a hint to the solver."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">solution_hint</span><span class="o">.</span><span class="n">vars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeIndex</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">solution_hint</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Adds 'var == value' as a hint to the solver.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.ClearHints" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.ClearHints">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ClearHints</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ClearHints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Remove any solution hint from the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'solution_hint'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Remove any solution hint from the model.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAssumption" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAssumption">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAssumption</span><span class="signature">(self, lit)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAssumption</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lit</span><span class="p">):</span>
|
|
<span class="sd">"""Add the literal 'lit' to the model as assumptions."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">assumptions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GetOrMakeBooleanIndex</span><span class="p">(</span><span class="n">lit</span><span class="p">))</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Add the literal 'lit' to the model as assumptions.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.AddAssumptions" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.AddAssumptions">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">AddAssumptions</span><span class="signature">(self, literals)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">AddAssumptions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">literals</span><span class="p">):</span>
|
|
<span class="sd">"""Add the literals to the model as assumptions."""</span>
|
|
<span class="k">for</span> <span class="n">lit</span> <span class="ow">in</span> <span class="n">literals</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">AddAssumption</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Add the literals to the model as assumptions.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpModel.ClearAssumptions" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpModel.ClearAssumptions">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ClearAssumptions</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ClearAssumptions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Remove all assumptions from the model."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span><span class="o">.</span><span class="n">ClearField</span><span class="p">(</span><span class="s1">'assumptions'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Remove all assumptions from the model.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</section>
|
|
<section id="ExpandGeneratorOrTuple">
|
|
<div class="attr function"><a class="headerlink" href="#ExpandGeneratorOrTuple">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ExpandGeneratorOrTuple</span><span class="signature">(args)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">ExpandGeneratorOrTuple</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="s1">'__len__'</span><span class="p">):</span> <span class="c1"># Tuple</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">args</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_a_number</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">args</span>
|
|
<span class="c1"># Generator</span>
|
|
<span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</section>
|
|
<section id="EvaluateLinearExpr">
|
|
<div class="attr function"><a class="headerlink" href="#EvaluateLinearExpr">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">EvaluateLinearExpr</span><span class="signature">(expression, solution)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">EvaluateLinearExpr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">solution</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluate a linear expression against a solution."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">LinearExpr</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Cannot interpret </span><span class="si">%s</span><span class="s1"> as a linear expression.'</span> <span class="o">%</span>
|
|
<span class="n">expression</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="n">expression</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Index</span><span class="p">()]</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">expr</span><span class="si">}</span><span class="s1"> as a linear expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">value</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Evaluate a linear expression against a solution.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="EvaluateBooleanExpression">
|
|
<div class="attr function"><a class="headerlink" href="#EvaluateBooleanExpression">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">EvaluateBooleanExpression</span><span class="signature">(literal, solution)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">def</span> <span class="nf">EvaluateBooleanExpression</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">solution</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluate a boolean expression against a solution."""</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">literal</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">literal</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span>
|
|
<span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="n">literal</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">index</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="ow">not</span> <span class="n">solution</span><span class="o">.</span><span class="n">solution</span><span class="p">[</span><span class="o">-</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">literal</span><span class="si">}</span><span class="s1"> as a boolean expression.'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Evaluate a boolean expression against a solution.</p>
|
|
</div>
|
|
|
|
|
|
</section>
|
|
<section id="CpSolver">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#CpSolver">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">CpSolver</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">CpSolver</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""Main solver class.</span>
|
|
|
|
<span class="sd"> The purpose of this class is to search for a solution to the model provided</span>
|
|
<span class="sd"> to the Solve() method.</span>
|
|
|
|
<span class="sd"> Once Solve() is called, this class allows inspecting the solution found</span>
|
|
<span class="sd"> with the Value() and BooleanValue() methods, as well as general statistics</span>
|
|
<span class="sd"> about the solve procedure.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="p">:</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">solution_callback</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sd">"""Solves a problem and passes each solution to the callback if not null."""</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span> <span class="o">=</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="p">()</span>
|
|
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="o">.</span><span class="n">SetSerializedParameters</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">solve_wrapper</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">solution_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">AddSolutionCallback</span><span class="p">(</span><span class="n">solution_callback</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">AddLogCallback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span><span class="o">.</span><span class="n">FromString</span><span class="p">(</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="o">.</span><span class="n">SerializedSolve</span><span class="p">(</span>
|
|
<span class="n">model</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">solve_wrapper</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="n">solution_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">ClearSolutionCallback</span><span class="p">(</span><span class="n">solution_callback</span><span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SolveWithSolutionCallback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
|
|
<span class="sd">"""DEPRECATED Use Solve() with the callback argument."""</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s1">'SolveWithSolutionCallback is deprecated; use Solve() with'</span> <span class="o">+</span>
|
|
<span class="s1">'the callback argument.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Solve</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SearchForAllSolutions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
|
|
<span class="sd">"""DEPRECATED Use Solve() with the right parameter.</span>
|
|
|
|
<span class="sd"> Search for all solutions of a satisfiability problem.</span>
|
|
|
|
<span class="sd"> This method searches for all feasible solutions of a given model.</span>
|
|
<span class="sd"> Then it feeds the solution to the callback.</span>
|
|
|
|
<span class="sd"> Note that the model cannot contain an objective.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> model: The model to solve.</span>
|
|
<span class="sd"> callback: The callback that will be called at each solution.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> The status of the solve:</span>
|
|
|
|
<span class="sd"> * *FEASIBLE* if some solutions have been found</span>
|
|
<span class="sd"> * *INFEASIBLE* if the solver has proved there are no solution</span>
|
|
<span class="sd"> * *OPTIMAL* if all solutions have been found</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s1">'SearchForAllSolutions is deprecated; use Solve() with'</span> <span class="o">+</span>
|
|
<span class="s1">'enumerate_all_solutions = True.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">HasObjective</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Search for all solutions is only defined on '</span>
|
|
<span class="s1">'satisfiability problems'</span><span class="p">)</span>
|
|
<span class="c1"># Store old parameter.</span>
|
|
<span class="n">enumerate_all</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Solve</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Restore parameter.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span> <span class="o">=</span> <span class="n">enumerate_all</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
|
|
<span class="k">def</span> <span class="nf">StopSearch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Stops the current search asynchronously."""</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="o">.</span><span class="n">StopSearch</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the value of a linear expression after solve."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">EvaluateLinearExpr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">BooleanValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the boolean value of a literal after solve."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">EvaluateBooleanExpression</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ObjectiveValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the value of the objective after solve."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">objective_value</span>
|
|
|
|
<span class="k">def</span> <span class="nf">BestObjectiveBound</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the best lower (upper) bound found when min(max)imizing."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">best_objective_bound</span>
|
|
|
|
<span class="k">def</span> <span class="nf">StatusName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the name of the status returned by Solve()."""</span>
|
|
<span class="k">if</span> <span class="n">status</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">status</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
<span class="k">return</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverStatus</span><span class="o">.</span><span class="n">Name</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NumBooleans</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of boolean variables managed by the SAT solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_booleans</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NumConflicts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of conflicts since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_conflicts</span>
|
|
|
|
<span class="k">def</span> <span class="nf">NumBranches</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of search branches explored by the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_branches</span>
|
|
|
|
<span class="k">def</span> <span class="nf">WallTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the wall time in seconds since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">wall_time</span>
|
|
|
|
<span class="k">def</span> <span class="nf">UserTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the user time in seconds since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">user_time</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ResponseStats</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns some statistics on the solution found as a string."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedSolverResponseStats</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span> <span class="nf">ResponseProto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the response object."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SufficientAssumptionsForInfeasibility</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the indices of the infeasible assumptions."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">sufficient_assumptions_for_infeasibility</span>
|
|
|
|
<span class="k">def</span> <span class="nf">SolutionInfo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns some information on the solve process.</span>
|
|
|
|
<span class="sd"> Returns some information on how the solution was found, or the reason</span>
|
|
<span class="sd"> why the model or the parameters are invalid.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">solution_info</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Main solver class.</p>
|
|
|
|
<p>The purpose of this class is to search for a solution to the model provided
|
|
to the Solve() method.</p>
|
|
|
|
<p>Once Solve() is called, this class allows inspecting the solution found
|
|
with the Value() and BooleanValue() methods, as well as general statistics
|
|
about the solve procedure.</p>
|
|
</div>
|
|
|
|
|
|
<div id="CpSolver.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.__init__">#  </a>
|
|
|
|
|
|
<span class="name">CpSolver</span><span class="signature">()</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__model</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span> <span class="o">=</span> <span class="n">sat_parameters_pb2</span><span class="o">.</span><span class="n">SatParameters</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="p">:</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.Solve" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.Solve">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Solve</span><span class="signature">(self, model, solution_callback=None)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">solution_callback</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sd">"""Solves a problem and passes each solution to the callback if not null."""</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span> <span class="o">=</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="p">()</span>
|
|
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="o">.</span><span class="n">SetSerializedParameters</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">solve_wrapper</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">solution_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">AddSolutionCallback</span><span class="p">(</span><span class="n">solution_callback</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">AddLogCallback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_callback</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span> <span class="o">=</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span><span class="o">.</span><span class="n">FromString</span><span class="p">(</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolveWrapper</span><span class="o">.</span><span class="n">SerializedSolve</span><span class="p">(</span>
|
|
<span class="n">model</span><span class="o">.</span><span class="n">Proto</span><span class="p">()</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="n">solve_wrapper</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="n">solution_callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">solve_wrapper</span><span class="o">.</span><span class="n">ClearSolutionCallback</span><span class="p">(</span><span class="n">solution_callback</span><span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Solves a problem and passes each solution to the callback if not null.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.SolveWithSolutionCallback" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.SolveWithSolutionCallback">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">SolveWithSolutionCallback</span><span class="signature">(self, model, callback)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">SolveWithSolutionCallback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
|
|
<span class="sd">"""DEPRECATED Use Solve() with the callback argument."""</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s1">'SolveWithSolutionCallback is deprecated; use Solve() with'</span> <span class="o">+</span>
|
|
<span class="s1">'the callback argument.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">Solve</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>DEPRECATED Use Solve() with the callback argument.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.SearchForAllSolutions" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.SearchForAllSolutions">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">SearchForAllSolutions</span><span class="signature">(self, model, callback)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">SearchForAllSolutions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
|
|
<span class="sd">"""DEPRECATED Use Solve() with the right parameter.</span>
|
|
|
|
<span class="sd"> Search for all solutions of a satisfiability problem.</span>
|
|
|
|
<span class="sd"> This method searches for all feasible solutions of a given model.</span>
|
|
<span class="sd"> Then it feeds the solution to the callback.</span>
|
|
|
|
<span class="sd"> Note that the model cannot contain an objective.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> model: The model to solve.</span>
|
|
<span class="sd"> callback: The callback that will be called at each solution.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> The status of the solve:</span>
|
|
|
|
<span class="sd"> * *FEASIBLE* if some solutions have been found</span>
|
|
<span class="sd"> * *INFEASIBLE* if the solver has proved there are no solution</span>
|
|
<span class="sd"> * *OPTIMAL* if all solutions have been found</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s1">'SearchForAllSolutions is deprecated; use Solve() with'</span> <span class="o">+</span>
|
|
<span class="s1">'enumerate_all_solutions = True.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">HasObjective</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Search for all solutions is only defined on '</span>
|
|
<span class="s1">'satisfiability problems'</span><span class="p">)</span>
|
|
<span class="c1"># Store old parameter.</span>
|
|
<span class="n">enumerate_all</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">Solve</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Restore parameter.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parameters</span><span class="o">.</span><span class="n">enumerate_all_solutions</span> <span class="o">=</span> <span class="n">enumerate_all</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>DEPRECATED Use Solve() with the right parameter.</p>
|
|
|
|
<p>Search for all solutions of a satisfiability problem.</p>
|
|
|
|
<p>This method searches for all feasible solutions of a given model.
|
|
Then it feeds the solution to the callback.</p>
|
|
|
|
<p>Note that the model cannot contain an objective.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>model:</strong> The model to solve.</li>
|
|
<li><strong>callback:</strong> The callback that will be called at each solution.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>The status of the solve:</p>
|
|
|
|
<ul>
|
|
<li><em>FEASIBLE</em> if some solutions have been found</li>
|
|
<li><em>INFEASIBLE</em> if the solver has proved there are no solution</li>
|
|
<li><em>OPTIMAL</em> if all solutions have been found</li>
|
|
</ul>
|
|
</blockquote>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.StopSearch" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.StopSearch">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">StopSearch</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">StopSearch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Stops the current search asynchronously."""</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">__lock</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solve_wrapper</span><span class="o">.</span><span class="n">StopSearch</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Stops the current search asynchronously.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.Value" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.Value">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Value</span><span class="signature">(self, expression)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the value of a linear expression after solve."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">EvaluateLinearExpr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the value of a linear expression after solve.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.BooleanValue" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.BooleanValue">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">BooleanValue</span><span class="signature">(self, literal)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">BooleanValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">literal</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the boolean value of a literal after solve."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">EvaluateBooleanExpression</span><span class="p">(</span><span class="n">literal</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the boolean value of a literal after solve.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.ObjectiveValue" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.ObjectiveValue">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ObjectiveValue</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ObjectiveValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the value of the objective after solve."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">objective_value</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the value of the objective after solve.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.BestObjectiveBound" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.BestObjectiveBound">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">BestObjectiveBound</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">BestObjectiveBound</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the best lower (upper) bound found when min(max)imizing."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">best_objective_bound</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the best lower (upper) bound found when min(max)imizing.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.StatusName" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.StatusName">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">StatusName</span><span class="signature">(self, status=None)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">StatusName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the name of the status returned by Solve()."""</span>
|
|
<span class="k">if</span> <span class="n">status</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">status</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">status</span>
|
|
<span class="k">return</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverStatus</span><span class="o">.</span><span class="n">Name</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the name of the status returned by Solve().</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.NumBooleans" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.NumBooleans">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NumBooleans</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NumBooleans</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of boolean variables managed by the SAT solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_booleans</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the number of boolean variables managed by the SAT solver.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.NumConflicts" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.NumConflicts">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NumConflicts</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NumConflicts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of conflicts since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_conflicts</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the number of conflicts since the creation of the solver.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.NumBranches" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.NumBranches">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">NumBranches</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">NumBranches</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of search branches explored by the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">num_branches</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the number of search branches explored by the solver.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.WallTime" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.WallTime">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">WallTime</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">WallTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the wall time in seconds since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">wall_time</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the wall time in seconds since the creation of the solver.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.UserTime" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.UserTime">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">UserTime</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">UserTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the user time in seconds since the creation of the solver."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">user_time</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the user time in seconds since the creation of the solver.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.ResponseStats" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.ResponseStats">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ResponseStats</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ResponseStats</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns some statistics on the solution found as a string."""</span>
|
|
<span class="k">return</span> <span class="n">swig_helper</span><span class="o">.</span><span class="n">CpSatHelper</span><span class="o">.</span><span class="n">SerializedSolverResponseStats</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns some statistics on the solution found as a string.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.ResponseProto" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.ResponseProto">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">ResponseProto</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">ResponseProto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the response object."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the response object.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.SufficientAssumptionsForInfeasibility" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.SufficientAssumptionsForInfeasibility">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">SufficientAssumptionsForInfeasibility</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">SufficientAssumptionsForInfeasibility</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the indices of the infeasible assumptions."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">sufficient_assumptions_for_infeasibility</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the indices of the infeasible assumptions.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolver.SolutionInfo" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolver.SolutionInfo">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">SolutionInfo</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">SolutionInfo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns some information on the solve process.</span>
|
|
|
|
<span class="sd"> Returns some information on how the solution was found, or the reason</span>
|
|
<span class="sd"> why the model or the parameters are invalid.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution</span><span class="o">.</span><span class="n">solution_info</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns some information on the solve process.</p>
|
|
|
|
<p>Returns some information on how the solution was found, or the reason
|
|
why the model or the parameters are invalid.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</section>
|
|
<section id="CpSolverSolutionCallback">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#CpSolverSolutionCallback">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">CpSolverSolutionCallback</span><wbr>(<span class="base">ortools.sat.python.swig_helper.SolutionCallback</span>):
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">CpSolverSolutionCallback</span><span class="p">(</span><span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Solution callback.</span>
|
|
|
|
<span class="sd"> This class implements a callback that will be called at each new solution</span>
|
|
<span class="sd"> found during search.</span>
|
|
|
|
<span class="sd"> The method OnSolutionCallback() will be called by the solver, and must be</span>
|
|
<span class="sd"> implemented. The current solution can be queried using the BooleanValue()</span>
|
|
<span class="sd"> and Value() methods.</span>
|
|
|
|
<span class="sd"> It inherits the following methods from its base class:</span>
|
|
|
|
<span class="sd"> * `ObjectiveValue(self)`</span>
|
|
<span class="sd"> * `BestObjectiveBound(self)`</span>
|
|
<span class="sd"> * `NumBooleans(self)`</span>
|
|
<span class="sd"> * `NumConflicts(self)`</span>
|
|
<span class="sd"> * `NumBranches(self)`</span>
|
|
<span class="sd"> * `WallTime(self)`</span>
|
|
<span class="sd"> * `UserTime(self)`</span>
|
|
|
|
<span class="sd"> These methods returns the same information as their counterpart in the</span>
|
|
<span class="sd"> `CpSolver` class.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">OnSolutionCallback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Proxy for the same method in snake case."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">on_solution_callback</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">BooleanValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lit</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the boolean value of a boolean literal.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> lit: A boolean variable or its negation.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> The Boolean value of the literal in the solution.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> RuntimeError: if `lit` is not a boolean variable or its negation.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">HasResponse</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">lit</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="n">lit</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">SolutionBooleanValue</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">lit</span><span class="si">}</span><span class="s1"> as a boolean expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluates an linear expression in the current solution.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> expression: a linear expression of the model.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An integer value equal to the evaluation of the linear expression</span>
|
|
<span class="sd"> against the current solution.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> RuntimeError: if 'expression' is not a LinearExpr.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">HasResponse</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="n">expression</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">SolutionIntegerValue</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">SolutionIntegerValue</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s1"> as a linear expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">value</span>
|
|
|
|
<span class="k">def</span> <span class="nf">Response</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the current solution response."""</span>
|
|
<span class="k">return</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span><span class="o">.</span><span class="n">FromString</span><span class="p">(</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="o">.</span><span class="n">SerializedResponse</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Solution callback.</p>
|
|
|
|
<p>This class implements a callback that will be called at each new solution
|
|
found during search.</p>
|
|
|
|
<p>The method OnSolutionCallback() will be called by the solver, and must be
|
|
implemented. The current solution can be queried using the BooleanValue()
|
|
and Value() methods.</p>
|
|
|
|
<p>It inherits the following methods from its base class:</p>
|
|
|
|
<ul>
|
|
<li><code>ObjectiveValue(self)</code></li>
|
|
<li><code>BestObjectiveBound(self)</code></li>
|
|
<li><code>NumBooleans(self)</code></li>
|
|
<li><code>NumConflicts(self)</code></li>
|
|
<li><code>NumBranches(self)</code></li>
|
|
<li><code>WallTime(self)</code></li>
|
|
<li><code>UserTime(self)</code></li>
|
|
</ul>
|
|
|
|
<p>These methods returns the same information as their counterpart in the
|
|
<code><a href="#CpSolver">CpSolver</a></code> class.</p>
|
|
</div>
|
|
|
|
|
|
<div id="CpSolverSolutionCallback.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolverSolutionCallback.__init__">#  </a>
|
|
|
|
|
|
<span class="name">CpSolverSolutionCallback</span><span class="signature">()</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>__init__(self: ortools.sat.python.swig_helper.SolutionCallback) -> None</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolverSolutionCallback.OnSolutionCallback" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolverSolutionCallback.OnSolutionCallback">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">OnSolutionCallback</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">OnSolutionCallback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Proxy for the same method in snake case."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">on_solution_callback</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Proxy for the same method in snake case.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolverSolutionCallback.BooleanValue" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolverSolutionCallback.BooleanValue">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">BooleanValue</span><span class="signature">(self, lit)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">BooleanValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lit</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the boolean value of a boolean literal.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> lit: A boolean variable or its negation.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> The Boolean value of the literal in the solution.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> RuntimeError: if `lit` is not a boolean variable or its negation.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">HasResponse</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">lit</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">lit</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">lit</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">index</span> <span class="o">=</span> <span class="n">lit</span><span class="o">.</span><span class="n">Index</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">SolutionBooleanValue</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">lit</span><span class="si">}</span><span class="s1"> as a boolean expression.'</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the boolean value of a boolean literal.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>lit:</strong> A boolean variable or its negation.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>The Boolean value of the literal in the solution.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>RuntimeError:</strong> if <code>lit</code> is not a boolean variable or its negation.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolverSolutionCallback.Value" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolverSolutionCallback.Value">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Value</span><span class="signature">(self, expression)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
|
<span class="sd">"""Evaluates an linear expression in the current solution.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> expression: a linear expression of the model.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> An integer value equal to the evaluation of the linear expression</span>
|
|
<span class="sd"> against the current solution.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> RuntimeError: if 'expression' is not a LinearExpr.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">HasResponse</span><span class="p">():</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Solve() has not be called.'</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">to_process</span> <span class="o">=</span> <span class="p">[(</span><span class="n">expression</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">to_process</span><span class="p">:</span>
|
|
<span class="n">expr</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">cmh</span><span class="o">.</span><span class="n">is_integral</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="nb">int</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_ProductCst</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expression</span><span class="p">(),</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficient</span><span class="p">()))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_Sum</span><span class="p">):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Left</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">expr</span><span class="o">.</span><span class="n">Right</span><span class="p">(),</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_SumArray</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">():</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_WeightedSum</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Expressions</span><span class="p">(),</span> <span class="n">expr</span><span class="o">.</span><span class="n">Coefficients</span><span class="p">()):</span>
|
|
<span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">e</span><span class="p">,</span> <span class="n">coeff</span> <span class="o">*</span> <span class="n">c</span><span class="p">))</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">expr</span><span class="o">.</span><span class="n">Constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">coeff</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">IntVar</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">SolutionIntegerValue</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Index</span><span class="p">())</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_NotBooleanVariable</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">+=</span> <span class="n">coeff</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">SolutionIntegerValue</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">Not</span><span class="p">()</span><span class="o">.</span><span class="n">Index</span><span class="p">()))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">'Cannot interpret </span><span class="si">{</span><span class="n">expression</span><span class="si">}</span><span class="s1"> as a linear expression.'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">value</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Evaluates an linear expression in the current solution.</p>
|
|
|
|
<h6 id="args">Args</h6>
|
|
|
|
<ul>
|
|
<li><strong>expression:</strong> a linear expression of the model.</li>
|
|
</ul>
|
|
|
|
<h6 id="returns">Returns</h6>
|
|
|
|
<blockquote>
|
|
<p>An integer value equal to the evaluation of the linear expression
|
|
against the current solution.</p>
|
|
</blockquote>
|
|
|
|
<h6 id="raises">Raises</h6>
|
|
|
|
<ul>
|
|
<li><strong>RuntimeError:</strong> if 'expression' is not a LinearExpr.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="CpSolverSolutionCallback.Response" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#CpSolverSolutionCallback.Response">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">Response</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Response</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the current solution response."""</span>
|
|
<span class="k">return</span> <span class="n">cp_model_pb2</span><span class="o">.</span><span class="n">CpSolverResponse</span><span class="o">.</span><span class="n">FromString</span><span class="p">(</span>
|
|
<span class="n">swig_helper</span><span class="o">.</span><span class="n">SolutionCallback</span><span class="o">.</span><span class="n">SerializedResponse</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the current solution response.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div class="inherited">
|
|
<h5>Inherited Members</h5>
|
|
<dl>
|
|
<div><dt>ortools.sat.python.swig_helper.SolutionCallback</dt>
|
|
<dd id="CpSolverSolutionCallback.BestObjectiveBound" class="function">BestObjectiveBound</dd>
|
|
<dd id="CpSolverSolutionCallback.DeterministicTime" class="function">DeterministicTime</dd>
|
|
<dd id="CpSolverSolutionCallback.HasResponse" class="function">HasResponse</dd>
|
|
<dd id="CpSolverSolutionCallback.NumBinaryPropagations" class="function">NumBinaryPropagations</dd>
|
|
<dd id="CpSolverSolutionCallback.NumBooleans" class="function">NumBooleans</dd>
|
|
<dd id="CpSolverSolutionCallback.NumBranches" class="function">NumBranches</dd>
|
|
<dd id="CpSolverSolutionCallback.NumConflicts" class="function">NumConflicts</dd>
|
|
<dd id="CpSolverSolutionCallback.NumIntegerPropagations" class="function">NumIntegerPropagations</dd>
|
|
<dd id="CpSolverSolutionCallback.ObjectiveValue" class="function">ObjectiveValue</dd>
|
|
<dd id="CpSolverSolutionCallback.SerializedResponse" class="function">SerializedResponse</dd>
|
|
<dd id="CpSolverSolutionCallback.SolutionBooleanValue" class="function">SolutionBooleanValue</dd>
|
|
<dd id="CpSolverSolutionCallback.SolutionIntegerValue" class="function">SolutionIntegerValue</dd>
|
|
<dd id="CpSolverSolutionCallback.StopSearch" class="function">StopSearch</dd>
|
|
<dd id="CpSolverSolutionCallback.UserTime" class="function">UserTime</dd>
|
|
<dd id="CpSolverSolutionCallback.WallTime" class="function">WallTime</dd>
|
|
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
</section>
|
|
<section id="ObjectiveSolutionPrinter">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#ObjectiveSolutionPrinter">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">ObjectiveSolutionPrinter</span><wbr>(<span class="base"><a href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a></span>):
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">ObjectiveSolutionPrinter</span><span class="p">(</span><span class="n">CpSolverSolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Display the objective value and time of intermediate solutions."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ObjectiveValue</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s, objective = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Display the objective value and time of intermediate solutions.</p>
|
|
</div>
|
|
|
|
|
|
<div id="ObjectiveSolutionPrinter.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#ObjectiveSolutionPrinter.__init__">#  </a>
|
|
|
|
|
|
<span class="name">ObjectiveSolutionPrinter</span><span class="signature">()</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>__init__(self: ortools.sat.python.swig_helper.SolutionCallback) -> None</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="ObjectiveSolutionPrinter.on_solution_callback" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#ObjectiveSolutionPrinter.on_solution_callback">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">on_solution_callback</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ObjectiveValue</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s, objective = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Called on each new solution.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="ObjectiveSolutionPrinter.solution_count" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#ObjectiveSolutionPrinter.solution_count">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">solution_count</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the number of solutions found.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div class="inherited">
|
|
<h5>Inherited Members</h5>
|
|
<dl>
|
|
<div><dt><a href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a></dt>
|
|
<dd id="ObjectiveSolutionPrinter.OnSolutionCallback" class="function"><a href="#CpSolverSolutionCallback.OnSolutionCallback">OnSolutionCallback</a></dd>
|
|
<dd id="ObjectiveSolutionPrinter.BooleanValue" class="function"><a href="#CpSolverSolutionCallback.BooleanValue">BooleanValue</a></dd>
|
|
<dd id="ObjectiveSolutionPrinter.Value" class="function"><a href="#CpSolverSolutionCallback.Value">Value</a></dd>
|
|
<dd id="ObjectiveSolutionPrinter.Response" class="function"><a href="#CpSolverSolutionCallback.Response">Response</a></dd>
|
|
|
|
</div>
|
|
<div><dt>ortools.sat.python.swig_helper.SolutionCallback</dt>
|
|
<dd id="ObjectiveSolutionPrinter.BestObjectiveBound" class="function">BestObjectiveBound</dd>
|
|
<dd id="ObjectiveSolutionPrinter.DeterministicTime" class="function">DeterministicTime</dd>
|
|
<dd id="ObjectiveSolutionPrinter.HasResponse" class="function">HasResponse</dd>
|
|
<dd id="ObjectiveSolutionPrinter.NumBinaryPropagations" class="function">NumBinaryPropagations</dd>
|
|
<dd id="ObjectiveSolutionPrinter.NumBooleans" class="function">NumBooleans</dd>
|
|
<dd id="ObjectiveSolutionPrinter.NumBranches" class="function">NumBranches</dd>
|
|
<dd id="ObjectiveSolutionPrinter.NumConflicts" class="function">NumConflicts</dd>
|
|
<dd id="ObjectiveSolutionPrinter.NumIntegerPropagations" class="function">NumIntegerPropagations</dd>
|
|
<dd id="ObjectiveSolutionPrinter.ObjectiveValue" class="function">ObjectiveValue</dd>
|
|
<dd id="ObjectiveSolutionPrinter.SerializedResponse" class="function">SerializedResponse</dd>
|
|
<dd id="ObjectiveSolutionPrinter.SolutionBooleanValue" class="function">SolutionBooleanValue</dd>
|
|
<dd id="ObjectiveSolutionPrinter.SolutionIntegerValue" class="function">SolutionIntegerValue</dd>
|
|
<dd id="ObjectiveSolutionPrinter.StopSearch" class="function">StopSearch</dd>
|
|
<dd id="ObjectiveSolutionPrinter.UserTime" class="function">UserTime</dd>
|
|
<dd id="ObjectiveSolutionPrinter.WallTime" class="function">WallTime</dd>
|
|
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
</section>
|
|
<section id="VarArrayAndObjectiveSolutionPrinter">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#VarArrayAndObjectiveSolutionPrinter">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">VarArrayAndObjectiveSolutionPrinter</span><wbr>(<span class="base"><a href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a></span>):
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">VarArrayAndObjectiveSolutionPrinter</span><span class="p">(</span><span class="n">CpSolverSolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Print intermediate solutions (objective, variable values, time)."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__variables</span> <span class="o">=</span> <span class="n">variables</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ObjectiveValue</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s, objective = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__variables</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Print intermediate solutions (objective, variable values, time).</p>
|
|
</div>
|
|
|
|
|
|
<div id="VarArrayAndObjectiveSolutionPrinter.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#VarArrayAndObjectiveSolutionPrinter.__init__">#  </a>
|
|
|
|
|
|
<span class="name">VarArrayAndObjectiveSolutionPrinter</span><span class="signature">(variables)</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__variables</span> <span class="o">=</span> <span class="n">variables</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>__init__(self: ortools.sat.python.swig_helper.SolutionCallback) -> None</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="VarArrayAndObjectiveSolutionPrinter.on_solution_callback" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#VarArrayAndObjectiveSolutionPrinter.on_solution_callback">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">on_solution_callback</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ObjectiveValue</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s, objective = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">,</span> <span class="n">obj</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__variables</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Called on each new solution.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="VarArrayAndObjectiveSolutionPrinter.solution_count" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#VarArrayAndObjectiveSolutionPrinter.solution_count">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">solution_count</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the number of solutions found.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div class="inherited">
|
|
<h5>Inherited Members</h5>
|
|
<dl>
|
|
<div><dt><a href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a></dt>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.OnSolutionCallback" class="function"><a href="#CpSolverSolutionCallback.OnSolutionCallback">OnSolutionCallback</a></dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.BooleanValue" class="function"><a href="#CpSolverSolutionCallback.BooleanValue">BooleanValue</a></dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.Value" class="function"><a href="#CpSolverSolutionCallback.Value">Value</a></dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.Response" class="function"><a href="#CpSolverSolutionCallback.Response">Response</a></dd>
|
|
|
|
</div>
|
|
<div><dt>ortools.sat.python.swig_helper.SolutionCallback</dt>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.BestObjectiveBound" class="function">BestObjectiveBound</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.DeterministicTime" class="function">DeterministicTime</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.HasResponse" class="function">HasResponse</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.NumBinaryPropagations" class="function">NumBinaryPropagations</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.NumBooleans" class="function">NumBooleans</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.NumBranches" class="function">NumBranches</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.NumConflicts" class="function">NumConflicts</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.NumIntegerPropagations" class="function">NumIntegerPropagations</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.ObjectiveValue" class="function">ObjectiveValue</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.SerializedResponse" class="function">SerializedResponse</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.SolutionBooleanValue" class="function">SolutionBooleanValue</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.SolutionIntegerValue" class="function">SolutionIntegerValue</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.StopSearch" class="function">StopSearch</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.UserTime" class="function">UserTime</dd>
|
|
<dd id="VarArrayAndObjectiveSolutionPrinter.WallTime" class="function">WallTime</dd>
|
|
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
</section>
|
|
<section id="VarArraySolutionPrinter">
|
|
<div class="attr class">
|
|
<a class="headerlink" href="#VarArraySolutionPrinter">#  </a>
|
|
|
|
|
|
<span class="def">class</span>
|
|
<span class="name">VarArraySolutionPrinter</span><wbr>(<span class="base"><a href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a></span>):
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">VarArraySolutionPrinter</span><span class="p">(</span><span class="n">CpSolverSolutionCallback</span><span class="p">):</span>
|
|
<span class="sd">"""Print intermediate solutions (variable values, time)."""</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__variables</span> <span class="o">=</span> <span class="n">variables</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__variables</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Print intermediate solutions (variable values, time).</p>
|
|
</div>
|
|
|
|
|
|
<div id="VarArraySolutionPrinter.__init__" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#VarArraySolutionPrinter.__init__">#  </a>
|
|
|
|
|
|
<span class="name">VarArraySolutionPrinter</span><span class="signature">(variables)</span>
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">variables</span><span class="p">):</span>
|
|
<span class="n">CpSolverSolutionCallback</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__variables</span> <span class="o">=</span> <span class="n">variables</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>__init__(self: ortools.sat.python.swig_helper.SolutionCallback) -> None</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="VarArraySolutionPrinter.on_solution_callback" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#VarArraySolutionPrinter.on_solution_callback">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">on_solution_callback</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">on_solution_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Called on each new solution."""</span>
|
|
<span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Solution </span><span class="si">%i</span><span class="s1">, time = </span><span class="si">%0.2f</span><span class="s1"> s'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span><span class="p">,</span> <span class="n">current_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__start_time</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__variables</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1"> = </span><span class="si">%i</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Called on each new solution.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div id="VarArraySolutionPrinter.solution_count" class="classattr">
|
|
<div class="attr function"><a class="headerlink" href="#VarArraySolutionPrinter.solution_count">#  </a>
|
|
|
|
|
|
<span class="def">def</span>
|
|
<span class="name">solution_count</span><span class="signature">(self)</span>:
|
|
</div>
|
|
|
|
<details>
|
|
<summary>View Source</summary>
|
|
<div class="pdoc-code codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">solution_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""Returns the number of solutions found."""</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__solution_count</span>
|
|
</pre></div>
|
|
|
|
</details>
|
|
|
|
<div class="docstring"><p>Returns the number of solutions found.</p>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div class="inherited">
|
|
<h5>Inherited Members</h5>
|
|
<dl>
|
|
<div><dt><a href="#CpSolverSolutionCallback">CpSolverSolutionCallback</a></dt>
|
|
<dd id="VarArraySolutionPrinter.OnSolutionCallback" class="function"><a href="#CpSolverSolutionCallback.OnSolutionCallback">OnSolutionCallback</a></dd>
|
|
<dd id="VarArraySolutionPrinter.BooleanValue" class="function"><a href="#CpSolverSolutionCallback.BooleanValue">BooleanValue</a></dd>
|
|
<dd id="VarArraySolutionPrinter.Value" class="function"><a href="#CpSolverSolutionCallback.Value">Value</a></dd>
|
|
<dd id="VarArraySolutionPrinter.Response" class="function"><a href="#CpSolverSolutionCallback.Response">Response</a></dd>
|
|
|
|
</div>
|
|
<div><dt>ortools.sat.python.swig_helper.SolutionCallback</dt>
|
|
<dd id="VarArraySolutionPrinter.BestObjectiveBound" class="function">BestObjectiveBound</dd>
|
|
<dd id="VarArraySolutionPrinter.DeterministicTime" class="function">DeterministicTime</dd>
|
|
<dd id="VarArraySolutionPrinter.HasResponse" class="function">HasResponse</dd>
|
|
<dd id="VarArraySolutionPrinter.NumBinaryPropagations" class="function">NumBinaryPropagations</dd>
|
|
<dd id="VarArraySolutionPrinter.NumBooleans" class="function">NumBooleans</dd>
|
|
<dd id="VarArraySolutionPrinter.NumBranches" class="function">NumBranches</dd>
|
|
<dd id="VarArraySolutionPrinter.NumConflicts" class="function">NumConflicts</dd>
|
|
<dd id="VarArraySolutionPrinter.NumIntegerPropagations" class="function">NumIntegerPropagations</dd>
|
|
<dd id="VarArraySolutionPrinter.ObjectiveValue" class="function">ObjectiveValue</dd>
|
|
<dd id="VarArraySolutionPrinter.SerializedResponse" class="function">SerializedResponse</dd>
|
|
<dd id="VarArraySolutionPrinter.SolutionBooleanValue" class="function">SolutionBooleanValue</dd>
|
|
<dd id="VarArraySolutionPrinter.SolutionIntegerValue" class="function">SolutionIntegerValue</dd>
|
|
<dd id="VarArraySolutionPrinter.StopSearch" class="function">StopSearch</dd>
|
|
<dd id="VarArraySolutionPrinter.UserTime" class="function">UserTime</dd>
|
|
<dd id="VarArraySolutionPrinter.WallTime" class="function">WallTime</dd>
|
|
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</body>
|
|
</html> |