MatteoRagni/cas-rb

View on GitHub
docs/CAS/BinaryOp.html

Summary

Maintainability
Test Coverage
<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8">

<title>class CAS::BinaryOp - RDoc Documentation</title>

<script type="text/javascript">
  var rdoc_rel_prefix = "../";
</script>

<script src="../js/jquery.js"></script>
<script src="../js/darkfish.js"></script>

<link href="../css/fonts.css" rel="stylesheet">
<link href="../css/rdoc.css" rel="stylesheet">



<body id="top" role="document" class="class">
<nav role="navigation">
  <div id="project-navigation">
    <div id="home-section" role="region" title="Quick navigation" class="nav-section">
  <h2>
    <a href="../index.html" rel="home">Home</a>
  </h2>

  <div id="table-of-contents-navigation">
    <a href="../table_of_contents.html#pages">Pages</a>
    <a href="../table_of_contents.html#classes">Classes</a>
    <a href="../table_of_contents.html#methods">Methods</a>
  </div>
</div>

    <div id="search-section" role="search" class="project-section initially-hidden">
  <form action="#" method="get" accept-charset="utf-8">
    <div id="search-field-wrapper">
      <input id="search-field" role="combobox" aria-label="Search"
             aria-autocomplete="list" aria-controls="search-results"
             type="text" name="search" placeholder="Search" spellcheck="false"
             title="Type to search, Up and Down to navigate, Enter to load">
    </div>

    <ul id="search-results" aria-label="Search Results"
        aria-busy="false" aria-expanded="false"
        aria-atomic="false" class="initially-hidden"></ul>
  </form>
</div>

  </div>

  

  <div id="class-metadata">
    
    <div id="parent-class-section" class="nav-section">
  <h3>Parent</h3>

  
  <p class="link"><a href="Op.html">CAS::Op</a>
  
</div>

    
    
    <!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
  <h3>Methods</h3>

  <ul class="link-list" role="directory">
    
    <li ><a href="#method-c-new">::new</a>
    
    <li ><a href="#method-i-3D-3D">#==</a>
    
    <li ><a href="#method-i-args">#args</a>
    
    <li ><a href="#method-i-call">#call</a>
    
    <li ><a href="#method-i-depend-3F">#depend?</a>
    
    <li ><a href="#method-i-diff">#diff</a>
    
    <li ><a href="#method-i-dot_graph">#dot_graph</a>
    
    <li ><a href="#method-i-inspect">#inspect</a>
    
    <li ><a href="#method-i-simplify">#simplify</a>
    
    <li ><a href="#method-i-subs">#subs</a>
    
    <li ><a href="#method-i-subs_lhs">#subs_lhs</a>
    
    <li ><a href="#method-i-subs_rhs">#subs_rhs</a>
    
    <li ><a href="#method-i-to_code">#to_code</a>
    
    <li ><a href="#method-i-to_s">#to_s</a>
    
  </ul>
</div>

  </div>
</nav>

<main role="main" aria-labelledby="class-CAS::BinaryOp">
  <h1 id="class-CAS::BinaryOp" class="class">
    class CAS::BinaryOp
  </h1>

  <section class="description">
    
<p>Binary operator</p>

  </section>

  
  
  
  <section id="5Buntitled-5D" class="documentation-section">
    

    

    

    
    <section class="attribute-method-details" class="method-section">
      <header>
        <h3>Attributes</h3>
      </header>

      
      <div id="attribute-i-x" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">x</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        <p>First element of the operation</p>
        
        </div>
      </div>
      
      <div id="attribute-i-y" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">y</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        <p>Second element of the operation</p>
        
        </div>
      </div>
      
    </section>
    

    
     <section id="public-class-5Buntitled-5D-method-details" class="method-section">
       <header>
         <h3>Public Class Methods</h3>
       </header>

    
      <div id="method-c-new" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">new</span><span
            class="method-args">(x, y)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>The binary operator inherits from the <code>CAS::Op</code>, even if it is
