Sophie

Sophie

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

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_routines_misc.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_routines_misc.h</h1><a href="pbori__routines__misc_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="l00143"></a>00143 <span class="comment"></span><span class="comment">//*****************************************************************************</span>
<a name="l00144"></a>00144 
<a name="l00145"></a>00145 <span class="comment">// include basic definitions</span>
<a name="l00146"></a>00146 <span class="preprocessor">#include "<a class="code" href="pbori__defs_8h.html">pbori_defs.h</a>"</span>
<a name="l00147"></a>00147 
<a name="l00148"></a>00148 <span class="comment">// temprarily</span>
<a name="l00149"></a>00149 <span class="preprocessor">#include "<a class="code" href="CIdxVariable_8h.html">CIdxVariable.h</a>"</span>
<a name="l00150"></a>00150 
<a name="l00151"></a>00151 <span class="comment">// temprarily</span>
<a name="l00152"></a>00152 <span class="preprocessor">#include "<a class="code" href="CacheManager_8h.html">CacheManager.h</a>"</span>
<a name="l00153"></a>00153 
<a name="l00154"></a>00154 <span class="preprocessor">#include "<a class="code" href="CDDOperations_8h.html">CDDOperations.h</a>"</span>
<a name="l00155"></a>00155 
<a name="l00156"></a>00156 <a class="code" href="pbori__defs_8h.html#6ae360a591580558f31b6157ee792a10" title="Start project&amp;#39;s namespace.">BEGIN_NAMESPACE_PBORI</a>
<a name="l00157"></a>00157 
<a name="l00158"></a>00158 <span class="keyword">template</span>&lt;<span class="keyword">class</span> Iterator&gt;
<a name="l00159"></a>00159 <span class="keyword">typename</span> Iterator::value_type
<a name="l00160"></a><a class="code" href="namespacepolybori.html#3aa5e73310d2cdf3649303097a82d3eb">00160</a> <a class="code" href="namespacepolybori.html#3aa5e73310d2cdf3649303097a82d3eb">index_vector_hash</a>(Iterator start, Iterator finish){
<a name="l00161"></a>00161 
<a name="l00162"></a>00162   <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
<a name="l00163"></a>00163 
<a name="l00164"></a>00164   value_type vars = 0;
<a name="l00165"></a>00165   value_type sum = 0;
<a name="l00166"></a>00166  
<a name="l00167"></a>00167   <span class="keywordflow">while</span> (start != finish){
<a name="l00168"></a>00168     vars++;
<a name="l00169"></a>00169     sum += ((*start)+1) * ((*start)+1);
<a name="l00170"></a>00170     ++start;
<a name="l00171"></a>00171   }
<a name="l00172"></a>00172   <span class="keywordflow">return</span> sum * vars;
<a name="l00173"></a>00173 }
<a name="l00174"></a>00174 
<a name="l00177"></a>00177 <span class="keyword">template</span> &lt;<span class="keyword">class</span> DegreeCacher, <span class="keyword">class</span> NaviType&gt;
<a name="l00178"></a>00178 <span class="keyword">typename</span> NaviType::size_type
<a name="l00179"></a><a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">00179</a> <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(<span class="keyword">const</span> DegreeCacher&amp; cache, NaviType navi) {
<a name="l00180"></a>00180 
<a name="l00181"></a>00181   <span class="keyword">typedef</span> <span class="keyword">typename</span> NaviType::size_type size_type;
<a name="l00182"></a>00182 
<a name="l00183"></a>00183   <span class="keywordflow">if</span> (navi.isConstant()) <span class="comment">// No need for caching of constant nodes' degrees</span>
<a name="l00184"></a>00184     <span class="keywordflow">return</span> 0;
<a name="l00185"></a>00185  
<a name="l00186"></a>00186   <span class="comment">// Look whether result was cached before</span>
<a name="l00187"></a>00187   <span class="keyword">typename</span> DegreeCacher::node_type result = cache.find(navi);
<a name="l00188"></a>00188   <span class="keywordflow">if</span> (result.isValid())
<a name="l00189"></a>00189     <span class="keywordflow">return</span> *result;
<a name="l00190"></a>00190 
<a name="l00191"></a>00191   <span class="comment">// Get degree of then branch (contains at least one valid path)...</span>
<a name="l00192"></a>00192   size_type deg = <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(cache, navi.thenBranch()) + 1;
<a name="l00193"></a>00193  
<a name="l00194"></a>00194   <span class="comment">// ... combine with degree of else branch</span>
<a name="l00195"></a>00195   deg = std::max(deg,  <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(cache, navi.elseBranch()) );
<a name="l00196"></a>00196 
<a name="l00197"></a>00197   <span class="comment">// Write result to cache</span>
<a name="l00198"></a>00198   cache.insert(navi, deg);
<a name="l00199"></a>00199  
<a name="l00200"></a>00200   <span class="keywordflow">return</span> deg;
<a name="l00201"></a>00201 }
<a name="l00202"></a>00202 
<a name="l00207"></a>00207 <span class="keyword">template</span> &lt;<span class="keyword">class</span> DegreeCacher, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> SizeType&gt;
<a name="l00208"></a>00208 <span class="keyword">typename</span> NaviType::size_type
<a name="l00209"></a><a class="code" href="namespacepolybori.html#56c5c8490b73dc6e6b41192088b5f692">00209</a> <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(<span class="keyword">const</span> DegreeCacher&amp; cache, NaviType navi, SizeType bound) {
<a name="l00210"></a>00210 
<a name="l00211"></a>00211   <span class="keyword">typedef</span> <span class="keyword">typename</span> NaviType::size_type size_type;
<a name="l00212"></a>00212 
<a name="l00213"></a>00213   <span class="comment">// No need for caching of constant nodes' degrees</span>
<a name="l00214"></a>00214   <span class="keywordflow">if</span> (bound == 0 || navi.isConstant())
<a name="l00215"></a>00215     <span class="keywordflow">return</span> 0;
<a name="l00216"></a>00216  
<a name="l00217"></a>00217   <span class="comment">// Look whether result was cached before</span>
<a name="l00218"></a>00218   <span class="keyword">typename</span> DegreeCacher::node_type result = cache.find(navi);
<a name="l00219"></a>00219   <span class="keywordflow">if</span> (result.isValid())
<a name="l00220"></a>00220     <span class="keywordflow">return</span> *result;
<a name="l00221"></a>00221 
<a name="l00222"></a>00222   <span class="comment">// Get degree of then branch (contains at least one valid path)...</span>
<a name="l00223"></a>00223   size_type deg = <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(cache, navi.thenBranch(), bound - 1) + 1;
<a name="l00224"></a>00224 
<a name="l00225"></a>00225   <span class="comment">// ... combine with degree of else branch</span>
<a name="l00226"></a>00226   <span class="keywordflow">if</span> (bound &gt; deg)              <span class="comment">// if deg &lt;= bound, we are already finished</span>
<a name="l00227"></a>00227     deg = std::max(deg,  <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(cache, navi.elseBranch(), bound) );
<a name="l00228"></a>00228 
<a name="l00229"></a>00229   <span class="comment">// Write result to cache</span>
<a name="l00230"></a>00230   cache.insert(navi, deg);
<a name="l00231"></a>00231  
<a name="l00232"></a>00232   <span class="keywordflow">return</span> deg;
<a name="l00233"></a>00233 }
<a name="l00234"></a>00234 
<a name="l00235"></a>00235 <span class="keyword">template</span> &lt;<span class="keyword">class </span>Iterator, <span class="keyword">class </span>NameGenerator, 
<a name="l00236"></a>00236           <span class="keyword">class </span>Separator, <span class="keyword">class </span>EmptySetType, 
<a name="l00237"></a>00237           <span class="keyword">class </span>OStreamType&gt;
<a name="l00238"></a>00238 <span class="keywordtype">void</span> 
<a name="l00239"></a><a class="code" href="namespacepolybori.html#533ec22fb123df8821c8b554221621ad">00239</a> <a class="code" href="namespacepolybori.html#533ec22fb123df8821c8b554221621ad">dd_print_term</a>(Iterator start, Iterator finish, <span class="keyword">const</span> NameGenerator&amp; get_name,
<a name="l00240"></a>00240               <span class="keyword">const</span> Separator&amp; sep, <span class="keyword">const</span> EmptySetType&amp; emptyset, 
<a name="l00241"></a>00241               OStreamType&amp; os){
<a name="l00242"></a>00242 
<a name="l00243"></a>00243   <span class="keywordflow">if</span> (start != finish){
<a name="l00244"></a>00244     os &lt;&lt; get_name(*start);
<a name="l00245"></a>00245     ++start;
<a name="l00246"></a>00246   }
<a name="l00247"></a>00247   <span class="keywordflow">else</span>
<a name="l00248"></a>00248     os &lt;&lt; emptyset();
<a name="l00249"></a>00249 
<a name="l00250"></a>00250   <span class="keywordflow">while</span> (start != finish){
<a name="l00251"></a>00251     os &lt;&lt; sep() &lt;&lt; get_name(*start);
<a name="l00252"></a>00252     ++start;
<a name="l00253"></a>00253   }
<a name="l00254"></a>00254 }
<a name="l00255"></a>00255 
<a name="l00256"></a>00256 <span class="keyword">template</span> &lt;<span class="keyword">class </span>TermType, <span class="keyword">class </span>NameGenerator,
<a name="l00257"></a>00257           <span class="keyword">class </span>Separator, <span class="keyword">class </span>EmptySetType,
<a name="l00258"></a>00258           <span class="keyword">class </span>OStreamType&gt;
<a name="l00259"></a>00259 <span class="keywordtype">void</span> 
<a name="l00260"></a><a class="code" href="namespacepolybori.html#ea50e5351a9c49f09a83cb507e77e99d">00260</a> <a class="code" href="namespacepolybori.html#533ec22fb123df8821c8b554221621ad">dd_print_term</a>(<span class="keyword">const</span> TermType&amp; term, <span class="keyword">const</span> NameGenerator&amp; get_name,
<a name="l00261"></a>00261               <span class="keyword">const</span> Separator&amp; sep, <span class="keyword">const</span> EmptySetType&amp; emptyset, 
<a name="l00262"></a>00262               OStreamType&amp; os){
<a name="l00263"></a>00263   <a class="code" href="namespacepolybori.html#533ec22fb123df8821c8b554221621ad">dd_print_term</a>(term.begin(), term.end(), get_name, sep, emptyset, os);
<a name="l00264"></a>00264 }
<a name="l00265"></a>00265 
<a name="l00266"></a>00266 
<a name="l00267"></a>00267 <span class="keyword">template</span> &lt;<span class="keyword">class </span>Iterator, <span class="keyword">class </span>NameGenerator,
<a name="l00268"></a>00268           <span class="keyword">class </span>Separator, <span class="keyword">class </span>InnerSeparator, 
<a name="l00269"></a>00269           <span class="keyword">class </span>EmptySetType, <span class="keyword">class </span>OStreamType&gt;
<a name="l00270"></a>00270 <span class="keywordtype">void</span> 
<a name="l00271"></a><a class="code" href="namespacepolybori.html#8951c207d9ea95a12159bb467a08d882">00271</a> <a class="code" href="namespacepolybori.html#8951c207d9ea95a12159bb467a08d882">dd_print_terms</a>(Iterator start, Iterator finish, <span class="keyword">const</span> NameGenerator&amp; get_name,
<a name="l00272"></a>00272                <span class="keyword">const</span> Separator&amp; sep, <span class="keyword">const</span> InnerSeparator&amp; innersep,
<a name="l00273"></a>00273                <span class="keyword">const</span> EmptySetType&amp; emptyset, OStreamType&amp; os) {
<a name="l00274"></a>00274 
<a name="l00275"></a>00275   <span class="keywordflow">if</span> (start != finish){
<a name="l00276"></a>00276     <a class="code" href="namespacepolybori.html#533ec22fb123df8821c8b554221621ad">dd_print_term</a>(*start, get_name, innersep, emptyset, os);
<a name="l00277"></a>00277     ++start;
<a name="l00278"></a>00278   }
<a name="l00279"></a>00279 
<a name="l00280"></a>00280   <span class="keywordflow">while</span> (start != finish){
<a name="l00281"></a>00281     os &lt;&lt; sep(); 
<a name="l00282"></a>00282     <a class="code" href="namespacepolybori.html#533ec22fb123df8821c8b554221621ad">dd_print_term</a>(*start, get_name, innersep, emptyset, os);
<a name="l00283"></a>00283     ++start;
<a name="l00284"></a>00284   }
<a name="l00285"></a>00285 
<a name="l00286"></a>00286 }
<a name="l00287"></a>00287 
<a name="l00288"></a>00288 
<a name="l00289"></a>00289 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> PolyType&gt;
<a name="l00290"></a>00290 PolyType
<a name="l00291"></a><a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">00291</a> <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr,
<a name="l00292"></a>00292                         NaviType firstNavi, NaviType secondNavi, PolyType init){
<a name="l00293"></a>00293   <span class="comment">// Extract subtypes</span>
<a name="l00294"></a>00294   <span class="keyword">typedef</span> <span class="keyword">typename</span> PolyType::dd_type dd_type;
<a name="l00295"></a>00295   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">NaviType::idx_type</a> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">idx_type</a>;
<a name="l00296"></a>00296   <span class="keyword">typedef</span> NaviType navigator;
<a name="l00297"></a>00297 
<a name="l00298"></a>00298   <span class="keywordflow">if</span> (firstNavi.isConstant()) {
<a name="l00299"></a>00299     <span class="keywordflow">if</span>(firstNavi.terminalValue())
<a name="l00300"></a>00300       <span class="keywordflow">return</span> cache_mgr.generate(secondNavi);
<a name="l00301"></a>00301     <span class="keywordflow">else</span> 
<a name="l00302"></a>00302       <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00303"></a>00303   }
<a name="l00304"></a>00304 
<a name="l00305"></a>00305   <span class="keywordflow">if</span> (secondNavi.isConstant()) {
<a name="l00306"></a>00306     <span class="keywordflow">if</span>(secondNavi.terminalValue())
<a name="l00307"></a>00307       <span class="keywordflow">return</span> cache_mgr.generate(firstNavi);
<a name="l00308"></a>00308     <span class="keywordflow">else</span> 
<a name="l00309"></a>00309       <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00310"></a>00310   }
<a name="l00311"></a>00311   <span class="keywordflow">if</span> (firstNavi == secondNavi)
<a name="l00312"></a>00312     <span class="keywordflow">return</span> cache_mgr.generate(firstNavi);
<a name="l00313"></a>00313   
<a name="l00314"></a>00314   <span class="comment">// Look up, whether operation was already used</span>
<a name="l00315"></a>00315   navigator cached = cache_mgr.find(firstNavi, secondNavi);
<a name="l00316"></a>00316   PolyType result = cache_mgr.zero();
<a name="l00317"></a>00317 
<a name="l00318"></a>00318   <span class="keywordflow">if</span> (cached.isValid()) {       <span class="comment">// Cache lookup sucessful</span>
<a name="l00319"></a>00319     <span class="keywordflow">return</span> cache_mgr.generate(cached);
<a name="l00320"></a>00320   }
<a name="l00321"></a>00321   <span class="keywordflow">else</span> {                        <span class="comment">// Cache lookup not sucessful</span>
<a name="l00322"></a>00322     <span class="comment">// Get top variable's index</span>
<a name="l00323"></a>00323 
<a name="l00324"></a>00324     <span class="keywordflow">if</span> (*secondNavi &lt; *firstNavi)
<a name="l00325"></a>00325       std::swap(firstNavi, secondNavi);
<a name="l00326"></a>00326 
<a name="l00327"></a>00327     idx_type index = *firstNavi;
<a name="l00328"></a>00328 
<a name="l00329"></a>00329     <span class="comment">// Get then- and else-branches wrt. current indexed variable</span>
<a name="l00330"></a>00330     navigator as0 = firstNavi.elseBranch();
<a name="l00331"></a>00331     navigator as1 = firstNavi.thenBranch();
<a name="l00332"></a>00332 
<a name="l00333"></a>00333     navigator bs0;
<a name="l00334"></a>00334     navigator bs1;
<a name="l00335"></a>00335 
<a name="l00336"></a>00336     <span class="keywordflow">if</span> (*secondNavi == index) {
<a name="l00337"></a>00337       bs0 = secondNavi.elseBranch();
<a name="l00338"></a>00338       bs1 = secondNavi.thenBranch();
<a name="l00339"></a>00339     }
<a name="l00340"></a>00340     <span class="keywordflow">else</span> {
<a name="l00341"></a>00341       bs0 = secondNavi;
<a name="l00342"></a>00342       bs1 = result.navigation();
<a name="l00343"></a>00343     }
<a name="l00344"></a>00344 
<a name="l00345"></a>00345 
<a name="l00346"></a>00346 <span class="preprocessor">#ifdef PBORI_FAST_MULTIPLICATION</span>
<a name="l00347"></a>00347 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (*firstNavi == *secondNavi) {
<a name="l00348"></a>00348 
<a name="l00349"></a>00349       PolyType res00 = <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, as0, bs0, init);
<a name="l00350"></a>00350 
<a name="l00351"></a>00351       PolyType res10 = PolyType(cache_mgr.generate(as1)) +
<a name="l00352"></a>00352         PolyType(cache_mgr.generate(as0));
<a name="l00353"></a>00353       PolyType res01 = PolyType(cache_mgr.generate(bs0)) +
<a name="l00354"></a>00354         PolyType(cache_mgr.generate(bs1));
<a name="l00355"></a>00355 
<a name="l00356"></a>00356       PolyType res11 = 
<a name="l00357"></a>00357         <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr,
<a name="l00358"></a>00358                                 res10.navigation(), res01.navigation(),
<a name="l00359"></a>00359                                 init) - res00;
<a name="l00360"></a>00360 
<a name="l00361"></a>00361       result = dd_type(index, res11.diagram(), res00.diagram());
<a name="l00362"></a>00362     } <span class="keywordflow">else</span>
<a name="l00363"></a>00363 <span class="preprocessor">#endif</span>
<a name="l00364"></a>00364 <span class="preprocessor"></span>    { 
<a name="l00365"></a>00365         <span class="keywordtype">bool</span> as1_zero=<span class="keyword">false</span>;
<a name="l00366"></a>00366         <span class="keywordflow">if</span> (as0 == as1)
<a name="l00367"></a>00367           bs1 = result.navigation();
<a name="l00368"></a>00368         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (bs0 == bs1){
<a name="l00369"></a>00369           as1 = result.navigation();
<a name="l00370"></a>00370           as1_zero=<span class="keyword">true</span>;  
<a name="l00371"></a>00371         }
<a name="l00372"></a>00372         <span class="comment">// Do recursion</span>
<a name="l00373"></a>00373         NaviType zero_ptr = result.navigation();
<a name="l00374"></a>00374         
<a name="l00375"></a>00375         <span class="keywordflow">if</span> (as1_zero){
<a name="l00376"></a>00376           result = dd_type(index,  
<a name="l00377"></a>00377                          <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, as0, bs1,
<a name="l00378"></a>00378                                                  init).diagram(),
<a name="l00379"></a>00379                          <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, as0, bs0,
<a name="l00380"></a>00380                                                  init).diagram() );
<a name="l00381"></a>00381         } <span class="keywordflow">else</span>{
<a name="l00382"></a>00382           PolyType bs01 = PolyType(cache_mgr.generate(bs0)) + 
<a name="l00383"></a>00383             PolyType(cache_mgr.generate(bs1));
<a name="l00384"></a>00384           result = dd_type(index,
<a name="l00385"></a>00385                          ( <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr,
<a name="l00386"></a>00386                                                    bs01.navigation(), 
<a name="l00387"></a>00387                                                    as1, init) + 
<a name="l00388"></a>00388                            <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, as0, bs1, init)
<a name="l00389"></a>00389                            ).diagram(),
<a name="l00390"></a>00390                          <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, 
<a name="l00391"></a>00391                                                  as0, bs0,
<a name="l00392"></a>00392                                                  init).diagram()
<a name="l00393"></a>00393                          ); 
<a name="l00394"></a>00394           }
<a name="l00395"></a>00395         
<a name="l00396"></a>00396       }
<a name="l00397"></a>00397     <span class="comment">// Insert in cache</span>
<a name="l00398"></a>00398     cache_mgr.insert(firstNavi, secondNavi, result.navigation());
<a name="l00399"></a>00399   }
<a name="l00400"></a>00400 
<a name="l00401"></a>00401   <span class="keywordflow">return</span> result;
<a name="l00402"></a>00402 }
<a name="l00403"></a>00403 
<a name="l00404"></a>00404 
<a name="l00405"></a>00405 <span class="keyword">template</span> &lt;<span class="keyword">class </span>CacheType, <span class="keyword">class </span>NaviType, <span class="keyword">class </span>PolyType,
<a name="l00406"></a>00406           <span class="keyword">class </span>MonomTag&gt;
<a name="l00407"></a>00407 PolyType
<a name="l00408"></a><a class="code" href="namespacepolybori.html#b23927d40dec3c58318bc56726295a14">00408</a> <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr,
<a name="l00409"></a>00409                         NaviType monomNavi, NaviType navi, PolyType init,
<a name="l00410"></a>00410                         MonomTag monom_tag ){
<a name="l00411"></a>00411 
<a name="l00412"></a>00412   <span class="comment">// Extract subtypes</span>
<a name="l00413"></a>00413   <span class="keyword">typedef</span> <span class="keyword">typename</span> PolyType::dd_type dd_type;
<a name="l00414"></a>00414   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">NaviType::idx_type</a> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">idx_type</a>;
<a name="l00415"></a>00415   <span class="keyword">typedef</span> NaviType navigator;
<a name="l00416"></a>00416 
<a name="l00417"></a>00417   <span class="keywordflow">if</span> (monomNavi.isConstant()) {
<a name="l00418"></a>00418     <span class="keywordflow">if</span>(monomNavi.terminalValue())
<a name="l00419"></a>00419       <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00420"></a>00420     <span class="keywordflow">else</span> 
<a name="l00421"></a>00421       <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00422"></a>00422   }
<a name="l00423"></a>00423 
<a name="l00424"></a>00424   assert(monomNavi.elseBranch().isEmpty());
<a name="l00425"></a>00425 
<a name="l00426"></a>00426   <span class="keywordflow">if</span> (navi.isConstant()) {
<a name="l00427"></a>00427     <span class="keywordflow">if</span>(navi.terminalValue())
<a name="l00428"></a>00428       <span class="keywordflow">return</span> cache_mgr.generate(monomNavi);
<a name="l00429"></a>00429     <span class="keywordflow">else</span> 
<a name="l00430"></a>00430       <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00431"></a>00431   }
<a name="l00432"></a>00432   <span class="keywordflow">if</span> (monomNavi == navi)
<a name="l00433"></a>00433     <span class="keywordflow">return</span> cache_mgr.generate(monomNavi);
<a name="l00434"></a>00434   
<a name="l00435"></a>00435   <span class="comment">// Look up, whether operation was already used</span>
<a name="l00436"></a>00436   navigator cached = cache_mgr.find(monomNavi, navi);
<a name="l00437"></a>00437 
<a name="l00438"></a>00438   <span class="keywordflow">if</span> (cached.isValid()) {       <span class="comment">// Cache lookup sucessful</span>
<a name="l00439"></a>00439     <span class="keywordflow">return</span> cache_mgr.generate(cached);
<a name="l00440"></a>00440   }
<a name="l00441"></a>00441 
<a name="l00442"></a>00442   <span class="comment">// Cache lookup not sucessful</span>
<a name="l00443"></a>00443   <span class="comment">// Get top variables' index</span>
<a name="l00444"></a>00444 
<a name="l00445"></a>00445   idx_type index = *navi;
<a name="l00446"></a>00446   idx_type monomIndex = *monomNavi;
<a name="l00447"></a>00447 
<a name="l00448"></a>00448   <span class="keywordflow">if</span> (monomIndex &lt; index) {     <span class="comment">// Case: index may occure within monom</span>
<a name="l00449"></a>00449     init = <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, monomNavi.thenBranch(), navi,
<a name="l00450"></a>00450                                    init, monom_tag).diagram().change(monomIndex);
<a name="l00451"></a>00451   }
<a name="l00452"></a>00452   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (monomIndex == index) { <span class="comment">// Case: monom and poly start with same index</span>
<a name="l00453"></a>00453 
<a name="l00454"></a>00454     <span class="comment">// Increment navigators</span>
<a name="l00455"></a>00455     navigator monomThen = monomNavi.thenBranch();
<a name="l00456"></a>00456     navigator naviThen = navi.thenBranch();
<a name="l00457"></a>00457     navigator naviElse = navi.elseBranch();
<a name="l00458"></a>00458 
<a name="l00459"></a>00459     <span class="keywordflow">if</span> (naviThen != naviElse)
<a name="l00460"></a>00460       init = (<a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, monomThen, naviThen, init,
<a name="l00461"></a>00461                                       monom_tag)
<a name="l00462"></a>00462               + <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, monomThen, naviElse, init,
<a name="l00463"></a>00463                                         monom_tag)).diagram().change(index);
<a name="l00464"></a>00464   }
<a name="l00465"></a>00465   <span class="keywordflow">else</span> {                        <span class="comment">// Case: var(index) not part of monomial</span>
<a name="l00466"></a>00466     
<a name="l00467"></a>00467     init = 
<a name="l00468"></a>00468       dd_type(index,  
<a name="l00469"></a>00469               <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, monomNavi, navi.thenBranch(), 
<a name="l00470"></a>00470                                       init, monom_tag).diagram(),
<a name="l00471"></a>00471               <a class="code" href="namespacepolybori.html#22a0e96cd805d1b3b734d34a6d84359f">dd_multiply_recursively</a>(cache_mgr, monomNavi, navi.elseBranch(),
<a name="l00472"></a>00472                                       init, monom_tag).diagram() );
<a name="l00473"></a>00473   }
<a name="l00474"></a>00474   
<a name="l00475"></a>00475   <span class="comment">// Insert in cache</span>
<a name="l00476"></a>00476   cache_mgr.insert(monomNavi, navi, init.navigation());
<a name="l00477"></a>00477 
<a name="l00478"></a>00478   <span class="keywordflow">return</span> init;
<a name="l00479"></a>00479 }
<a name="l00480"></a>00480 
<a name="l00481"></a>00481 
<a name="l00482"></a>00482 <span class="keyword">template</span> &lt;<span class="keyword">class</span> DDGenerator, <span class="keyword">class</span> Iterator, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> PolyType&gt;
<a name="l00483"></a>00483 PolyType
<a name="l00484"></a><a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">00484</a> <a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">dd_multiply_recursively_exp</a>(<span class="keyword">const</span> DDGenerator&amp; ddgen,
<a name="l00485"></a>00485                             Iterator start, Iterator finish,
<a name="l00486"></a>00486                             NaviType navi, PolyType init){
<a name="l00487"></a>00487   <span class="comment">// Extract subtypes</span>
<a name="l00488"></a>00488   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">NaviType::idx_type</a> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">idx_type</a>;
<a name="l00489"></a>00489   <span class="keyword">typedef</span> <span class="keyword">typename</span> PolyType::dd_type dd_type;
<a name="l00490"></a>00490   <span class="keyword">typedef</span> NaviType navigator;
<a name="l00491"></a>00491 
<a name="l00492"></a>00492   <span class="keywordflow">if</span> (start == finish)
<a name="l00493"></a>00493     <span class="keywordflow">return</span> ddgen.generate(navi);
<a name="l00494"></a>00494 
<a name="l00495"></a>00495   PolyType result;
<a name="l00496"></a>00496   <span class="keywordflow">if</span> (navi.isConstant()) {
<a name="l00497"></a>00497     <span class="keywordflow">if</span>(navi.terminalValue()) {
<a name="l00498"></a>00498 
<a name="l00499"></a>00499       std::reverse_iterator&lt;Iterator&gt; rstart(finish), rfinish(start);
<a name="l00500"></a>00500       result = ddgen.generate(navi);
<a name="l00501"></a>00501       <span class="keywordflow">while</span> (rstart != rfinish) {
<a name="l00502"></a>00502         result = result.diagram().change(*rstart);
<a name="l00503"></a>00503         ++rstart;
<a name="l00504"></a>00504       }
<a name="l00505"></a>00505     }
<a name="l00506"></a>00506     <span class="keywordflow">else</span> 
<a name="l00507"></a>00507       <span class="keywordflow">return</span> ddgen.zero();
<a name="l00508"></a>00508 
<a name="l00509"></a>00509     <span class="keywordflow">return</span> result;
<a name="l00510"></a>00510   }
<a name="l00511"></a>00511 
<a name="l00512"></a>00512   <span class="comment">// Cache lookup not sucessful</span>
<a name="l00513"></a>00513   <span class="comment">// Get top variables' index</span>
<a name="l00514"></a>00514 
<a name="l00515"></a>00515   idx_type index = *navi;
<a name="l00516"></a>00516   idx_type monomIndex = *start;
<a name="l00517"></a>00517 
<a name="l00518"></a>00518   <span class="keywordflow">if</span> (monomIndex &lt; index) {     <span class="comment">// Case: index may occure within monom</span>
<a name="l00519"></a>00519 
<a name="l00520"></a>00520     Iterator next(start);
<a name="l00521"></a>00521     <span class="keywordflow">while</span>( (next != finish) &amp;&amp; (*next &lt; index) )
<a name="l00522"></a>00522       ++next;
<a name="l00523"></a>00523 
<a name="l00524"></a>00524     result = <a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">dd_multiply_recursively_exp</a>(ddgen, next, finish, navi, init);
<a name="l00525"></a>00525 
<a name="l00526"></a>00526     std::reverse_iterator&lt;Iterator&gt; rstart(next), rfinish(start);
<a name="l00527"></a>00527     <span class="keywordflow">while</span> (rstart != rfinish) {
<a name="l00528"></a>00528       result = result.diagram().change(*rstart);
<a name="l00529"></a>00529       ++rstart;
<a name="l00530"></a>00530     }
<a name="l00531"></a>00531   }
<a name="l00532"></a>00532   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (monomIndex == index) { <span class="comment">// Case: monom and poly start with same index</span>
<a name="l00533"></a>00533 
<a name="l00534"></a>00534     <span class="comment">// Increment navigators</span>
<a name="l00535"></a>00535     ++start;
<a name="l00536"></a>00536 
<a name="l00537"></a>00537     navigator naviThen = navi.thenBranch();
<a name="l00538"></a>00538     navigator naviElse = navi.elseBranch();
<a name="l00539"></a>00539 
<a name="l00540"></a>00540     <span class="keywordflow">if</span> (naviThen != naviElse)
<a name="l00541"></a>00541       result =(<a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">dd_multiply_recursively_exp</a>(ddgen, start, finish, naviThen, init)
<a name="l00542"></a>00542               + <a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">dd_multiply_recursively_exp</a>(ddgen, start, finish, naviElse,
<a name="l00543"></a>00543                                             init)).diagram().change(index);
<a name="l00544"></a>00544   }
<a name="l00545"></a>00545   <span class="keywordflow">else</span> {                        <span class="comment">// Case: var(index) not part of monomial</span>
<a name="l00546"></a>00546     
<a name="l00547"></a>00547     result = 
<a name="l00548"></a>00548       dd_type(index,  
<a name="l00549"></a>00549               <a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">dd_multiply_recursively_exp</a>(ddgen, start, finish,
<a name="l00550"></a>00550                                           navi.thenBranch(), init).diagram(),
<a name="l00551"></a>00551               <a class="code" href="namespacepolybori.html#fc41ffeb47799b69daa17f73bd048b77">dd_multiply_recursively_exp</a>(ddgen, start, finish, 
<a name="l00552"></a>00552                                           navi.elseBranch(), init).diagram() );
<a name="l00553"></a>00553   }
<a name="l00554"></a>00554 
<a name="l00555"></a>00555   <span class="keywordflow">return</span> result;
<a name="l00556"></a>00556 }
<a name="l00557"></a>00557 
<a name="l00558"></a>00558 <span class="keyword">template</span>&lt;<span class="keyword">class</span> DegCacheMgr, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> SizeType&gt;
<a name="l00559"></a><a class="code" href="namespacepolybori.html#5365780965fdb8d59018edfce826ec62">00559</a> <span class="keywordtype">bool</span> <a class="code" href="namespacepolybori.html#5365780965fdb8d59018edfce826ec62">max_degree_on_then</a>(<span class="keyword">const</span> DegCacheMgr&amp; deg_mgr, NaviType navi,
<a name="l00560"></a>00560                         SizeType degree, <a class="code" href="structpolybori_1_1valid__tag.html" title="This class shows, whether a property of an order is valid.">valid_tag</a> is_descending) {
<a name="l00561"></a>00561   navi.incrementThen();
<a name="l00562"></a>00562   <span class="keywordflow">return</span> ((<a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(deg_mgr, navi, degree - 1) + 1) == degree);
<a name="l00563"></a>00563 }
<a name="l00564"></a>00564 
<a name="l00565"></a>00565 <span class="keyword">template</span>&lt;<span class="keyword">class</span> DegCacheMgr, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> SizeType&gt;
<a name="l00566"></a><a class="code" href="namespacepolybori.html#9e63e5c83ff8294cb73060d383d76472">00566</a> <span class="keywordtype">bool</span> <a class="code" href="namespacepolybori.html#5365780965fdb8d59018edfce826ec62">max_degree_on_then</a>(<span class="keyword">const</span> DegCacheMgr&amp; deg_mgr, NaviType navi,
<a name="l00567"></a>00567                         SizeType degree, <a class="code" href="structpolybori_1_1invalid__tag.html" title="This class shows, whether a property of an order is invalid.">invalid_tag</a> non_descending) {
<a name="l00568"></a>00568   navi.incrementElse();
<a name="l00569"></a>00569   <span class="keywordflow">return</span> (<a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(deg_mgr, navi, degree) != degree);
<a name="l00570"></a>00570 }
<a name="l00571"></a>00571 
<a name="l00572"></a>00572 
<a name="l00573"></a>00573 <span class="comment">// with degree bound</span>
<a name="l00574"></a>00574 <span class="keyword">template</span> &lt;<span class="keyword">class </span>CacheType, <span class="keyword">class </span>DegCacheMgr, <span class="keyword">class </span>NaviType, 
<a name="l00575"></a>00575           <span class="keyword">class </span>TermType, <span class="keyword">class </span>SizeType, <span class="keyword">class </span>DescendingProperty&gt;
<a name="l00576"></a>00576 TermType
<a name="l00577"></a><a class="code" href="namespacepolybori.html#b1601a76391dd8f0fd4f2837e565b43b">00577</a> <a class="code" href="namespacepolybori.html#b1601a76391dd8f0fd4f2837e565b43b">dd_recursive_degree_lead</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr, <span class="keyword">const</span> DegCacheMgr&amp;
<a name="l00578"></a>00578                          deg_mgr,
<a name="l00579"></a>00579                          NaviType navi, TermType init, SizeType degree,
<a name="l00580"></a>00580                          DescendingProperty prop) {
<a name="l00581"></a>00581 
<a name="l00582"></a>00582   <span class="keywordflow">if</span> ((degree == 0) || navi.isConstant())
<a name="l00583"></a>00583     <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00584"></a>00584 
<a name="l00585"></a>00585   <span class="comment">// Check cache for previous results</span>
<a name="l00586"></a>00586   NaviType cached = cache_mgr.find(navi);
<a name="l00587"></a>00587   <span class="keywordflow">if</span> (cached.isValid())
<a name="l00588"></a>00588     <span class="keywordflow">return</span> cache_mgr.generate(cached);
<a name="l00589"></a>00589 
<a name="l00590"></a>00590   <span class="comment">// Go to next branch</span>
<a name="l00591"></a>00591   <span class="keywordflow">if</span> ( <a class="code" href="namespacepolybori.html#5365780965fdb8d59018edfce826ec62">max_degree_on_then</a>(deg_mgr, navi, degree, prop) ) {
<a name="l00592"></a>00592     NaviType then_branch = navi.thenBranch();
<a name="l00593"></a>00593     init = <a class="code" href="namespacepolybori.html#b1601a76391dd8f0fd4f2837e565b43b">dd_recursive_degree_lead</a>(cache_mgr, deg_mgr, then_branch, 
<a name="l00594"></a>00594         init, degree - 1, prop);
<a name="l00595"></a>00595     <span class="keywordflow">if</span>  ((navi.elseBranch().isEmpty()) &amp;&amp; (init.navigation()==then_branch))
<a name="l00596"></a>00596       init = cache_mgr.generate(navi);
<a name="l00597"></a>00597     <span class="keywordflow">else</span>
<a name="l00598"></a>00598       init = init.change(*navi);
<a name="l00599"></a>00599                                     
<a name="l00600"></a>00600   }
<a name="l00601"></a>00601   <span class="keywordflow">else</span> {
<a name="l00602"></a>00602     init = <a class="code" href="namespacepolybori.html#b1601a76391dd8f0fd4f2837e565b43b">dd_recursive_degree_lead</a>(cache_mgr, deg_mgr, navi.elseBranch(), 
<a name="l00603"></a>00603                                     init, degree, prop);
<a name="l00604"></a>00604   }
<a name="l00605"></a>00605 
<a name="l00606"></a>00606   NaviType resultNavi(init.navigation());
<a name="l00607"></a>00607   cache_mgr.insert(navi, resultNavi);
<a name="l00608"></a>00608   deg_mgr.insert(resultNavi, degree);
<a name="l00609"></a>00609 
<a name="l00610"></a>00610   <span class="keywordflow">return</span> init;
<a name="l00611"></a>00611 }
<a name="l00612"></a>00612 
<a name="l00613"></a>00613 <span class="keyword">template</span> &lt;<span class="keyword">class </span>CacheType, <span class="keyword">class </span>DegCacheMgr, <span class="keyword">class </span>NaviType, 
<a name="l00614"></a>00614           <span class="keyword">class </span>TermType, <span class="keyword">class </span>DescendingProperty&gt;
<a name="l00615"></a>00615 TermType
<a name="l00616"></a><a class="code" href="namespacepolybori.html#5585c64684eaa745d07e5bd716abc2ba">00616</a> <a class="code" href="namespacepolybori.html#b1601a76391dd8f0fd4f2837e565b43b">dd_recursive_degree_lead</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr, <span class="keyword">const</span> DegCacheMgr&amp; deg_mgr,
<a name="l00617"></a>00617                          NaviType navi, TermType init, DescendingProperty prop){
<a name="l00618"></a>00618 
<a name="l00619"></a>00619   <span class="keywordflow">if</span> (navi.isConstant())
<a name="l00620"></a>00620     <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00621"></a>00621   
<a name="l00622"></a>00622   <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#b1601a76391dd8f0fd4f2837e565b43b">dd_recursive_degree_lead</a>(cache_mgr, deg_mgr, navi, init,
<a name="l00623"></a>00623                                   <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(deg_mgr, navi), prop);
<a name="l00624"></a>00624 }
<a name="l00625"></a>00625 
<a name="l00626"></a>00626 <span class="keyword">template</span> &lt;<span class="keyword">class </span>CacheType, <span class="keyword">class </span>DegCacheMgr, <span class="keyword">class </span>NaviType, 
<a name="l00627"></a>00627           <span class="keyword">class </span>TermType, <span class="keyword">class </span>SizeType, <span class="keyword">class </span>DescendingProperty&gt;
<a name="l00628"></a>00628 TermType&amp;
<a name="l00629"></a><a class="code" href="namespacepolybori.html#280291d41ef4ddc8a5ef4fceabc119f3">00629</a> <a class="code" href="namespacepolybori.html#280291d41ef4ddc8a5ef4fceabc119f3">dd_recursive_degree_leadexp</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr, 
<a name="l00630"></a>00630                             <span class="keyword">const</span> DegCacheMgr&amp; deg_mgr,
<a name="l00631"></a>00631                             NaviType navi, TermType&amp; result,  
<a name="l00632"></a>00632                             SizeType degree,
<a name="l00633"></a>00633                             DescendingProperty prop) {
<a name="l00634"></a>00634 
<a name="l00635"></a>00635   <span class="keywordflow">if</span> ((degree == 0) || navi.isConstant())
<a name="l00636"></a>00636     <span class="keywordflow">return</span> result;
<a name="l00637"></a>00637  
<a name="l00638"></a>00638   <span class="comment">// Check cache for previous result</span>
<a name="l00639"></a>00639   NaviType cached = cache_mgr.find(navi);
<a name="l00640"></a>00640   <span class="keywordflow">if</span> (cached.isValid())
<a name="l00641"></a>00641     <span class="keywordflow">return</span> result = result.multiplyFirst(cache_mgr.generate(cached));
<a name="l00642"></a>00642 
<a name="l00643"></a>00643   <span class="comment">// Prepare next branch</span>
<a name="l00644"></a>00644   <span class="keywordflow">if</span> ( <a class="code" href="namespacepolybori.html#5365780965fdb8d59018edfce826ec62">max_degree_on_then</a>(deg_mgr, navi, degree, prop) ) {
<a name="l00645"></a>00645     result.push_back(*navi);
<a name="l00646"></a>00646     navi.incrementThen();
<a name="l00647"></a>00647     --degree;
<a name="l00648"></a>00648   }
<a name="l00649"></a>00649   <span class="keywordflow">else</span> 
<a name="l00650"></a>00650     navi.incrementElse();
<a name="l00651"></a>00651 
<a name="l00652"></a>00652   <span class="keywordflow">return</span> 
<a name="l00653"></a>00653     <a class="code" href="namespacepolybori.html#280291d41ef4ddc8a5ef4fceabc119f3">dd_recursive_degree_leadexp</a>(cache_mgr, deg_mgr, navi, result, degree, prop);
<a name="l00654"></a>00654 }
<a name="l00655"></a>00655 
<a name="l00656"></a>00656 <span class="keyword">template</span> &lt;<span class="keyword">class </span>CacheType, <span class="keyword">class </span>DegCacheMgr, <span class="keyword">class </span>NaviType, 
<a name="l00657"></a>00657           <span class="keyword">class </span>TermType, <span class="keyword">class </span>DescendingProperty&gt;
<a name="l00658"></a>00658 TermType&amp;
<a name="l00659"></a><a class="code" href="namespacepolybori.html#e91d5ae8f41cad0591f2a0942095b035">00659</a> <a class="code" href="namespacepolybori.html#280291d41ef4ddc8a5ef4fceabc119f3">dd_recursive_degree_leadexp</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr, 
<a name="l00660"></a>00660                             <span class="keyword">const</span> DegCacheMgr&amp; deg_mgr,
<a name="l00661"></a>00661                             NaviType navi, TermType&amp; result,  
<a name="l00662"></a>00662                             DescendingProperty prop) {
<a name="l00663"></a>00663 
<a name="l00664"></a>00664   <span class="keywordflow">if</span> (navi.isConstant())
<a name="l00665"></a>00665     <span class="keywordflow">return</span> result;
<a name="l00666"></a>00666 
<a name="l00667"></a>00667   <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#280291d41ef4ddc8a5ef4fceabc119f3">dd_recursive_degree_leadexp</a>(cache_mgr, deg_mgr, navi, result, 
<a name="l00668"></a>00668                                      <a class="code" href="namespacepolybori.html#11073584b523f82b3febaac201b86365">dd_cached_degree</a>(deg_mgr, navi), prop);
<a name="l00669"></a>00669 }
<a name="l00670"></a>00670 
<a name="l00671"></a>00671 <span class="comment">// Existential Abstraction. Given a ZDD F, and a set of variables</span>
<a name="l00672"></a>00672 <span class="comment">// S, remove all occurrences of s in S from any subset in F. This can</span>
<a name="l00673"></a>00673 <span class="comment">// be implemented by cofactoring F with respect to s = 1 and s = 0,</span>
<a name="l00674"></a>00674 <span class="comment">// then forming the union of these results. </span>
<a name="l00675"></a>00675 
<a name="l00676"></a>00676 
<a name="l00677"></a>00677 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> TermType&gt;
<a name="l00678"></a>00678 TermType
<a name="l00679"></a><a class="code" href="namespacepolybori.html#06e2642e9e7ff6183dac970dc88bac79">00679</a> <a class="code" href="namespacepolybori.html#06e2642e9e7ff6183dac970dc88bac79">dd_existential_abstraction</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr, 
<a name="l00680"></a>00680                            NaviType varsNavi, NaviType navi, TermType init){
<a name="l00681"></a>00681 
<a name="l00682"></a>00682   <span class="keyword">typedef</span> <span class="keyword">typename</span> TermType::dd_type dd_type;
<a name="l00683"></a>00683   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">TermType::idx_type</a> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">idx_type</a>;
<a name="l00684"></a>00684 
<a name="l00685"></a>00685   <span class="keywordflow">if</span> (navi.isConstant()) 
<a name="l00686"></a>00686     <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00687"></a>00687 
<a name="l00688"></a>00688   idx_type index(*navi);
<a name="l00689"></a>00689   <span class="keywordflow">while</span> (!varsNavi.isConstant() &amp;&amp; ((*varsNavi) &lt; index))
<a name="l00690"></a>00690     varsNavi.incrementThen();
<a name="l00691"></a>00691 
<a name="l00692"></a>00692   <span class="keywordflow">if</span> (varsNavi.isConstant())
<a name="l00693"></a>00693     <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00694"></a>00694 
<a name="l00695"></a>00695   <span class="comment">// Check cache for previous result</span>
<a name="l00696"></a>00696   NaviType cached = cache_mgr.find(varsNavi, navi);
<a name="l00697"></a>00697   <span class="keywordflow">if</span> (cached.isValid()) 
<a name="l00698"></a>00698     <span class="keywordflow">return</span> cache_mgr.generate(cached);
<a name="l00699"></a>00699 
<a name="l00700"></a>00700   NaviType thenNavi(navi.thenBranch()), elseNavi(navi.elseBranch()); 
<a name="l00701"></a>00701 
<a name="l00702"></a>00702   TermType thenResult = 
<a name="l00703"></a>00703     <a class="code" href="namespacepolybori.html#06e2642e9e7ff6183dac970dc88bac79">dd_existential_abstraction</a>(cache_mgr, varsNavi, thenNavi, init);
<a name="l00704"></a>00704 
<a name="l00705"></a>00705   TermType elseResult = 
<a name="l00706"></a>00706     <a class="code" href="namespacepolybori.html#06e2642e9e7ff6183dac970dc88bac79">dd_existential_abstraction</a>(cache_mgr, varsNavi, elseNavi, init);
<a name="l00707"></a>00707 
<a name="l00708"></a>00708   <span class="keywordflow">if</span> ((*varsNavi) == index)
<a name="l00709"></a>00709     init = thenResult.unite(elseResult);
<a name="l00710"></a>00710   <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (thenResult.navigation() == thenNavi) &amp;&amp; 
<a name="l00711"></a>00711             (elseResult.navigation() == elseNavi)  )
<a name="l00712"></a>00712     init = cache_mgr.generate(navi);
<a name="l00713"></a>00713   <span class="keywordflow">else</span>
<a name="l00714"></a>00714     init = dd_type(index, thenResult, elseResult);
<a name="l00715"></a>00715 
<a name="l00716"></a>00716   <span class="comment">// Insert result to cache</span>
<a name="l00717"></a>00717   cache_mgr.insert(varsNavi, navi, init.navigation());
<a name="l00718"></a>00718 
<a name="l00719"></a>00719   <span class="keywordflow">return</span> init;
<a name="l00720"></a>00720 }
<a name="l00721"></a>00721 
<a name="l00722"></a>00722 
<a name="l00723"></a>00723 
<a name="l00724"></a>00724 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> PolyType&gt;
<a name="l00725"></a>00725 PolyType
<a name="l00726"></a><a class="code" href="namespacepolybori.html#9d5b2010f690cb8780331d5869912a3d">00726</a> <a class="code" href="namespacepolybori.html#9d5b2010f690cb8780331d5869912a3d">dd_divide_recursively</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr,
<a name="l00727"></a>00727                       NaviType navi, NaviType monomNavi, PolyType init){
<a name="l00728"></a>00728 
<a name="l00729"></a>00729   <span class="comment">// Extract subtypes</span>
<a name="l00730"></a>00730   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">NaviType::idx_type</a> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">idx_type</a>;
<a name="l00731"></a>00731   <span class="keyword">typedef</span> NaviType navigator;
<a name="l00732"></a>00732   <span class="keyword">typedef</span> <span class="keyword">typename</span> PolyType::dd_type dd_type;
<a name="l00733"></a>00733 
<a name="l00734"></a>00734   <span class="keywordflow">if</span> (monomNavi.isConstant()) {
<a name="l00735"></a>00735     <span class="keywordflow">if</span>(monomNavi.terminalValue())
<a name="l00736"></a>00736       <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00737"></a>00737     <span class="keywordflow">else</span> 
<a name="l00738"></a>00738       <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00739"></a>00739   }
<a name="l00740"></a>00740 
<a name="l00741"></a>00741   assert(monomNavi.elseBranch().isEmpty());
<a name="l00742"></a>00742 
<a name="l00743"></a>00743   <span class="keywordflow">if</span> (navi.isConstant()) 
<a name="l00744"></a>00744     <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00745"></a>00745 
<a name="l00746"></a>00746   <span class="keywordflow">if</span> (monomNavi == navi)
<a name="l00747"></a>00747     <span class="keywordflow">return</span> cache_mgr.one();
<a name="l00748"></a>00748   
<a name="l00749"></a>00749   <span class="comment">// Look up, whether operation was already used</span>
<a name="l00750"></a>00750   navigator cached = cache_mgr.find(navi, monomNavi);
<a name="l00751"></a>00751 
<a name="l00752"></a>00752   <span class="keywordflow">if</span> (cached.isValid()) {       <span class="comment">// Cache lookup sucessful</span>
<a name="l00753"></a>00753     <span class="keywordflow">return</span> cache_mgr.generate(cached);
<a name="l00754"></a>00754   }
<a name="l00755"></a>00755 
<a name="l00756"></a>00756   <span class="comment">// Cache lookup not sucessful</span>
<a name="l00757"></a>00757   <span class="comment">// Get top variables' index</span>
<a name="l00758"></a>00758 
<a name="l00759"></a>00759   idx_type index = *navi;
<a name="l00760"></a>00760   idx_type monomIndex = *monomNavi;
<a name="l00761"></a>00761 
<a name="l00762"></a>00762   <span class="keywordflow">if</span> (monomIndex == index) {    <span class="comment">// Case: monom and poly start with same index</span>
<a name="l00763"></a>00763 
<a name="l00764"></a>00764     <span class="comment">// Increment navigators</span>
<a name="l00765"></a>00765     navigator monomThen =  monomNavi.thenBranch();
<a name="l00766"></a>00766     navigator naviThen = navi.thenBranch();
<a name="l00767"></a>00767 
<a name="l00768"></a>00768     init = <a class="code" href="namespacepolybori.html#9d5b2010f690cb8780331d5869912a3d">dd_divide_recursively</a>(cache_mgr, naviThen, monomThen, init);
<a name="l00769"></a>00769   }
<a name="l00770"></a>00770   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (monomIndex &gt; index) { <span class="comment">// Case: monomIndex may occure within poly</span>
<a name="l00771"></a>00771     
<a name="l00772"></a>00772     init = 
<a name="l00773"></a>00773       dd_type(index,  
<a name="l00774"></a>00774               <a class="code" href="namespacepolybori.html#9d5b2010f690cb8780331d5869912a3d">dd_divide_recursively</a>(cache_mgr,  navi.thenBranch(), monomNavi,
<a name="l00775"></a>00775                                       init).diagram(),
<a name="l00776"></a>00776               <a class="code" href="namespacepolybori.html#9d5b2010f690cb8780331d5869912a3d">dd_divide_recursively</a>(cache_mgr, navi.elseBranch(), monomNavi, 
<a name="l00777"></a>00777                                       init).diagram() );
<a name="l00778"></a>00778   }
<a name="l00779"></a>00779   
<a name="l00780"></a>00780   <span class="comment">// Insert in cache</span>
<a name="l00781"></a>00781   cache_mgr.insert(navi, monomNavi,  init.navigation());
<a name="l00782"></a>00782 
<a name="l00783"></a>00783   <span class="keywordflow">return</span> init;
<a name="l00784"></a>00784 }
<a name="l00785"></a>00785 
<a name="l00786"></a>00786 
<a name="l00787"></a>00787 
<a name="l00788"></a>00788 <span class="keyword">template</span> &lt;<span class="keyword">class</span> DDGenerator, <span class="keyword">class</span> Iterator, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> PolyType&gt;
<a name="l00789"></a>00789 PolyType
<a name="l00790"></a><a class="code" href="namespacepolybori.html#db03e7f6aeab9c254b3590112db7714a">00790</a> <a class="code" href="namespacepolybori.html#db03e7f6aeab9c254b3590112db7714a">dd_divide_recursively_exp</a>(<span class="keyword">const</span> DDGenerator&amp; ddgen,
<a name="l00791"></a>00791                           NaviType navi, Iterator start, Iterator finish,
<a name="l00792"></a>00792                           PolyType init){
<a name="l00793"></a>00793 
<a name="l00794"></a>00794   <span class="comment">// Extract subtypes</span>
<a name="l00795"></a>00795   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">NaviType::idx_type</a> <a class="code" href="namespacepolybori_1_1groebner.html#ef37a95e97afbd561cc4c5f84d660765">idx_type</a>;
<a name="l00796"></a>00796   <span class="keyword">typedef</span> <span class="keyword">typename</span> PolyType::dd_type dd_type;
<a name="l00797"></a>00797   <span class="keyword">typedef</span> NaviType navigator;
<a name="l00798"></a>00798 
<a name="l00799"></a>00799   <span class="keywordflow">if</span> (start == finish)
<a name="l00800"></a>00800     <span class="keywordflow">return</span> ddgen.generate(navi);
<a name="l00801"></a>00801 
<a name="l00802"></a>00802   <span class="keywordflow">if</span> (navi.isConstant()) 
<a name="l00803"></a>00803     <span class="keywordflow">return</span> ddgen.zero();
<a name="l00804"></a>00804   
<a name="l00805"></a>00805 
<a name="l00806"></a>00806   <span class="comment">// Cache lookup not sucessful</span>
<a name="l00807"></a>00807   <span class="comment">// Get top variables' index</span>
<a name="l00808"></a>00808 
<a name="l00809"></a>00809   idx_type index = *navi;
<a name="l00810"></a>00810   idx_type monomIndex = *start;
<a name="l00811"></a>00811 
<a name="l00812"></a>00812   PolyType result;
<a name="l00813"></a>00813   <span class="keywordflow">if</span> (monomIndex == index) {    <span class="comment">// Case: monom and poly start with same index</span>
<a name="l00814"></a>00814 
<a name="l00815"></a>00815     <span class="comment">// Increment navigators</span>
<a name="l00816"></a>00816     ++start;
<a name="l00817"></a>00817     navigator naviThen = navi.thenBranch();
<a name="l00818"></a>00818 
<a name="l00819"></a>00819     result = <a class="code" href="namespacepolybori.html#db03e7f6aeab9c254b3590112db7714a">dd_divide_recursively_exp</a>(ddgen, naviThen, start, finish, init);
<a name="l00820"></a>00820   }
<a name="l00821"></a>00821   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (monomIndex &gt; index) { <span class="comment">// Case: monomIndex may occure within poly</span>
<a name="l00822"></a>00822     
<a name="l00823"></a>00823     result = 
<a name="l00824"></a>00824       dd_type(index,  
<a name="l00825"></a>00825               <a class="code" href="namespacepolybori.html#db03e7f6aeab9c254b3590112db7714a">dd_divide_recursively_exp</a>(ddgen, navi.thenBranch(), start, finish,
<a name="l00826"></a>00826                                         init).diagram(),
<a name="l00827"></a>00827               <a class="code" href="namespacepolybori.html#db03e7f6aeab9c254b3590112db7714a">dd_divide_recursively_exp</a>(ddgen, navi.elseBranch(), start, finish,
<a name="l00828"></a>00828                                         init).diagram() );
<a name="l00829"></a>00829   }
<a name="l00830"></a>00830   <span class="keywordflow">else</span> 
<a name="l00831"></a>00831     result = ddgen.zero();
<a name="l00832"></a>00832   
<a name="l00833"></a>00833   <span class="keywordflow">return</span> result;
<a name="l00834"></a>00834 }
<a name="l00835"></a>00835 
<a name="l00838"></a>00838 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> MonomType&gt;
<a name="l00839"></a>00839 MonomType
<a name="l00840"></a><a class="code" href="namespacepolybori.html#dcd04d2da6906fb2b104820203802ea0">00840</a> <a class="code" href="namespacepolybori.html#dcd04d2da6906fb2b104820203802ea0">cached_used_vars</a>(<span class="keyword">const</span> CacheType&amp; cache, NaviType navi, MonomType init) {
<a name="l00841"></a>00841 
<a name="l00842"></a>00842   <span class="keywordflow">if</span> (navi.isConstant()) <span class="comment">// No need for caching of constant nodes' degrees</span>
<a name="l00843"></a>00843     <span class="keywordflow">return</span> init;
<a name="l00844"></a>00844  
<a name="l00845"></a>00845   <span class="comment">// Look whether result was cached before</span>
<a name="l00846"></a>00846   NaviType cached_result = cache.find(navi);
<a name="l00847"></a>00847 
<a name="l00848"></a>00848   <span class="keyword">typedef</span> <span class="keyword">typename</span> MonomType::poly_type poly_type;
<a name="l00849"></a>00849   <span class="keywordflow">if</span> (cached_result.isValid())
<a name="l00850"></a>00850     <span class="keywordflow">return</span> <a class="code" href="classpolybori_1_1CDDOperations.html">CDDOperations</a>&lt;<span class="keyword">typename</span> MonomType::dd_type, 
<a name="l00851"></a>00851     MonomType&gt;().getMonomial(cache.generate(cached_result));
<a name="l00852"></a>00852   
<a name="l00853"></a>00853   MonomType result = <a class="code" href="namespacepolybori.html#dcd04d2da6906fb2b104820203802ea0">cached_used_vars</a>(cache, navi.thenBranch(), init);
<a name="l00854"></a>00854   result *= <a class="code" href="namespacepolybori.html#dcd04d2da6906fb2b104820203802ea0">cached_used_vars</a>(cache, navi.elseBranch(), init);
<a name="l00855"></a>00855 
<a name="l00856"></a>00856   result.changeAssign(*navi);
<a name="l00857"></a>00857 
<a name="l00858"></a>00858   <span class="comment">// Write result to cache</span>
<a name="l00859"></a>00859   cache.insert(navi, result.diagram().navigation());
<a name="l00860"></a>00860  
<a name="l00861"></a>00861   <span class="keywordflow">return</span> result;
<a name="l00862"></a>00862 }
<a name="l00863"></a>00863 
<a name="l00864"></a>00864 <span class="keyword">template</span> &lt;<span class="keyword">class</span> NaviType, <span class="keyword">class</span> Iterator&gt;
<a name="l00865"></a>00865 <span class="keywordtype">bool</span>
<a name="l00866"></a><a class="code" href="namespacepolybori.html#721132760de802e5de5c4c8e53ceabcf">00866</a> <a class="code" href="namespacepolybori.html#721132760de802e5de5c4c8e53ceabcf">dd_owns</a>(NaviType navi, Iterator start, Iterator finish) {
<a name="l00867"></a>00867 
<a name="l00868"></a>00868   <span class="keywordflow">if</span> (start == finish) {
<a name="l00869"></a>00869     <span class="keywordflow">while</span>(!navi.isConstant())
<a name="l00870"></a>00870       navi.incrementElse();
<a name="l00871"></a>00871     <span class="keywordflow">return</span> navi.terminalValue();
<a name="l00872"></a>00872   }
<a name="l00873"></a>00873 
<a name="l00874"></a>00874   <span class="keywordflow">while</span>(!navi.isConstant() &amp;&amp; (*start &gt; *navi) )
<a name="l00875"></a>00875     navi.incrementElse();
<a name="l00876"></a>00876 
<a name="l00877"></a>00877   <span class="keywordflow">if</span> (navi.isConstant() || (*start != *navi))
<a name="l00878"></a>00878     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00879"></a>00879 
<a name="l00880"></a>00880   <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#721132760de802e5de5c4c8e53ceabcf">dd_owns</a>(navi.thenBranch(), ++start, finish);
<a name="l00881"></a>00881 }
<a name="l00882"></a>00882 
<a name="l00883"></a>00883 <span class="comment">// determine the part of a polynomials of a given degree</span>
<a name="l00884"></a>00884 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CacheType, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> DegType, <span class="keyword">class</span> SetType&gt;
<a name="l00885"></a>00885 SetType
<a name="l00886"></a><a class="code" href="namespacepolybori.html#41cf533e9730a8a912cc95dba2698dfb">00886</a> <a class="code" href="namespacepolybori.html#41cf533e9730a8a912cc95dba2698dfb">dd_graded_part</a>(<span class="keyword">const</span> CacheType&amp; cache, NaviType navi, DegType deg,  
<a name="l00887"></a>00887                SetType init) {
<a name="l00888"></a>00888 
<a name="l00889"></a>00889 
<a name="l00890"></a>00890   <span class="keywordflow">if</span> (deg == 0) {
<a name="l00891"></a>00891     <span class="keywordflow">while</span>(!navi.isConstant())
<a name="l00892"></a>00892       navi.incrementElse();
<a name="l00893"></a>00893     <span class="keywordflow">return</span> cache.generate(navi);
<a name="l00894"></a>00894   }
<a name="l00895"></a>00895 
<a name="l00896"></a>00896   <span class="keywordflow">if</span>(navi.isConstant())
<a name="l00897"></a>00897     <span class="keywordflow">return</span> cache.zero();
<a name="l00898"></a>00898 
<a name="l00899"></a>00899   <span class="comment">// Look whether result was cached before</span>
<a name="l00900"></a>00900   NaviType cached = cache.find(navi, deg);
<a name="l00901"></a>00901 
<a name="l00902"></a>00902   <span class="keywordflow">if</span> (cached.isValid())
<a name="l00903"></a>00903     <span class="keywordflow">return</span> cache.generate(cached);
<a name="l00904"></a>00904 
<a name="l00905"></a>00905   SetType result = 
<a name="l00906"></a>00906     SetType(*navi,  
<a name="l00907"></a>00907             <a class="code" href="namespacepolybori.html#41cf533e9730a8a912cc95dba2698dfb">dd_graded_part</a>(cache, navi.thenBranch(), deg - 1, init),
<a name="l00908"></a>00908             <a class="code" href="namespacepolybori.html#41cf533e9730a8a912cc95dba2698dfb">dd_graded_part</a>(cache, navi.elseBranch(), deg, init)
<a name="l00909"></a>00909             );
<a name="l00910"></a>00910 
<a name="l00911"></a>00911   <span class="comment">// store result for later reuse</span>
<a name="l00912"></a>00912   cache.insert(navi, deg, result.navigation());
<a name="l00913"></a>00913 
<a name="l00914"></a>00914   <span class="keywordflow">return</span> result;
<a name="l00915"></a>00915 }
<a name="l00916"></a>00916 
<a name="l00917"></a>00917 
<a name="l00922"></a>00922 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CacheManager, <span class="keyword">class</span> NaviType, <span class="keyword">class</span> SetType&gt;
<a name="l00923"></a>00923 SetType
<a name="l00924"></a><a class="code" href="namespacepolybori.html#fb5a6eb8fcb25e03a9c1c82bd60045fd">00924</a> <a class="code" href="namespacepolybori.html#fb5a6eb8fcb25e03a9c1c82bd60045fd">dd_first_divisors_of</a>(<a class="code" href="classpolybori_1_1CacheManager.html">CacheManager</a> cache_mgr, NaviType navi, 
<a name="l00925"></a>00925                      NaviType rhsNavi, SetType init ) {
<a name="l00926"></a>00926 
<a name="l00927"></a>00927   <span class="keyword">typedef</span> <span class="keyword">typename</span> SetType::dd_type dd_type;
<a name="l00928"></a>00928   <span class="keywordflow">while</span>( (!navi.isConstant()) &amp;&amp; (*rhsNavi != *navi) ) {
<a name="l00929"></a>00929 
<a name="l00930"></a>00930     <span class="keywordflow">if</span> ( (*rhsNavi &lt; *navi) &amp;&amp; (!rhsNavi.isConstant()) ) 
<a name="l00931"></a>00931       rhsNavi.incrementThen();
<a name="l00932"></a>00932     <span class="keywordflow">else</span> 
<a name="l00933"></a>00933       navi.incrementElse();  
<a name="l00934"></a>00934   }
<a name="l00935"></a>00935 
<a name="l00936"></a>00936   <span class="keywordflow">if</span> (navi.isConstant())        <span class="comment">// At end of path</span>
<a name="l00937"></a>00937     <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00938"></a>00938 
<a name="l00939"></a>00939   <span class="comment">// Look up, whether operation was already used</span>
<a name="l00940"></a>00940   NaviType result = cache_mgr.find(navi, rhsNavi);
<a name="l00941"></a>00941     
<a name="l00942"></a>00942   <span class="keywordflow">if</span> (result.isValid())       <span class="comment">// Cache lookup sucessful</span>
<a name="l00943"></a>00943     <span class="keywordflow">return</span>  cache_mgr.generate(result);
<a name="l00944"></a>00944   
<a name="l00945"></a>00945   assert(*rhsNavi == *navi);
<a name="l00946"></a>00946    
<a name="l00947"></a>00947   <span class="comment">// Compute new result</span>
<a name="l00948"></a>00948   init = dd_type(*rhsNavi,  
<a name="l00949"></a>00949                  <a class="code" href="namespacepolybori.html#fb5a6eb8fcb25e03a9c1c82bd60045fd">dd_first_divisors_of</a>(cache_mgr, navi.thenBranch(), rhsNavi, 
<a name="l00950"></a>00950                                       init).diagram(),
<a name="l00951"></a>00951                  <a class="code" href="namespacepolybori.html#fb5a6eb8fcb25e03a9c1c82bd60045fd">dd_first_divisors_of</a>(cache_mgr, navi.elseBranch(), rhsNavi, 
<a name="l00952"></a>00952                                       init).diagram() );
<a name="l00953"></a>00953   <span class="comment">// Insert result to cache</span>
<a name="l00954"></a>00954   cache_mgr.insert(navi, rhsNavi, init.navigation());
<a name="l00955"></a>00955 
<a name="l00956"></a>00956   <span class="keywordflow">return</span> init;
<a name="l00957"></a>00957 }
<a name="l00958"></a>00958 
<a name="l00959"></a>00959 <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="l00960"></a>00960 SetType
<a name="l00961"></a><a class="code" href="namespacepolybori.html#09033c4dd20314aabe518a8994be46ee">00961</a> <a class="code" href="namespacepolybori.html#09033c4dd20314aabe518a8994be46ee">dd_first_multiples_of</a>(<span class="keyword">const</span> CacheType&amp; cache_mgr,
<a name="l00962"></a>00962                       NaviType navi, NaviType rhsNavi, SetType init){
<a name="l00963"></a>00963 
<a name="l00964"></a>00964   <span class="keyword">typedef</span> <span class="keyword">typename</span> SetType::dd_type dd_type;
<a name="l00965"></a>00965 
<a name="l00966"></a>00966   <span class="keywordflow">if</span>(rhsNavi.isConstant())
<a name="l00967"></a>00967     <span class="keywordflow">if</span>(rhsNavi.terminalValue())
<a name="l00968"></a>00968       <span class="keywordflow">return</span> cache_mgr.generate(navi);
<a name="l00969"></a>00969     <span class="keywordflow">else</span>
<a name="l00970"></a>00970       <span class="keywordflow">return</span> cache_mgr.generate(rhsNavi);
<a name="l00971"></a>00971 
<a name="l00972"></a>00972   <span class="keywordflow">if</span> (navi.isConstant() || (*navi &gt; *rhsNavi)) 
<a name="l00973"></a>00973     <span class="keywordflow">return</span> cache_mgr.zero();
<a name="l00974"></a>00974 
<a name="l00975"></a>00975   <span class="keywordflow">if</span> (*navi == *rhsNavi)
<a name="l00976"></a>00976     <span class="keywordflow">return</span> <a class="code" href="namespacepolybori.html#09033c4dd20314aabe518a8994be46ee">dd_first_multiples_of</a>(cache_mgr, navi.thenBranch(), 
<a name="l00977"></a>00977                                  rhsNavi.thenBranch(), init).<a class="code" href="classchange.html" title="Accessing .change().">change</a>(*navi);
<a name="l00978"></a>00978 
<a name="l00979"></a>00979   <span class="comment">// Look up old result - if any</span>
<a name="l00980"></a>00980   NaviType result = cache_mgr.find(navi, rhsNavi);
<a name="l00981"></a>00981 
<a name="l00982"></a>00982   <span class="keywordflow">if</span> (result.isValid())
<a name="l00983"></a>00983     <span class="keywordflow">return</span> cache_mgr.generate(result);
<a name="l00984"></a>00984 
<a name="l00985"></a>00985   <span class="comment">// Compute new result</span>
<a name="l00986"></a>00986   init = dd_type(*navi,
<a name="l00987"></a>00987                   <a class="code" href="namespacepolybori.html#09033c4dd20314aabe518a8994be46ee">dd_first_multiples_of</a>(cache_mgr, navi.thenBranch(), 
<a name="l00988"></a>00988                                         rhsNavi, init).diagram(),
<a name="l00989"></a>00989                   <a class="code" href="namespacepolybori.html#09033c4dd20314aabe518a8994be46ee">dd_first_multiples_of</a>(cache_mgr, navi.elseBranch(), 
<a name="l00990"></a>00990                                         rhsNavi, init).diagram() );
<a name="l00991"></a>00991 
<a name="l00992"></a>00992   <span class="comment">// Insert new result in cache</span>
<a name="l00993"></a>00993   cache_mgr.insert(navi, rhsNavi, init.navigation());
<a name="l00994"></a>00994 
<a name="l00995"></a>00995   <span class="keywordflow">return</span> init;
<a name="l00996"></a>00996 }
<a name="l00997"></a>00997 
<a name="l00998"></a>00998 
<a name="l00999"></a>00999 <a class="code" href="pbori__defs_8h.html#faf094fde6c1a7f1aad18bcb455f3b06" title="Finish project&amp;#39;s namespace.">END_NAMESPACE_PBORI</a>
</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>