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
|
<!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: matrix_addon.h 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>matrix_addon.h</h1><a href="matrix__addon_8h.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"></span>
<a name="l00018"></a>00018 <span class="comment">/** </span>
<a name="l00019"></a>00019 <span class="comment"> * Polylib matrix addons</span>
<a name="l00020"></a>00020 <span class="comment"> * Mainly, deals with polyhedra represented in implicit form (set of</span>
<a name="l00021"></a>00021 <span class="comment"> * constraints).</span>
<a name="l00022"></a>00022 <span class="comment"> * @author Benoit Meister </span>
<a name="l00023"></a>00023 <span class="comment"> */</span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef __BM_MATRIX_ADDON_H__</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define __BM_MATRIX_ADDON_H__</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="preprocessor">#include<<a class="code" href="polylib_8h.html">polylib/polylib.h</a>></span>
<a name="l00029"></a>00029 <span class="preprocessor">#include<<a class="code" href="assert_8h.html">assert.h</a>></span>
<a name="l00030"></a>00030 <span class="comment"></span>
<a name="l00031"></a>00031 <span class="comment">/** Shortcut for Matrix_Print */</span>
<a name="l00032"></a><a class="code" href="matrix__addon_8h.html#a11468159c7fa7d75fadfa10e2e929fee">00032</a> <span class="preprocessor">#define show_matrix(M) { printf(#M"= \n"); \</span>
<a name="l00033"></a>00033 <span class="preprocessor"> if (M!=NULL) { \</span>
<a name="l00034"></a>00034 <span class="preprocessor"> Matrix_Print(stderr,P_VALUE_FMT,(M));} \</span>
<a name="l00035"></a>00035 <span class="preprocessor"> else {printf("<NULL>\n");} \</span>
<a name="l00036"></a>00036 <span class="preprocessor"> } </span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00038"></a>00038 <span class="comment">/** </span>
<a name="l00039"></a>00039 <span class="comment"> * Allocates a matrix if it is null, or else asserts that it has at least a</span>
<a name="l00040"></a>00040 <span class="comment"> * certain size */</span>
<a name="l00041"></a><a class="code" href="matrix__addon_8h.html#a4f34dad95751e0142b7b9404fc44d0f0">00041</a> <span class="preprocessor">#define ensureMatrix(M, r, c) { if (M==NULL) M = Matrix_Alloc(r,c); \</span>
<a name="l00042"></a>00042 <span class="preprocessor"> else assert (M->NbRows>=r && M->NbColumns>=c); \</span>
<a name="l00043"></a>00043 <span class="preprocessor"> } </span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
<a name="l00045"></a>00045 <span class="comment">/* Creates a view of the constraints of a polyhedron as a Matrix * */</span>
<a name="l00046"></a>00046 <a class="code" href="structmatrix.html">Matrix</a> * <a class="code" href="matrix__addon_8c.html#a495de3cced5c0eecf74aef91b05502dd" title="Idmatrix_addon.c,v 1.17 2007/03/18 18:49:08 skimo Exp ">constraintsView</a>(<a class="code" href="structpolyhedron.html">Polyhedron</a> * P);
<a name="l00047"></a>00047
<a name="l00048"></a>00048 <span class="comment">/* "Frees" a view of the constraints of a polyhedron */</span>
<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#aa0cc9da9320a0f253db72e78f4f6e56b" title="&quot;Frees&quot; a view of the constraints of a polyhedron">constraintsView_Free</a>(<a class="code" href="structmatrix.html">Matrix</a> * M);
<a name="l00050"></a>00050
<a name="l00051"></a>00051 <span class="comment">/* splits a matrix of constraints M into a matrix of equalities Eqs and a</span>
<a name="l00052"></a>00052 <span class="comment"> matrix of inequalities Ineqs allocs the new matrices. */</span>
<a name="l00053"></a>00053 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#a288db1ffeb5425aada82cabf5c824bc4" title="splits a matrix of constraints M into a matrix of equalities Eqs and a matrix of...">split_constraints</a>(<a class="code" href="structmatrix.html">Matrix</a> <span class="keyword">const</span> * M, <a class="code" href="structmatrix.html">Matrix</a> ** Eqs, <a class="code" href="structmatrix.html">Matrix</a> **Ineqs);
<a name="l00054"></a>00054
<a name="l00055"></a>00055 <span class="comment">/* returns the dim-dimensional identity matrix */</span>
<a name="l00056"></a>00056 <a class="code" href="structmatrix.html">Matrix</a> * <a class="code" href="matrix__addon_8c.html#a33f64eb039ac943c1bddbafc3be3ece6">Identity_Matrix</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dim);
<a name="l00057"></a>00057
<a name="l00058"></a>00058 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#adb1631ef2ddb3b386742b881b30f8ce6" title="returns the dim-dimensional identity matrix.">Matrix_identity</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dim, <a class="code" href="structmatrix.html">Matrix</a> **I);
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="comment">/* given a n x n integer transformation matrix transf, compute its inverse M/g,</span>
<a name="l00061"></a>00061 <span class="comment"> where M is a nxn integer matrix. g is a common denominator for elements of</span>
<a name="l00062"></a>00062 <span class="comment"> (transf^{-1})*/</span>
<a name="l00063"></a>00063 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#ab736f7ec39f7b625397e965e8b612ad2" title="given a n x n integer transformation matrix transf, compute its inverse M/g, where...">mtransformation_inverse</a>(<a class="code" href="structmatrix.html">Matrix</a> * transf, <a class="code" href="structmatrix.html">Matrix</a> ** inv, Value * g);
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <span class="comment">/* simplifies a matrix seen as a polyhedron, by dividing its rows by the gcd of</span>
<a name="l00066"></a>00066 <span class="comment">their elements. */</span>
<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#ace44097b2d9d40d05934971b9716af89" title="simplify a matrix seen as a polyhedron, by dividing its rows by the gcd of their...">mpolyhedron_simplify</a>(<a class="code" href="structmatrix.html">Matrix</a> * polyh);
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="comment">/* inflates a polyhedron (represented as a matrix) P, so that the apx of its</span>
<a name="l00070"></a>00070 <span class="comment"> Ehrhart Polynomial is an upper bound of the Ehrhart polynomial of P WARNING:</span>
<a name="l00071"></a>00071 <span class="comment"> this inflation is supposed to be applied on full-dimensional polyhedra. */</span>
<a name="l00072"></a>00072 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#ac4b68d480196756e0deffafb3d99ecc7" title="inflates a polyhedron (represented as a matrix) P, so that the apx of its Ehrhart...">mpolyhedron_inflate</a>(<a class="code" href="structmatrix.html">Matrix</a> * polyh, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nb_parms);
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <span class="comment">/* deflates a polyhedron (represented as a matrix) P, so that the apx of its</span>
<a name="l00075"></a>00075 <span class="comment"> Ehrhart Polynomial is a lower bound of the Ehrhart polynomial of P WARNING:</span>
<a name="l00076"></a>00076 <span class="comment"> this deflation is supposed to be applied on full-dimensional polyhedra. */</span>
<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#a0f0ba73176f5316a02e849b8c210204a" title="deflates a polyhedron (represented as a matrix) P, so that the apx of its Ehrhart...">mpolyhedron_deflate</a>(<a class="code" href="structmatrix.html">Matrix</a> * polyh, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nb_parms);
<a name="l00078"></a>00078
<a name="l00079"></a>00079 <span class="comment">/* use an eliminator row to eliminate a variable in a victim row (without</span>
<a name="l00080"></a>00080 <span class="comment">changing the sign of the victim row -> important if it is an inequality). */</span>
<a name="l00081"></a>00081 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#a79d19aa329285819b31bc7a602241842" title="use an eliminator row to eliminate a variable in a victim row (without changing the...">eliminate_var_with_constr</a>(<a class="code" href="structmatrix.html">Matrix</a> * Eliminator,
<a name="l00082"></a>00082 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> eliminator_row, <a class="code" href="structmatrix.html">Matrix</a> * Victim,
<a name="l00083"></a>00083 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> victim_row,
<a name="l00084"></a>00084 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> var_to_elim);
<a name="l00085"></a>00085
<a name="l00086"></a>00086
<a name="l00087"></a>00087 <span class="comment">/* ----- PARTIAL MAPPINGS ----- */</span>
<a name="l00088"></a>00088
<a name="l00089"></a>00089 <span class="comment">/* compresses the last vars/pars of the polyhedron M expressed as a polylib</span>
<a name="l00090"></a>00090 <span class="comment"> matrix</span>
<a name="l00091"></a>00091 <span class="comment"> - adresses the full-rank compressions only</span>
<a name="l00092"></a>00092 <span class="comment"> - modfies M */</span>
<a name="l00093"></a>00093 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#a44f487e1b38f0f47c115d2115087a017" title="compress the last vars/pars of the polyhedron M expressed as a polylib matrixadresses...">mpolyhedron_compress_last_vars</a>(<a class="code" href="structmatrix.html">Matrix</a> * M, <a class="code" href="structmatrix.html">Matrix</a> * compression);
<a name="l00094"></a><a class="code" href="matrix__addon_8h.html#a9af03fc1d2667573752d7e593d8a50c3">00094</a> <span class="preprocessor">#define Constraints_compressLastVars(a, b) mpolyhedron_compress_last_vars(a, b)</span>
<a name="l00095"></a>00095 <span class="preprocessor"></span>
<a name="l00096"></a>00096 <span class="comment">/* uses a set of m equalities Eqs to eliminate m variables in the polyhedron.</span>
<a name="l00097"></a>00097 <span class="comment"> Ineqs represented as a matrix eliminates the m first variables </span>
<a name="l00098"></a>00098 <span class="comment">- assumes that Eqs allows to eliminate the m equalities </span>
<a name="l00099"></a>00099 <span class="comment">- modifies Ineqs */</span>
<a name="l00100"></a>00100 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="matrix__addon_8c.html#a649c9050ca9d6229d5b48e966da1f35c" title="use a set of m equalities Eqs to eliminate m variables in the polyhedron Ineqs represented...">mpolyhedron_eliminate_first_variables</a>(<a class="code" href="structmatrix.html">Matrix</a> * Eqs,
<a name="l00101"></a>00101 <a class="code" href="structmatrix.html">Matrix</a> * Ineqs);
<a name="l00102"></a><a class="code" href="matrix__addon_8h.html#af4e227a2b50484a6befcc1e33933eb3a">00102</a> <span class="preprocessor">#define Constraints_eliminateFirstVars(a,b) mpolyhedron_eliminate_first_variables(a,b)</span>
<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00104"></a>00104 <span class="comment">/** returns a contiguous submatrix of a matrix. */</span>
<a name="l00105"></a>00105 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#a33fec91bb879b7b4dda814ad9d33f41b" title="returns a contiguous submatrix of a matrix.">Matrix_subMatrix</a>(<a class="code" href="structmatrix.html">Matrix</a> * M, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sr, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sc,
<a name="l00106"></a>00106 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbR, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbC, <a class="code" href="structmatrix.html">Matrix</a> ** sub);<span class="comment"></span>
<a name="l00107"></a>00107 <span class="comment">/**</span>
<a name="l00108"></a>00108 <span class="comment"> * Cloning function. Similar to Matrix_Copy() but allocates the target matrix</span>
<a name="l00109"></a>00109 <span class="comment"> * if it is set to NULL.</span>
<a name="l00110"></a>00110 <span class="comment"> */</span>
<a name="l00111"></a>00111 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#a8269bc80b6beba6d58a4c5b029f04bbf" title="Cloning function.">Matrix_clone</a>(<a class="code" href="structmatrix.html">Matrix</a> * M, <a class="code" href="structmatrix.html">Matrix</a> ** Cl);
<a name="l00112"></a>00112 <span class="comment"></span>
<a name="l00113"></a>00113 <span class="comment">/**</span>
<a name="l00114"></a>00114 <span class="comment"> * Copies a contiguous submatrix of M1 into M2, at the indicated position.</span>
<a name="l00115"></a>00115 <span class="comment"> * M1 and M2 are assumed t be allocated already.</span>
<a name="l00116"></a>00116 <span class="comment"> */</span>
<a name="l00117"></a>00117 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#acb90cceb8e7a674a3d5796a1402f0c9e" title="Copies a contiguous submatrix of M1 into M2, at the indicated position.">Matrix_copySubMatrix</a>(<a class="code" href="structmatrix.html">Matrix</a> *M1,
<a name="l00118"></a>00118 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sr1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sc1,
<a name="l00119"></a>00119 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbR, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbC,
<a name="l00120"></a>00120 <a class="code" href="structmatrix.html">Matrix</a> * M2,
<a name="l00121"></a>00121 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sr2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sc2);
<a name="l00122"></a>00122 <span class="comment"></span>
<a name="l00123"></a>00123 <span class="comment">/** </span>
<a name="l00124"></a>00124 <span class="comment"> * given a matrix M into -M</span>
<a name="l00125"></a>00125 <span class="comment"> */</span>
<a name="l00126"></a>00126 <span class="keywordtype">void</span> <a class="code" href="matrix__addon_8c.html#acbbded0c02e89b1a7b6b08ee3f396986" title="transforms a matrix M into -M">Matrix_oppose</a>(<a class="code" href="structmatrix.html">Matrix</a> * M);
<a name="l00127"></a>00127
<a name="l00128"></a>00128 <span class="preprocessor">#endif </span><span class="comment">/* __BM_MATRIX_ADDON_H__ */</span>
</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>
|