defined as a node with two possible branches. This is particular of the
basic operations. The two basic nodes shares the <strong>same</strong>
interface, so all the operations do not need to know which kind of node
they are handling.</p>
<ul><li>
<p><strong>argument</strong>: <code>CAS::Op</code> left argument of the node
or <code>Numeric</code> to be converted in <code>CAS::Constant</code></p>
</li><li>
<p><strong>argument</strong>: <code>CAS::Op</code> right argument of the node
or <code>Numeric</code> to be converted in <code>CAS::Constant</code></p>
</li><li>
<p><strong>returns</strong>: <code>CAS::BinaryOp</code> instance</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="new-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 50</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">y</span>)
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Numeric</span>
    <span class="ruby-identifier">x</span> = <span class="ruby-constant">BinaryOp</span>.<span class="ruby-identifier">numeric_to_const</span> <span class="ruby-identifier">x</span>
  <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Numeric</span>
    <span class="ruby-identifier">y</span> = <span class="ruby-constant">BinaryOp</span>.<span class="ruby-identifier">numeric_to_const</span> <span class="ruby-identifier">y</span>
  <span class="ruby-keyword">end</span>
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">x</span>, <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>)
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">y</span>, <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>)

  <span class="ruby-ivar">@x</span> = <span class="ruby-identifier">x</span>
  <span class="ruby-ivar">@y</span> = <span class="ruby-identifier">y</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
    </section>
  
     <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
       <header>
         <h3>Public Instance Methods</h3>
       </header>

    
      <div id="method-i-3D-3D" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">==</span><span
            class="method-args">(op)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Comparison with other <code>CAS::Op</code>. This is <strong>not</strong> a
