00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 #include <twod/jag_pq_opt_interval.hpp>
00038 
00039 template <typename T, typename Pr>
00040 T twod::JagPQOptIntervalHor<T,Pr>::internal(int procX, int procY, const Pr& prefixSumArray, util::RectList<T, Pr > &parts)
00041 {
00042   util::Aggreg2Dto1Dpart<T, Pr> bar (prefixSumArray, procY);
00043   int * x_cuts = new int [procX+1];
00044   int * y_cuts = new int [procY+1];
00045 
00046   T res = oned::Nicol_plus_interval<T, util::Aggreg2Dto1Dpart<T, Pr> >::nicol_plus (procX, bar, prefixSumArray.prefixsizeX(), x_cuts, -1);
00047     
00048     
00049   {
00050     T max_load = 0;
00051 
00052     util::rectangle r;
00053 
00054     r.x_top_l = 1;
00055     
00056     for(int i = 0; i < procX; i++)
00057       {
00058         
00059         r.y_top_l = 1;
00060         r.y_bot_r = prefixSumArray.prefixsizeY() - 1;
00061         r.x_bot_r = (i == procX - 1) ? prefixSumArray.prefixsizeX() - 1 :x_cuts[i];
00062         if (r.x_top_l <= r.x_bot_r)
00063           {
00064             util::Aggreg2Dto1D<T, Pr, false> ps1dx_row(prefixSumArray, r.x_top_l, r.x_bot_r, 1, prefixSumArray.prefixsizeY() - 1); 
00065             oned::NicolPlus<T, util::Aggreg2Dto1D<T, Pr, false> >::nicol_plus (procY, ps1dx_row, prefixSumArray.prefixsizeY(), y_cuts, -1);
00066             
00067             for(int j = 0; j < procY; j++)
00068               {
00069                 r.y_bot_r = (j == procY - 1) ? prefixSumArray.prefixsizeY() - 1 :y_cuts[j];
00070                 if(r.valid_bound(prefixSumArray))
00071                   {
00072                       
00073                     parts.add_rect(r);
00074                     if(r.get_load<T,Pr>(prefixSumArray) > max_load)
00075                       max_load = r.get_load<T,Pr>(prefixSumArray);
00076                     r.y_top_l = r.y_bot_r + 1;
00077                   }
00078                 else
00079                   break;
00080               }
00081           }
00082         r.x_top_l = r.x_bot_r + 1;
00083       }
00084 
00085     assert (res == max_load);
00086   }
00087   delete [] x_cuts;
00088   delete [] y_cuts;
00089   return res;
00090 }
00091 
00092 template <typename T, typename Pr>
00093 twod::JagPQOptIntervalHor<T,Pr>::~JagPQOptIntervalHor(){}
00094 
00095 template <typename T, typename Pr>
00096 twod::JagPQOptIntervalHor<T,Pr>::JagPQOptIntervalHor():P(0){}
00097 
00098 template <typename T, typename Pr>
00099 void twod::JagPQOptIntervalHor<T,Pr>::setP(int P){this->P = P;}
00100 
00101 template <typename T, typename Pr>
00102 T twod::JagPQOptIntervalHor<T,Pr>::part (int procCount, const Pr& prefixSumArray, util::RectList<T, Pr > &parts)
00103 {
00104       int procX;
00105       if (P == 0)
00106         procX = (int)sqrt(procCount);      
00107       else
00108         procX = P; 
00109 
00110       int procY = procCount/procX;
00111 
00112       return internal (procX, procY, prefixSumArray, parts);
00113 }
00114 
00115 template <typename T, typename Pr>
00116 twod::JagPQOptIntervalVer<T,Pr>::JagPQOptIntervalVer():P(0){}
00117 
00118 template <typename T, typename Pr>
00119 void twod::JagPQOptIntervalVer<T,Pr>::setP(int P){this->P = P;}
00120 
00121 template <typename T, typename Pr>
00122 T twod::JagPQOptIntervalVer<T,Pr>::part(int procCount, const Pr& prefixSumArray, util::RectList<T,Pr> &parts)
00123 {
00124   JagPQOptIntervalHor <T, util::TransposePrefix2D<T, Pr > > foo;
00125       
00126   util::TransposePrefix2D<T, Pr> tpr (prefixSumArray);
00127       
00128   util::RectList<T, util::TransposePrefix2D<T, Pr> > intermediate (tpr);
00129       
00130   T val = foo.part(procCount,tpr,intermediate);
00131       
00132   util::TransposePrefix2D<T, Pr>::convertRectList(intermediate, parts);
00133       
00134   return val;
00135 }
00136 
00137 
00138 template <typename T, typename Pr>
00139 twod::JagPQOptIntervalVer<T,Pr>::~JagPQOptIntervalVer(){}
00140 
00141 template <typename T, typename Pr>
00142 T twod::JagPQOptIntervalBest<T,Pr>::part(int procCount, const Pr& prefixSumArray, util::RectList<T,Pr> &parts)
00143 {
00144   util::RectList<T,Pr > partsv(prefixSumArray);
00145   util::RectList<T,Pr > partsh(prefixSumArray); 
00146 
00147   JagPQOptIntervalVer<T,Pr> foov;
00148   JagPQOptIntervalHor<T,Pr> fooh;
00149 
00150   T ort1 = foov.part(procCount, prefixSumArray, partsv);
00151   T ort2 = fooh.part(procCount, prefixSumArray, partsh);
00152   if(ort1 > ort2)
00153     {
00154       parts.copy_into(partsh);
00155       return ort2;
00156     }
00157   else
00158     {
00159       parts.copy_into(partsv);
00160       return ort1;
00161     }
00162 }
00163 
00164 template <typename T, typename Pr>
00165 twod::JagPQOptIntervalBest<T,Pr>::~JagPQOptIntervalBest(){}