<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>PolyBoRi: pbori_algorithms.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.5.9 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="namespaces.html"><span>Namespaces</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>pbori_algorithms.h</h1><a href="pbori__algorithms_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// -*- c++ -*-</span> <a name="l00002"></a>00002 <span class="comment">//*****************************************************************************</span> <a name="l00101"></a>00101 <span class="comment"></span><span class="comment">//*****************************************************************************</span> <a name="l00102"></a>00102 <a name="l00103"></a>00103 <span class="preprocessor">#ifndef pbori_algorithms_h_</span> <a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#define pbori_algorithms_h_</span> <a name="l00105"></a>00105 <span class="preprocessor"></span> <a name="l00106"></a>00106 <span class="comment">// include standard headers</span> <a name="l00107"></a>00107 <span class="preprocessor">#include <numeric></span> <a name="l00108"></a>00108 <a name="l00109"></a>00109 <span class="comment">// include basic definitions</span> <a name="l00110"></a>00110 <span class="preprocessor">#include "<a class="code" href="pbori__defs_8h.html">pbori_defs.h</a>"</span> <a name="l00111"></a>00111 <a name="l00112"></a>00112 <span class="comment">// include PolyBoRi algorithm, which do not depend on PolyBoRi classes</span> <a name="l00113"></a>00113 <span class="preprocessor">#include "<a class="code" href="pbori__algo_8h.html">pbori_algo.h</a>"</span> <a name="l00114"></a>00114 <a name="l00115"></a>00115 <span class="comment">// include PolyBoRi class definitions, which are used here</span> <a name="l00116"></a>00116 <span class="preprocessor">#include "<a class="code" href="BoolePolynomial_8h.html">BoolePolynomial.h</a>"</span> <a name="l00117"></a>00117 <span class="preprocessor">#include "<a class="code" href="BooleMonomial_8h.html">BooleMonomial.h</a>"</span> <a name="l00118"></a>00118 <span class="preprocessor">#include "<a class="code" href="CGenericIter_8h.html">CGenericIter.h</a>"</span> <a name="l00119"></a>00119 <a name="l00120"></a>00120 <a name="l00121"></a>00121 <a class="code" href="pbori__defs_8h.html#6ae360a591580558f31b6157ee792a10" title="Start project&#39;s namespace.">BEGIN_NAMESPACE_PBORI</a> <a name="l00122"></a>00122 <a name="l00125"></a>00125 <span class="keyword">inline</span> BoolePolynomial <a name="l00126"></a><a class="code" href="namespacepolybori.html#0f3c5fbaad0a5e31501bbb9260650d4b">00126</a> <a class="code" href="namespacepolybori.html#0f3c5fbaad0a5e31501bbb9260650d4b">spoly</a>(<span class="keyword">const</span> <a class="code" href="classpolybori_1_1BoolePolynomial.html" title="This class wraps the underlying decicion diagram type and defines the necessary operations...">BoolePolynomial</a>& first, <span class="keyword">const</span> <a class="code" href="classpolybori_1_1BoolePolynomial.html" title="This class wraps the underlying decicion diagram type and defines the necessary operations...">BoolePolynomial</a>& second){ <a name="l00127"></a>00127 <a name="l00128"></a>00128 <a class="code" href="classpolybori_1_1BooleMonomial.html" title="This class is just a wrapper for using variables from cudd&#39;s decicion diagram...">BooleMonomial</a> lead1(first.<a class="code" href="classpolybori_1_1BoolePolynomial.html#67cb2a5617e37c17683b730411964186" title="Get leading term.">lead</a>()), lead2(second.<a class="code" href="classpolybori_1_1BoolePolynomial.html#67cb2a5617e37c17683b730411964186" title="Get leading term.">lead</a>()); <a name="l00129"></a>00129 <a name="l00130"></a>00130 <a class="code" href="classpolybori_1_1BooleMonomial.html" title="This class is just a wrapper for using variables from cudd&#39;s decicion diagram...">BooleMonomial</a> prod = lead1; <a name="l00131"></a>00131 prod *= lead2; <a name="l00132"></a>00132 <a name="l00133"></a>00133 <span class="keywordflow">return</span> ( first * (prod / lead1) ) + ( second * (prod / lead2) ); <a name="l00134"></a>00134 } <a name="l00135"></a>00135 <a name="l00136"></a>00136 <span class="keyword">template</span> <<span class="keyword">class</span> NaviType, <span class="keyword">class</span> LowerIterator, <span class="keyword">class</span> ValueType> <a name="l00137"></a>00137 ValueType <a name="l00138"></a><a class="code" href="namespacepolybori.html#7bc1eb21cf1b279d6e84f83e71b1df26">00138</a> <a class="code" href="namespacepolybori.html#7bc1eb21cf1b279d6e84f83e71b1df26">lower_term_accumulate</a>(NaviType navi, <a name="l00139"></a>00139 LowerIterator lstart, LowerIterator lfinish, <a name="l00140"></a>00140 ValueType init) { <a name="l00141"></a>00141 assert(init.isZero()); <a name="l00143"></a>00143 <span class="keywordflow">if</span> (lstart == lfinish){ <a name="l00144"></a>00144 <span class="keywordflow">return</span> init; <a name="l00145"></a>00145 } <a name="l00146"></a>00146 <a name="l00147"></a>00147 <span class="keywordflow">if</span> (navi.isConstant()) <a name="l00148"></a>00148 <span class="keywordflow">return</span> (navi.terminalValue()? (ValueType)init.ring().one(): init); <a name="l00149"></a>00149 <a name="l00150"></a>00150 assert(*lstart >= *navi); <a name="l00151"></a>00151 <a name="l00152"></a>00152 ValueType result; <a name="l00153"></a>00153 <span class="keywordflow">if</span> (*lstart > *navi) { <a name="l00154"></a>00154 <a name="l00155"></a>00155 ValueType reselse = <a name="l00156"></a>00156 <a class="code" href="namespacepolybori.html#7bc1eb21cf1b279d6e84f83e71b1df26">lower_term_accumulate</a>(navi.elseBranch(), lstart, lfinish, init); <a name="l00157"></a>00157 <a name="l00158"></a>00158 <span class="comment">// if(reselse.isZero())</span> <a name="l00159"></a>00159 <span class="comment">// return BooleSet(navi.thenBranch()).change(*navi);</span> <a name="l00160"></a>00160 <a name="l00161"></a>00161 <span class="comment">// Note: result == BooleSet(navi) holds only in trivial cases, so testing</span> <a name="l00162"></a>00162 <span class="comment">// reselse.navigation() == navi.elseBranch() is almost always false</span> <a name="l00163"></a>00163 <span class="comment">// Hence, checking reselse.navigation() == navi.elseBranch() for returning</span> <a name="l00164"></a>00164 <span class="comment">// navi, instead of result yields too much overhead.</span> <a name="l00165"></a>00165 result = <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a>(*navi, navi.thenBranch(), reselse.navigation(), <a name="l00166"></a>00166 init.ring()); <a name="l00167"></a>00167 } <a name="l00168"></a>00168 <span class="keywordflow">else</span> { <a name="l00169"></a>00169 assert(*lstart == *navi); <a name="l00170"></a>00170 ++lstart; <a name="l00171"></a>00171 <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a> resthen = <a name="l00172"></a>00172 <a class="code" href="namespacepolybori.html#7bc1eb21cf1b279d6e84f83e71b1df26">lower_term_accumulate</a>(navi.thenBranch(), lstart, lfinish, init).diagram(); <a name="l00173"></a>00173 <a name="l00174"></a>00174 result = resthen.<a class="code" href="classpolybori_1_1BooleSet.html#b199b5c67866f25585866aa306466035">change</a>(*navi); <a name="l00175"></a>00175 } <a name="l00176"></a>00176 <a name="l00177"></a>00177 <span class="keywordflow">return</span> result; <a name="l00178"></a>00178 } <a name="l00179"></a>00179 <a name="l00180"></a>00180 <a name="l00181"></a>00181 <span class="keyword">template</span> <<span class="keyword">class</span> UpperIterator, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> ValueType> <a name="l00182"></a>00182 ValueType <a name="l00183"></a><a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">00183</a> <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(UpperIterator ustart, UpperIterator ufinish, <a name="l00184"></a>00184 NaviType navi, ValueType init) { <a name="l00185"></a>00185 <a name="l00186"></a>00186 <span class="comment">// Note: Recursive caching, wrt. a navigator representing the term</span> <a name="l00187"></a>00187 <span class="comment">// corresponding to ustart .. ufinish cannot be efficient here, because</span> <a name="l00188"></a>00188 <span class="comment">// dereferencing the term is as expensive as this procedure in whole. (Maybe</span> <a name="l00189"></a>00189 <span class="comment">// the generation of the BooleSet in the final line could be cached somehow.)</span> <a name="l00190"></a>00190 <a name="l00191"></a>00191 <span class="comment">// assuming (ustart .. ufinish) never means zero</span> <a name="l00192"></a>00192 <span class="keywordflow">if</span> (ustart == ufinish) <a name="l00193"></a>00193 <span class="keywordflow">return</span> init.ring().one(); <a name="l00194"></a>00194 <a name="l00195"></a>00195 <span class="keywordflow">while</span> (*navi < *ustart) <a name="l00196"></a>00196 navi.incrementElse(); <a name="l00197"></a>00197 ++ustart; <a name="l00198"></a>00198 NaviType navithen = navi.thenBranch(); <a name="l00199"></a>00199 ValueType resthen = <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(ustart, ufinish, navithen, init); <a name="l00200"></a>00200 <a name="l00201"></a>00201 <span class="comment">// The following condition holds quite often, so computation time may be saved</span> <a name="l00202"></a>00202 <span class="keywordflow">if</span> (navithen == resthen.navigation()) <a name="l00203"></a>00203 <span class="keywordflow">return</span> <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a>(navi, init.ring()); <a name="l00204"></a>00204 <a name="l00205"></a>00205 <span class="keywordflow">return</span> <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a>(*navi, resthen.navigation(), navi.elseBranch(), init.ring()); <a name="l00206"></a>00206 } <a name="l00207"></a>00207 <a name="l00209"></a>00209 <span class="keyword">template</span> <<span class="keyword">class </span>UpperIterator, <span class="keyword">class </span>NaviType, <span class="keyword">class </span>LowerIterator, <a name="l00210"></a>00210 <span class="keyword">class </span>ValueType> <a name="l00211"></a>00211 ValueType <a name="l00212"></a><a class="code" href="namespacepolybori.html#d775ceebd2e77e1eabd3398aced701b1">00212</a> <a class="code" href="namespacepolybori.html#d775ceebd2e77e1eabd3398aced701b1">term_accumulate</a>(UpperIterator ustart, UpperIterator ufinish, NaviType navi, <a name="l00213"></a>00213 LowerIterator lstart, LowerIterator lfinish, ValueType init) { <a name="l00214"></a>00214 <a name="l00215"></a>00215 <a name="l00216"></a>00216 <span class="keywordflow">if</span> (lstart == lfinish) <a name="l00217"></a>00217 <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(ustart, ufinish, navi, init); <a name="l00218"></a>00218 <a name="l00219"></a>00219 <span class="keywordflow">if</span> (ustart == ufinish) <a name="l00220"></a>00220 <span class="keywordflow">return</span> init.ring().one(); <a name="l00221"></a>00221 <a name="l00222"></a>00222 <span class="keywordflow">while</span> (*navi < *ustart) <a name="l00223"></a>00223 navi.incrementElse(); <a name="l00224"></a>00224 ++ustart; <a name="l00225"></a>00225 <a name="l00226"></a>00226 <a name="l00227"></a>00227 <span class="keywordflow">if</span> (navi.isConstant()) <a name="l00228"></a>00228 <span class="keywordflow">return</span> <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a>(navi, init.ring()); <a name="l00229"></a>00229 <a name="l00230"></a>00230 assert(*lstart >= *navi); <a name="l00231"></a>00231 <a name="l00232"></a>00232 ValueType result; <a name="l00233"></a>00233 <span class="keywordflow">if</span> (*lstart > *navi) { <a name="l00234"></a>00234 ValueType resthen = <a name="l00235"></a>00235 <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(ustart, ufinish, navi.thenBranch(), init); <a name="l00236"></a>00236 ValueType reselse = <a name="l00237"></a>00237 <a class="code" href="namespacepolybori.html#7bc1eb21cf1b279d6e84f83e71b1df26">lower_term_accumulate</a>(navi.elseBranch(), lstart, lfinish, init); <a name="l00238"></a>00238 <a name="l00239"></a>00239 result = <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a>(*navi, resthen.navigation(), reselse.navigation(), <a name="l00240"></a>00240 init.ring()); <a name="l00241"></a>00241 } <a name="l00242"></a>00242 <span class="keywordflow">else</span> { <a name="l00243"></a>00243 assert(*lstart == *navi); <a name="l00244"></a>00244 ++lstart; <a name="l00245"></a>00245 <a class="code" href="classpolybori_1_1BooleSet.html">BooleSet</a> resthen = <a class="code" href="namespacepolybori.html#d775ceebd2e77e1eabd3398aced701b1">term_accumulate</a>(ustart, ufinish, navi.thenBranch(), <a name="l00246"></a>00246 lstart, lfinish, init).diagram(); <a name="l00247"></a>00247 <a name="l00248"></a>00248 result = resthen.<a class="code" href="classpolybori_1_1BooleSet.html#b199b5c67866f25585866aa306466035">change</a>(*navi); <a name="l00249"></a>00249 } <a name="l00250"></a>00250 <a name="l00251"></a>00251 <span class="keywordflow">return</span> result; <a name="l00252"></a>00252 } <a name="l00253"></a>00253 <a name="l00254"></a>00254 <a name="l00255"></a>00255 <a name="l00256"></a>00256 <a name="l00259"></a>00259 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator, <span class="keyword">class</span> ValueType> <a name="l00260"></a>00260 ValueType <a name="l00261"></a><a class="code" href="namespacepolybori.html#f09e5c66739e9dcc9918291a334e9b59">00261</a> <a class="code" href="namespacepolybori.html#d775ceebd2e77e1eabd3398aced701b1">term_accumulate</a>(InputIterator first, InputIterator last, ValueType init) { <a name="l00262"></a>00262 <a name="l00263"></a>00263 <span class="preprocessor">#ifdef PBORI_ALT_TERM_ACCUMULATE</span> <a name="l00264"></a>00264 <span class="preprocessor"></span> <span class="keywordflow">if</span>(last.isOne()) <a name="l00265"></a>00265 <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(first.begin(), first.end(), <a name="l00266"></a>00266 first.navigation(), init) + ValueType(1); <a name="l00267"></a>00267 <a name="l00268"></a>00268 ValueType result = <a class="code" href="namespacepolybori.html#d775ceebd2e77e1eabd3398aced701b1">term_accumulate</a>(first.begin(), first.end(), <a name="l00269"></a>00269 first.navigation(), <a name="l00270"></a>00270 last.begin(), last.end(), init); <a name="l00271"></a>00271 <a name="l00272"></a>00272 <a name="l00273"></a>00273 <span class="comment">// alternative</span> <a name="l00274"></a>00274 <span class="comment">/* ValueType result = upper_term_accumulate(first.begin(), first.end(), </span> <a name="l00275"></a>00275 <span class="comment"> first.navigation(), init);</span> <a name="l00276"></a>00276 <span class="comment"></span> <a name="l00277"></a>00277 <span class="comment"></span> <a name="l00278"></a>00278 <span class="comment"> result = lower_term_accumulate(result.navigation(),</span> <a name="l00279"></a>00279 <span class="comment"> last.begin(), last.end(), init);</span> <a name="l00280"></a>00280 <span class="comment"></span> <a name="l00281"></a>00281 <span class="comment"> */</span> <a name="l00282"></a>00282 <a name="l00283"></a>00283 assert(result == std::accumulate(first, last, init) ); <a name="l00284"></a>00284 <a name="l00285"></a>00285 <span class="keywordflow">return</span> result; <a name="l00286"></a>00286 <a name="l00287"></a>00287 <span class="preprocessor">#else</span> <a name="l00288"></a>00288 <span class="preprocessor"></span> <a name="l00291"></a>00291 <span class="keywordflow">if</span>(first.isZero()) <a name="l00292"></a>00292 <span class="keywordflow">return</span> <span class="keyword">typename</span> ValueType::dd_type(init.diagram().manager(), <a name="l00293"></a>00293 first.navigation()); <a name="l00294"></a>00294 <a name="l00295"></a>00295 ValueType result = <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(first.begin(), first.end(), <a name="l00296"></a>00296 first.navigation(), init); <a name="l00297"></a>00297 <span class="keywordflow">if</span>(!last.isZero()) <a name="l00298"></a>00298 result += <a class="code" href="namespacepolybori.html#e907eb9aacb49f4c5fa363ff497dfe2b">upper_term_accumulate</a>(last.begin(), last.end(), <a name="l00299"></a>00299 last.navigation(), init); <a name="l00300"></a>00300 <a name="l00301"></a>00301 assert(result == std::accumulate(first, last, init) ); <a name="l00302"></a>00302 <a name="l00303"></a>00303 <span class="keywordflow">return</span> result; <a name="l00304"></a>00304 <span class="preprocessor">#endif</span> <a name="l00305"></a>00305 <span class="preprocessor"></span>} <a name="l00306"></a>00306 <a name="l00307"></a>00307 <a name="l00308"></a>00308 <span class="comment">// determine the part of a polynomials of a given degree</span> <a name="l00309"></a>00309 <span class="keyword">template</span> <<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> SetType> <a name="l00310"></a>00310 SetType <a name="l00311"></a><a class="code" href="namespacepolybori.html#284443c69d45d4c10f21ce3869af8a2b">00311</a> <a class="code" href="namespacepolybori.html#284443c69d45d4c10f21ce3869af8a2b">dd_mapping</a>(<span class="keyword">const</span> CacheType& cache, NaviType navi, NaviType map, SetType init) { <a name="l00312"></a>00312 <a name="l00313"></a>00313 <span class="keywordflow">if</span> (navi.isConstant()) <a name="l00314"></a>00314 <span class="keywordflow">return</span> cache.generate(navi); <a name="l00315"></a>00315 <a name="l00316"></a>00316 <span class="keywordflow">while</span> (*map < *navi) { <a name="l00317"></a>00317 assert(!map.isConstant()); <a name="l00318"></a>00318 map.incrementThen(); <a name="l00319"></a>00319 } <a name="l00320"></a>00320 <a name="l00321"></a>00321 assert(*navi == *map); <a name="l00322"></a>00322 <a name="l00323"></a>00323 NaviType cached = cache.find(navi, map); <a name="l00324"></a>00324 <a name="l00325"></a>00325 <span class="comment">// look whether computation was done before</span> <a name="l00326"></a>00326 <span class="keywordflow">if</span> (cached.isValid()) <a name="l00327"></a>00327 <span class="keywordflow">return</span> SetType(cached, cache.ring()); <a name="l00328"></a>00328 <a name="l00329"></a>00329 SetType result = <a name="l00330"></a>00330 SetType(*(map.elseBranch()), <a name="l00331"></a>00331 <a class="code" href="namespacepolybori.html#284443c69d45d4c10f21ce3869af8a2b">dd_mapping</a>(cache, navi.thenBranch(), map.thenBranch(), init), <a name="l00332"></a>00332 <a class="code" href="namespacepolybori.html#284443c69d45d4c10f21ce3869af8a2b">dd_mapping</a>(cache, navi.elseBranch(), map.thenBranch(), init) <a name="l00333"></a>00333 ); <a name="l00334"></a>00334 <a name="l00335"></a>00335 <a name="l00336"></a>00336 <span class="comment">// store result for later reuse</span> <a name="l00337"></a>00337 cache.insert(navi, map, result.navigation()); <a name="l00338"></a>00338 <a name="l00339"></a>00339 <span class="keywordflow">return</span> result; <a name="l00340"></a>00340 } <a name="l00341"></a>00341 <a name="l00342"></a>00342 <a name="l00343"></a>00343 <span class="keyword">template</span> <<span class="keyword">class</span> PolyType, <span class="keyword">class</span> MapType> <a name="l00344"></a>00344 PolyType <a name="l00345"></a><a class="code" href="namespacepolybori.html#7276b653ec156dd0b9f924ceef86b087">00345</a> <a class="code" href="namespacepolybori.html#7276b653ec156dd0b9f924ceef86b087">apply_mapping</a>(<span class="keyword">const</span> PolyType& poly, <span class="keyword">const</span> MapType& map) { <a name="l00346"></a>00346 <a name="l00347"></a>00347 <a class="code" href="classpolybori_1_1CCacheManagement.html" title="This template class forms the base for CCommutativeCacheManagement and CacheManager...">CCacheManagement<typename CCacheTypes::mapping></a> <a name="l00348"></a>00348 cache(poly.diagram().manager()); <a name="l00349"></a>00349 <a name="l00350"></a>00350 <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#284443c69d45d4c10f21ce3869af8a2b">dd_mapping</a>(cache, poly.navigation(), map.navigation(), <a name="l00351"></a>00351 <span class="keyword">typename</span> PolyType::set_type()); <a name="l00352"></a>00352 } <a name="l00353"></a>00353 <a name="l00354"></a>00354 <a name="l00355"></a>00355 <span class="keyword">template</span> <<span class="keyword">class</span> MonomType, <span class="keyword">class</span> PolyType> <a name="l00356"></a>00356 PolyType <a name="l00357"></a><a class="code" href="namespacepolybori.html#4f042a062394d131ad414dcb95624598">00357</a> <a class="code" href="namespacepolybori.html#4f042a062394d131ad414dcb95624598">generate_mapping</a>(MonomType& fromVars, MonomType& toVars, PolyType init) { <a name="l00358"></a>00358 <a name="l00359"></a>00359 <span class="keywordflow">if</span>(fromVars.isConstant()) { <a name="l00360"></a>00360 assert(fromVars.isOne() && toVars.isOne()); <a name="l00361"></a>00361 <span class="keywordflow">return</span> fromVars; <a name="l00362"></a>00362 } <a name="l00363"></a>00363 <a name="l00364"></a>00364 MonomType varFrom = fromVars.firstVariable(); <a name="l00365"></a>00365 MonomType varTo = toVars.firstVariable(); <a name="l00366"></a>00366 fromVars.popFirst(); <a name="l00367"></a>00367 toVars.popFirst(); <a name="l00368"></a>00368 <span class="keywordflow">return</span> (varFrom * <a class="code" href="namespacepolybori.html#4f042a062394d131ad414dcb95624598">generate_mapping</a>(fromVars, toVars, init)) + varTo; <a name="l00369"></a>00369 } <a name="l00370"></a>00370 <a name="l00371"></a>00371 <span class="keyword">template</span> <<span class="keyword">class</span> PolyType, <span class="keyword">class</span> MonomType> <a name="l00372"></a>00372 PolyType <a name="l00373"></a><a class="code" href="namespacepolybori.html#c31e579e1e46a1361bd8ec71a5ca5d13">00373</a> <a class="code" href="namespacepolybori.html#c31e579e1e46a1361bd8ec71a5ca5d13">mapping</a>(PolyType poly, MonomType fromVars, MonomType toVars) { <a name="l00374"></a>00374 <a name="l00375"></a>00375 <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#7276b653ec156dd0b9f924ceef86b087">apply_mapping</a>(poly, <a class="code" href="namespacepolybori.html#4f042a062394d131ad414dcb95624598">generate_mapping</a>(fromVars, toVars, PolyType()) ); <a name="l00376"></a>00376 } <a name="l00377"></a>00377 <a name="l00378"></a>00378 <a name="l00379"></a>00379 <a name="l00380"></a>00380 <a class="code" href="pbori__defs_8h.html#faf094fde6c1a7f1aad18bcb455f3b06" title="Finish project&#39;s namespace.">END_NAMESPACE_PBORI</a> <a name="l00381"></a>00381 <a name="l00382"></a>00382 <span class="preprocessor">#endif // pbori_algorithms_h_</span> </pre></div></div> <hr size="1"><address style="text-align: right;"><small>Generated on Wed Sep 9 14:30:59 2009 for PolyBoRi by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.9 </small></address> </body> </html>