math operation.</p>
<ul><li>
<p><strong>argument</strong>: <code>CAS::Op</code> to be compared against</p>
</li><li>
<p><strong>returns</strong>: <code>TrueClass</code> if equal,
<code>FalseClass</code> if different</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="3D-3D-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 181</span>
<span class="ruby-keyword">def</span> <span class="ruby-operator">==</span>(<span class="ruby-identifier">op</span>)
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">op</span>, <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>)
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">BinaryOp</span>
    <span class="ruby-keyword">return</span> (<span class="ruby-keyword">self</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">class</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@x</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">x</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@y</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">y</span>)
  <span class="ruby-keyword">else</span>
    <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-args" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">args</span><span
            class="method-args">()</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Returns an array of all the variables that are in the graph</p>
<ul><li>
<p><strong>returns</strong>: <code>Array</code> of <code>CAS::Variable</code>s</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="args-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 166</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">args</span>
  (<span class="ruby-ivar">@x</span>.<span class="ruby-identifier">args</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">args</span>).<span class="ruby-identifier">uniq</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-call" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">call</span><span
            class="method-args">(_fd)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Same <code>CAS::Op#call</code></p>
<ul><li>
<p><strong>argument</strong>: <code>Hash</code> of values</p>
</li><li>
<p><strong>returns</strong>: <code>Numeric</code> for result</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="call-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 145</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">call</span>(<span class="ruby-identifier">_fd</span>)
  <span class="ruby-identifier">raise</span> <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">CASError</span>, <span class="ruby-string">&quot;Not Implemented. This is a virtual method&quot;</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-depend-3F" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">depend?</span><span
            class="method-args">(v)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Return the dependencies of the operation. Requires a
<code>CAS::Variable</code> and it is one of the recursve method (implicit
tree resolution)</p>
<ul><li>
<p><strong>argument</strong>: <code>CAS::Variable</code> instance</p>
</li><li>
<p><strong>returns</strong>: <code>TrueClass</code> if depends,
<code>FalseClass</code> if not</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="depend-3F-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 69</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">depend?</span>(<span class="ruby-identifier">v</span>)
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">v</span>, <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>)

  <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">depend?</span> <span class="ruby-identifier">v</span> <span class="ruby-keyword">or</span> <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">depend?</span> <span class="ruby-identifier">v</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-diff" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">diff</span><span
            class="method-args">(v)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>This method returns an array with the derivatives of the two branches of
the node. This method is usually called by child classes, and it is not
intended to be used directly.</p>
<ul><li>
<p><strong>argument</strong>: <code>CAS::Op</code> operation to differentiate
against</p>
</li><li>
<p><strong>returns</strong>: <code>Array</code> of differentiated branches
([0] for left, [1] for right)</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="diff-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 81</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">diff</span>(<span class="ruby-identifier">v</span>)
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">v</span>, <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>)
  <span class="ruby-identifier">left</span>, <span class="ruby-identifier">right</span> = <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Zero</span>, <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Zero</span>

  <span class="ruby-identifier">left</span> = <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">diff</span>(<span class="ruby-identifier">v</span>) <span class="ruby-keyword">if</span> <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">depend?</span> <span class="ruby-identifier">v</span>
  <span class="ruby-identifier">right</span> = <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">diff</span>(<span class="ruby-identifier">v</span>) <span class="ruby-keyword">if</span> <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">depend?</span> <span class="ruby-identifier">v</span>

  <span class="ruby-keyword">return</span> <span class="ruby-identifier">left</span>, <span class="ruby-identifier">right</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-dot_graph" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">dot_graph</span><span
            class="method-args">()</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Return the local Graphviz node of the tree</p>
<ul><li>
<p><strong>returns</strong>: <code>String</code> of local Graphiz node</p>
</li></ul>
          
          

          
          <div class="method-source-code" id="dot_graph-source">
            <pre><span class="ruby-comment"># File lib/Mr.CAS/graphviz.rb, line 52</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">dot_graph</span>
  <span class="ruby-identifier">cls</span> = <span class="ruby-node">&quot;#{self.class.to_s.gsub(&quot;CAS::&quot;, &quot;&quot;)}_#{self.object_id}&quot;</span>
  <span class="ruby-node">&quot;#{cls} -&gt; #{@x.dot_graph}\n  #{cls} -&gt; #{@y.dot_graph}&quot;</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-inspect" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">inspect</span><span
            class="method-args">()</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Inspector</p>
<ul><li>
<p><strong>returns</strong>: <code>String</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="inspect-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 173</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">inspect</span>
  <span class="ruby-node">&quot;#{self.class}(#{@x.inspect}, #{@y.inspect})&quot;</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-simplify" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">simplify</span><span
            class="method-args">()</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Executes simplifications of the two branches of the graph</p>
<ul><li>
<p><strong>returns</strong>: <code>CAS::BinaryOp</code> as <code>self</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="simplify-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 193</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">simplify</span>
  <span class="ruby-identifier">hash</span> = <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">to_s</span>
  <span class="ruby-ivar">@x</span> = <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">simplify</span>
  <span class="ruby-keyword">while</span> <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">hash</span>
    <span class="ruby-identifier">hash</span> = <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">to_s</span>
    <span class="ruby-ivar">@x</span> = <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">simplify</span>
  <span class="ruby-keyword">end</span>
  <span class="ruby-identifier">hash</span> = <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">to_s</span>
  <span class="ruby-ivar">@y</span> = <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">simplify</span>
  <span class="ruby-keyword">while</span> <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">hash</span>
    <span class="ruby-identifier">hash</span> = <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">to_s</span>
    <span class="ruby-ivar">@y</span> = <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">simplify</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-subs" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">subs</span><span
            class="method-args">(dt)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Substituitions for both branches of the graph, same as
<code>CAS::Op#subs</code></p>
<ul><li>
<p><strong>argument</strong>: <code>Hash</code> of substitutions</p>
</li><li>
<p><strong>returns</strong>: <code>CAS::BinaryOp</code>, in practice
<code>self</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="subs-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 95</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">subs</span>(<span class="ruby-identifier">dt</span>)
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">subs_lhs</span>(<span class="ruby-identifier">dt</span>).<span class="ruby-identifier">subs_rhs</span>(<span class="ruby-identifier">dt</span>)
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-subs_lhs" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">subs_lhs</span><span
            class="method-args">(dt)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Substituitions for left branch of the graph, same as
<code>CAS::Op#subs</code></p>
<ul><li>
<p><strong>argument</strong>: <code>Hash</code> of substitutions</p>
</li><li>
<p><strong>returns</strong>: <code>CAS::BinaryOp</code>, in practice
<code>self</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="subs_lhs-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 103</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">subs_lhs</span>(<span class="ruby-identifier">dt</span>)
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">dt</span>, <span class="ruby-constant">Hash</span>)
  <span class="ruby-identifier">sub</span> = <span class="ruby-identifier">dt</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">e</span><span class="ruby-operator">|</span> <span class="ruby-identifier">e</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@x</span> }[<span class="ruby-value">0</span>]
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">sub</span>
    <span class="ruby-keyword">if</span> <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>
      <span class="ruby-ivar">@x</span> = <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>]
    <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Numeric</span>
      <span class="ruby-ivar">@x</span> = <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-identifier">const</span> <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>]
    <span class="ruby-keyword">else</span>
      <span class="ruby-identifier">raise</span> <span class="ruby-constant">CASError</span>, <span class="ruby-node">&quot;Impossible subs. Received a #{dt[sub].class} = #{dt[sub]}&quot;</span>
    <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">else</span>
    <span class="ruby-ivar">@x</span>.<span class="ruby-identifier">subs</span>(<span class="ruby-identifier">dt</span>)
  <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">self</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-subs_rhs" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">subs_rhs</span><span
            class="method-args">(dt)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Substituitions for left branch of the graph, same as
<code>CAS::Op#subs</code></p>
<ul><li>
<p><strong>argument</strong>: <code>Hash</code> of substitutions</p>
</li><li>
<p><strong>returns</strong>: <code>CAS::BinaryOp</code>, in practice
<code>self</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="subs_rhs-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 124</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">subs_rhs</span>(<span class="ruby-identifier">dt</span>)
  <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Help</span>.<span class="ruby-identifier">assert</span>(<span class="ruby-identifier">dt</span>, <span class="ruby-constant">Hash</span>)
  <span class="ruby-identifier">sub</span> = <span class="ruby-identifier">dt</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">e</span><span class="ruby-operator">|</span> <span class="ruby-identifier">e</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@y</span> }[<span class="ruby-value">0</span>]
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">sub</span>
    <span class="ruby-keyword">if</span> <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">Op</span>
      <span class="ruby-ivar">@y</span> = <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>]
    <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Numeric</span>
      <span class="ruby-ivar">@y</span> = <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-identifier">const</span> <span class="ruby-identifier">dt</span>[<span class="ruby-identifier">sub</span>]
    <span class="ruby-keyword">else</span>
      <span class="ruby-identifier">raise</span> <span class="ruby-constant">CASError</span>, <span class="ruby-node">&quot;Impossible subs. Received a #{dt[sub].class} = #{dt[sub]}&quot;</span>
    <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">else</span>
    <span class="ruby-ivar">@y</span>.<span class="ruby-identifier">subs</span>(<span class="ruby-identifier">dt</span>)
  <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">self</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_code" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">to_code</span><span
            class="method-args">()</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>Code to be used in <code>CAS::BinaryOp#to_proc</code></p>
<ul><li>
<p><strong>returns</strong>: <code>String</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="to_code-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 159</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">to_code</span>
  <span class="ruby-identifier">raise</span> <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">CASError</span>, <span class="ruby-string">&quot;Not implemented. This is a virtual method&quot;</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_s" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">to_s</span><span
            class="method-args">()</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          <p>String representation of the tree</p>
<ul><li>
<p><strong>returns</strong>: <code>String</code></p>
</li></ul>
          
          

          
          <div class="method-source-code" id="to_s-source">
            <pre><span class="ruby-comment"># File lib/operators/bary-op.rb, line 152</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">to_s</span>
  <span class="ruby-identifier">raise</span> <span class="ruby-constant">CAS</span><span class="ruby-operator">::</span><span class="ruby-constant">CASError</span>, <span class="ruby-string">&quot;Not Implemented. This is a virtual method&quot;</span>
<span class="ruby-keyword">end</span></pre>
          </div>
          
        </div>

        

        
      </div>

    
    </section>
  
  </section>
</main>


<footer id="validator-badges" role="contentinfo">
  <p><a href="http://validator.w3.org/check/referer">Validate</a>
  <p>Generated by <a href="http://docs.seattlerb.org/rdoc/">RDoc</a> 4.2.1.
  <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>