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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>polylib: testlib.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<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>
<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">/* main.c</span>
<a name="l00002"></a>00002 <span class="comment"> COPYRIGHT</span>
<a name="l00003"></a>00003 <span class="comment"> Both this software and its documentation are</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment"> Copyright 1993 by IRISA /Universite de Rennes I - France,</span>
<a name="l00006"></a>00006 <span class="comment"> Copyright 1995,1996 by BYU</span>
<a name="l00007"></a>00007 <span class="comment"> all rights reserved.</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment"> Permission is granted to copy, use, and distribute</span>
<a name="l00010"></a>00010 <span class="comment"> for any commercial or noncommercial purpose under the terms</span>
<a name="l00011"></a>00011 <span class="comment"> of the GNU General Public license, version 2, June 1991</span>
<a name="l00012"></a>00012 <span class="comment"> (see file : LICENSING).</span>
<a name="l00013"></a>00013 <span class="comment"></span>
<a name="l00014"></a>00014 <span class="comment"> This file along with polyhedron.c and vector.c do the following functions:</span>
<a name="l00015"></a>00015 <span class="comment"> - Extraction of a minimal set of constraints from some set of constraints</span>
<a name="l00016"></a>00016 <span class="comment"> - Intersection of two convexes</span>
<a name="l00017"></a>00017 <span class="comment"> - Application of a linear function to some convex</span>
<a name="l00018"></a>00018 <span class="comment"> - Verification that a convex is included in some other convex</span>
<a name="l00019"></a>00019 <span class="comment"></span>
<a name="l00020"></a>00020 <span class="comment"> They are compiled together into an executable file called "test".</span>
<a name="l00021"></a>00021 <span class="comment"> The file test.in contains sample input data for the program.</span>
<a name="l00022"></a>00022 <span class="comment"> The file test.out contains the output produced by the program.</span>
<a name="l00023"></a>00023 <span class="comment"></span>
<a name="l00024"></a>00024 <span class="comment"> This directory also contains a makefile to build and run the test.</span>
<a name="l00025"></a>00025 <span class="comment"></span>
<a name="l00026"></a>00026 <span class="comment"> This file is a tutorial on how to use the library. The comments</span>
<a name="l00027"></a>00027 <span class="comment"> explain whats going on. You can use this file as a pattern for your</span>
<a name="l00028"></a>00028 <span class="comment"> own program. Good Luck !</span>
<a name="l00029"></a>00029 <span class="comment"></span>
<a name="l00030"></a>00030 <span class="comment"> --Doran</span>
<a name="l00031"></a>00031 <span class="comment">*/</span>
<a name="l00032"></a>00032
<a name="l00033"></a>00033 <span class="preprocessor">#include <stdio.h></span>
<a name="l00034"></a>00034
<a name="l00035"></a>00035 <span class="preprocessor">#include <<a class="code" href="polylib_8h.html">polylib/polylib.h</a>></span>
<a name="l00036"></a>00036
<a name="l00037"></a>00037
<a name="l00038"></a><a class="code" href="testlib_8c.html#e66f6b31b5ad750f1fe042a706a4e3d4">00038</a> <span class="keywordtype">int</span> <a class="code" href="c2p_8c.html#e66f6b31b5ad750f1fe042a706a4e3d4">main</a>() {
<a name="l00039"></a>00039
<a name="l00040"></a>00040 <a class="code" href="structmatrix.html">Matrix</a> *a, *b, *t;
<a name="l00041"></a>00041 <a class="code" href="structpolyhedron.html">Polyhedron</a> *A, *B, *C, *D;
<a name="l00042"></a>00042
<a name="l00043"></a>00043 printf(<span class="stringliteral">"Polyhedral Library Test\n\n"</span>);
<a name="l00044"></a>00044
<a name="l00045"></a>00045 <span class="comment">/* read in a matrix containing your equations */</span>
<a name="l00046"></a>00046 <span class="comment">/* for example, run this program and type in these five lines:</span>
<a name="l00047"></a>00047 <span class="comment"> 4 4</span>
<a name="l00048"></a>00048 <span class="comment"> 1 0 1 -1</span>
<a name="l00049"></a>00049 <span class="comment"> 1 -1 0 6</span>
<a name="l00050"></a>00050 <span class="comment"> 1 0 -1 7</span>
<a name="l00051"></a>00051 <span class="comment"> 1 1 0 -2</span>
<a name="l00052"></a>00052 <span class="comment"> This is a matrix for the following inequalities</span>
<a name="l00053"></a>00053 <span class="comment"> 1 = inequality, 0x + 1y -1 >=0 --> y >= 1</span>
<a name="l00054"></a>00054 <span class="comment"> 1 = inequality, -1x + 0y +6 >=0 --> x <= 6</span>
<a name="l00055"></a>00055 <span class="comment"> 1 = inequality, 0x + -1y +7 >=0 --> y <= 7</span>
<a name="l00056"></a>00056 <span class="comment"> 1 = inequality, 1x + 0y -2 >=0 --> x >= 2</span>
<a name="l00057"></a>00057 <span class="comment"> If the first number is a 0 instead of a 1, then that constraint</span>
<a name="l00058"></a>00058 <span class="comment"> is an 'equality' instead of an 'inequality'.</span>
<a name="l00059"></a>00059 <span class="comment"> */</span>
<a name="l00060"></a>00060 a = <a class="code" href="matrix_8c.html#3a087ae9a03d5baf0b81831177931143">Matrix_Read</a>();
<a name="l00061"></a>00061
<a name="l00062"></a>00062 <span class="comment">/* read in a second matrix containing a second set of constraints:</span>
<a name="l00063"></a>00063 <span class="comment"> for example :</span>
<a name="l00064"></a>00064 <span class="comment"> 4 4</span>
<a name="l00065"></a>00065 <span class="comment"> 1 1 0 -1</span>
<a name="l00066"></a>00066 <span class="comment"> 1 -1 0 3</span>
<a name="l00067"></a>00067 <span class="comment"> 1 0 -1 5</span>
<a name="l00068"></a>00068 <span class="comment"> 1 0 1 -2</span>
<a name="l00069"></a>00069 <span class="comment"> */</span>
<a name="l00070"></a>00070 b = <a class="code" href="matrix_8c.html#3a087ae9a03d5baf0b81831177931143">Matrix_Read</a>();
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <span class="comment">/* Convert the constraints to a Polyhedron.</span>
<a name="l00073"></a>00073 <span class="comment"> This operation 1. Computes the dual ray/vertice form of the</span>
<a name="l00074"></a>00074 <span class="comment"> system, and 2. Eliminates redundant constraints and reduces</span>
<a name="l00075"></a>00075 <span class="comment"> them to a minimal form.</span>
<a name="l00076"></a>00076 <span class="comment"> */</span>
<a name="l00077"></a>00077 A = <a class="code" href="polyhedron_8c.html#efb77665a187d751bdd44f106b12465e" title="Given a matrix of constraints (&#39;Constraints&#39;), construct and return a polyhedron...">Constraints2Polyhedron</a>(a, 200);
<a name="l00078"></a>00078 B = <a class="code" href="polyhedron_8c.html#efb77665a187d751bdd44f106b12465e" title="Given a matrix of constraints (&#39;Constraints&#39;), construct and return a polyhedron...">Constraints2Polyhedron</a>(b, 200);
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <span class="comment">/* the 200 is the size of the working space (in terms of number</span>
<a name="l00081"></a>00081 <span class="comment"> of rays) that is allocated temporarily</span>
<a name="l00082"></a>00082 <span class="comment"> -- you can enlarge or reduce it as needed */</span>
<a name="l00083"></a>00083
<a name="l00084"></a>00084 <span class="comment">/* There is likewise a rays to polyhedron procedure */</span>
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="comment">/* Since you are done with the matrices a and b, be a good citizen</span>
<a name="l00087"></a>00087 <span class="comment"> and clean up your garbage */</span>
<a name="l00088"></a>00088 <a class="code" href="matrix_8c.html#fcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(a);
<a name="l00089"></a>00089 <a class="code" href="matrix_8c.html#fcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(b);
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="comment">/* If you want the the reduced set of equations back, you can</span>
<a name="l00092"></a>00092 <span class="comment"> either learn to read the polyhedron structure (not hard,</span>
<a name="l00093"></a>00093 <span class="comment"> look in "types.h"...</span>
<a name="l00094"></a>00094 <span class="comment"> or you can get the matrix back in the same format it started</span>
<a name="l00095"></a>00095 <span class="comment"> in... */</span>
<a name="l00096"></a>00096 a = <a class="code" href="polyhedron_8c.html#69417a994cd682d0c391ecff6d223cd2">Polyhedron2Constraints</a>(A);
<a name="l00097"></a>00097 b = <a class="code" href="polyhedron_8c.html#69417a994cd682d0c391ecff6d223cd2">Polyhedron2Constraints</a>(B);
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="comment">/* Take a look at them if you want */</span>
<a name="l00100"></a>00100 printf(<span class="stringliteral">"\na ="</span>);
<a name="l00101"></a>00101 <a class="code" href="matrix_8c.html#d4c3c350dba633f72bbcf3609b6b67d7">Matrix_Print</a>(stdout,<a class="code" href="types_8h.html#e6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,a);
<a name="l00102"></a>00102 printf(<span class="stringliteral">"\nb ="</span>);
<a name="l00103"></a>00103 <a class="code" href="matrix_8c.html#d4c3c350dba633f72bbcf3609b6b67d7">Matrix_Print</a>(stdout,<a class="code" href="types_8h.html#e6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,b);
<a name="l00104"></a>00104
<a name="l00105"></a>00105 <a class="code" href="matrix_8c.html#fcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(a);
<a name="l00106"></a>00106 <a class="code" href="matrix_8c.html#fcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(b);
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="comment">/* To intersect the two systems, use the polyhedron formats... */</span>
<a name="l00109"></a>00109 C = <a class="code" href="polyhedron_8c.html#c5a1a2751f0b833183560af25b18033b">DomainIntersection</a>(A, B, 200);
<a name="l00110"></a>00110
<a name="l00111"></a>00111 <span class="comment">/* Again, the 200 is the size of the working space */</span>
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <span class="comment">/* This time, lets look a the polyhedron itself... */</span>
<a name="l00114"></a>00114 printf(<span class="stringliteral">"\nC = A and B ="</span>);
<a name="l00115"></a>00115 <a class="code" href="polyhedron_8c.html#d87595bd01c5cdd0f3933824943db496">Polyhedron_Print</a>(stdout,<a class="code" href="types_8h.html#e6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,C);
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="comment">/* </span>
<a name="l00118"></a>00118 <span class="comment"> * The operations DomainUnion, DomainDifference, and DomainConvex</span>
<a name="l00119"></a>00119 <span class="comment"> * are also available </span>
<a name="l00120"></a>00120 <span class="comment"> */</span>
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="comment">/* </span>
<a name="l00123"></a>00123 <span class="comment"> * Read in a third matrix containing a transformation matrix,</span>
<a name="l00124"></a>00124 <span class="comment"> * this one swaps the indices (x,y --> y,x):</span>
<a name="l00125"></a>00125 <span class="comment"> * 3 3</span>
<a name="l00126"></a>00126 <span class="comment"> * 0 1 0</span>
<a name="l00127"></a>00127 <span class="comment"> * 1 0 0</span>
<a name="l00128"></a>00128 <span class="comment"> * 0 0 1</span>
<a name="l00129"></a>00129 <span class="comment"> */</span>
<a name="l00130"></a>00130
<a name="l00131"></a>00131
<a name="l00132"></a>00132 t = <a class="code" href="matrix_8c.html#3a087ae9a03d5baf0b81831177931143">Matrix_Read</a>();
<a name="l00133"></a>00133
<a name="l00134"></a>00134 <span class="comment">/* Take the preimage (transform the equations) of the domain C to</span>
<a name="l00135"></a>00135 <span class="comment"> get D. Are you catching on to this 200 thing yet ??? */</span>
<a name="l00136"></a>00136
<a name="l00137"></a>00137 D = <a class="code" href="polyhedron_8c.html#53d52d5d1befc1d1446e0920556c3d24">Polyhedron_Preimage</a>(C, t, 200);
<a name="l00138"></a>00138
<a name="l00139"></a>00139 <span class="comment">/* cleanup please */</span>
<a name="l00140"></a>00140 <a class="code" href="matrix_8c.html#fcb312b7c12a6997cd66964ecc34e1a6">Matrix_Free</a>(t);
<a name="l00141"></a>00141
<a name="l00142"></a>00142 printf(<span class="stringliteral">"\nD = transformed C ="</span>);
<a name="l00143"></a>00143 <a class="code" href="polyhedron_8c.html#d87595bd01c5cdd0f3933824943db496">Polyhedron_Print</a>(stdout,<a class="code" href="types_8h.html#e6f16bcd4a42ba51cbb003e3d1e1cde6">P_VALUE_FMT</a>,D);
<a name="l00144"></a>00144 <a class="code" href="polyhedron_8c.html#e6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(D);
<a name="l00145"></a>00145
<a name="l00146"></a>00146 <span class="comment">/* in a similar way, Polyhedron_Image(dom, mat, 200), takes the image</span>
<a name="l00147"></a>00147 <span class="comment"> of dom under matrix mat (transforms the vertices/rays) */</span>
<a name="l00148"></a>00148
<a name="l00149"></a>00149 <span class="comment">/* The function PolyhedronIncludes(Pol1, Pol2) returns 1 if Pol1</span>
<a name="l00150"></a>00150 <span class="comment"> includes (covers) Pol2, and a 0 otherwise */</span>
<a name="l00151"></a>00151
<a name="l00152"></a>00152 <span class="keywordflow">if</span> (<a class="code" href="polyhedron_8c.html#107a96d44465428ffcd25f1ab3d67b43">PolyhedronIncludes</a>(A,C))
<a name="l00153"></a>00153 printf(<span class="stringliteral">"\nWe expected A to cover C since C = A intersect B\n"</span>);
<a name="l00154"></a>00154 <span class="keywordflow">if</span> (!<a class="code" href="polyhedron_8c.html#107a96d44465428ffcd25f1ab3d67b43">PolyhedronIncludes</a>(C,B))
<a name="l00155"></a>00155 printf(<span class="stringliteral">"and C does not cover B...\n"</span>);
<a name="l00156"></a>00156
<a name="l00157"></a>00157 <span class="comment">/* Final note: some functions are defined for Domains, others</span>
<a name="l00158"></a>00158 <span class="comment"> * for Polyhedrons. A domain is simply a list of polyhedrons.</span>
<a name="l00159"></a>00159 <span class="comment"> * Every polyhedron structure has a "next" pointer used to </span>
<a name="l00160"></a>00160 <span class="comment"> * make a list of polyhedrons... For instance, the union of</span>
<a name="l00161"></a>00161 <span class="comment"> * two disjoint polyhedra is a domain consisting of two polyhedra.</span>
<a name="l00162"></a>00162 <span class="comment"> * If you want the convex domain... you have to call </span>
<a name="l00163"></a>00163 <span class="comment"> * DomainConvex(Pol1, 200) explicity. </span>
<a name="l00164"></a>00164 <span class="comment"> * Note that includes does not work on domains, only on simple</span>
<a name="l00165"></a>00165 <span class="comment"> * polyhedrons...</span>
<a name="l00166"></a>00166 <span class="comment"> * Thats the end of the demo... write me if you have questions.</span>
<a name="l00167"></a>00167 <span class="comment"> * And remember to clean up... </span>
<a name="l00168"></a>00168 <span class="comment"> */</span>
<a name="l00169"></a>00169
<a name="l00170"></a>00170 <a class="code" href="polyhedron_8c.html#e6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(A);
<a name="l00171"></a>00171 <a class="code" href="polyhedron_8c.html#e6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(B);
<a name="l00172"></a>00172 <a class="code" href="polyhedron_8c.html#e6d0a7daf8e801a777fc8e93d8cfe43a">Domain_Free</a>(C);
<a name="l00173"></a>00173
<a name="l00174"></a>00174 <span class="keywordflow">return</span> 0;
<a name="l00175"></a>00175 }
<a name="l00176"></a>00176
<a name="l00177"></a>00177
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Tue Sep 15 18:34:00 2009 for polylib by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>
|