Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > a24e1a39141f9b4ca49bd1e2e23a54ba > files > 808

polybori-doc-0.5rc.p9-6mdv2010.0.i586.rpm

<!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&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;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&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;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 &lt;numeric&gt;</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&amp;#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>&amp; 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>&amp; 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&amp;#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&amp;#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> &lt;<span class="keyword">class</span> NaviType, <span class="keyword">class</span> LowerIterator, <span class="keyword">class</span> ValueType&gt;
<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 &gt;= *navi);
<a name="l00151"></a>00151 
<a name="l00152"></a>00152   ValueType result;
<a name="l00153"></a>00153   <span class="keywordflow">if</span> (*lstart &gt; *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> &lt;<span class="keyword">class</span> UpperIterator, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> ValueType&gt;
<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 &lt; *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> &lt;<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&gt;
<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 &lt; *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 &gt;= *navi);
<a name="l00231"></a>00231 
<a name="l00232"></a>00232   ValueType result;
<a name="l00233"></a>00233   <span class="keywordflow">if</span> (*lstart &gt; *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> &lt;<span class="keyword">class</span> InputIterator, <span class="keyword">class</span> ValueType&gt;
<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> &lt;<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> SetType&gt;
<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&amp; 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 &lt; *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> &lt;<span class="keyword">class</span> PolyType, <span class="keyword">class</span> MapType&gt;
<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&amp; poly, <span class="keyword">const</span> MapType&amp; 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&lt;typename CCacheTypes::mapping&gt;</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> &lt;<span class="keyword">class</span> MonomType, <span class="keyword">class</span> PolyType&gt;
<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&amp; fromVars, MonomType&amp; 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() &amp;&amp; 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> &lt;<span class="keyword">class</span> PolyType, <span class="keyword">class</span> MonomType&gt;
<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&amp;#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&nbsp;
<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>