|
realroot_doc 0.1.1
|
| unsigned mmx::realroot::clean_result | ( | real_t * | isols, |
| int | nvars, | ||
| int | nsols, | ||
| const real_t & | prec | ||
| ) |
Definition at line 34 of file system_support.hpp.
References mmx::abs(), mmx::sparse::copy(), and mmx::max().
Referenced by solver< C, ProjRd< MTH > >::run(), and solver< C, ProjRd< MTH > >::solve_monomial().
{
int a,c,n,i;
real_t cd;
if ( nsols == 0 ) return 0;
for ( a = 0; a < nsols*nvars; isols[a] = (isols[2*a]+isols[2*a+1])/2.0, a ++ ) ;
for ( n = 1, c = 0, a = 0; a < nsols*nvars; a += nvars )
{
for ( cd = 0, i = 0; i < nvars; cd = std::max(cd,std::abs((isols+c)[i]-(isols+a)[i])), i ++ ) ;
if ( cd < prec )
{
double fa = ((double)n)/(n+1);
double fb = ((double)1.0)/(n+1);
for ( int i = 0; i < nvars; i ++ ) (isols+c)[i] = fa*(isols+c)[i]+fb*(isols+a)[i];
n ++;
}
else
{
c += nvars;
std::copy(isols+a,isols+a+nvars,isols+c);
n = 1;
};
};
return (c+nvars)/nvars;
};
| T mmx::realroot::det | ( | T * | mat, |
| int | order | ||
| ) |
Definition at line 136 of file solver_mv_monomial_tests.hpp.
References submatrix().
Referenced by exclude2(), include1(), include2(), and signof_det().
{
if(order == 1)
return mat[0]; // Matrix is of order one
int i;
T ev(0);
for(i = 0; i < order; i++)
{
//std::cout<<"entering"<<order<<",i="<<i <<std::endl;
ev += T(i%2==0?1:-1)* mat[i*order] * det(submatrix(mat, order, i, 0), order - 1);
//std::cout<<"OK, ("<<order<<" "<<i<<")"<<std::endl;
}
return ev;
}
| T* mmx::realroot::eval_poly_matrix | ( | Seq< T > | val, |
| polynomial< double, with< MonomialTensor > > * | mat, | ||
| int | n | ||
| ) | [inline] |
Definition at line 84 of file solver_mv_monomial_tests.hpp.
References mmx::eval(), mmx::rep(), and Seq< C, R >::size().
Referenced by exclude2(), include1(), include2(), and include3().
{
int m(val.size());
T *ev;//[m*n];
ev= new T [m*n];
for( int i=0;i<m;i++)
{
for( int k=0;k<n;k++)
{
tensor::eval( ev[i*m+k] , mat[i*m+k].rep(),
val , m );
}
}
return ev;
}
| bool mmx::realroot::exclude1 | ( | box_rep< POL > * | b, |
| Seq< POL * > & | S0 | ||
| ) |
Exclusion criteria (inteval arithmetic)
Definition at line 344 of file solver_mv_monomial_tests.hpp.
References mmx::assign(), DPOL, mmx::eval(), Interval< T, r >::M, and Interval< T, r >::m.
{
Interval<double> ev;
Seq<Interval<double> > dom;
dom= b->template domain<double>();
DPOL tmp;
for (unsigned i=0; i!=b->nbpol(); ++i)
{
let::assign(tmp, *S0[i] );
tensor::eval( ev , tmp.rep(),
dom , b->nbvar() );
if ( ev.m*ev.M > 0 )
{
// std::cout<<i<<" ev"<<
// dom<<"\nf= "<< *(S0[1])<<
// "\n f([])= " <<ev<<std::endl;
// if (td!=0)
// std::cout<<"!!!!!!----td: "<<td <<std::endl;
return true;
}
}
return false;
};
| bool mmx::realroot::exclude2 | ( | box_rep< POL > * | b, |
| polynomial< double, with< MonomialTensor > > * | J | ||
| ) |
Exclusion criteria (topological degree)
Definition at line 373 of file solver_mv_monomial_tests.hpp.
References det(), eval_poly_matrix(), Interval< T, r >::M, and Interval< T, r >::m.
Referenced by solver_mv_monomial< FT, POL >::solve_system().
{
Interval<double> ev;
Interval<double> * m;
//Seq<POL> SS= b->system();
unsigned dim= b->nbvar();
// Check Jacobian's sign
m= eval_poly_matrix( b->template domain<double>() ,J,dim);
ev= det(m,dim);
if ( ev.m*ev.M < 0 )
return false;
int td= topological_degree_2d<POL, double>(b);
return ( td==0 );
}
| bool mmx::realroot::exclude3 | ( | box_rep< POL > * | b | ) | [inline] |
Definition at line 393 of file solver_mv_monomial_tests.hpp.
References no_variation().
{
Seq<POL> S= b->system();
for (unsigned i=0; i!=b->nbpol(); ++i)
if ( no_variation( S[i]) )
return true;
return false;
}
| void mmx::realroot::fill_data | ( | T * | data, |
| eenv_t * | env, | ||
| const MPOL & | p, | ||
| binomials< T > & | benv | ||
| ) |
Definition at line 82 of file solver_mv_bernstein.hpp.
References mmx::tensor::convertm2b(), mmx::vct::fill(), and mmx::tensor::mpolfill().
Referenced by solver< C, ProjRd< MTH > >::solve_monomial().
{
std::fill(data,data+env->sz(),0);
mpolfill(data,p.rep(),*env);
convertm2b (data,*env,benv);
};
| bool mmx::realroot::include1 | ( | box_rep< POL > * | b, |
| polynomial< double, with< MonomialTensor > > * | J | ||
| ) |
Inclusion criteria (Miranda Test)
Definition at line 203 of file solver_mv_monomial_tests.hpp.
References det(), eval_poly_matrix(), Interval< T, r >::M, Interval< T, r >::m, miranda_test(), and POL.
{
Interval<double> ev(0);
Interval<double> * m;
unsigned i,j,c; //,r ;
POL u,l;
Seq<POL> SS= b->system();
unsigned dim= b->nbvar();
bool t[dim][dim];
m= eval_poly_matrix( b->template domain<double>() ,J,dim);
// std::cout<<"Ok " <<std::endl;
// double dm[9];
// for(i = 0; i < 9; i++)
// { dm[i]= m[i].M;
// std::cout<<"dm["<<i<<"]="<<dm[i] <<std::endl;
// }
// ev= det(dm,dim);
// std::cout<<"Ok ="<<ev <<std::endl;
// for(i = 0; i < 9; i++)
// std::cout<<"m["<<i<<"]="<<m[i] <<std::endl;
// std::cout<<"SUB "<<std::endl;
// ev= det(submatrix(m, 3, 2, 0), 2);
// std::cout<<"FULL "<<std::endl;
ev=det(m,dim);
if ( ev.m*ev.M < 0 )
return false;
for (i=0; i!=dim;++i)
for (j=0; j!=dim;++j){
t[i][j]= miranda_test(SS,i,j);
//std::cout<<"mir("<<i<<","<<j<<")="<< t[i][j] <<std::endl;
}
c=0;
for (i=0; i!=dim;++i)
for (j=0; j!=dim;++j)
if (t[i][j]==true)
{
c++; break;
}
if (c<dim) return false;
c=0;
for (i=0; i!=dim;++i)
for (j=0; j!=dim;++j)
if (t[j][i]==true)
{
c++; break;
}
if (c<dim) return false;
//std::cout<<"INCLUDE. ev="<<ev<<", c="<<c <<"*dim:"<<dim <<std::endl;
return true;
};
| bool mmx::realroot::include2 | ( | box_rep< POL > * | b, |
| polynomial< double, with< MonomialTensor > > * | J | ||
| ) |
Inclusion criteria (Jacobian+Topological Degree)
Definition at line 267 of file solver_mv_monomial_tests.hpp.
References det(), eval_poly_matrix(), Interval< T, r >::M, and Interval< T, r >::m.
{
Interval<double> ev;
Interval<double> * m;
//Seq<POL> SS= b->system();
unsigned dim= b->nbvar();
// Check Jacobian's sign
m= eval_poly_matrix( b->template domain<double>() ,J,dim);
ev= det(m,dim);
if ( ev.m*ev.M < 0 )
return false;
int td= topological_degree_2d<POL, double>(b);
//if ( (td==-1 || td==1) )
//{ std::cout<<"INCLUDE. ev="<<ev<<", td="<<td <<std::endl;
//this->print(); }
return ( (td==-1 || td==1) );
}
| bool mmx::realroot::include3 | ( | box_rep< POL > * | b, |
| polynomial< double, with< MonomialTensor > > * | J, | ||
| Seq< POL * > & | S0 | ||
| ) |
Inclusion criteria based on Rump's test.
Definition at line 292 of file solver_mv_monomial_tests.hpp.
References mmx::assign(), DPOL, mmx::eval(), eval_poly_matrix(), mmx::linear::LUinverse(), Interval< T, r >::M, and Interval< T, r >::m.
{
double *fc, *jc, *ijc;
Interval<double> ev, *jb, *m;
Seq<double> c= b->point( b->middle() ) ;
Seq<Interval<double> > bx;
unsigned i,j,n= b->nbvar();
DPOL tmp;
fc= new double[n]; // system S0 evaluated on c
for(i=0; i< n;i++ )
{
let::assign(tmp, *S0[i]) ;
tensor::eval( fc[i] , tmp.rep(), c , n );
}
bx= b->template domain<double>(); // box
jc= eval_poly_matrix( c, J, n); // Jacobian evaluated on c
ijc= new double[n*n];
linear::LUinverse(ijc, jc, n); // Inverse of above
jb= eval_poly_matrix( bx, J, n); // Jacobian evaluated on box
m= new Interval<double>[n*n];
for(i=0; i< n;i++ )
for(j=0; j< n;j++ )
m[i*n+j] += ijc[i*n+j]*jb[j*n+i];
free(jb);
// check if -im*fc + (I-im*jb)*bx is inside bx.
for(i=0; i< n;i++ )
{
bx[i]= bx[i]- c[i];
ev= bx[i];
for(j=0; j<n; j++ )
{
ev+= -ijc[i*n+j]*fc[j] - m[i*n+j] *bx[i];
}
// std::cout<<ev<<" --- "<<bx[i]<<std::endl;
if ( ev.m < bx[i].m ||
ev.M > bx[i].M )
{
// std::cout<<ev<<" not in "<<bx[i]<<std::endl;
return false;
}
}
// std::cout<<"found root in "<<bx<< "(ev="<<ev<<")"<<std::endl;
return ( true );
}
| polynomial<double,with<MonomialTensor> >* mmx::realroot::jacobian | ( | Seq< POL * > & | S0 | ) | [inline] |
Definition at line 42 of file solver_mv_monomial_tests.hpp.
References mmx::assign(), mmx::diff(), DPOL, POL, and Seq< C, R >::size().
Referenced by solver_mv_monomial< FT, POL >::approximate(), and solver_mv_monomial< FT, POL >::isolate().
{
int n=S0.size();
DPOL * jac;//[n*n];
POL df;
jac= new DPOL [n*n];
for( int i=0;i<n;i++)
{
for( int k=0;k<n;k++)
{
df= diff( *(S0[i]),k);
let::assign( jac[i*n+k] , df);
}
}
return jac;
}
| bool mmx::realroot::miranda_test | ( | Seq< POL > & | S, |
| const int | i, | ||
| const int | j | ||
| ) | [inline] |
Definition at line 187 of file solver_mv_monomial_tests.hpp.
References mmx::tensor::face(), no_variation(), and POL.
Referenced by include1().
{
POL u,l;
tensor::face(l, S[i], j, 0);
tensor::face(u, S[i], j, 1);
//std::cout<<"l="<<l<<",u="<<u<<std::endl;
return ( no_variation(l) &&
no_variation(u) &&
(l[0]>0)!=(u[0]>0) );
};
| bool mmx::realroot::no_variation | ( | POL & | p | ) | [inline] |
True iff all coefficients of p have the same sign.
Definition at line 404 of file solver_mv_monomial_tests.hpp.
References mmx::has_sign_variation().
Referenced by exclude3(), miranda_test(), and box_rep< POL >::miranda_test().
{
return !has_sign_variation(p.begin(),p.end()) ;
};
| void mmx::realroot::precondition | ( | Seq< T > | val, |
| polynomial< double, with< MonomialTensor > > * | mat, | ||
| int | n | ||
| ) | [inline] |
Definition at line 63 of file solver_mv_monomial_tests.hpp.
References mmx::eval(), mmx::rep(), and Seq< C, R >::size().
{
int m(val.size());
T *ev;//[m*n];
ev= new T [m*n];
for( int i=0;i<m;i++)
{
for( int k=0;k<n;k++)
{
tensor::eval( ev[i*m+k] , mat[i*m+k].rep(),
val , m );
}
}
return ev;
}
| void mmx::realroot::scan_monom_env | ( | std::set< int > & | env, |
| const monom & | m | ||
| ) |
Definition at line 89 of file solver_mv_bernstein.hpp.
References monom< C, E >::rep(), and mmx::size().
Referenced by solver< C, ProjRd< MTH > >::solve_monomial().
{ for ( unsigned i = 0; i < (m.rep()).size(); i++ ) if ( (m.rep())[i] != 0 ) env.insert(i); };
| int mmx::realroot::sgn | ( | POL & | f, |
| FT | a | ||
| ) | [inline] |
Sign of f at point a>=0 (-1=inf)
Definition at line 424 of file solver_mv_monomial_tests.hpp.
References sgn().
| int mmx::realroot::sgn | ( | FT | a | ) | [inline] |
Sign of a.
Definition at line 416 of file solver_mv_monomial_tests.hpp.
Referenced by parallel< system >::process(), sgn(), descartes_solver< real_t, local_method >::solve(), and topological_degree_2d().
{
if (a==FT(0) ) return 0;
return ( (a>0) ? 1 : -1 );
}
| int mmx::realroot::signof | ( | polynomial< double, with< MonomialTensor > > * | p, |
| Seq< FT > | t | ||
| ) | [inline] |
Definition at line 156 of file solver_mv_monomial_tests.hpp.
References mmx::eval(), and Seq< C, R >::size().
{
Interval<double> ev;
//int dim= p->nbvar();
tensor::eval( ev , p->rep() ,
t , t.size() );
if (ev< .1e-10) return (0);
return (ev>0?1:-1);
}
| int mmx::realroot::signof_det | ( | T * | mat, |
| const int & | n | ||
| ) | [inline] |
Definition at line 102 of file solver_mv_monomial_tests.hpp.
References det().
{ // mat= double[n*n]
double ev;
ev= det(mat,n);
if (ev< .1e-15) return (0);
return (ev>0?1:-1);
}
| T* mmx::realroot::submatrix | ( | T * | matrix, |
| int | order, | ||
| int | i, | ||
| int | j | ||
| ) |
Definition at line 112 of file solver_mv_monomial_tests.hpp.
Referenced by det().
{
int n=order-1;
T * subm;//[n*n];
int p, q; // Indexes for matrix
int a = 0, b; // Indexes for subm
subm = new T [n*n];
for(p = 0; p < order; p++) {
if(p==i) continue; //Skip ith row
b = 0;
for(q = 0; q < order; q++) {
if(q==j) continue; //Skip jth column
subm[a*order + b++] = matrix[p*order+q];
}
a++; //Increment row index
}
return subm;
}
| int topological_degree_2d | ( | box_rep< POL > * | b | ) |
Definition at line 434 of file solver_mv_monomial_tests.hpp.
References assert, POL, sgn(), and Seq< C, R >::size().
{
/*-1=inf*/
typedef typename POL::scalar_t C;
assert( b->nbvar() ==2 );
Seq<FT> p;
Seq<FT> tmp;
unsigned ev1(0), ev2(0), ev3(0), ev4(0);
FT p1[2],p2[2];
int tdeg;
unsigned i;
POL fl0, fr0,fl1,fr1, s,
gl0, gr0,gl1,gr1 ;
fl0=b->lface(0,1); gl0=b->lface(1,1);
fr0=b->rface(0,1); gr0=b->rface(1,1);
fl1=b->lface(0,0); gl1=b->lface(1,0);
fr1=b->rface(0,0); gr1=b->rface(1,0);
s= fl0 * gl0 ;
p<< FT(0);p << FT(0) ;
tmp= solver<ring<C,MonomialTensor>, CFseparate>::template solve<FT>(s);
for (i=0;i< tmp.size(); ++i )
p<< tmp[i] << FT(0) ;
s= fr1 * gr1;
p<< FT(-1);p << FT(0);
tmp= solver<ring<C,MonomialTensor>, CFseparate>::template solve<FT>(s);
for (i=0;i< tmp.size(); ++i )
p<< FT(-1) << tmp[i];
s= fr0 * gr0 ;
p<< FT(-1);p << FT(-1) ;
tmp= solver<ring<C,MonomialTensor>, CFseparate>::template solve<FT>(s);
for (i=0;i< tmp.size(); ++i )
p<< tmp[i] << FT(-1) ;
s= fl1 * gl1 ;
p<< FT(0);p << FT(-1) ;
tmp= solver<ring<C,MonomialTensor>, CFseparate>::template solve<FT>(s);
for (i=0;i< tmp.size(); ++i )
p<< FT(0) << tmp[i] ;
p<< FT(0);p << FT(0) ;
tdeg= 0;
for (i=0; i<p.size()-3; i+=2)
{
p1[0]= p[i] ;p1[1]=p[i+1];
p2[0]= p[i+2];p2[1]=p[i+3];
if (p1[1]==FT(0) && p2[1]==FT(0)){
ev1= sgn( fl0, p1[0] );
ev3= sgn( fl0, p2[0] );
ev4= sgn( gl0, p1[0] );
ev2= sgn( gl0, p2[0] );
}else
if (p1[0]==FT(-1) && p2[0]==FT(-1)){
ev1= sgn( fr1, p1[1] );
ev3= sgn( fr1, p2[1] );
ev4= sgn( gr1, p1[1] );
ev2= sgn( gr1, p2[1] );
}else
if (p1[1]==FT(-1) && p2[1]==FT(-1)){
ev1= sgn( fr0, p1[0] );
ev3= sgn( fr0, p2[0] );
ev4= sgn( gr0, p1[0] );
ev2= sgn( gr0, p2[0] );
}else
if (p1[0]==FT(0) && p2[0]==FT(0)){
ev1= sgn( fl1, p1[1] );
ev3= sgn( fl1, p2[1] );
ev4= sgn( gl1, p1[1] );
ev2= sgn( gl1, p2[1] );
}
else
std::cout<< "TROUBLE!"<<std::endl;
tdeg+= ( (ev1)*(ev2) - (ev3)*(ev4) );
}
return (tdeg/8);
}
| const int C_ACCEPT = 5 |
Definition at line 32 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::accept(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().
| const int D_REJECT = 11 |
Definition at line 42 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().
| const int E_CTRL = 0 |
Definition at line 25 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().
| const int E_INIT = 4 |
Definition at line 29 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().
| const int E_RDSLV = 2 |
Definition at line 27 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::reduction().
| const int E_SBDRL = 3 |
Definition at line 28 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), method< system, _strgy_, _rdslv_, _sbdrl_ >::launch(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::subdivision().
| const int E_STRGY = 1 |
Definition at line 26 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().
| const int R_ERROR = 10 |
Definition at line 41 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error().
| const int R_FAIL = 9 |
Definition at line 40 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), method< system, _strgy_, _rdslv_, _sbdrl_ >::launch(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::reduction().
| const int R_ISOK = 7 |
Definition at line 38 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::launch(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::reduction().
| const int R_REJECT = 6 |
Definition at line 36 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::launch(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::reduction().
| const int R_WEAK = 8 |
Definition at line 39 of file system_method.hpp.
Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::launch(), and method< system, _strgy_, _rdslv_, _sbdrl_ >::reduction().