File: testlib_8c_source.html

package info (click to toggle)
polylib 5.22.5-3%2Bdfsg
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, stretch, wheezy
  • size: 14,444 kB
  • ctags: 52,958
  • sloc: ansic: 16,342; sh: 10,134; makefile: 560
file content (223 lines) | stat: -rw-r--r-- 19,424 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>polylib: testlib.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>testlib.c</h1><a href="testlib_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">    This file is part of PolyLib.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment">    PolyLib is free software: you can redistribute it and/or modify</span>
<a name="l00005"></a>00005 <span class="comment">    it under the terms of the GNU General Public License as published by</span>
<a name="l00006"></a>00006 <span class="comment">    the Free Software Foundation, either version 3 of the License, or</span>
<a name="l00007"></a>00007 <span class="comment">    (at your option) any later version.</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment">    PolyLib is distributed in the hope that it will be useful,</span>
<a name="l00010"></a>00010 <span class="comment">    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00011"></a>00011 <span class="comment">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00012"></a>00012 <span class="comment">    GNU General Public License for more details.</span>
<a name="l00013"></a>00013 <span class="comment"></span>
<a name="l00014"></a>00014 <span class="comment">    You should have received a copy of the GNU General Public License</span>
<a name="l00015"></a>00015 <span class="comment">    along with PolyLib.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00016"></a>00016 <span class="comment">*/</span>
<a name="l00017"></a>00017 <span class="comment">/* main.c</span>
<a name="l00018"></a>00018 <span class="comment">     COPYRIGHT</span>
<a name="l00019"></a>00019 <span class="comment">          Both this software and its documentation are</span>
<a name="l00020"></a>00020 <span class="comment"></span>
<a name="l00021"></a>00021 <span class="comment">              Copyright 1993 by IRISA /Universite de Rennes I - France,</span>
<a name="l00022"></a>00022 <span class="comment">              Copyright 1995,1996 by BYU</span>
<a name="l00023"></a>00023 <span class="comment">                         all rights reserved.</span>
<a name="l00024"></a>00024 <span class="comment"></span>
<a name="l00025"></a>00025 <span class="comment">          Permission is granted to copy, use, and distribute</span>
<a name="l00026"></a>00026 <span class="comment">          for any commercial or noncommercial purpose under the terms</span>
<a name="l00027"></a>00027 <span class="comment">          of the GNU General Public license, version 2, June 1991</span>
<a name="l00028"></a>00028 <span class="comment">          (see file : LICENSING).</span>
<a name="l00029"></a>00029 <span class="comment"></span>
<a name="l00030"></a>00030 <span class="comment">   This file along with polyhedron.c and vector.c do the following functions:</span>
<a name="l00031"></a>00031 <span class="comment">    - Extraction of a minimal set of constraints from some set of constraints</span>
<a name="l00032"></a>00032 <span class="comment">    - Intersection of two convexes</span>
<a name="l00033"></a>00033 <span class="comment">    - Application of a linear function to some convex</span>
<a name="l00034"></a>00034 <span class="comment">    - Verification that a convex is included in some other convex</span>
<a name="l00035"></a>00035 <span class="comment"></span>
<a name="l00036"></a>00036 <span class="comment">   They are compiled together into an executable file called &quot;test&quot;.</span>
<a name="l00037"></a>00037 <span class="comment">   The file test.in contains sample input data for the program.</span>
<a name="l00038"></a>00038 <span class="comment">   The file test.out contains the output produced by the program.</span>
<a name="l00039"></a>00039 <span class="comment"></span>
<a name="l00040"></a>00040 <span class="comment">   This directory also contains a makefile to build and run the test.</span>
<a name="l00041"></a>00041 <span class="comment"></span>
<a name="l00042"></a>00042 <span class="comment">   This file is a tutorial on how to use the library.  The comments</span>
<a name="l00043"></a>00043 <span class="comment">   explain whats going on.  You can use this file as a pattern for your</span>
<a name="l00044"></a>00044 <span class="comment">   own program.  Good Luck !</span>
<a name="l00045"></a>00045 <span class="comment"></span>
<a name="l00046"></a>00046 <span class="comment">   --Doran</span>
<a name="l00047"></a>00047 <span class="comment">*/</span>
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00050"></a>00050 
<a name="l00051"></a>00051 <span class="preprocessor">#include &lt;<a class="code" href="polylib_8h.html">polylib/polylib.h</a>&gt;</span>
<a name="l00052"></a>00052 
<a name="l00053"></a>00053 
<a name="l00054"></a><a class="code" href="testlib_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4">00054</a> <span class="keywordtype">int</span> <a class="code" href="c2p_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a>() { 
<a name="l00055"></a>00055   
<a name="l00056"></a>00056   <a class="code" href="structmatrix.html">Matrix</a> *a, *b, *t;
<a name="l00057"></a>00057   <a class="code" href="structpolyhedron.html">Polyhedron</a> *A, *B, *C, *D;
<a name="l00058"></a>00058   
<a name="l00059"></a>00059   printf(<span class="stringliteral">&quot;Polyhedral Library Test\n\n&quot;</span>);
<a name="l00060"></a>00060   
<a name="l00061"></a>00061   <span class="comment">/* read in a matrix containing your equations */</span>
<a name="l00062"></a>00062   <span class="comment">/* for example, run this program and type in these five  lines:</span>
<a name="l00063"></a>00063 <span class="comment">     4 4</span>
<a name="l00064"></a>00064 <span class="comment">     1 0 1 -1</span>
<a name="l00065"></a>00065 <span class="comment">     1 -1 0 6</span>
<a name="l00066"></a>00066 <span class="comment">     1 0 -1 7</span>
<a name="l00067"></a>00067 <span class="comment">     1 1 0 -2</span>
<a name="l00068"></a>00068 <span class="comment">     This is a matrix for the following inequalities</span>
<a name="l00069"></a>00069 <span class="comment">     1 = inequality,  0x +  1y -1 &gt;=0  --&gt;      y &gt;= 1</span>
<a name="l00070"></a>00070 <span class="comment">     1 = inequality, -1x +  0y +6 &gt;=0  --&gt;      x &lt;= 6</span>
<a name="l00071"></a>00071 <span class="comment">     1 = inequality,  0x + -1y +7 &gt;=0  --&gt;      y &lt;= 7</span>
<a name="l00072"></a>00072 <span class="comment">     1 = inequality,  1x +  0y -2 &gt;=0  --&gt;      x &gt;= 2</span>
<a name="l00073"></a>00073 <span class="comment">     If the first number is a 0 instead of a 1, then that constraint</span>
<a name="l00074"></a>00074 <span class="comment">     is an &apos;equality&apos; instead of an &apos;inequality&apos;.</span>
<a name="l00075"></a>00075 <span class="comment">  */</span>
<a name="l00076"></a>00076   a = <a class="code" href="matrix_8c.html#a3a087ae9a03d5baf0b81831177931143">Matrix_Read</a>();
<a name="l00077"></a>00077   
<a name="l00078"></a>00078   <span class="comment">/* read in a second matrix containing a second set of constraints:</span>
<a name="l00079"></a>00079 <span class="comment">     for example :</span>
<a name="l00080"></a>00080 <span class="comment">     4 4</span>
<a name="l00081"></a>00081 <span class="comment">     1 1 0 -1</span>
<a name="l00082"></a>00082 <span class="comment">     1 -1 0 3</span>
<a name="l00083"></a>00083 <span class="comment">     1 0 -1 5</span>
<a name="l00084"></a>00084 <span class="comment">     1 0 1 -2</span>
<a name="l00085"></a>00085 <span class="comment">  */</span>
<a name="l00086"></a>00086   b = <a class="code" href="matrix_8c.html#a3a087ae9a03d5baf0b81831177931143">Matrix_Read</a>();
<a name="l00087"></a>00087 
<a name="l00088"></a>00088   <span class="comment">/* Convert the constraints to a Polyhedron.</span>
<a name="l00089"></a>00089 <span class="comment">     This operation 1. Computes the dual ray/vertice form of the</span>
<a name="l00090"></a>00090 <span class="comment">     system, and 2. Eliminates redundant constraints and reduces</span>
<a name="l00091"></a>00091 <span class="comment">     them to a minimal form.</span>
<a name="l00092"></a>00092 <span class="comment">  */</span>
<a name="l00093"></a>00093   A = <a class="code" href="polyhedron_8c.html#aefb77665a187d751bdd44f106b12465e" title="Given a matrix of constraints (&amp;#39;Constraints&amp;#39;), construct and return a polyhedron...">Constraints2Polyhedron</a>(a, 200);
<a name="l00094"></a>00094   B = <a class="code" href="polyhedron_8c.html#aefb77665a187d751bdd44f106b12465e" title="Given a matrix of constraints (&amp;#39;Constraints&amp;#39;), construct and return a polyhedron...">Constraints2Polyhedron</a>(b, 200);
<a name="l00095"></a>00095 
<a name="l00096"></a>00096   <span class="comment">/* the 200 is the size of the working space (in terms of number</span>
<a name="l00097"></a>00097 <span class="comment">     of rays) that is allocated temporarily</span>
<a name="l00098"></a>00098 <span class="comment">     -- you can enlarge or reduce it as needed */</span>
<a name="l00099"></a>00099   
<a name="l00100"></a>00100   <span class="comment">/* There is likewise a rays to polyhedron procedure */</span>
<a name="l00101"></a>00101   
<a name="l00102"></a>00102   <span class="comment">/* Since you are done with the matrices a and b, be a good citizen</span>
<a name="l00103"></a>00103 <span class="comment">     and clean up your garbage */</span>
<a name="l00104"></a>00104   <a class="code" href="matrix_8c.html#afcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(a);
<a name="l00105"></a>00105   <a class="code" href="matrix_8c.html#afcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(b);
<a name="l00106"></a>00106   
<a name="l00107"></a>00107   <span class="comment">/* If you want the the reduced set of equations back, you can</span>
<a name="l00108"></a>00108 <span class="comment">     either learn to read the polyhedron structure (not hard,</span>
<a name="l00109"></a>00109 <span class="comment">     look in &quot;types.h&quot;...</span>
<a name="l00110"></a>00110 <span class="comment">     or you can get the matrix back in the same format it started</span>
<a name="l00111"></a>00111 <span class="comment">     in... */</span>
<a name="l00112"></a>00112   a = <a class="code" href="polyhedron_8c.html#a69417a994cd682d0c391ecff6d223cd2">Polyhedron2Constraints</a>(A);
<a name="l00113"></a>00113   b = <a class="code" href="polyhedron_8c.html#a69417a994cd682d0c391ecff6d223cd2">Polyhedron2Constraints</a>(B);
<a name="l00114"></a>00114 
<a name="l00115"></a>00115   <span class="comment">/* Take a look at them if you want */</span>
<a name="l00116"></a>00116   printf(<span class="stringliteral">&quot;\na =&quot;</span>);
<a name="l00117"></a>00117   <a class="code" href="matrix_8c.html#ad4c3c350dba633f72bbcf3609b6b67d7">Matrix_Print</a>(stdout,<a class="code" href="types_8h.html#ae6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,a);
<a name="l00118"></a>00118   printf(<span class="stringliteral">&quot;\nb =&quot;</span>);
<a name="l00119"></a>00119   <a class="code" href="matrix_8c.html#ad4c3c350dba633f72bbcf3609b6b67d7">Matrix_Print</a>(stdout,<a class="code" href="types_8h.html#ae6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,b);
<a name="l00120"></a>00120 
<a name="l00121"></a>00121   <a class="code" href="matrix_8c.html#afcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(a);
<a name="l00122"></a>00122   <a class="code" href="matrix_8c.html#afcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(b);
<a name="l00123"></a>00123   
<a name="l00124"></a>00124   <span class="comment">/* To intersect the two systems, use the polyhedron formats... */</span>
<a name="l00125"></a>00125   C = <a class="code" href="polyhedron_8c.html#ac5a1a2751f0b833183560af25b18033b">DomainIntersection</a>(A, B, 200);
<a name="l00126"></a>00126   
<a name="l00127"></a>00127   <span class="comment">/* Again, the 200 is the size of the working space */</span>
<a name="l00128"></a>00128   
<a name="l00129"></a>00129   <span class="comment">/* This time, lets look a the polyhedron itself... */</span>
<a name="l00130"></a>00130   printf(<span class="stringliteral">&quot;\nC = A and B =&quot;</span>);
<a name="l00131"></a>00131   <a class="code" href="polyhedron_8c.html#ad87595bd01c5cdd0f3933824943db496">Polyhedron_Print</a>(stdout,<a class="code" href="types_8h.html#ae6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,C);
<a name="l00132"></a>00132   
<a name="l00133"></a>00133   <span class="comment">/* </span>
<a name="l00134"></a>00134 <span class="comment">   * The operations DomainUnion, DomainDifference, and DomainConvex</span>
<a name="l00135"></a>00135 <span class="comment">   * are also available </span>
<a name="l00136"></a>00136 <span class="comment">   */</span>
<a name="l00137"></a>00137   
<a name="l00138"></a>00138   <span class="comment">/* </span>
<a name="l00139"></a>00139 <span class="comment">   * Read in a third matrix containing a transformation matrix,</span>
<a name="l00140"></a>00140 <span class="comment">   * this one swaps the indices (x,y --&gt; y,x):</span>
<a name="l00141"></a>00141 <span class="comment">   * 3 3</span>
<a name="l00142"></a>00142 <span class="comment">   * 0 1 0</span>
<a name="l00143"></a>00143 <span class="comment">   * 1 0 0</span>
<a name="l00144"></a>00144 <span class="comment">   * 0 0 1</span>
<a name="l00145"></a>00145 <span class="comment">   */</span>
<a name="l00146"></a>00146   
<a name="l00147"></a>00147   
<a name="l00148"></a>00148   t = <a class="code" href="matrix_8c.html#a3a087ae9a03d5baf0b81831177931143">Matrix_Read</a>();
<a name="l00149"></a>00149   
<a name="l00150"></a>00150   <span class="comment">/* Take the preimage (transform the equations) of the domain C to</span>
<a name="l00151"></a>00151 <span class="comment">     get D.  Are you catching on to this 200 thing yet ??? */</span>
<a name="l00152"></a>00152   
<a name="l00153"></a>00153   D = <a class="code" href="polyhedron_8c.html#a53d52d5d1befc1d1446e0920556c3d24">Polyhedron_Preimage</a>(C, t, 200);
<a name="l00154"></a>00154   
<a name="l00155"></a>00155   <span class="comment">/* cleanup please */</span>
<a name="l00156"></a>00156   <a class="code" href="matrix_8c.html#afcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(t);
<a name="l00157"></a>00157   
<a name="l00158"></a>00158   printf(<span class="stringliteral">&quot;\nD = transformed C =&quot;</span>);
<a name="l00159"></a>00159   <a class="code" href="polyhedron_8c.html#ad87595bd01c5cdd0f3933824943db496">Polyhedron_Print</a>(stdout,<a class="code" href="types_8h.html#ae6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,D);
<a name="l00160"></a>00160   <a class="code" href="polyhedron_8c.html#ae6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(D);
<a name="l00161"></a>00161   
<a name="l00162"></a>00162   <span class="comment">/* in a similar way, Polyhedron_Image(dom, mat, 200), takes the image</span>
<a name="l00163"></a>00163 <span class="comment">     of dom under matrix mat  (transforms the vertices/rays) */</span>
<a name="l00164"></a>00164   
<a name="l00165"></a>00165   <span class="comment">/* The function PolyhedronIncludes(Pol1, Pol2) returns 1 if Pol1</span>
<a name="l00166"></a>00166 <span class="comment">     includes (covers) Pol2, and a 0 otherwise */</span>
<a name="l00167"></a>00167   
<a name="l00168"></a>00168   <span class="keywordflow">if</span> (<a class="code" href="polyhedron_8c.html#a107a96d44465428ffcd25f1ab3d67b43">PolyhedronIncludes</a>(A,C))
<a name="l00169"></a>00169     printf(<span class="stringliteral">&quot;\nWe expected A to cover C since C = A intersect B\n&quot;</span>);
<a name="l00170"></a>00170   <span class="keywordflow">if</span> (!<a class="code" href="polyhedron_8c.html#a107a96d44465428ffcd25f1ab3d67b43">PolyhedronIncludes</a>(C,B))
<a name="l00171"></a>00171     printf(<span class="stringliteral">&quot;and C does not cover B...\n&quot;</span>);
<a name="l00172"></a>00172   
<a name="l00173"></a>00173   <span class="comment">/* Final note:  some functions are defined for Domains, others</span>
<a name="l00174"></a>00174 <span class="comment">   * for Polyhedrons.  A domain is simply a list of polyhedrons.</span>
<a name="l00175"></a>00175 <span class="comment">   * Every polyhedron structure has a &quot;next&quot; pointer used to </span>
<a name="l00176"></a>00176 <span class="comment">   * make a list of polyhedrons...  For instance, the union of</span>
<a name="l00177"></a>00177 <span class="comment">   * two disjoint polyhedra is a domain consisting of two polyhedra.</span>
<a name="l00178"></a>00178 <span class="comment">   * If you want the convex domain... you have to call </span>
<a name="l00179"></a>00179 <span class="comment">   * DomainConvex(Pol1, 200) explicity.   </span>
<a name="l00180"></a>00180 <span class="comment">   * Note that includes does not work on domains, only on simple</span>
<a name="l00181"></a>00181 <span class="comment">   * polyhedrons...</span>
<a name="l00182"></a>00182 <span class="comment">   * Thats the end of the demo...  write me if you have questions.</span>
<a name="l00183"></a>00183 <span class="comment">   * And remember to clean up... </span>
<a name="l00184"></a>00184 <span class="comment">   */</span>
<a name="l00185"></a>00185   
<a name="l00186"></a>00186   <a class="code" href="polyhedron_8c.html#ae6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(A);
<a name="l00187"></a>00187   <a class="code" href="polyhedron_8c.html#ae6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(B);
<a name="l00188"></a>00188   <a class="code" href="polyhedron_8c.html#ae6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(C);
<a name="l00189"></a>00189   
<a name="l00190"></a>00190   <span class="keywordflow">return</span> 0;
<a name="l00191"></a>00191 }
<a name="l00192"></a>00192 
<a name="l00193"></a>00193 
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated on Wed Nov 25 17:45:26 2009 for polylib by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>