Jekyll2019-10-05T17:33:38+00:00http://worc4021.github.io/feed.xmlGeoCalcLibHomepage of the GeoCalcLib, a Matlab interface for the LRS library.
Installing GeoCalcLib2019-10-05T13:41:36+00:002019-10-05T13:41:36+00:00http://worc4021.github.io/install/2019/10/05/install<p>A prerequisite to run the GeoCalcLib is to have the <a href="https://gmplib.org">GMP Library</a> on your machine. At build time, you will need the main header file <code class="highlighter-rouge">gmp.h</code> however the library itself is largely irrelevant, as Matlab provides a gmp redistributable.</p>
<p>To install the GeoCalcLib open your Terminal navigate to your desired directory and clone the repository by typing</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash">git clone https://github.com/worc4021/GeoCalcLib.git
<span class="nb">cd </span>GeoCalcLib</code></pre></figure>
<p>Create a text file named <code class="highlighter-rouge">User.make</code> in which you define the absolute path to your Matlab installation <code class="highlighter-rouge">MATLABROOT</code>
and the desired installation directory <code class="highlighter-rouge">INSTALLDIR</code> <em>(a directory on your Matlab path</em>), e.g.</p>
<figure class="highlight"><pre><code class="language-make" data-lang="make"><span class="c"># Specify the absolute path to your Matlab installation
</span><span class="nv">MATLABROOT</span> <span class="o">=</span> /Applications/MATLAB_R2019b.app
<span class="c"># Path to which everything should be installed, has to be on Matlab path!
</span><span class="nv">INSTALLDIR</span> <span class="o">=</span> /Users/Username/Documents/MATLAB/Functions</code></pre></figure>
<p>If necessary add <code class="highlighter-rouge">GMPINCLUDE</code> with the path to the <code class="highlighter-rouge">gmp.h</code> file (I only had to do this on osx ).</p>
<p>Run make</p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash">make</code></pre></figure>
<p>If you do not yet have a directory on your Matlab path to store your functions and want to add one, run <code class="highlighter-rouge">edit startup</code> in Matlab and add</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="nb">addpath</span><span class="p">(</span><span class="s1">'/absolute/path/to/your/directory'</span><span class="p">);</span></code></pre></figure>
<p>or find <a href="http://uk.mathworks.com/help/matlab/matlab_env/what-is-the-matlab-search-path.html">alternative ways of setting up your path here</a>.</p>
<p>You should now be set up.</p>A prerequisite to run the GeoCalcLib is to have the GMP Library on your machine. At build time, you will need the main header file gmp.h however the library itself is largely irrelevant, as Matlab provides a gmp redistributable.User Guide2019-10-05T13:41:36+00:002019-10-05T13:41:36+00:00http://worc4021.github.io/userguide/2019/10/05/userguide<blockquote>
<p>Warning: There are no guarantees for the robustness of the GeoCalcLib!
Please report any malfunction.</p>
</blockquote>
<p>The GeoCalcLib provides five different wrappers to call the LRS routines:</p>
<ol>
<li>
<p><code class="highlighter-rouge">facetEnumeration()</code> calculates a half space description for the provides vertex/ray description.</p>
</li>
<li>
<p><code class="highlighter-rouge">vertexEnumeration()</code>calculates a vertex description for the provided half space description.</p>
</li>
<li><code class="highlighter-rouge">inequalityReduction()</code> produces an irredundant half space description for a polyhedron in half space description.</li>
<li><code class="highlighter-rouge">vertexReduction()</code> produces an irredundant vertex/ray description of a polyhedron in vertex/ray description.</li>
<li><code class="highlighter-rouge">projectPolyhedron()</code> does not call a LRS routine, but projects a polyhedron in half space description and returns the result in half space description.</li>
<li><code class="highlighter-rouge">lrs()</code> allows passing more data to the LRS engine to perform the vertex and facet enumeration. Allows passing parameters.</li>
</ol>
<p>On top of the direct interface to the LRS library <code class="highlighter-rouge">createLRSfile()</code> and <code class="highlighter-rouge">readLRSfile()</code> are provided to write and read an LRS input file respectively.</p>
<h1 id="facet-enumeration">Facet Enumeration</h1>
<p>Generate a set of vertices:</p>
<script type="math/tex; mode=display">V = \left(\begin{array}{c}
v_1^T \\\\[0em]
v_2^T \\\\[0em]
\vdots
\end{array}\right)</script>
<p>For example</p>
<script type="math/tex; mode=display">P = \text{conv}\left\{\left(\begin{array}{c} 1 \\\\[0em] 0 \end{array}\right),\left(\begin{array}{c} 0 \\\\[0em] 1 \end{array}\right), \left(\begin{array}{c} -1 \\\\[0em] 0 \end{array}\right), \left(\begin{array}{c} 0 \\\\[0em] -1 \end{array}\right)\right\}</script>
<p>translates to</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"> <span class="n">V</span> <span class="o">=</span> <span class="p">[</span><span class="nb">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span><span class="o">-</span><span class="nb">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">)];</span></code></pre></figure>
<p>We can produce a plot of the polytope <script type="math/tex">P</script> using</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"> <span class="n">k</span> <span class="o">=</span> <span class="nb">convhull</span><span class="p">(</span><span class="n">V</span><span class="p">(:,</span><span class="mi">1</span><span class="p">),</span><span class="n">V</span><span class="p">(:,</span><span class="mi">2</span><span class="p">));</span>
<span class="nb">fill</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="mi">1</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="mi">2</span><span class="p">),</span><span class="s1">'r'</span><span class="p">);</span></code></pre></figure>
<p>The H-representation of $P$ is trivially obtained as</p>
<script type="math/tex; mode=display">% <![CDATA[
P = \left\{x\in\mathbb R^2 : \begin{pmatrix}
1 & 1 \\\\[0em]
-1 & 1 \\\\[0em]
1 & -1 \\\\[0em]
-1 & -1
\end{pmatrix} x \leq \begin{pmatrix} 1 \\\\[0em] 1 \\\\[0em] 1 \\\\[0em] 1 \end{pmatrix}\right\} %]]></script>
<p>This can result is obtained by calling <code class="highlighter-rouge">[A,b] = facetEnumeration(V)</code>. Called with one argument <code class="highlighter-rouge">facetEnumeration(V)</code> assumes that all rows in <code class="highlighter-rouge">V</code> are vertices.</p>
<p>If rays are present, an additional vector <code class="highlighter-rouge">type</code> must be provided</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="p">[</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">facetEnumeration</span><span class="p">(</span><span class="n">V</span><span class="p">,</span><span class="nb">type</span><span class="p">)</span></code></pre></figure>
<p>each row in <code class="highlighter-rouge">type</code> is either <code class="highlighter-rouge">type(i) = 1</code> if <code class="highlighter-rouge">V(i,:)</code> is a vertex or <code class="highlighter-rouge">type(i) = 0</code> if <code class="highlighter-rouge">V(i,:)</code> is a ray.
<code class="highlighter-rouge">[A,b] = facetEnumeration(V,ones(size(V,1),1))</code> produces the same result as <code class="highlighter-rouge">[A,b]=facetEnumeration(V)</code>.</p>
<h1 id="vertex-enumeration">Vertex Enumeration</h1>
<p>The <code class="highlighter-rouge">vertexEnumeration()</code> function produces a vertex/ray representation for a given polyhedron <script type="math/tex">P = \left\{x:Ax\leq b\right\}</script>.</p>
<p>Assume we want to understand the epigraph <script type="math/tex">\text{epi}(\varphi)</script> of the piecewise affine function <script type="math/tex">\varphi(x) = \max\{x+1,2x,3x-4\}</script>
for <script type="math/tex">x\in[0,5]</script>.
The epigraph is given by</p>
<script type="math/tex; mode=display">\text{epi}(\varphi) = \left\{ (x,t) : 0\leq x\leq 5, x+1\leq t, 2x \leq t, 3x-4\leq t
\right\}</script>
<script type="math/tex; mode=display">% <![CDATA[
A = \begin{pmatrix}
1 & -1\\\\[0em]
2 & -1\\\\[0em]
3 & -1\\\\[0em]
1 & 0\\\\[0em]
-1 & 0
\end{pmatrix}
, b = \begin{pmatrix}-1 \\\\[0em] 0 \\\\[0em] 4 \\\\[0em] 5 \\\\[0em] 0
\end{pmatrix} %]]></script>
<p>Using this as an input</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="o">>></span><span class="p">[</span><span class="n">V</span><span class="p">,</span><span class="nb">type</span><span class="p">]</span> <span class="o">=</span> <span class="n">vertexEnumeration</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">)</span>
<span class="n">V</span> <span class="o">=</span>
<span class="mi">0</span> <span class="mi">1</span>
<span class="mi">0</span> <span class="mi">1</span>
<span class="mi">1</span> <span class="mi">2</span>
<span class="mi">4</span> <span class="mi">8</span>
<span class="mi">5</span> <span class="mi">11</span>
<span class="mi">0</span> <span class="mi">1</span>
<span class="nb">type</span> <span class="o">=</span>
<span class="mi">1</span>
<span class="mi">0</span>
<span class="mi">1</span>
<span class="mi">1</span>
<span class="mi">1</span>
<span class="mi">0</span></code></pre></figure>
<p>we obtain the vertices and rays generating the epigraph.</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="nb">plot</span><span class="p">(</span><span class="n">V</span><span class="p">(</span><span class="nb">logical</span><span class="p">(</span><span class="n">t</span><span class="p">),</span><span class="mi">1</span><span class="p">),</span><span class="n">V</span><span class="p">(</span><span class="nb">logical</span><span class="p">(</span><span class="n">t</span><span class="p">),</span><span class="mi">2</span><span class="p">))</span></code></pre></figure>
<h1 id="inequality-reduction">Inequality Reduction</h1>
<p>The call <code class="highlighter-rouge">[Aout,bout] = inequalityReduction(Ain,bin)</code> returns an irredundant H-representation of <script type="math/tex">P = \{x: A_{in}x\leq b_{in}\}</script>.</p>
<h1 id="vertex-reduction">Vertex Reduction</h1>
<p>The call <code class="highlighter-rouge">[Vout,tout] = vertexReduction(Vin,tin)</code> returns an irredundant V-representation of <script type="math/tex">P = \text{conv}\{v_{i}\}\oplus \text{cone}\{r_{i}\}</script> where the vertices in <code class="highlighter-rouge">Vin</code> are passed by setting <code class="highlighter-rouge">tin(i) = 1</code> if <code class="highlighter-rouge">Vin(i,:)</code> is a vertex and <code class="highlighter-rouge">tin(i) = 0</code> if <code class="highlighter-rouge">Vin(i,:)</code> is a ray.</p>
<p>If <script type="math/tex">P = \text{conv}\{v_i\}</script>, passing <code class="highlighter-rouge">tin = ones(size(V,1),1)</code> can be omitted <code class="highlighter-rouge">Vout = vertexReduction(Vin)</code> assumes all passed points are vertices.</p>
<h1 id="projection">Projection</h1>
<p>The projection of polyhedral sets is performed for polyhedra in H-representation <script type="math/tex">P = \{x\in\mathbb R^n: A_{in}x \leq b_{in}\}</script>,
and is always projected on to <script type="math/tex">\mathbb R^{n-d}</script>. The projected set <script type="math/tex">\pi_d(P) = \{y\in\mathbb R^{n-d}: \exists z\in\mathbb R^d y\times z\in P\}</script> is returned in H-representation.</p>
<p>Internally a vertex enumeration is performed on <script type="math/tex">P</script>, the projection operator <script type="math/tex">\pi_d</script> acts trivially on points by just dropping off the last <script type="math/tex">n-d</script> elements, after that a facet enumeration is appended to produce the H-representation of <script type="math/tex">\pi_d(P)</script>.
The function call <code class="highlighter-rouge">[Aout,bout] = projectPolyhedron(Ain,bin,d)</code> performs this operation for general polyhedra:</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="n">P</span> <span class="o">=</span> <span class="nb">gallery</span><span class="p">(</span><span class="s1">'uniformdata'</span><span class="p">,[</span><span class="mi">30</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span><span class="mi">1</span><span class="p">);</span>
<span class="p">[</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">facetEnumeration</span><span class="p">(</span><span class="n">P</span><span class="p">);</span>
<span class="n">K</span> <span class="o">=</span> <span class="nb">convhull</span><span class="p">(</span><span class="n">P</span><span class="p">);</span>
<span class="nb">figure</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="nb">trisurf</span><span class="p">(</span><span class="n">K</span><span class="p">,</span><span class="n">P</span><span class="p">(:,</span><span class="mi">1</span><span class="p">),</span><span class="n">P</span><span class="p">(:,</span><span class="mi">2</span><span class="p">),</span><span class="n">P</span><span class="p">(:,</span><span class="mi">3</span><span class="p">))</span>
<span class="nb">hold</span> <span class="n">on</span>
<span class="p">[</span><span class="n">C</span><span class="p">,</span><span class="n">d</span><span class="p">]</span> <span class="o">=</span> <span class="n">projectPolyhedron</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
<span class="n">V</span> <span class="o">=</span> <span class="n">vertexEnumeration</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="n">d</span><span class="p">);</span>
<span class="n">k</span> <span class="o">=</span> <span class="nb">convhull</span><span class="p">(</span><span class="n">V</span><span class="p">(:,</span><span class="mi">1</span><span class="p">),</span><span class="n">V</span><span class="p">(:,</span><span class="mi">2</span><span class="p">));</span>
<span class="nb">fill</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="mi">1</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="mi">2</span><span class="p">),</span><span class="s1">'b'</span><span class="p">);</span>
<span class="nb">hold</span> <span class="n">off</span></code></pre></figure>
<h1 id="vertex-and-facet-enumeration-with-lrs-parameters">Vertex and facet enumeration with LRS parameters</h1>
<p>The functions <code class="highlighter-rouge">vertexEnumeration()</code> and <code class="highlighter-rouge">facetEnumeration()</code> perform a vertex and facet enumeration respectively for data that was preconditioned by the user.
The <code class="highlighter-rouge">vertexEnumeration()</code> call requires the user to prepare a type vector if rays are present etc. and the <code class="highlighter-rouge">facetEnumeration()</code> call only treats inequality constrained sets.
To exploit (almost) the full scope of possibilities the LRS engine offers the <code class="highlighter-rouge">LRS()</code> function is provided.</p>
<p>The argument is a <code class="highlighter-rouge">struct</code> with the required field <code class="highlighter-rouge">'rep'</code> specifying whether a V- or an H-representation is passed.
Each representation has its own arguments:</p>
<p>Assume we want to facet enumerate the first quadrant, i.e. <script type="math/tex">P=\text{cone}\left\{\begin{pmatrix}1 \\\\ 0\end{pmatrix}, \begin{pmatrix}0 \\\\ 1\end{pmatrix} \right\}</script>, then we define the structure</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="n">s</span> <span class="o">=</span> <span class="nb">struct</span><span class="p">(</span><span class="s1">'rep'</span><span class="p">,</span><span class="s1">'V'</span><span class="p">,</span><span class="s1">'R'</span><span class="p">,</span><span class="nb">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span>
<span class="p">[</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">lrs</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">A</span> <span class="o">=</span>
<span class="mi">0</span> <span class="o">-</span><span class="mi">1</span>
<span class="o">-</span><span class="mi">1</span> <span class="mi">0</span>
<span class="n">b</span> <span class="o">=</span>
<span class="mi">0</span>
<span class="mi">0</span></code></pre></figure>
<p>If we have <script type="math/tex">P = \text{cone}\left\{\begin{pmatrix}1 \\\\ 0\end{pmatrix}, \begin{pmatrix}0 \\\\ 1\end{pmatrix} \right\} \oplus \text{conv}\left\{\begin{pmatrix}1\\\\1 \end{pmatrix} \right\}</script> we set the additional field</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="n">s</span><span class="o">.</span><span class="n">V</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">];</span>
<span class="p">[</span><span class="n">A</span><span class="p">,</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">LRS</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">A</span> <span class="o">=</span>
<span class="mi">0</span> <span class="mi">0</span>
<span class="o">-</span><span class="mi">1</span> <span class="mi">0</span>
<span class="mi">0</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">b</span> <span class="o">=</span>
<span class="mi">1</span>
<span class="o">-</span><span class="mi">1</span>
<span class="o">-</span><span class="mi">1</span></code></pre></figure>
<p>That is, if the <code class="highlighter-rouge">s.rep='V'</code> at least one of <code class="highlighter-rouge">s.V</code> or <code class="highlighter-rouge">s.R</code> has to be passed.</p>
<p>Assume now that we want to vertex enumerate the 3-dimensional simplex <script type="math/tex">P = \{x:x_1\geq0,x_2\geq0,x_3\geq0,x_1+x_2+x_3=1\}</script>,
that is the representation of <code class="highlighter-rouge">rep='H'</code></p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="n">s</span> <span class="o">=</span> <span class="nb">struct</span><span class="p">(</span><span class="s1">'rep'</span><span class="p">,</span><span class="s1">'H'</span><span class="p">,</span><span class="s1">'Aineq'</span><span class="p">,</span><span class="o">-</span><span class="nb">eye</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span><span class="s1">'bineq'</span><span class="p">,</span><span class="nb">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span><span class="s1">'Aeq'</span><span class="p">,</span><span class="nb">ones</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span><span class="s1">'beq'</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
<span class="p">[</span><span class="n">V</span><span class="p">,</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">lrs</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">V</span> <span class="o">=</span>
<span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span>
<span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span>
<span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span>
<span class="n">t</span> <span class="o">=</span>
<span class="mi">1</span>
<span class="mi">1</span>
<span class="mi">1</span></code></pre></figure>
<p>The interpretation of the output for a vertex enumeration is exactly the same as for <code class="highlighter-rouge">vertexEnumeration()</code> that is, <code class="highlighter-rouge">V(i,:)</code> is a vertex if <code class="highlighter-rouge">t(i)=1</code> and <code class="highlighter-rouge">V(i,:)</code> is a ray if <code class="highlighter-rouge">t(i)=0</code>.</p>
<p>If <code class="highlighter-rouge">s.rep='H'</code> then <code class="highlighter-rouge">s.Aineq</code> and <code class="highlighter-rouge">s.bineq</code> are required, <code class="highlighter-rouge">s.Aeq</code> and <code class="highlighter-rouge">s.beq</code> are optional.</p>
<p>In addition to the computational data parameters may be passed, so far <code class="highlighter-rouge">maxcobases</code>, <code class="highlighter-rouge">maxoutput</code> and <code class="highlighter-rouge">maxdepth</code> are accepted. See <a href="http://cgm.cs.mcgill.ca/%7Eavis/C/lrslib/USERGUIDE.html#Options">LRS options</a> for details.</p>
<p>If we want to restrict the number of search depth in the vertex enumeration of a 12-dimensional cube, and further we also want to constrain the number of explored cobases and only need 5 vertices we would call</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="p">[</span><span class="n">V</span><span class="p">,</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">lrs</span><span class="p">(</span><span class="nb">struct</span><span class="p">(</span><span class="s1">'rep'</span><span class="p">,</span><span class="s1">'H'</span><span class="p">,</span><span class="s1">'Aineq'</span><span class="p">,[</span><span class="nb">eye</span><span class="p">(</span><span class="mi">12</span><span class="p">);</span><span class="o">-</span><span class="nb">eye</span><span class="p">(</span><span class="mi">12</span><span class="p">)],</span><span class="s1">'bineq'</span><span class="p">,</span><span class="nb">ones</span><span class="p">(</span><span class="mi">24</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span><span class="s1">'maxdepth'</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="s1">'maxcobases'</span><span class="p">,</span><span class="mi">12</span><span class="p">,</span><span class="s1">'maxoutput'</span><span class="p">,</span><span class="mi">5</span><span class="p">))</span>
<span class="n">V</span> <span class="o">=</span>
<span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
<span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
<span class="o">-</span><span class="mi">1</span> <span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
<span class="mi">1</span> <span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
<span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">t</span> <span class="o">=</span>
<span class="mi">1</span>
<span class="mi">1</span>
<span class="mi">1</span>
<span class="mi">1</span>
<span class="mi">1</span></code></pre></figure>
<blockquote>
<p>Warning: Although this function has been thoroughly tested, there might be uncaught exceptions.
Matlab will immediately crash if you come across an uncaught exception.
These exceptions have no numerical nature, but can occur when passing unaccepted data types <em>(passing cell arrays instead of arrays etc.</em>).
Please test your code your function calls before calling this function in an automated environment!</p>
</blockquote>
<h1 id="writing-and-reading-lrs-input-files">Writing and reading LRS input files</h1>
<p>Many LRS users might prefer to call the LRS executable directly in order to be able to see the output as it is obtained, rather than waiting for the entire solution to be returned.
For this purpose <code class="highlighter-rouge">createLRSfile('param1',param1,...)</code> is provided to generate a LRS input file from within the Matlab environment.</p>
<p>The supported parameters are</p>
<ul>
<li><code class="highlighter-rouge">fname</code> - specifies the file name of the LRS input file created, if omitted a file called <code class="highlighter-rouge">lrstest.ine</code> is created in the current directory.</li>
<li><code class="highlighter-rouge">rep</code> - <code class="highlighter-rouge">'V'</code> or <code class="highlighter-rouge">'H'</code> implying that the data is passed in a V- or H-representation respectively.</li>
<li>If <code class="highlighter-rouge">rep='V'</code> vertices are passed as the parameter <code class="highlighter-rouge">V</code> in a matrix <code class="highlighter-rouge">vdat</code> containing a vertex/ray in each row, optionally <code class="highlighter-rouge">Type</code> can be used to pass a vector of <code class="highlighter-rouge">1/0</code> such that <code class="highlighter-rouge">type(i) = 0</code> implies <code class="highlighter-rouge">vdat(i,:)</code> is a ray and <code class="highlighter-rouge">type(i) = 1</code> implies <code class="highlighter-rouge">vdat(i,:)</code> is a vertex.
If <code class="highlighter-rouge">Type</code>is not specified all rows of <code class="highlighter-rouge">vdat</code> are assumed to be vertices.</li>
<li>If <code class="highlighter-rouge">rep='H'</code> the set of inequalities <script type="math/tex">\{x:A_{dat}x\leq b_{dat}\}</script> is passed by setting <code class="highlighter-rouge">A</code> to <code class="highlighter-rouge">Adat</code> and <code class="highlighter-rouge">b</code> to <code class="highlighter-rouge">bdat</code>.
If <code class="highlighter-rouge">b</code> is omitted the set is assumed to be <script type="math/tex">\{x:A_{dat}x\leq{\bf{1}}\}</script></li>
<li>The optional parameter <code class="highlighter-rouge">tol</code> may be set to the desired conversion tolerance to a rational format, default <code class="highlighter-rouge">1e-12</code>.</li>
</ul>
<p>To create an LRS input file <code class="highlighter-rouge">myfile.ine</code> to vertex enumerate the <script type="math/tex">\ell_\infty</script> unit ball in two dimensions <script type="math/tex">\|x\|_\infty\leq 1</script> we would use</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="n">A</span> <span class="o">=</span> <span class="p">[</span><span class="nb">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span><span class="o">-</span><span class="nb">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">)];</span>
<span class="n">b</span> <span class="o">=</span> <span class="nb">ones</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
<span class="n">createLRSfile</span><span class="p">(</span><span class="s1">'rep'</span><span class="p">,</span><span class="s1">'H'</span><span class="p">,</span><span class="s1">'A'</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="s1">'b'</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="s1">'fname'</span><span class="p">,</span><span class="s1">'myfile.ine'</span><span class="p">);</span></code></pre></figure>
<p>Users who have produced results using the LRS executable wanting to import it into the Matlab environment would first change the head of the result file into an admissible LRS input file, i.e replace the <code class="highlighter-rouge">***** n rational</code> line by <code class="highlighter-rouge">m n rational</code>, where <code class="highlighter-rouge">m</code> and <code class="highlighter-rouge">n</code> are the number of rows and columns respectively. Then pass the <code class="highlighter-rouge">filename</code> to <code class="highlighter-rouge">readLRSfile('filename')</code>.</p>
<p>To read in the result of a vertex enumeration in <code class="highlighter-rouge">myfile.ext</code>, i.e. the result is in V-representation, we would call</p>
<figure class="highlight"><pre><code class="language-matlab" data-lang="matlab"><span class="p">[</span><span class="n">V</span><span class="p">,</span><span class="nb">type</span><span class="p">]</span> <span class="o">=</span> <span class="n">readLRSfile</span><span class="p">(</span><span class="s1">'myfile.ext'</span><span class="p">);</span></code></pre></figure>Warning: There are no guarantees for the robustness of the GeoCalcLib! Please report any malfunction.