<!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 &#8212; 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> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> &#187;</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">&#39;_discrete_locked&#39;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&#39;_discrete_locked&#39;</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">&#39;_dvar&#39;</span><span class="p">,</span> <span class="s1">&#39;_coef&#39;</span><span class="p">,</span> <span class="s1">&#39;_subscribers&#39;</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">&#39;Expr.set_coefficient()&#39;</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">&lt;</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">&#39;-&#39;</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">&#39; &#39;</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">&quot;docplex.mp.MonomialExpr(</span><span class="si">%s</span><span class="s2">)&quot;</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">&quot;&quot;&quot;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">    &quot;&quot;&quot;</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">&#39;_constant&#39;</span><span class="p">,</span> <span class="s1">&#39;_terms&#39;</span><span class="p">,</span> <span class="s1">&#39;_transient&#39;</span><span class="p">,</span> <span class="s1">&#39;_subscribers&#39;</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">&#39;LinearExpr()&#39;</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">&#39;LinearExpr&#39;</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">&quot;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">&quot;</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">&quot;&quot;&quot;</span>
<span class="sd">        Returns:</span>
<span class="sd">            A copy of the expression on the same model.</span>
<span class="sd">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd">        This property is used to get or set the constant term of the expression.</span>
<span class="sd">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&#39; &#39;</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">&gt;</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">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">c</span> <span class="o">&gt;</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">&#39;-&#39;</span> <span class="k">if</span> <span class="n">coeff</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="sa">u</span><span class="s1">&#39;+&#39;</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">coeff</span> <span class="o">&lt;</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">&gt;</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">&lt;</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">&#39;-&#39;</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">&#39;+&#39;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;+&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;-&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;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">)&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;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">&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;docplex.mp.LinearExpr(</span><span class="si">{0}</span><span class="s2">)&quot;</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">&#39;_subscribers&#39;</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">&#39;0&#39;</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">&quot;docplex.mp.ZeroExpr()&quot;</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">&#39;_constant&#39;</span><span class="p">,</span> <span class="s1">&#39;_subscribers&#39;</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">&#39;</span><span class="si">{0}</span><span class="s1">&#39;</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">&#39;docplex.mp.linear.ConstantExpr(</span><span class="si">{0}</span><span class="s1">)&#39;</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> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">docplex.mp.linear</a></li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
    &#169; Copyright 2016-2022, IBM&reg;.
    </div>
  </body>
</html>