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 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 List</span></a></li>
<li><a href="globals.html"><span>File 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 <http://www.gnu.org/licenses/>.</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 "test".</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 <stdio.h></span>
<a name="l00050"></a>00050
<a name="l00051"></a>00051 <span class="preprocessor">#include <<a class="code" href="polylib_8h.html">polylib/polylib.h</a>></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">"Polyhedral Library Test\n\n"</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 >=0 --> y >= 1</span>
<a name="l00070"></a>00070 <span class="comment"> 1 = inequality, -1x + 0y +6 >=0 --> x <= 6</span>
<a name="l00071"></a>00071 <span class="comment"> 1 = inequality, 0x + -1y +7 >=0 --> y <= 7</span>
<a name="l00072"></a>00072 <span class="comment"> 1 = inequality, 1x + 0y -2 >=0 --> x >= 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 'equality' instead of an 'inequality'.</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 (&#39;Constraints&#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 (&#39;Constraints&#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 "types.h"...</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">"\na ="</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">"\nb ="</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">"\nC = A and B ="</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 --> 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">"\nD = transformed C ="</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">"\nWe expected A to cover C since C = A intersect B\n"</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">"and C does not cover B...\n"</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 "next" 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
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
|