<!doctype html> <html lang="en"> <head> <meta charset="iso-8859-1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>docplex.mp.linear — DOcplex.MP: Mathematical Programming Modeling for Python V2.30 documentation</title> <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=03e43079" /> <link rel="stylesheet" type="text/css" href="../../../_static/bizstyle.css?v=c92c1228" /> <script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js?v=dd09d6e6"></script> <script src="../../../_static/doctools.js?v=888ff710"></script> <script src="../../../_static/sphinx_highlight.js?v=4825356b"></script> <script src="../../../_static/bizstyle.js"></script> <link rel="index" title="Index" href="../../../genindex.html" /> <link rel="search" title="Search" href="../../../search.html" /> <meta name="viewport" content="width=device-width,initial-scale=1.0" /> <!--[if lt IE 9]> <script src="_static/css3-mediaqueries.js"></script> <![endif]--> </head><body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="nav-item nav-item-0"><a href="../../../index.html">DOcplex.MP: Mathematical Programming Modeling for Python V2.30 documentation</a> »</li> <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> »</li> <li class="nav-item nav-item-this"><a href="">docplex.mp.linear</a></li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <h1>Source code for docplex.mp.linear</h1><div class="highlight"><pre> <span></span><span class="c1"># --------------------------------------------------------------------------</span> <span class="c1"># Source file provided under Apache License, Version 2.0, January 2004,</span> <span class="c1"># http://www.apache.org/licenses/</span> <span class="c1"># (c) Copyright IBM Corp. 2015, 2022</span> <span class="c1"># --------------------------------------------------------------------------</span> <span class="c1"># pylint: disable=too-many-lines</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">ComparisonType</span><span class="p">,</span> <span class="n">UpdateEvent</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.basic</span><span class="w"> </span><span class="kn">import</span> <span class="n">Expr</span><span class="p">,</span> <span class="n">ModelingObjectBase</span><span class="p">,</span> <span class="n">_SubscriptionMixin</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.operand</span><span class="w"> </span><span class="kn">import</span> <span class="n">LinearOperand</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_int</span><span class="p">,</span> <span class="n">is_number</span><span class="p">,</span> <span class="n">iter_emptyset</span><span class="p">,</span> <span class="n">is_quad_expr</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.dvar</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_var</span> <span class="c1"># ----------------------------</span> <span class="c1"># kept for compatibility</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.dvar</span><span class="w"> </span><span class="kn">import</span> <span class="n">Var</span> <span class="c1"># ------------------</span> <span class="kn">from</span><span class="w"> </span><span class="nn">docplex.mp.sttck</span><span class="w"> </span><span class="kn">import</span> <span class="n">StaticTypeChecker</span> <div class="viewcode-block" id="DOCplexQuadraticArithException"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.DOCplexQuadraticArithException">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">DOCplexQuadraticArithException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">pass</span></div> <span class="c1"># noinspection PyAbstractClass</span> <div class="viewcode-block" id="AbstractLinearExpr"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.AbstractLinearExpr">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">AbstractLinearExpr</span><span class="p">(</span><span class="n">LinearOperand</span><span class="p">,</span> <span class="n">Expr</span><span class="p">):</span> <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'_discrete_locked'</span><span class="p">,)</span> <div class="viewcode-block" id="AbstractLinearExpr.get_coef"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.AbstractLinearExpr.get_coef">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">get_coef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Returns the coefficient of a variable in the expression.</span> <span class="sd"> Note:</span> <span class="sd"> If the variable is not present in the expression, the function returns 0.</span> <span class="sd"> :param dvar: The variable for which the coefficient is being queried.</span> <span class="sd"> :return: A floating-point number.</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_typecheck_var</span><span class="p">(</span><span class="n">dvar</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">unchecked_get_coef</span><span class="p">(</span><span class="n">dvar</span><span class="p">)</span></div> <span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="c1"># direct access to a variable coef x[var]</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">unchecked_get_coef</span><span class="p">(</span><span class="n">dvar</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL: this is necessary to prevent expr from being an iterable.</span> <span class="c1"># as it follows getitem protocol, it can mistakenly be interpreted as an iterable</span> <span class="c1"># but this would make sum loop forever.</span> <span class="k">raise</span> <span class="ne">TypeError</span> <span class="k">def</span><span class="w"> </span><span class="nf">lock_discrete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># intern al: used for any expression used in linear constraints inside equivalences</span> <span class="bp">self</span><span class="o">.</span><span class="n">_discrete_locked</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_discrete_locked</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'_discrete_locked'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">check_discrete_lock_frozen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">check_expr_discrete_lock</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">relaxed_copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relaxed_model</span><span class="p">,</span> <span class="n">var_map</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">relaxed_model</span><span class="p">,</span> <span class="n">var_map</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">set_coefficients</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_coef_seq</span><span class="p">):</span> <span class="k">for</span> <span class="n">dv</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">var_coef_seq</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_coefficient</span><span class="p">(</span><span class="n">dv</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span></div> <div class="viewcode-block" id="MonomialExpr"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.MonomialExpr">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">MonomialExpr</span><span class="p">(</span><span class="n">_SubscriptionMixin</span><span class="p">,</span> <span class="n">AbstractLinearExpr</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">def</span><span class="w"> </span><span class="nf">_raw_solution_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</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="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span><span class="o">.</span><span class="n">_raw_solution_value</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="c1"># INTERNAL class</span> <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'_dvar'</span><span class="p">,</span> <span class="s1">'_coef'</span><span class="p">,</span> <span class="s1">'_subscribers'</span><span class="p">)</span> <span class="c1"># noinspection PyMissingConstructor</span> <span class="k">def</span><span class="w"> </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">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="kc">False</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"># faster than to call recursively init methods...</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span> <span class="o">=</span> <span class="n">dvar</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subscribers</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">safe</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">coeff</span> <span class="k">else</span><span class="p">:</span> <span class="n">validfn</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_checker</span><span class="o">.</span><span class="n">get_number_validation_fn</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">validfn</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span> <span class="k">if</span> <span class="n">validfn</span> <span class="k">else</span> <span class="n">coeff</span> <div class="viewcode-block" id="MonomialExpr.number_of_variables"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.MonomialExpr.number_of_variables">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">number_of_variables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span></div> <span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># py3 requires this function</span> <span class="k">return</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">var</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">_dvar</span> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">coef</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="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># for compatibility</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">as_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span> <span class="k">if</span> <span class="mi">1</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_coef</span> <span class="k">else</span> <span class="kc">None</span> <span class="k">def</span><span class="w"> </span><span class="nf">clone</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="vm">__class__</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">_dvar</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="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target_model</span><span class="p">,</span> <span class="n">var_mapping</span><span class="p">):</span> <span class="n">copy_var</span> <span class="o">=</span> <span class="n">var_mapping</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span><span class="p">]</span> <span class="k">return</span> <span class="n">MonomialExpr</span><span class="p">(</span><span class="n">target_model</span><span class="p">,</span> <span class="n">dvar</span><span class="o">=</span><span class="n">copy_var</span><span class="p">,</span> <span class="n">coeff</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_coef</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">iter_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_coef</span> <span class="n">iter_sorted_terms</span> <span class="o">=</span> <span class="n">iter_terms</span> <span class="k">def</span><span class="w"> </span><span class="nf">unchecked_get_coef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</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">if</span> <span class="n">dvar</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span> <span class="k">else</span> <span class="mi">0</span> <div class="viewcode-block" id="MonomialExpr.contains_var"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.MonomialExpr.contains_var">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">contains_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span> <span class="ow">is</span> <span class="n">dvar</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">is_normalized</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_coef</span> <span class="o">!=</span> <span class="mi">0</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_discrete</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">_dvar</span><span class="o">.</span><span class="n">is_discrete</span><span class="p">()</span> <span class="ow">and</span> <span class="n">is_int</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="c1"># arithmetics</span> <span class="k">def</span><span class="w"> </span><span class="nf">negate</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">_coef</span> <span class="o">=</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_coef</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span><span class="w"> </span><span class="nf">plus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">minus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="n">expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span> <span class="n">expr</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">return</span> <span class="n">expr</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">rminus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">times</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="mi">0</span> <span class="o">==</span> <span class="n">e</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">new_zero_expr</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># return a fresh instance</span> <span class="k">return</span> <span class="n">MonomialExpr</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">_dvar</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">e</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">)</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="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">elif</span> <span class="n">is_var</span><span class="p">(</span><span class="n">e</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">_qfactory</span><span class="o">.</span><span class="n">new_var_product</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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">MonomialExpr</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">_qfactory</span><span class="o">.</span><span class="n">new_monomial_product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span> <span class="k">return</span> <span class="n">expr</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">square</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">_qfactory</span><span class="o">.</span><span class="n">new_monomial_product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">quotient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># returns a new instance</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="o">.</span><span class="n">_typecheck_as_denominator</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> <span class="n">inverse</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="nb">float</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">return</span> <span class="n">MonomialExpr</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">_dvar</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">inverse</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__add__</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">minus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">_to_linear_operand</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">force_clone</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="o">.</span><span class="n">minus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">opposite</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span> <span class="k">return</span> <span class="n">opposite</span><span class="o">.</span><span class="n">negate</span><span class="p">()</span> <span class="k">def</span><span class="w"> </span><span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">__div__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">quotient</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># for py3</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__div__</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rtruediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># for py3</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">cannot_be_used_as_denominator_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="nf">__rdiv__</span><span class="p">(</span><span class="bp">self</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">model</span><span class="o">.</span><span class="n">cannot_be_used_as_denominator_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="c1"># changing a coef</span> <span class="k">def</span><span class="w"> </span><span class="nf">set_coefficient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coef</span><span class="p">):</span> <span class="n">m</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model</span> <span class="n">m</span><span class="o">.</span><span class="n">_typecheck_var</span><span class="p">(</span><span class="n">dvar</span><span class="p">)</span> <span class="n">m</span><span class="o">.</span><span class="n">_typecheck_num</span><span class="p">(</span><span class="n">coef</span><span class="p">,</span> <span class="s1">'Expr.set_coefficient()'</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_coefficient</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="n">coef</span><span class="p">)</span> <span class="n">set_coef</span> <span class="o">=</span> <span class="n">set_coefficient</span> <span class="k">def</span><span class="w"> </span><span class="nf">_set_coefficient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coef</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">item</span><span class="o">=</span><span class="n">coef</span><span class="p">)</span> <span class="k">if</span> <span class="n">dvar</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dvar</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">coef</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">coef</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">new_expr</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lfactory</span><span class="o">.</span><span class="n">new_zero_expr</span><span class="p">())</span> <span class="k">elif</span> <span class="n">coef</span><span class="p">:</span> <span class="c1"># monomail is extended to a linear expr</span> <span class="n">new_self</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span> <span class="n">new_self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="n">coef</span><span class="p">)</span> <span class="c1"># beware self is modified here</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">new_self</span><span class="p">)</span> <span class="c1"># noinspection PyMethodFirstArgAssignment</span> <span class="bp">self</span> <span class="o">=</span> <span class="n">new_self</span> <span class="k">return</span> <span class="bp">self</span> <span class="c1"># -- arithmetic to self</span> <span class="k">def</span><span class="w"> </span><span class="fm">__iadd__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_to_self</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">_add_to_self</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="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">item</span><span class="o">=</span><span class="n">other</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</span><span class="p">):</span> <span class="n">added</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">added</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">plus</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">notify_replaced</span><span class="p">(</span><span class="n">added</span><span class="p">)</span> <span class="k">return</span> <span class="n">added</span> <span class="k">def</span><span class="w"> </span><span class="nf">add</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_to_self</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__isub__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sub_to_self</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">_sub_to_self</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="c1"># INTERNAL</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">item</span><span class="o">=</span><span class="n">other</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</span><span class="p">):</span> <span class="n">expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span> <span class="n">expr</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="n">subtracted</span> <span class="o">=</span> <span class="n">expr</span> <span class="k">else</span><span class="p">:</span> <span class="n">subtracted</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">rminus</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">notify_replaced</span><span class="p">(</span><span class="n">subtracted</span><span class="p">)</span> <span class="k">return</span> <span class="n">subtracted</span> <span class="k">def</span><span class="w"> </span><span class="nf">subtract</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sub_to_self</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__imul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">multiply</span><span class="p">(</span><span class="bp">self</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">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="mi">0</span> <span class="o">==</span> <span class="n">e</span><span class="p">:</span> <span class="n">product</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">new_zero_expr</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">_coef</span> <span class="o">*=</span> <span class="n">e</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="n">product</span> <span class="o">=</span> <span class="bp">self</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="n">product</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">elif</span> <span class="n">is_var</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="n">product</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">_qfactory</span><span class="o">.</span><span class="n">new_var_product</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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">MonomialExpr</span><span class="p">):</span> <span class="n">product</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">_qfactory</span><span class="o">.</span><span class="n">new_monomial_product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">elif</span> <span class="n">is_quad_expr</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">has_quadratic_term</span><span class="p">():</span> <span class="n">StaticTypeChecker</span><span class="o">.</span><span class="n">mul_quad_lin_error</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="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">product</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">_qfactory</span><span class="o">.</span><span class="n">new_monomial_product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">linear_part</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">product</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">()</span><span class="o">.</span><span class="n">multiply</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">notify_replaced</span><span class="p">(</span><span class="n">product</span><span class="p">)</span> <span class="k">return</span> <span class="n">product</span> <span class="n">mul</span> <span class="o">=</span> <span class="n">multiply</span> <span class="k">def</span><span class="w"> </span><span class="nf">__idiv__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="fm">__itruediv__</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="c1"># pragma: no cover</span> <span class="c1"># for py3</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">divide</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="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="o">.</span><span class="n">_typecheck_as_denominator</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> <span class="n">inverse</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="nb">float</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">inverse</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">inverse</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span><span class="w"> </span><span class="nf">equals</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="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">and</span> \ <span class="n">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> \ <span class="n">other</span><span class="o">.</span><span class="n">number_of_terms</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> \ <span class="n">other</span><span class="o">.</span><span class="n">unchecked_get_coef</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_coef</span> <span class="c1"># conversion</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_linear_expr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">e</span> <span class="o">=</span> <span class="n">LinearExpr</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">e</span><span class="o">=</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dvar</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="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">transient</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">return</span> <span class="n">e</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_stringio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">oss</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">,</span> <span class="n">use_space</span><span class="p">,</span> <span class="n">var_namer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span><span class="o">.</span><span class="n">lp_name</span><span class="p">):</span> <span class="n">self_coef</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_coef</span> <span class="k">if</span> <span class="n">self_coef</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="k">if</span> <span class="n">self_coef</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">u</span><span class="s1">'-'</span><span class="p">)</span> <span class="n">self_coef</span> <span class="o">=</span> <span class="o">-</span> <span class="n">self_coef</span> <span class="k">if</span> <span class="n">self_coef</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_num_to_stringio</span><span class="p">(</span><span class="n">oss</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">self_coef</span><span class="p">,</span> <span class="n">ndigits</span><span class="o">=</span><span class="n">nb_digits</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_space</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">u</span><span class="s1">' '</span><span class="p">)</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">var_namer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dvar</span><span class="p">)))</span> <span class="k">def</span><span class="w"> </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="s2">"docplex.mp.MonomialExpr(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_string</span><span class="p">()</span></div> <span class="c1"># from private.debug_deco import count_instances</span> <span class="c1">#</span> <span class="c1"># @count_instances</span> <div class="viewcode-block" id="LinearExpr"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">LinearExpr</span><span class="p">(</span><span class="n">_SubscriptionMixin</span><span class="p">,</span> <span class="n">AbstractLinearExpr</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""LinearExpr()</span> <span class="sd"> This class models linear expressions.</span> <span class="sd"> This class is not intended to be instantiated. Expressions are built</span> <span class="sd"> either using operators or using `Model.linear_expr()`.</span> <span class="sd"> """</span> <span class="nd">@staticmethod</span> <span class="k">def</span><span class="w"> </span><span class="nf">_new_terms_dict</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">return</span> <span class="n">model</span><span class="o">.</span><span class="n">_lfactory</span><span class="o">.</span><span class="n">term_dict_type</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="c1"># @staticmethod</span> <span class="c1"># def _new_empty_terms_dict(model):</span> <span class="c1"># return model._lfactory.term_dict_type()</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_linear_expr</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="k">def</span><span class="w"> </span><span class="nf">_get_terms_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'_constant'</span><span class="p">,</span> <span class="s1">'_terms'</span><span class="p">,</span> <span class="s1">'_transient'</span><span class="p">,</span> <span class="s1">'_subscribers'</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># py3 requires this function</span> <span class="k">return</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span><span class="w"> </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">e</span><span class="o">=</span><span class="kc">None</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="n">safe</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">transient</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="n">ModelingObjectBase</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="n">model</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">safe</span> <span class="ow">and</span> <span class="n">constant</span><span class="p">:</span> <span class="n">model</span><span class="o">.</span><span class="n">_typecheck_num</span><span class="p">(</span><span class="n">constant</span><span class="p">,</span> <span class="s1">'LinearExpr()'</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="bp">self</span><span class="o">.</span><span class="n">_transient</span> <span class="o">=</span> <span class="n">transient</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subscribers</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span> <span class="k">if</span> <span class="n">safe</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="o">=</span> <span class="n">e</span> <span class="k">else</span><span class="p">:</span> <span class="n">self_terms</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_lfactory</span><span class="o">.</span><span class="n">term_dict_type</span><span class="p">()</span> <span class="k">for</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="n">model</span><span class="o">.</span><span class="n">_typecheck_var</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="n">model</span><span class="o">.</span><span class="n">_typecheck_num</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="s1">'LinearExpr'</span><span class="p">)</span> <span class="k">if</span> <span class="n">k</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="o">=</span> <span class="n">self_terms</span> <span class="k">return</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_lfactory</span><span class="o">.</span><span class="n">_new_term_dict</span><span class="p">()</span> <span class="k">if</span> <span class="n">e</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">pass</span> <span class="k">elif</span> <span class="n">is_var</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">_terms</span><span class="p">[</span><span class="n">e</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">elif</span> <span class="n">is_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="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">MonomialExpr</span><span class="p">):</span> <span class="c1"># TODO: simplify by self_terms[e.var] = e.coef</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">var</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">coef</span><span class="p">)</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="c1"># note that transient is not kept.</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">get_constant</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_new_terms_dict</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">_get_terms_dict</span><span class="p">())</span> <span class="c1"># make a copy</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="nb">tuple</span><span class="p">):</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="n">e</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">fatal</span><span class="p">(</span><span class="s2">"Cannot convert </span><span class="si">{0!r}</span><span class="s2"> to docplex.mp.LinearExpr, type is </span><span class="si">{1}</span><span class="s2">"</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">))</span> <span class="k">def</span><span class="w"> </span><span class="nf">keep</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">_transient</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_kept</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_transient</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_transient</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># pragma: no cover</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_transient</span> <span class="k">def</span><span class="w"> </span><span class="nf">clone_if_necessary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_transient</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="o">.</span><span class="n">_keep_all_exprs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_in_use</span><span class="p">():</span> <span class="k">return</span> <span class="bp">self</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">clone</span><span class="p">()</span> <span class="c1"># def set_name(self, name):</span> <span class="c1"># Expr.set_name(self, name)</span> <span class="c1"># # an expression with a name is not transient any more</span> <span class="c1"># if name:</span> <span class="c1"># self.keep()</span> <span class="c1">#</span> <span class="c1"># def _get_name(self):</span> <span class="c1"># return self._name</span> <span class="c1">#</span> <span class="c1"># name = property(_get_name, set_name)</span> <span class="c1"># from private.debug_deco import count_calls</span> <span class="c1"># @count_calls</span> <div class="viewcode-block" id="LinearExpr.clone"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.clone">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">clone</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Returns:</span> <span class="sd"> A copy of the expression on the same model.</span> <span class="sd"> """</span> <span class="n">cloned_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_new_terms_dict</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">_terms</span><span class="p">)</span> <span class="c1"># faster than copy() on OrderedDict()</span> <span class="n">cloned</span> <span class="o">=</span> <span class="n">LinearExpr</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="p">,</span> <span class="n">e</span><span class="o">=</span><span class="n">cloned_terms</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">_constant</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">return</span> <span class="n">cloned</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target_model</span><span class="p">,</span> <span class="n">var_mapping</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="n">copied_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_new_terms_dict</span><span class="p">(</span><span class="n">target_model</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_sorted_terms</span><span class="p">():</span> <span class="n">copied_terms</span><span class="p">[</span><span class="n">var_mapping</span><span class="p">[</span><span class="n">v</span><span class="p">]]</span> <span class="o">=</span> <span class="n">k</span> <span class="n">copied_expr</span> <span class="o">=</span> <span class="n">LinearExpr</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="n">target_model</span><span class="p">,</span> <span class="n">e</span><span class="o">=</span><span class="n">copied_terms</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">constant</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">return</span> <span class="n">copied_expr</span> <div class="viewcode-block" id="LinearExpr.negate"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.negate">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">negate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Takes the negation of an expression.</span> <span class="sd"> Changes the expression by replacing each variable coefficient and the constant term</span> <span class="sd"> by its opposite.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not create any new expression but modifies the `self` instance.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified self.</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="o">=</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="n">self_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">self_terms</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">k</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprGlobal</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">_clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Clears the expression.</span> <span class="sd"> All variables and coefficients are removed and the constant term is set to zero.</span> <span class="sd"> """</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="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> <div class="viewcode-block" id="LinearExpr.equals_constant"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.equals_constant">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">equals_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">scalar</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Checks if the expression equals a constant term.</span> <span class="sd"> Args:</span> <span class="sd"> scalar (float): A floating-point number.</span> <span class="sd"> Returns:</span> <span class="sd"> Boolean: True if the expression equals this constant term.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_constant</span><span class="p">()</span> <span class="ow">and</span> <span class="p">(</span><span class="n">scalar</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span><span class="p">)</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">is_zero</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">equals_constant</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <div class="viewcode-block" id="LinearExpr.is_constant"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.is_constant">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">is_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Checks if the expression is a constant.</span> <span class="sd"> Returns:</span> <span class="sd"> Boolean: True if the expression consists of only a constant term.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">as_variable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL: returns True if expression is in fact a variable (1*x)</span> <span class="k">if</span> <span class="mi">1</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">_terms</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span><span class="p">:</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="n">v</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_normalized</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">k</span> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">()</span> <span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">normalize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">doomed</span> <span class="o">=</span> <span class="p">[</span><span class="n">dv</span> <span class="k">for</span> <span class="n">dv</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">k</span><span class="p">]</span> <span class="n">lterms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">doomed</span><span class="p">:</span> <span class="k">del</span> <span class="n">lterms</span><span class="p">[</span><span class="n">d</span><span class="p">]</span> <div class="viewcode-block" id="LinearExpr.number_of_variables"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.number_of_variables">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">number_of_variables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="p">)</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">unchecked_get_coef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <div class="viewcode-block" id="LinearExpr.add_term"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.add_term">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">add_term</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Adds a term (variable and coefficient) to the expression.</span> <span class="sd"> Args:</span> <span class="sd"> dvar (:class:`Var`): A decision variable.</span> <span class="sd"> coeff (float): A floating-point number.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified expression itself.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">coeff</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">_typecheck_var</span><span class="p">(</span><span class="n">dvar</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">_typecheck_num</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">_add_term</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coef</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="n">self_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="n">new_coef</span> <span class="o">=</span> <span class="n">self_terms</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="n">coef</span> <span class="k">if</span> <span class="n">new_coef</span><span class="p">:</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">dvar</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_coef</span> <span class="k">else</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="k">del</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">dvar</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">def</span><span class="w"> </span><span class="nf">set_coefficient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</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">_typecheck_var</span><span class="p">(</span><span class="n">dvar</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">_typecheck_num</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_coefficient</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">)</span> <span class="n">set_coef</span> <span class="o">=</span> <span class="n">set_coefficient</span> <span class="k">def</span><span class="w"> </span><span class="nf">_set_coefficient_internal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">):</span> <span class="n">self_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="k">if</span> <span class="n">coeff</span> <span class="ow">or</span> <span class="n">dvar</span> <span class="ow">in</span> <span class="n">self_terms</span><span class="p">:</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">dvar</span><span class="p">]</span> <span class="o">=</span> <span class="n">coeff</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">def</span><span class="w"> </span><span class="nf">_set_coefficient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">coeff</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_coefficient_internal</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="n">coeff</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">coeff</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">normalize</span><span class="p">()</span> <span class="k">def</span><span class="w"> </span><span class="nf">set_coefficients</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_coef_seq</span><span class="p">):</span> <span class="c1"># TODO: typecheck</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_coefficients</span><span class="p">(</span><span class="n">var_coef_seq</span><span class="p">)</span> <span class="n">set_coefs</span> <span class="o">=</span> <span class="n">set_coefficients</span> <span class="k">def</span><span class="w"> </span><span class="nf">_set_coefficients</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_coef_seq</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">()</span> <span class="n">nb_changes</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">nb_nulls</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">dv</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">var_coef_seq</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_coefficient_internal</span><span class="p">(</span><span class="n">dv</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span> <span class="n">nb_changes</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">k</span><span class="p">:</span> <span class="n">nb_nulls</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">nb_changes</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span><span class="p">)</span> <span class="k">if</span> <span class="n">nb_nulls</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">normalize</span><span class="p">()</span> <div class="viewcode-block" id="LinearExpr.remove_term"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.remove_term">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">remove_term</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Removes a term associated with a variable from the expression.</span> <span class="sd"> Args:</span> <span class="sd"> dvar (:class:`Var`): A decision variable.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified expression.</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_coefficient</span><span class="p">(</span><span class="n">dvar</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></div> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> This property is used to get or set the constant term of the expression.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="nd">@constant</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span><span class="w"> </span><span class="nf">constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_constant</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_constant</span><span class="p">(</span><span class="n">new_constant</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_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">def</span><span class="w"> </span><span class="nf">_set_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_constant</span><span class="p">):</span> <span class="k">if</span> <span class="n">new_constant</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="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">new_constant</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">new_constant</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <div class="viewcode-block" id="LinearExpr.contains_var"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.contains_var">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">contains_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Checks whether a decision variable is part of an expression.</span> <span class="sd"> Args:</span> <span class="sd"> dvar (:class:`Var`): A decision variable.</span> <span class="sd"> Returns:</span> <span class="sd"> Boolean: True if `dvar` is mentioned in the expression with a nonzero coefficient.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">dvar</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span></div> <div class="viewcode-block" id="LinearExpr.equals"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.equals">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">equals</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="w"> </span><span class="sd">"""</span> <span class="sd"> This method is used to test equality between expressions.</span> <span class="sd"> Because of the overloading of operator `==` through the redefinition of</span> <span class="sd"> the `__eq__` method, you cannot use `==` to test for equality.</span> <span class="sd"> The `equals` method to test whether a given expression is equivalent to a variable.</span> <span class="sd"> Two linear expressions are equivalent if they have the same coefficient for all</span> <span class="sd"> variables.</span> <span class="sd"> Args:</span> <span class="sd"> other: a number or any expression.</span> <span class="sd"> Returns:</span> <span class="sd"> A boolean value, True if the passed expression is equivalent, else False.</span> <span class="sd"> Note:</span> <span class="sd"> A constant expression is considered equivalent to its constant number.</span> <span class="sd"> m.linear_expression(3).equals(3) returns True</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_constant</span><span class="p">()</span> <span class="ow">and</span> <span class="n">other</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">constant</span> <span class="k">else</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">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</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="n">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">():</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">number_of_terms</span><span class="p">()</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">number_of_terms</span><span class="p">():</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">for</span> <span class="n">dv</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="k">if</span> <span class="n">k</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">unchecked_get_coef</span><span class="p">(</span><span class="n">dv</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></div> <span class="c1"># noinspection PyPep8</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_stringio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">oss</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">,</span> <span class="n">use_space</span><span class="p">,</span> <span class="n">var_namer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span><span class="o">.</span><span class="n">lp_name</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="c1"># Writes unicode representation of self</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># noinspection PyPep8Naming</span> <span class="n">SP</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">' '</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">coeff</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_sorted_terms</span><span class="p">():</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">coeff</span><span class="p">:</span> <span class="k">continue</span> <span class="c1"># pragma: no cover</span> <span class="c1"># 1 separator</span> <span class="k">if</span> <span class="n">use_space</span> <span class="ow">and</span> <span class="n">c</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">SP</span><span class="p">)</span> <span class="c1"># ---</span> <span class="c1"># sign is printed if non-first OR negative</span> <span class="c1"># at the end of this block coeff is positive</span> <span class="k">if</span> <span class="n">coeff</span> <span class="o"><</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">c</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">u</span><span class="s1">'-'</span> <span class="k">if</span> <span class="n">coeff</span> <span class="o"><</span> <span class="mi">0</span> <span class="k">else</span> <span class="sa">u</span><span class="s1">'+'</span><span class="p">)</span> <span class="k">if</span> <span class="n">coeff</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="n">coeff</span> <span class="o">=</span> <span class="o">-</span><span class="n">coeff</span> <span class="k">if</span> <span class="n">use_space</span> <span class="ow">and</span> <span class="n">c</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">SP</span><span class="p">)</span> <span class="c1"># ---</span> <span class="k">if</span> <span class="mi">1</span> <span class="o">!=</span> <span class="n">coeff</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_num_to_stringio</span><span class="p">(</span><span class="n">oss</span><span class="p">,</span> <span class="n">coeff</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_space</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">SP</span><span class="p">)</span> <span class="n">varname</span> <span class="o">=</span> <span class="n">var_namer</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">varname</span><span class="p">))</span> <span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span> <span class="n">k</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">constant</span> <span class="k">if</span> <span class="n">c</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">_num_to_stringio</span><span class="p">(</span><span class="n">oss</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">)</span> <span class="k">elif</span> <span class="n">k</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="k">if</span> <span class="n">k</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="n">sign</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">'-'</span> <span class="n">k</span> <span class="o">=</span> <span class="o">-</span><span class="n">k</span> <span class="k">else</span><span class="p">:</span> <span class="n">sign</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">'+'</span> <span class="k">if</span> <span class="n">use_space</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">SP</span><span class="p">)</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">sign</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_space</span><span class="p">:</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">SP</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_num_to_stringio</span><span class="p">(</span><span class="n">oss</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">_add_expr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_expr</span><span class="p">):</span> <span class="c1"># INTERNAL</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="o">+=</span> <span class="n">other_expr</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="c1"># merge term dictionaries</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">other_expr</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="c1"># use unchecked version</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">_add_expr_scaled</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">factor</span><span class="p">):</span> <span class="c1"># INTERNAL: used by quadratic</span> <span class="k">if</span> <span class="n">factor</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">expr</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="o">*</span> <span class="n">factor</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="c1"># use unchecked version</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="o">*</span> <span class="n">factor</span><span class="p">)</span> <span class="c1"># --- algebra methods always modify self.</span> <div class="viewcode-block" id="LinearExpr.add"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.add">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Adds an expression to self.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not create an new expression but modifies the `self` instance.</span> <span class="sd"> Args:</span> <span class="sd"> e: The expression to be added. Can be a variable, an expression, or a number.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified self.</span> <span class="sd"> See Also:</span> <span class="sd"> The method :func:`plus` to compute a sum without modifying the self instance.</span> <span class="sd"> """</span> <span class="n">event</span> <span class="o">=</span> <span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprGlobal</span> <span class="k">if</span> <span class="n">is_var</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">_add_term</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">coef</span><span class="o">=</span><span class="mi">1</span><span class="p">)</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">LinearOperand</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_expr</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">ZeroExpr</span><span class="p">):</span> <span class="n">event</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">elif</span> <span class="n">is_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="n">validfn</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">_checker</span><span class="o">.</span><span class="n">get_number_validation_fn</span><span class="p">()</span> <span class="n">valid_e</span> <span class="o">=</span> <span class="n">validfn</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">if</span> <span class="n">validfn</span> <span class="k">else</span> <span class="n">e</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="o">+=</span> <span class="n">valid_e</span> <span class="n">event</span> <span class="o">=</span> <span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span> <span class="k">elif</span> <span class="n">is_quad_expr</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">raise</span> <span class="n">DOCplexQuadraticArithException</span> <span class="k">else</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">())</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unsupported_binary_operation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"+"</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">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">event</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span></div> <div class="viewcode-block" id="LinearExpr.iter_terms"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.iter_terms">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">iter_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Iterates over the terms in the expression.</span> <span class="sd"> Returns:</span> <span class="sd"> An iterator over the (variable, coefficient) pairs in the expression.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="o">.</span><span class="n">items</span><span class="p">()</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">number_of_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_terms</span><span class="p">)</span> <span class="o">+</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_constant</span><span class="p">)</span> <div class="viewcode-block" id="LinearExpr.subtract"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.subtract">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">subtract</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Subtracts an expression from this expression.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not create a new expression but modifies the `self` instance.</span> <span class="sd"> Args:</span> <span class="sd"> e: The expression to be subtracted. Can be either a variable, an expression, or a number.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified self.</span> <span class="sd"> See Also:</span> <span class="sd"> The method :func:`minus` to compute a difference without modifying the `self` instance.</span> <span class="sd"> """</span> <span class="n">event</span> <span class="o">=</span> <span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprCoef</span> <span class="k">if</span> <span class="n">is_var</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">_add_term</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">elif</span> <span class="n">is_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="n">event</span> <span class="o">=</span> <span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</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="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">is_constant</span><span class="p">()</span> <span class="ow">and</span> <span class="mi">0</span> <span class="o">==</span> <span class="n">e</span><span class="o">.</span><span class="n">get_constant</span><span class="p">():</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># 1. decr constant</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">constant</span> <span class="c1"># merge term dictionaries</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">-</span><span class="n">k</span><span class="p">)</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">MonomialExpr</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_term</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">var</span><span class="p">,</span> <span class="o">-</span><span class="n">e</span><span class="o">.</span><span class="n">coef</span><span class="p">)</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">ZeroExpr</span><span class="p">):</span> <span class="n">event</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">elif</span> <span class="n">is_quad_expr</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="c1">#</span> <span class="k">raise</span> <span class="n">DOCplexQuadraticArithException</span> <span class="k">else</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">to_linear_expr</span><span class="p">())</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unsupported_binary_operation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"-"</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">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">_scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">factor</span><span class="p">):</span> <span class="c1"># INTERNAL: used my multiply</span> <span class="c1"># this method modifies self.</span> <span class="k">if</span> <span class="mi">0</span> <span class="o">==</span> <span class="n">factor</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_clear</span><span class="p">()</span> <span class="k">elif</span> <span class="n">factor</span> <span class="o">!=</span> <span class="mi">1</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">factor</span> <span class="n">self_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">self_terms</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span> <span class="o">*</span> <span class="n">factor</span> <div class="viewcode-block" id="LinearExpr.multiply"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.multiply">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">multiply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Multiplies this expression by an expression.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not create a new expression but modifies the `self` instance.</span> <span class="sd"> Args:</span> <span class="sd"> e: The expression that is used to multiply `self`.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified `self`.</span> <span class="sd"> See Also:</span> <span class="sd"> The method :func:`times` to compute a multiplication without modifying the `self` instance.</span> <span class="sd"> """</span> <span class="n">mul_res</span> <span class="o">=</span> <span class="bp">self</span> <span class="n">event</span> <span class="o">=</span> <span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprGlobal</span> <span class="n">self_constant</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="k">if</span> <span class="n">is_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">_scale</span><span class="p">(</span><span class="n">factor</span><span class="o">=</span><span class="n">e</span><span class="p">)</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">LinearOperand</span><span class="p">):</span> <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">is_constant</span><span class="p">():</span> <span class="c1"># simple scaling</span> <span class="bp">self</span><span class="o">.</span><span class="n">_scale</span><span class="p">(</span><span class="n">factor</span><span class="o">=</span><span class="n">e</span><span class="o">.</span><span class="n">get_constant</span><span class="p">())</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_constant</span><span class="p">():</span> <span class="c1"># self is constant: import other terms , scaled.</span> <span class="c1"># set constant to zero.</span> <span class="k">if</span> <span class="n">self_constant</span><span class="p">:</span> <span class="k">for</span> <span class="n">lv</span><span class="p">,</span> <span class="n">lk</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_coefficient</span><span class="p">(</span><span class="n">dvar</span><span class="o">=</span><span class="n">lv</span><span class="p">,</span> <span class="n">coeff</span><span class="o">=</span><span class="n">lk</span> <span class="o">*</span> <span class="n">self_constant</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">get_constant</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">_scale</span><span class="p">(</span><span class="n">factor</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># yields a quadratic</span> <span class="n">mul_res</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">_qfactory</span><span class="o">.</span><span class="n">new_linexpr_product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="n">event</span> <span class="o">=</span> <span class="n">UpdateEvent</span><span class="o">.</span><span class="n">LinExprPromotedToQuad</span> <span class="c1"># elif isinstance(e, ZeroExpr):</span> <span class="c1"># self._scale(factor=0)</span> <span class="k">elif</span> <span class="n">is_quad_expr</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">number_of_quadratic_terms</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">linear_part</span><span class="p">)</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_constant</span><span class="p">():</span> <span class="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_constant</span><span class="p">())</span> <span class="k">else</span><span class="p">:</span> <span class="n">StaticTypeChecker</span><span class="o">.</span><span class="n">mul_quad_lin_error</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="p">,</span> <span class="n">e</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">fatal</span><span class="p">(</span><span class="s2">"Multiply expects variable, expr or number, </span><span class="si">{0!r}</span><span class="s2"> was passed (type is </span><span class="si">{1}</span><span class="s2">)"</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="nb">type</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">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">event</span><span class="p">)</span> <span class="k">return</span> <span class="n">mul_res</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">square</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">_qfactory</span><span class="o">.</span><span class="n">new_linexpr_product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> <div class="viewcode-block" id="LinearExpr.divide"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.divide">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">divide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Divides this expression by an operand.</span> <span class="sd"> Args:</span> <span class="sd"> e: The operand by which the self expression is divided. Only nonzero numbers are permitted.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not create a new expression but modifies the `self` instance.</span> <span class="sd"> Returns:</span> <span class="sd"> The modified `self`.</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_typecheck_as_denominator</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">numerator</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> <span class="n">inverse</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="nb">float</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">inverse</span><span class="p">)</span></div> <span class="c1"># operator-based API</span> <span class="k">def</span><span class="w"> </span><span class="nf">opposite</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">cloned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone_if_necessary</span><span class="p">()</span> <span class="n">cloned</span><span class="o">.</span><span class="n">negate</span><span class="p">()</span> <span class="k">return</span> <span class="n">cloned</span> <div class="viewcode-block" id="LinearExpr.plus"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.plus">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">plus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Computes the sum of the expression and some operand.</span> <span class="sd"> Args:</span> <span class="sd"> e: the expression to add to self. Can be either a variable, an expression or a number.</span> <span class="sd"> Returns:</span> <span class="sd"> a new expression equal to the sum of the self expression and `e`</span> <span class="sd"> Note:</span> <span class="sd"> This method doe snot modify self.</span> <span class="sd"> """</span> <span class="n">cloned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone_if_necessary</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">cloned</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">except</span> <span class="n">DOCplexQuadraticArithException</span><span class="p">:</span> <span class="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">minus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="n">cloned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone_if_necessary</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">cloned</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">except</span> <span class="n">DOCplexQuadraticArithException</span><span class="p">:</span> <span class="k">return</span> <span class="n">e</span><span class="o">.</span><span class="n">rminus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <div class="viewcode-block" id="LinearExpr.times"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.times">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">times</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Computes the multiplication of this expression with an operand.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not modify the `self` instance but returns a new expression instance.</span> <span class="sd"> Args:</span> <span class="sd"> e: The expression that is used to multiply `self`.</span> <span class="sd"> Returns:</span> <span class="sd"> A new instance of expression.</span> <span class="sd"> """</span> <span class="n">cloned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone_if_necessary</span><span class="p">()</span> <span class="k">return</span> <span class="n">cloned</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div> <div class="viewcode-block" id="LinearExpr.quotient"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.quotient">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">quotient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Computes the division of this expression with an operand.</span> <span class="sd"> Note:</span> <span class="sd"> This method does not modify the `self` instance but returns a new expression instance.</span> <span class="sd"> Args:</span> <span class="sd"> e: The expression that is used to modify `self`. Only nonzero numbers are permitted.</span> <span class="sd"> Returns:</span> <span class="sd"> A new instance of expression.</span> <span class="sd"> """</span> <span class="n">cloned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone_if_necessary</span><span class="p">()</span> <span class="n">cloned</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">return</span> <span class="n">cloned</span></div> <span class="k">def</span><span class="w"> </span><span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__iadd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">except</span> <span class="n">DOCplexQuadraticArithException</span><span class="p">:</span> <span class="n">r</span> <span class="o">=</span> <span class="n">e</span> <span class="o">+</span> <span class="bp">self</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">new_expr</span><span class="o">=</span><span class="n">r</span><span class="p">)</span> <span class="k">return</span> <span class="n">r</span> <span class="k">def</span><span class="w"> </span><span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">minus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="n">cloned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone_if_necessary</span><span class="p">()</span> <span class="n">cloned</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="n">cloned</span><span class="o">.</span><span class="n">negate</span><span class="p">()</span> <span class="k">return</span> <span class="n">cloned</span> <span class="k">def</span><span class="w"> </span><span class="fm">__isub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">except</span> <span class="n">DOCplexQuadraticArithException</span><span class="p">:</span> <span class="n">r</span> <span class="o">=</span> <span class="o">-</span><span class="n">e</span> <span class="o">+</span> <span class="bp">self</span> <span class="k">return</span> <span class="n">r</span> <span class="k">def</span><span class="w"> </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="bp">self</span><span class="o">.</span><span class="n">opposite</span><span class="p">()</span> <span class="k">def</span><span class="w"> </span><span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__imul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">__div__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">quotient</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">__idiv__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="fm">__itruediv__</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="c1"># this is for Python 3.z</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__div__</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rtruediv__</span><span class="p">(</span><span class="bp">self</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">fatal</span><span class="p">(</span><span class="s2">"Expression </span><span class="si">{0!s}</span><span class="s2"> cannot be used as divider of </span><span class="si">{1!s}</span><span class="s2">"</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">solution_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" This property returns the solution value of the variable.</span> <span class="sd"> Raises:</span> <span class="sd"> DOCplexException</span> <span class="sd"> if the model has not been solved.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">solution_value</span> <span class="k">def</span><span class="w"> </span><span class="nf">_raw_solution_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1"># INTERNAL: no checks</span> <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="n">sol</span> <span class="o">=</span> <span class="n">s</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="o">.</span><span class="n">solution</span> <span class="k">for</span> <span class="n">var</span><span class="p">,</span> <span class="n">koef</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="n">val</span> <span class="o">+=</span> <span class="n">koef</span> <span class="o">*</span> <span class="n">sol</span><span class="o">.</span><span class="n">_get_var_value</span><span class="p">(</span><span class="n">var</span><span class="p">)</span> <span class="k">return</span> <span class="n">val</span> <div class="viewcode-block" id="LinearExpr.is_discrete"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.LinearExpr.is_discrete">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">is_discrete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="w"> </span><span class="sd">""" Checks if the expression contains only discrete variables and coefficients.</span> <span class="sd"> Example:</span> <span class="sd"> If X is an integer variable, X, X+1, 2X+3 are discrete</span> <span class="sd"> but X+0.3, 1.5X, 2X + 0.7 are not.</span> <span class="sd"> Returns:</span> <span class="sd"> Boolean: True if the expression contains only discrete variables and coefficients.</span> <span class="sd"> """</span> <span class="n">self_cst</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="k">if</span> <span class="n">self_cst</span> <span class="o">!=</span> <span class="nb">int</span><span class="p">(</span><span class="n">self_cst</span><span class="p">):</span> <span class="c1"># a float constant with integer value is OK</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</span><span class="p">():</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">v</span><span class="o">.</span><span class="n">is_discrete</span><span class="p">()</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">is_int</span><span class="p">(</span><span class="n">k</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></div> <span class="k">def</span><span class="w"> </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="s2">"docplex.mp.LinearExpr(</span><span class="si">{0}</span><span class="s2">)"</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">repr_str</span><span class="p">())</span> <span class="k">def</span><span class="w"> </span><span class="nf">_iter_sorted_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># internal</span> <span class="n">self_terms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_terms</span> <span class="k">for</span> <span class="n">dv</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">self_terms</span><span class="o">.</span><span class="n">keys</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">v</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">yield</span> <span class="n">dv</span><span class="p">,</span> <span class="n">self_terms</span><span class="p">[</span><span class="n">dv</span><span class="p">]</span> <span class="k">def</span><span class="w"> </span><span class="nf">iter_sorted_terms</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">_model</span><span class="o">.</span><span class="n">keep_ordering</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">iter_terms</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">_iter_sorted_terms</span><span class="p">()</span></div> <span class="n">LinearConstraintType</span> <span class="o">=</span> <span class="n">ComparisonType</span> <div class="viewcode-block" id="ZeroExpr"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ZeroExpr">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">ZeroExpr</span><span class="p">(</span><span class="n">_SubscriptionMixin</span><span class="p">,</span> <span class="n">AbstractLinearExpr</span><span class="p">):</span> <span class="k">def</span><span class="w"> </span><span class="nf">_raw_solution_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_zero</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="kc">True</span> <span class="c1"># INTERNAL</span> <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'_subscribers'</span><span class="p">,)</span> <span class="k">def</span><span class="w"> </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">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span><span class="w"> </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">ModelingObjectBase</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="n">model</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subscribers</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span><span class="w"> </span><span class="nf">clone</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="c1"># this is not cloned.</span> <span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target_model</span><span class="p">,</span> <span class="n">var_mapping</span><span class="p">):</span> <span class="k">return</span> <span class="n">ZeroExpr</span><span class="p">(</span><span class="n">target_model</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_linear_expr</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="c1"># this is a linear expr.</span> <div class="viewcode-block" id="ZeroExpr.number_of_variables"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ZeroExpr.number_of_variables">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">number_of_variables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">number_of_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">iter_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">iter_emptyset</span><span class="p">()</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_discrete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">def</span><span class="w"> </span><span class="nf">unchecked_get_coef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span> <div class="viewcode-block" id="ZeroExpr.contains_var"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ZeroExpr.contains_var">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">contains_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span></div> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># for compatibility</span> <span class="k">return</span> <span class="mi">0</span> <span class="nd">@constant</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span><span class="w"> </span><span class="nf">constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">newk</span><span class="p">):</span> <span class="k">if</span> <span class="n">newk</span><span class="p">:</span> <span class="n">cexpr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">constant_expr</span><span class="p">(</span><span class="n">newk</span><span class="p">,</span> <span class="n">safe_number</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">cexpr</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">negate</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="c1"># noinspection PyMethodMayBeStatic</span> <span class="k">def</span><span class="w"> </span><span class="nf">plus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="n">e</span> <span class="k">def</span><span class="w"> </span><span class="nf">times</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">return</span> <span class="bp">self</span> <span class="c1"># noinspection PyMethodMayBeStatic</span> <span class="k">def</span><span class="w"> </span><span class="nf">minus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="o">-</span><span class="n">e</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nb_digits</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">use_space</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'0'</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_stringio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">oss</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">,</span> <span class="n">use_space</span><span class="p">,</span> <span class="n">var_namer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span><span class="p">):</span> <span class="n">oss</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">to_string</span><span class="p">())</span> <span class="c1"># arithmetic</span> <span class="k">def</span><span class="w"> </span><span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">minus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># e - 0 = e !</span> <span class="k">return</span> <span class="n">e</span> <span class="k">def</span><span class="w"> </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="bp">self</span> <span class="k">def</span><span class="w"> </span><span class="fm">__add__</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="k">return</span> <span class="n">other</span> <span class="k">def</span><span class="w"> </span><span class="fm">__radd__</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="k">return</span> <span class="n">other</span> <span class="k">def</span><span class="w"> </span><span class="fm">__mul__</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="k">return</span> <span class="bp">self</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rmul__</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="k">return</span> <span class="bp">self</span> <span class="k">def</span><span class="w"> </span><span class="nf">__div__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_divide</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># for py3</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__div__</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="nf">_divide</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="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_typecheck_as_denominator</span><span class="p">(</span><span class="n">numerator</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">denominator</span><span class="o">=</span><span class="n">other</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span><span class="w"> </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="s2">"docplex.mp.ZeroExpr()"</span> <span class="k">def</span><span class="w"> </span><span class="nf">equals</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="k">return</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="ow">and</span> <span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">number_of_terms</span><span class="p">())))</span> <span class="ow">or</span> \ <span class="p">(</span><span class="n">is_number</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="ow">and</span> <span class="n">other</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">square</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="c1"># arithmetic to self</span> <span class="n">add</span> <span class="o">=</span> <span class="n">plus</span> <span class="n">subtract</span> <span class="o">=</span> <span class="n">minus</span> <span class="n">multiply</span> <span class="o">=</span> <span class="n">times</span> <span class="k">def</span><span class="w"> </span><span class="fm">__iadd__</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="n">linear_other</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">_to_linear_operand</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">force_clone</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">linear_other</span><span class="p">)</span> <span class="k">return</span> <span class="n">linear_other</span> <span class="k">def</span><span class="w"> </span><span class="fm">__isub__</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="n">linear_other</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_linear_factory</span><span class="p">()</span><span class="o">.</span><span class="n">_to_linear_operand</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">force_clone</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="n">negated</span> <span class="o">=</span> <span class="n">linear_other</span><span class="o">.</span><span class="n">negate</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">negated</span><span class="p">)</span> <span class="k">return</span> <span class="n">negated</span></div> <div class="viewcode-block" id="ConstantExpr"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ConstantExpr">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">ConstantExpr</span><span class="p">(</span><span class="n">_SubscriptionMixin</span><span class="p">,</span> <span class="n">AbstractLinearExpr</span><span class="p">):</span> <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'_constant'</span><span class="p">,</span> <span class="s1">'_subscribers'</span><span class="p">)</span> <span class="k">def</span><span class="w"> </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">cst</span><span class="p">):</span> <span class="n">ModelingObjectBase</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="n">model</span><span class="o">=</span><span class="n">model</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="c1"># assume constant is a number (to be checked upfront)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="o">=</span> <span class="n">cst</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subscribers</span> <span class="o">=</span> <span class="p">[]</span> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </span><span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="k">else</span> <span class="mi">0</span> <span class="c1"># INTERNAL</span> <span class="k">def</span><span class="w"> </span><span class="nf">_make_new_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_value</span><span class="p">):</span> <span class="k">return</span> <span class="n">ConstantExpr</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">new_value</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">_raw_solution_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="kc">None</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">def</span><span class="w"> </span><span class="nf">is_zero</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="k">def</span><span class="w"> </span><span class="nf">clone</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="vm">__class__</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">_constant</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target_model</span><span class="p">,</span> <span class="n">var_mapping</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span><span class="n">target_model</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="w"> </span><span class="nf">to_linear_expr</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="c1"># this is a linear expr.</span> <div class="viewcode-block" id="ConstantExpr.number_of_variables"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ConstantExpr.number_of_variables">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">number_of_variables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span></div> <div class="viewcode-block" id="ConstantExpr.iter_variables"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ConstantExpr.iter_variables">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">iter_variables</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">iter_emptyset</span><span class="p">()</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">iter_terms</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">iter_emptyset</span><span class="p">()</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">def</span><span class="w"> </span><span class="nf">is_discrete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">is_int</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="w"> </span><span class="nf">unchecked_get_coef</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="k">return</span> <span class="mi">0</span> <div class="viewcode-block" id="ConstantExpr.contains_var"><a class="viewcode-back" href="../../../docplex.mp.linear.html#docplex.mp.linear.ConstantExpr.contains_var">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">contains_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dvar</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span></div> <span class="k">def</span><span class="w"> </span><span class="nf">set_coefficients</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var_coef_seq</span><span class="p">):</span> <span class="k">pass</span> <span class="nd">@property</span> <span class="k">def</span><span class="w"> </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="nd">@constant</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span><span class="w"> </span><span class="nf">constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_constant</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_constant</span><span class="p">(</span><span class="n">new_constant</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_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">def</span><span class="w"> </span><span class="nf">_set_constant</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_constant</span><span class="p">):</span> <span class="k">if</span> <span class="n">new_constant</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="bp">self</span><span class="o">.</span><span class="n">check_discrete_lock_frozen</span><span class="p">(</span><span class="n">new_constant</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">new_constant</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">event</span><span class="o">=</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">negate</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">_make_new_constant</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">def</span><span class="w"> </span><span class="nf">_apply_op</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pyop</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span> <span class="k">if</span> <span class="n">is_number</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">_make_new_constant</span><span class="p">(</span><span class="n">pyop</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="n">arg</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">pyop</span><span class="p">(</span><span class="n">arg</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="c1"># noinspection PyMethodMayBeStatic</span> <span class="k">def</span><span class="w"> </span><span class="nf">plus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="kn">import</span><span class="w"> </span><span class="nn">operator</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_apply_op</span><span class="p">(</span><span class="n">operator</span><span class="o">.</span><span class="n">add</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">times</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</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">e</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">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">e</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="c1"># noinspection PyMethodMayBeStatic</span> <span class="k">def</span><span class="w"> </span><span class="nf">minus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span> <span class="o">+</span> <span class="p">(</span><span class="o">-</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nb_digits</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">use_space</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'</span><span class="si">{0}</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">def</span><span class="w"> </span><span class="nf">to_stringio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">oss</span><span class="p">,</span> <span class="n">nb_digits</span><span class="p">,</span> <span class="n">use_space</span><span class="p">,</span> <span class="n">var_namer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span><span class="o">.</span><span class="n">name</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_num_to_stringio</span><span class="p">(</span><span class="n">oss</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="n">nb_digits</span><span class="p">)</span> <span class="c1"># arithmetic</span> <span class="k">def</span><span class="w"> </span><span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">minus</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># e - k = e !</span> <span class="k">return</span> <span class="n">e</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="k">def</span><span class="w"> </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="bp">self</span><span class="o">.</span><span class="n">_make_new_constant</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">def</span><span class="w"> </span><span class="fm">__add__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__radd__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">plus</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__mul__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__rmul__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">__div__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_divide</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span> <span class="c1"># for py3</span> <span class="c1"># INTERNAL</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__div__</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="c1"># pragma: no cover</span> <span class="k">def</span><span class="w"> </span><span class="nf">_divide</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="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_typecheck_as_denominator</span><span class="p">(</span><span class="n">numerator</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">denominator</span><span class="o">=</span><span class="n">other</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_new_constant</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">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </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">'docplex.mp.linear.ConstantExpr(</span><span class="si">{0}</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">def</span><span class="w"> </span><span class="nf">equals_expr</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="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">ConstantExpr</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">constant</span> <span class="k">def</span><span class="w"> </span><span class="nf">square</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">_make_new_constant</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="mi">2</span><span class="p">)</span> <span class="c1"># arithmetci to self</span> <span class="k">def</span><span class="w"> </span><span class="nf">_scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">factor</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_new_constant</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">factor</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">equals</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="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</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="o">==</span> <span class="n">other</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> \ <span class="ow">and</span> <span class="n">other</span><span class="o">.</span><span class="n">is_constant</span><span class="p">()</span> <span class="ow">and</span> \ <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="c1"># arithmetic to self</span> <span class="k">def</span><span class="w"> </span><span class="fm">__iadd__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">add</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="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</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">other</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">and</span> <span class="n">other</span><span class="o">.</span><span class="n">is_constant</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">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># replace self by other + self.</span> <span class="n">added</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">plus</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="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">added</span><span class="p">)</span> <span class="k">return</span> <span class="n">added</span> <span class="k">def</span><span class="w"> </span><span class="nf">subtract</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="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</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">other</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">and</span> <span class="n">other</span><span class="o">.</span><span class="n">is_constant</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">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># replace self by (-other) + self.K</span> <span class="n">subtracted</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">negate</span><span class="p">()</span><span class="o">.</span><span class="n">plus</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="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">subtracted</span><span class="p">)</span> <span class="k">return</span> <span class="n">subtracted</span> <span class="k">def</span><span class="w"> </span><span class="fm">__isub__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">multiply</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="k">if</span> <span class="n">is_number</span><span class="p">(</span><span class="n">other</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">other</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">LinearOperand</span><span class="p">)</span> <span class="ow">and</span> <span class="n">other</span><span class="o">.</span><span class="n">is_constant</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">other</span><span class="o">.</span><span class="n">get_constant</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_modified</span><span class="p">(</span><span class="n">UpdateEvent</span><span class="o">.</span><span class="n">ExprConstant</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># replace self by (-other) + self.K</span> <span class="n">multiplied</span> <span class="o">=</span> <span class="n">other</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constant</span> <span class="bp">self</span><span class="o">.</span><span class="n">notify_replaced</span><span class="p">(</span><span class="n">multiplied</span><span class="p">)</span> <span class="k">return</span> <span class="n">multiplied</span> <span class="k">def</span><span class="w"> </span><span class="fm">__imul__</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="n">other</span><span class="p">)</span></div> </pre></div> <div class="clearer"></div> </div> </div> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <div id="searchbox" style="display: none" role="search"> <h3 id="searchlabel">Quick search</h3> <div class="searchformwrapper"> <form class="search" action="../../../search.html" method="get"> <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/> <input type="submit" value="Go" /> </form> </div> </div> <script>document.getElementById('searchbox').style.display = "block"</script> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="nav-item nav-item-0"><a href="../../../index.html">DOcplex.MP: Mathematical Programming Modeling for Python V2.30 documentation</a> »</li> <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li> <li class="nav-item nav-item-this"><a href="">docplex.mp.linear</a></li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2016-2022, IBM®. </div> </body> </html>