realroot_doc 0.1.1
|
#include <strgy_rdslv_parallel.hpp>
Definition at line 29 of file strgy_rdslv_parallel.hpp.
typedef system::creal_t creal_t |
Definition at line 31 of file strgy_rdslv_parallel.hpp.
typedef system::interval_t interval_t |
Definition at line 32 of file strgy_rdslv_parallel.hpp.
typedef vstack_t::sz_t sz_t |
Definition at line 34 of file strgy_rdslv_parallel.hpp.
typedef system::vstack_t vstack_t |
Definition at line 33 of file strgy_rdslv_parallel.hpp.
Definition at line 54 of file strgy_rdslv_parallel.hpp.
Referenced by parallel< system >::process().
{ sz_t s,i; for ( s = i = 0; i < 4*this->m_nbp; s += pmsz(iptr+i)+pMsz(iptr+i), i += 4 ) ; this->m_cpchnk.dec( s + 2 ); this->m_ipchnk.dec(4*this->nbp()); iptr = iptr - 4*this->nbp(); return iptr; };
Definition at line 37 of file strgy_rdslv_parallel.hpp.
References assert.
Referenced by parallel< system >::process().
{ assert(iptr%4 == 0); sz_t i,s; for ( s = i = 0; i < 4*this->nbp(); s += pmsz(iptr+i)+pMsz(iptr+i), i += 4 ) ; s = allocc(s+2)+2; sz_t inext = alloci(this->nbp()*4); for ( i = 0; i < 4*this->nbp(); s += pmsz(iptr+i)+pMsz(iptr+i), i += 4 ) { pmsz(inext+i) = pmsz(iptr+i); pmad(inext+i) = s; pMad(inext+i) = s + pmsz(iptr+i); pMsz(inext+i) = pMsz(iptr+i); }; return inext; };
bool process | ( | std::vector< interval_t > & | reductions, |
const vstack_t & | vp, | ||
const creal_t & | eps = 1e-3 , |
||
int | k = 12 |
||
) | [inline] |
Definition at line 65 of file strgy_rdslv_parallel.hpp.
References assert, mmx::sparse::copy(), mmx::brnops::decasteljau(), parallel< system >::pdec(), parallel< system >::pinc(), mmx::numerics::rnd_dw(), mmx::numerics::rnd_up(), mmx::realroot::sgn(), and mmx::vctops::sgnchg().
{ this->copy(vp); /* duplication de la pile de projections */ sz_t iptr, inext, mxsgn, sgn, i, nmult; int itk = 0; nmult = iptr = 0; for ( ; itk >= 0; ) { sgn = mxsgn = 0; /* projections basses */ for ( mxsgn = i = 0; i < 4*this->nbp(); i += 4 ) { if ( pmsz(iptr+i) && !(sgn = vctops::sgnchg(pmdata(iptr+i),pmsz(iptr+i))) ) { pmsz(iptr+i) = 0; if ( *pmdata(iptr+i) > 0.0 ) break; }; if ( mxsgn < sgn ) mxsgn = sgn; }; if ( i < 4*this->nbp() ) { iptr = pdec(iptr); itk --; continue; }; /* projection hautes */ for ( i = 0; i < 4*this->nbp(); i += 4 ) { if ( pMsz(iptr+i) && !(sgn = vctops::sgnchg( pMdata(iptr+i), pMsz(iptr+i))) ) { pMsz(iptr+i) = 0; if ( *pMdata(iptr+i) < 0.0 ) break; }; if ( mxsgn < sgn ) mxsgn = sgn; }; if ( i < 4*this->nbp() ) { iptr = pdec(iptr); itk --; continue; }; /* si le domaine a été accepté, si la précision ou le quota de multiplication est dépassé. */ if ( !mxsgn || (pupper(iptr)-plower(iptr)) < eps )/* || nmult > m_ssz * m_esz ) */ { if ( reductions.size() == 0 || reductions.back().upper() != plower(iptr) ) reductions.push_back(interval_t(plower(iptr),pupper(iptr))); else reductions.back().define(reductions.back().lower(),pupper( iptr )); iptr = pdec( iptr ); itk --; continue; }; /* incrémentation de la pile */ inext = pinc(iptr); // sz_t nbcstl = 0; /* subdivision des projections basses */ { numerics::rounding<creal_t> rnd( numerics::rnd_dw() ); for ( i = 0; i < 4*this->nbp(); i += 4 ) if ( pmsz(iptr+i) ) { nmult += pmsz(iptr+i)*(pmsz(iptr+i)-1); brnops::decasteljau(pmdata(iptr+i),pmdata(inext+i),pmsz(iptr+i)); // nbcstl++; }; }; /* subdivision des projections hautes */ { numerics::rounding<creal_t> rnd( numerics::rnd_up() ); for ( i = 0; i < 4*this->nbp(); i += 4 ) if ( pMsz(iptr+i) ) { nmult += pMsz(iptr+i)*(pMsz(iptr+i)-1); brnops::decasteljau(pMdata(iptr+i),pMdata(inext+i),pMsz(iptr+i) ); // nbcstl++; }; }; /* if ( nbcstl == 0 ) { print(iptr); }; */ // assert(nbcstl); plower(inext) = plower(iptr); pupper(inext) = (plower(iptr)+pupper(iptr))/2; plower(iptr) = pupper(inext); iptr = inext; itk ++; }; return reductions.size() != 0; assert(k>0); }