268 #ifndef MC__ELLIMAGE_H
269 #define MC__ELLIMAGE_H
274 #include "mcfunc.hpp"
276 #include "mclapack.hpp"
277 #include "ellipsoid.hpp"
278 #include "cmodel.hpp"
283 #undef MC__ELLIMAGE_DEBUG
369 case DIV :
return "mc::EllImg\t Division by zero scalar";
370 case INV :
return "mc::EllImg\t Inverse operation with zero in domain";
371 case LOG :
return "mc::EllImg\t Log operation with non-positive numbers in domain";
372 case SQRT :
return "mc::EllImg\t Square-root operation with negative numbers in domain";
373 case TAN :
return "mc::EllImg\t Tangent operation with zero in domain of cosine";
374 case ACOS :
return "mc::EllImg\t Inverse sine/cosine operation with domain outside [-1,1]";
375 case EIMG :
return "mc::EllImg\t EllVars belong to different ellipsoids, operation not allowed";
376 case UNDEF :
return "mc::EllImg\t Feature not yet implemented in mc::EllImg class";
377 default :
return "mc::EllImg\t Undocumented error";
416 CPPL::dssmatrix _depmap;
420 #ifdef MC__ELLIMAGE_DEBUG
421 std::ofstream _dbugout;
442 (
const CPPL::dsymatrix&
Q,
const CPPL::dcovector&
c=CPPL::dcovector(),
443 const CPPL::dssmatrix& depmap = CPPL::dssmatrix() );
447 (
const unsigned int n,
const double*Q,
const double*
c=0,
448 const CPPL::dssmatrix& depmap = CPPL::dssmatrix() );
452 (
const CPPL::dcovector&
r,
const CPPL::dcovector&
c=CPPL::dcovector(),
453 const CPPL::dssmatrix& depmap = CPPL::dssmatrix() );
469 (
const CPPL::dsymatrix& Q,
const CPPL::dcovector&
c=CPPL::dcovector(),
470 const CPPL::dssmatrix& depmap = CPPL::dssmatrix() )
475 (
const unsigned int n,
const double*Q,
const double*
c=0,
476 const CPPL::dssmatrix& depmap = CPPL::dssmatrix() )
481 (
const CPPL::dcovector& r,
const CPPL::dcovector&
c=CPPL::dcovector(),
482 const CPPL::dssmatrix& depmap = CPPL::dssmatrix() )
491 {
return _get( nvar, var ); }
494 std::ostream&
output( std::ostream&os = std::cout );
499 void _minksum(
const EllVar<T>&,
double );
502 void _minksum(
long,
double );
508 EllImg<T>& _set(
const CPPL::dssmatrix& depmap );
511 EllImg<T>& _reset(
const CPPL::dssmatrix& depmap = CPPL::dssmatrix() )
512 {
delete _CMpt;
return _set( depmap ); }
515 EllImg<T> _get(
unsigned, EllVar<T>* );
518 void _univupdate(
long,
long,
double,
double,
double );
521 void _univupdate(
long,
long, CPPL::drovector,
double,
double,
double );
524 typedef CVar<T> (univariate_function) (
const CVar<T>& ) ;
527 typedef std::tuple<double, double, double> lin_param;
530 lin_param _cmodel_linear( univariate_function,
const T& );
533 lin_param _cmodel_linear(
const int,
const T& );
536 lin_param _linearize_sqr(
const T& );
550 friend class EllImg<T>;
552 template<
class U >
friend EllVar<U> operator+(
const EllVar<U>& );
553 template<
class U >
friend EllVar<U> operator+(
const EllVar<U>&,
const EllVar<U>& );
554 template<
class U >
friend EllVar<U> operator+(
const EllVar<U>&,
const double );
555 template<
class U >
friend EllVar<U> operator+(
const double,
const EllVar<U>& );
556 template<
class U >
friend EllVar<U> operator+(
const EllVar<U>&,
const U& );
557 template<
class U >
friend EllVar<U> operator+(
const U&,
const EllVar<U>& );
558 template<
class U >
friend EllVar<U> operator-(
const EllVar<U>& );
559 template<
class U >
friend EllVar<U> operator-(
const EllVar<U>&,
const EllVar<U>& );
560 template<
class U >
friend EllVar<U> operator-(
const EllVar<U>&,
const double );
561 template<
class U >
friend EllVar<U> operator-(
const double,
const EllVar<U>& );
562 template<
class U >
friend EllVar<U> operator-(
const EllVar<U>&,
const U& );
563 template<
class U >
friend EllVar<U> operator-(
const U&,
const EllVar<U>& );
564 template<
class U >
friend EllVar<U> operator*(
const EllVar<U>&,
const EllVar<U>& );
565 template<
class U >
friend EllVar<U> operator*(
const EllVar<U>&,
const double );
566 template<
class U >
friend EllVar<U> operator*(
const double,
const EllVar<U>& );
567 template<
class U >
friend EllVar<U> operator*(
const EllVar<U>&,
const U& );
568 template<
class U >
friend EllVar<U> operator*(
const U&,
const EllVar<U>& );
569 template<
class U >
friend EllVar<U> operator/(
const EllVar<U>&,
const EllVar<U>& );
570 template<
class U >
friend EllVar<U> operator/(
const EllVar<U>&,
const double );
571 template<
class U >
friend EllVar<U> operator/(
const double,
const EllVar<U>& );
572 template<
class U >
friend EllVar<U> operator/(
const EllVar<U>&,
const U& );
573 template<
class U >
friend EllVar<U> operator/(
const U&,
const EllVar<U>& );
575 template<
class U >
friend EllVar<U> inv (
const EllVar<U>& );
576 template<
class U >
friend EllVar<U> exp (
const EllVar<U>& );
577 template<
class U >
friend EllVar<U> log (
const EllVar<U>& );
578 template<
class U >
friend EllVar<U> sqrt(
const EllVar<U>& );
579 template<
class U >
friend EllVar<U> sqr (
const EllVar<U>& );
580 template<
class U >
friend EllVar<U> pow (
const EllVar<U>&,
const int );
581 template<
class U >
friend EllVar<U> cos (
const EllVar<U>& );
582 template<
class U >
friend EllVar<U> sin (
const EllVar<U>& );
583 template<
class U >
friend EllVar<U> tan (
const EllVar<U>& );
584 template<
class U >
friend EllVar<U> acos(
const EllVar<U>& );
585 template<
class U >
friend EllVar<U> asin(
const EllVar<U>& );
586 template<
class U >
friend EllVar<U> atan(
const EllVar<U>& );
607 EllVar(
const EllVar<T>& );
613 EllVar(
const double l,
const double u );
615 EllVar( EllImg<T>&,
const unsigned );
617 EllVar( EllImg<T>&,
const unsigned,
const T& );
624 {
return _set( EI, i ); }
627 {
return _set( EI, i, Irange ); }
631 {
return !_is_constant? _Range: _const_val; }
652 const T& _range()
const
660 EllVar<T>& operator= (
const EllVar<T>& );
661 EllVar<T>& operator= (
const double );
662 EllVar<T>& operator= (
const T& );
664 EllVar<T>& operator+=(
const EllVar<T>& );
665 EllVar<T>& operator-=(
const EllVar<T>& );
666 EllVar<T>& operator*=(
const EllVar<T>& );
667 EllVar<T>& operator/=(
const EllVar<T>& );
676 : _nx(0), _current_row(0), _CMpt(0), _depmap_flag(false), _depmap(), _ip(-1)
678 #ifdef MC__ELLIMAGE_DEBUG
679 _dbugout.open(
"debug.log" , std::ios_base::out );
686 (
const CPPL::dsymatrix& Q,
const CPPL::dcovector& c,
const CPPL::dssmatrix& depmap )
689 #ifdef MC__ELLIMAGE_DEBUG
690 _dbugout.open(
"debug.log" , std::ios_base::out );
701 #ifdef MC__ELLIMAGE_DEBUG
702 _dbugout.open(
"debug.log" , std::ios_base::out );
711 (
const unsigned int n,
const double*Q,
const double*c,
const CPPL::dssmatrix& depmap )
714 #ifdef MC__ELLIMAGE_DEBUG
715 _dbugout.open(
"debug.log" , std::ios_base::out );
723 (
const CPPL::dcovector& r,
const CPPL::dcovector& c,
const CPPL::dssmatrix& depmap )
726 #ifdef MC__ELLIMAGE_DEBUG
727 _dbugout.open(
"debug.log" , std::ios_base::out );
736 #ifdef MC__ELLIMAGE_DEBUG
746 (
const CPPL::dssmatrix& depmap )
756 _Q = Q().to_dssmatrix();
758 _depmap_flag =
false;
764 _Q.resize( depmap.n );
765 _q.resize( depmap.n );
770 for(
long j=0; j<Q().n; ++j ){
772 for (
long i=0; i<=j; ++i ) _Q.put( i, j, Q(i,j) );
785 (
unsigned nvar, EllVar<T>* var )
787 CPPL::dsymatrix Q0( nvar ); Q0.zero();
788 CPPL::dcovector q0( nvar ); q0.zero();
789 for(
long j=0 ; j<nvar; ++j )
791 long prev = var[j]._RowInd;
792 for (
long i=j ; i<nvar ; ++i )
794 Q0( i , j ) = _Q( var[i]._RowInd , prev ) ;
795 q0( j ) = _q( var[j]._RowInd ) ;
798 return EllImg<T>( Q0, q0 );
807 if( !_Q.n )
return os;
809 os << std::scientific << std::setprecision(iprec);
810 os <<
"\nlifted center:\n" << _q;
811 os <<
"lifted shape matrix:\n" << _Q;
839 for(
long j = 0; j < i ; ++j)
if( _depmap.isListed( i, j ) ) _Q(i, j) = c1 * _Q(k,j) ;
841 _Q( i, i ) = std::pow(c1,2) * _Q(k,k) ;
846 for(
long j = 0; j < i ; ++j)
if( _Q.isListed( k, j ) ) _Q.put(i, j, c1 * _Q(k,j) );
848 _Q.put( i, i, std::pow(c1,2) * _Q(k,k) );
865 EllImg<T>::_univupdate
879 for(
long j = 0; j < i ; ++j)
if( _depmap.isListed( i, j ) ) _Q(i, j) = c1 * _Q(k,j) ;
881 if( _depmap.isListed( i, i ) ) _Q( i, i ) = std::pow(c1,2) * _Q(k,k) ;
886 for(
long j = 0; j < i ; ++j) _Q.put(i, j, c1 * _Q(k,j) );
888 _Q.put( i, i, std::pow(c1,2) * _Q(k,k) );
897 typename EllImg<T>::lin_param
898 EllImg<T>::_linearize_sqr
901 if( options.CHEBUSE )
return _cmodel_linear( sqr , domain );
905 double m = Op<T>::mid( domain );
906 double r = 0.5 * Op<T>::diam( domain );
907 double c_sec=0., x_tan=0., c_tan=0.;
910 x_tan = (c1-2.*m*r)/(2.*r*r);
911 c_tan = sqr(m+r*x_tan) - c1*x_tan;
912 eta = 0.5*(c_sec - c_tan);
915 return std::make_tuple( c0, c1, eta );
921 typename EllImg<T>::lin_param
922 EllImg<T>::_cmodel_linear
923 ( univariate_function f,
const T& domain )
927 if( !_CMpt ) _CMpt =
new CModel<T>( 1, options.CHEBORDER );
928 else if( _CMpt->nord() != options.CHEBORDER )
929 {
delete _CMpt; _CMpt =
new CModel<T>( 1, options.CHEBORDER ); }
931 CVar<T> CVX( _CMpt, 0 , domain );
932 CVar<T> CVF = f( CVX );
933 double c0 = CVF.C().constant();
934 double c1 = CVF.linear( 0 ,
true );
935 double eta = 0.5 * Op<T>::diam(CVF.B());
936 return std::make_tuple( c0, c1, eta );
941 typename EllImg<T>::lin_param
942 EllImg<T>::_cmodel_linear
943 (
const int n,
const T& domain )
947 if( !_CMpt ) _CMpt =
new CModel<T>( 1, options.CHEBORDER );
948 else if( _CMpt->nord() != options.CHEBORDER )
949 {
delete _CMpt; _CMpt =
new CModel<T>( 1, options.CHEBORDER ); }
951 CVar<T> CVX( _CMpt, 0 , domain );
952 CVar<T> CVF = pow( CVX, n);
953 double c0 = CVF.C().constant();
954 double c1 = CVF.linear( 0 ,
true );
955 double eta = 0.5 * Op<T>::diam(CVF.B());
956 return std::make_tuple( c0, c1, eta );
963 (
const EllVar<T>& EllVar1,
double rad )
965 long i = EllVar1._RowInd;
973 (
const long i,
const double rad )
975 #ifdef MC__ELLIMAGE_DEBUG
976 _dbugout << std::scientific << std::setprecision(3) << std::right;
977 _dbugout <<
"Minkowski sum starts: i= " << i <<std::endl;
979 _dbugout << _q <<std::endl;
981 _dbugout << _Q <<std::endl;
983 double TOL = 1e-8, EPS = machprec(), strQ = 0.0;
985 for(
long j=0; j<=i ; ++j ){
986 if( _Q.isListed(j,j) ) strQ += _Q(j,j)/(_Q(j,j)+TOL);
988 strQ = std::sqrt(strQ);
989 double sqrR = rad/std::sqrt(_Q(i,i)+TOL);
990 double kappa = strQ + sqrR + EPS;
991 _Q *= (kappa/(strQ+EPS));
992 _Q(i,i) += (std::pow(rad,2)*kappa)/(sqrR+EPS);
1010 if( !_Q.n )
return 0.;
1012 for(
unsigned int i=1; i<_Q.n; i++ ) tr += _Q(i,i);
1024 _is_constant(
false ) ,
1033 _EI ( EllVar1._EI ) ,
1034 _RowInd ( EllVar1._RowInd ) ,
1035 _is_constant( EllVar1._is_constant ) ,
1036 _const_val ( EllVar1._const_val ) ,
1037 _Range ( EllVar1._Range )
1043 (
const double d ) :
1046 _is_constant(
true ) ,
1057 _is_constant(
false ) ,
1065 (
const double l,
const double u ) :
1068 _is_constant(
false ) ,
1086 _set( EI, i, Irange );
1095 _RowInd ( RowInd ) ,
1096 _is_constant( false ) ,
1102 if( ! EI->_depmap_flag )
1105 if( EI->options.
PREALLOC && RowInd >= EI->_Q.n )
1108 EI->_Q.stretch( dim );
1109 EI->_q.stretch( dim );
1111 else if( !EI->options.
PREALLOC && RowInd >= EI->_Q.n )
1113 EI->_Q.stretch( 1 );
1114 EI->_q.stretch( 1 );
1125 long current_row ) :
1127 _RowInd ( RowInd ) ,
1128 _is_constant( false ) ,
1134 if( ! EI->_depmap_flag )
1137 if( EI->options.PREALLOC && RowInd >= EI->_Q.n )
1139 long dim = EI->options.PREALLOC;
1140 EI->_Q.stretch( dim );
1141 EI->_q.stretch( dim );
1143 else if( !EI->options.PREALLOC && RowInd >= EI->_Q.n )
1145 EI->_Q.stretch( 1 );
1146 EI->_q.stretch( 1 );
1149 EI->_current_row = current_row;
1156 ( EllImg<T>& EI,
const unsigned i )
1162 _is_constant =
false;
1164 _Range = EI._q(i) + std::sqrt(EI._Q( i,i )) * T(-1.,1.);
1172 ( EllImg<T>& EI,
const unsigned i,
const T& Irange )
1178 _is_constant =
false;
1180 if( !Op<T>::inter( _Range, EI._q(i) + std::sqrt(EI._Q( i,i )) * T(-1.,1.), Irange ) )
1188 EllVar<T>::operator=
1189 (
const EllVar<T>& EllVar1 )
1192 _RowInd = EllVar1._RowInd ;
1193 _is_constant = EllVar1._is_constant ;
1194 _const_val = EllVar1._const_val ;
1195 _Range = EllVar1._Range ;
1202 EllVar<T>::operator=
1207 _is_constant = true ;
1216 EllVar<T>::operator=
1221 _is_constant = false ;
1227 template <
typename T>
inline EllVar<T>&
1228 EllVar<T>::operator +=
1229 (
const EllVar<T>&E1 )
1231 EllVar<T> E2( *
this );
1236 template <
typename T>
inline EllVar<T>&
1237 EllVar<T>::operator -=
1238 (
const EllVar<T>&E1 )
1240 EllVar<T> E2( *
this );
1245 template <
typename T>
inline EllVar<T>&
1246 EllVar<T>::operator *=
1247 (
const EllVar<T>&E1 )
1249 EllVar<T> E2( *
this );
1254 template <
typename T>
inline EllVar<T>&
1255 EllVar<T>::operator /=
1256 (
const EllVar<T>&E1 )
1258 EllVar<T> E2( *
this );
1269 (
const EllVar<T>& EllVar1 )
1278 (
const EllVar<T>& EllVar1 ,
1279 const EllVar<T>& EllVar2 )
1283 if( EllVar1._is_constant )
return EllVar2 + EllVar1._const_val;
1284 return EllVar2 + EllVar1._Range;
1288 if( EllVar2._is_constant )
return EllVar1 + EllVar2._const_val;
1289 return EllVar1 + EllVar2._Range;
1292 if( EllVar1._EI != EllVar2._EI )
1295 EllImg<T>* EI = EllVar1._EI;
1296 long i = EI->_current_row;
1297 long k = EllVar1._RowInd;
1298 long l = EllVar2._RowInd;
1300 EllVar<T> EllVar3( EI, i );
1301 #ifdef MC__ELLIMAGE_DEBUG
1302 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1303 EI->_dbugout <<
"+ starts: i= " << i <<
" k= "<< k <<
" l= "<< l <<std::endl;
1304 EI->_dbugout <<
"q \n" ;
1305 EI->_dbugout << EI->_q <<std::endl;
1306 EI->_dbugout <<
"Q \n" ;
1307 EI->_dbugout << EI->_Q <<std::endl;
1310 EI->_q( i ) = EI->_q(k) + EI->_q(l);
1313 if( EI-> _depmap_flag ){
1315 for (
long j = 0; j < i ; ++j )
1316 if( EI->_depmap.isListed(i,j) ) EI->_Q.put( i,j, EI->_Q(k,j) + EI->_Q(l,j) );
1318 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q(k,k) + 2.*(EI->_Q(l,k)) + EI->_Q(l,l) );
1324 for (
long j = 0; j < i ; ++j )
1325 if( EI->_Q.isListed(k,j) || EI->_Q.isListed(l,j) ) EI->_Q.put( i,j, EI->_Q(k,j) + EI->_Q(l,j) );
1327 EI->_Q.put( i,i, EI->_Q(k,k) + 2.*(EI->_Q(l,k)) + EI->_Q(l,l) );
1331 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1332 EllVar3._range() = Range;
1333 #ifdef MC__ELLIMAGE_DEBUG
1334 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1335 EI->_dbugout <<
"+ ends: i= " << i <<
" k= "<< k <<
" l= "<< l <<std::endl;
1336 EI->_dbugout <<
"q \n" ;
1337 EI->_dbugout << EI->_q <<std::endl;
1338 EI->_dbugout <<
"Q \n" ;
1339 EI->_dbugout << EI->_Q <<std::endl;
1349 (
const EllVar<T>& EllVar1 ,
1354 if( EllVar1._is_constant )
return DVal + EllVar1._const_val;
1355 return DVal + EllVar1._Range;
1358 EllImg<T>* EI = EllVar1._EI;
1359 long i = EI->_current_row;
1360 long k = EllVar1._RowInd;
1362 EllVar<T> EllVar3( EI, i );
1364 EI->_q( i ) = EI->_q(k) + DVal;
1366 if( EI-> _depmap_flag )
1369 for (
long j = 0; j < i ; ++j )
1371 if( EI->_depmap.isListed(i,j) ) EI->_Q.put(i,j, EI->_Q(k,j) );
1374 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q(k,k) );
1379 for (
long j = 0; j < i ; ++j )
1381 if( EI->_Q.isListed(k,j) ) EI->_Q.put(i,j, EI->_Q(k,j) );
1384 EI->_Q.put( i,i, EI->_Q(k,k) );
1387 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1388 EllVar3._range() = Range;
1397 (
const double DVal,
1398 const EllVar<T>& EllVar1 )
1400 return EllVar1 + DVal;
1407 (
const EllVar<T>& EllVar1 ,
1412 if( EllVar1._is_constant )
return IVal + EllVar1._const_val;
1413 return IVal + EllVar1._Range;
1416 EllImg<T>* EI = EllVar1._EI;
1417 long i = EI->_current_row;
1418 long k = EllVar1._RowInd;
1420 EllVar<T> EllVar3( EI, i );
1422 EI->_q( i ) = EI->_q(k) + Op<T>::mid(IVal) ;
1424 if( EI-> _depmap_flag )
1426 EI->_minksum( i , 0.5*Op<T>::diam(IVal) );
1430 EI->_minksum( i , 0.5*Op<T>::diam(IVal) );
1433 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1434 EllVar3._range() = Range;
1444 const EllVar<T>& EllVar1 )
1446 return EllVar1 + IVal ;
1453 (
const EllVar<T>& EllVar1 )
1457 if( EllVar1._is_constant )
return -EllVar1._const_val;
1458 return -EllVar1._Range;
1461 EllImg<T>* EI = EllVar1._EI;
1462 long i = EI->_current_row;
1463 long k = EllVar1._RowInd;
1465 EllVar<T> EllVar3( EI, i );
1467 EI->_q( i ) = - EI->_q(k) ;
1469 if( EI-> _depmap_flag )
1472 for (
long j = 0; j < i ; ++j )
1474 if( EI->_depmap.isListed(i,j) ) EI->_Q.put( i,j, - EI->_Q(k,j) );
1477 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q(k,k) );
1482 for (
long j = 0; j < i ; ++j )
1484 if( EI->_Q.isListed(k,j) ) EI->_Q.put( i,j, - EI->_Q(k,j) );
1487 EI->_Q.put( i,i, EI->_Q(k,k) );
1490 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1491 EllVar3._range() = Range;
1500 (
const EllVar<T>& EllVar1 ,
1501 const EllVar<T>& EllVar2 )
1503 if( EllVar1._EI == NULL && EllVar1._is_constant &&
1504 EllVar2._EI == NULL && EllVar2._is_constant )
1506 return EllVar1._const_val - EllVar2._const_val;
1508 else if( EllVar1._EI == NULL && EllVar1._is_constant )
1510 return EllVar1._const_val - EllVar2 ;
1512 else if( EllVar2._EI == NULL && EllVar2._is_constant )
1514 return EllVar1 - EllVar2._const_val ;
1516 else if( EllVar1._EI == NULL && ! EllVar1._is_constant &&
1517 EllVar2._EI == NULL && ! EllVar2._is_constant )
1519 return EllVar1._Range - EllVar2._Range;
1521 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
1523 return EllVar1._Range - EllVar2 ;
1525 else if( EllVar2._EI == NULL && ! EllVar2._is_constant )
1527 return EllVar1 + (-1.*EllVar2._Range);
1529 else if( EllVar1._EI != EllVar2._EI )
1535 EllImg<T>* EI = EllVar1._EI;
1536 long i = EI->_current_row;
1537 long k = EllVar1._RowInd;
1538 long l = EllVar2._RowInd;
1540 EllVar<T> EllVar3( EI, i );
1542 EI->_q( i ) = EI->_q(k) - EI->_q(l);
1544 if( EI-> _depmap_flag )
1547 for (
long j = 0; j < i ; ++j )
1549 if( EI->_depmap.isListed(i,j) ) EI->_Q.put(i,j, EI->_Q(k,j) - EI->_Q(l,j) );
1552 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q(k,k) - 2.*(EI->_Q(l,k)) + EI->_Q(l,l) );
1557 for (
long j = 0; j < i ; ++j )
1559 if( EI->_Q.isListed(k,j) || EI->_Q.isListed(l,j) ) EI->_Q.put(i,j, EI->_Q(k,j) - EI->_Q(l,j) );
1562 EI->_Q.put( i,i, EI->_Q(k,k) - 2.*(EI->_Q(l,k)) + EI->_Q(l,l) );
1565 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1566 EllVar3._range() = Range;
1576 (
const EllVar<T>& EllVar1 ,
1581 if( EllVar1._is_constant )
return EllVar1._const_val - DVal;
1582 return EllVar1._Range - DVal;
1585 EllImg<T>* EI = EllVar1._EI;
1586 long i = EI->_current_row;
1587 long k = EllVar1._RowInd;
1589 EllVar<T> EllVar3( EI, i );
1591 EI->_q( i ) = EI->_q(k) - DVal;
1593 if( EI-> _depmap_flag )
1596 for (
long j = 0; j < i ; ++j )
1598 if( EI->_depmap.isListed(i,j) ) EI->_Q.put(i,j, EI->_Q(k,j) );
1601 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q(k,k) );
1606 for (
long j = 0; j < i ; ++j )
1608 if( EI->_Q.isListed(k,j) ) EI->_Q.put(i,j, EI->_Q(k,j) );
1611 EI->_Q.put( i,i, EI->_Q(k,k) );
1614 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1615 EllVar3._range() = Range;
1624 (
const double DVal,
1625 const EllVar<T>& EllVar1 )
1629 if( EllVar1._is_constant )
return DVal - EllVar1._const_val;
1630 return DVal - EllVar1._Range;
1633 EllImg<T>* EI = EllVar1._EI;
1634 long i = EI->_current_row;
1635 long k = EllVar1._RowInd;
1637 EllVar<T> EllVar3( EI, i );
1639 EI->_q( i ) = DVal - EI->_q(k) ;
1641 if( EI-> _depmap_flag )
1644 for (
long j = 0; j < i ; ++j )
1646 if( EI->_depmap.isListed(i,j) ) EI->_Q.put(i,j, - EI->_Q(k,j) );
1649 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q(k,k) );
1654 for (
long j = 0; j < i ; ++j )
1656 if( EI->_Q.isListed(k,j) ) EI->_Q.put(i,j, - EI->_Q(k,j) );
1659 EI->_Q.put( i,i, EI->_Q(k,k) );
1662 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1663 EllVar3._range() = Range;
1672 (
const EllVar<T>& EllVar1 ,
1677 if( EllVar1._is_constant )
return EllVar1._const_val - IVal;
1678 return EllVar1._Range - IVal;
1681 EllImg<T>* EI = EllVar1._EI;
1682 long i = EI->_current_row;
1683 long k = EllVar1._RowInd;
1686 EllVar<T> EllVar3( EI, i );
1688 EI->_q( i ) = EI->_q(k) + Op<T>::mid( -1.*IVal ) ;
1689 if( EI-> _depmap_flag )
1691 EI->_minksum( i , 0.5*Op<T>::diam( -1.*IVal ) ) ;
1695 EI->_minksum( i , 0.5*Op<T>::diam( -1.*IVal ) ) ;
1698 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1699 EllVar3._range() = Range;
1709 const EllVar<T>& EllVar1 )
1713 if( EllVar1._is_constant )
return IVal - EllVar1._const_val;
1714 return IVal - EllVar1._Range;
1717 EllImg<T>* EI = EllVar1._EI;
1718 long i = EI->_current_row;
1719 long k = EllVar1._RowInd;
1722 EllVar<T> EllVar3( EI, i );
1724 EI->_q( i ) = Op<T>::mid( IVal ) + EI->_q(k) ;
1726 if( EI-> _depmap_flag )
1728 EI->_minksum( i , 0.5*Op<T>::diam( IVal ) ) ;
1732 EI->_minksum( i , 0.5*Op<T>::diam( IVal ) ) ;
1735 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
1736 EllVar3._range() = Range;
1745 (
const EllVar<T>& EllVar0 ,
1746 const EllVar<T>& EllVar1 )
1748 if( EllVar0._EI == NULL && EllVar0._is_constant &&
1749 EllVar1._EI == NULL && EllVar1._is_constant )
1751 return EllVar0._const_val * EllVar1._const_val;
1753 else if( EllVar0._EI == NULL && EllVar0._is_constant )
1755 return EllVar0._const_val * EllVar1 ;
1757 else if( EllVar1._EI == NULL && EllVar1._is_constant )
1759 return EllVar0 * EllVar1._const_val ;
1761 else if( EllVar0._EI == NULL && ! EllVar0._is_constant &&
1762 EllVar1._EI == NULL && ! EllVar1._is_constant )
1764 return EllVar0._Range * EllVar1._Range;
1766 else if( EllVar0._EI == NULL && ! EllVar0._is_constant )
1770 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
1774 else if( EllVar0._EI != EllVar1._EI )
1780 EllImg<T>* EI = EllVar0._EI;
1782 long k = EllVar0._RowInd;
1783 long l = EllVar1._RowInd;
1784 T domain_EllVar0 = EI->_q( k ) + std::sqrt( EI->_Q(k,k) ) *T(-1.,1);
1785 T domain_EllVar1 = EI->_q( l ) + std::sqrt( EI->_Q(l,l) ) *T(-1.,1);
1788 EI->_ip = EI->_current_row ;
1789 if( ! EI->_depmap_flag && EI->_ip + 7 > EI->_Q.n )
1791 EI->_Q.stretch( 7 ) ;
1792 EI->_q.stretch( 7 ) ;
1793 for(
long j = EI->_current_row ; j < EI->_current_row + 6 ; ++j ) EI->_q(j) = 0.;
1795 i = EI->_current_row + 6 ;
1797 else i = EI->_current_row;
1803 EllVar<T> EllVar3( EI, i , i+1 );
1863 #ifdef MC__ELLIMAGE_DEBUG
1864 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1865 EI->_dbugout <<
"Product starts: i= " << i <<
" k= "<< k <<
" l= " << l <<std::endl;
1866 EI->_dbugout <<
"Product block starts: " << EI->_ip << std::endl;
1867 EI->_dbugout <<
" _q =\n" ;
1868 EI->_dbugout << EI->_q << std::endl;
1869 EI->_dbugout <<
" _Q =\n" ;
1870 EI->_dbugout << EI->_Q << std::endl;
1883 for(
long j = 0 ; j <= i ; ++j )
1885 if( EI->_Q.isListed(k,j) || EI->_Q.isListed(l,j) )
1887 result = EI->_Q( k,j ) + EI->_Q( l,j );
1888 if( ! isequal(result,0.) ) EI->_Q.put( ii,j, result );
1891 result = EI->_Q( k,k ) + 2.* EI->_Q( l,k ) + EI->_Q( l,l );
1892 if( ! isequal(result,0.) ) EI->_Q.put( ii,ii, result );
1894 EI->_q( ii ) = EI->_q( k ) + EI->_q( l );
1896 #ifdef MC__ELLIMAGE_DEBUG
1897 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1898 EI->_dbugout <<
" After v2 : \n" ;
1899 EI->_dbugout <<
" _q =\n" ;
1900 EI->_dbugout << EI->_q << std::endl;
1901 EI->_dbugout <<
" _Q =\n" ;
1902 EI->_dbugout << EI->_Q << std::endl;
1912 for(
long j = 0 ; j <= i ; ++j )
1914 if( EI->_Q.isListed(k,j) || EI->_Q.isListed(l,j) )
1916 double result = EI->_Q( k,j ) - EI->_Q( l,j ) ;
1917 if( ! isequal(result,0.) ) EI->_Q.put( ii,j, result );
1920 result = EI->_Q( k,k ) - 2.* EI->_Q( l,k ) + EI->_Q( l,l );
1921 if( ! isequal(result,0.) ) EI->_Q.put( ii,ii,result );
1923 EI->_q( ii ) = EI->_q( k ) - EI->_q( l );
1924 T domainv3 = EI->_q( ii ) + std::sqrt( EI->_Q( ii , ii ) ) * T(-1.,1.);
1926 #ifdef MC__ELLIMAGE_DEBUG
1927 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1928 EI->_dbugout <<
" After v3 : \n" ;
1929 EI->_dbugout <<
" _q =\n" ;
1930 EI->_dbugout << EI->_q << std::endl;
1931 EI->_dbugout <<
" _Q =\n" ;
1932 EI->_dbugout << EI->_Q << std::endl;
1935 T domain = EI->_q( kk ) + std::sqrt( EI->_Q(kk,kk) )*T(-1.,1.);
1936 double c_0, c_1, eta;
1937 std::tie( c_0, c_1, eta ) = EI->_linearize_sqr( domain );
1945 for(
long j = 0 ; j <= i ; ++j )
1947 if( EI->_Q.isListed( kk ,j ) )
1949 result = c_1*EI->_Q( kk ,j );
1950 if(! isequal(result,0.) ) EI->_Q.put( ii,j, result );
1953 result = std::pow(c_1,2)*EI->_Q(kk,kk);
1954 if(! isequal(result,0.) ) EI->_Q.put( ii,ii, result );
1957 EI->_minksum( ii, eta );
1960 #ifdef MC__ELLIMAGE_DEBUG
1961 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1962 EI->_dbugout <<
" After v4 : \n" ;
1963 EI->_dbugout <<
" _q =\n" ;
1964 EI->_dbugout << EI->_q << std::endl;
1965 EI->_dbugout <<
" _Q =\n" ;
1966 EI->_dbugout << EI->_Q << std::endl;
1969 std::tie( c_0, c_1, eta ) = EI->_linearize_sqr( domainv3 );
1977 for(
long j = 0 ; j <= i ; ++j )
1979 if( EI->_Q.isListed( kk ,j ) )
1981 result = c_1*EI->_Q( kk ,j );
1982 if(! isequal(result,0.) ) EI->_Q.put( ii,j, result );
1985 result = std::pow(c_1,2)*EI->_Q(kk,kk);
1986 if(! isequal(result,0.) ) EI->_Q.put( ii,ii, result );
1989 EI->_minksum( ii, eta );
1992 #ifdef MC__ELLIMAGE_DEBUG
1993 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
1994 EI->_dbugout <<
" After v5 : \n" ;
1995 EI->_dbugout <<
" _q =\n" ;
1996 EI->_dbugout << EI->_q << std::endl;
1997 EI->_dbugout <<
" _Q =\n" ;
1998 EI->_dbugout << EI->_Q << std::endl;
2008 for(
long j = 0 ; j <= i ; ++j )
2010 if( EI->_Q.isListed( kk,j ) )
2012 result = (1./4.)*EI->_Q( kk ,j ) ;
2013 if( ! isequal(result,0.) ) EI->_Q.put( ii,j, result );
2016 result = (1./16.)*EI->_Q(kk,kk);
2017 if( ! isequal(result,0.) ) EI->_Q.put( ii,ii,result );
2019 EI->_q( ii ) = (1./4.)*EI->_q( kk );
2022 #ifdef MC__ELLIMAGE_DEBUG
2023 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2024 EI->_dbugout <<
" After v6 : \n" ;
2025 EI->_dbugout <<
" _q =\n" ;
2026 EI->_dbugout << EI->_q << std::endl;
2027 EI->_dbugout <<
" _Q =\n" ;
2028 EI->_dbugout << EI->_Q << std::endl;
2038 for(
long j = 0 ; j <= i ; ++j )
2040 if( EI->_Q.isListed( kk ,j ) )
2042 result = (1./4.)*EI->_Q( kk ,j );
2043 if( ! isequal( result, 0.) ) EI->_Q.put( ii,j, result );
2046 result = (1./16.)*EI->_Q(kk,kk);
2047 if( ! isequal( result, 0.) ) EI->_Q.put( ii,ii, result );
2049 EI->_q( ii ) = (1./4.)*EI->_q( kk );
2052 #ifdef MC__ELLIMAGE_DEBUG
2053 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2054 EI->_dbugout <<
" After v7 : \n" ;
2055 EI->_dbugout <<
" _q =\n" ;
2056 EI->_dbugout << EI->_q << std::endl;
2057 EI->_dbugout <<
" _Q =\n" ;
2058 EI->_dbugout << EI->_Q << std::endl;
2061 if( EI->_depmap_flag )
2063 for(
long j = 0 ; j < i ; ++j )
if( EI->_depmap.isListed(i,j) ) EI->_Q.put( i,j, EI->_Q( kk,j ) - EI->_Q( ll,j ) );
2064 if( EI->_depmap.isListed(i,i) ) EI->_Q.put( i,i, EI->_Q( kk,kk ) - 2.* EI->_Q( ll,kk ) + EI->_Q( ll,ll ) );
2068 for(
long j = 0 ; j < i ; ++j )
2070 if( EI->_Q.isListed( kk,j ) || EI->_Q.isListed( ll,j ) )
2072 result = EI->_Q( kk,j ) - EI->_Q( ll,j ) ;
2073 if( ! isequal(result,0.) ) EI->_Q.put( i,j, result );
2076 result = EI->_Q( kk,kk ) - 2.* EI->_Q( ll,kk ) + EI->_Q( ll,ll );
2077 if( ! isequal(result,0.) ) EI->_Q.put( i,i, result );
2079 EI->_q( i ) = EI->_q( kk ) - EI->_q( ll );
2080 #ifdef MC__ELLIMAGE_DEBUG
2081 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2082 EI->_dbugout <<
" After v8 : \n" ;
2083 EI->_dbugout <<
" _q =\n" ;
2084 EI->_dbugout << EI->_q << std::endl;
2085 EI->_dbugout <<
" _Q =\n" ;
2086 EI->_dbugout << EI->_Q << std::endl;
2089 for (
long ipp= EI->_ip ; ipp <= ii ; ++ipp )
2091 for (
long jp= 0 ; jp <= i ; ++jp )
2093 EI -> _Q.del( ipp , jp ) ;
2096 EI->_Q.del( ipp,ipp );
2115 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), domain_EllVar0 * domain_EllVar1 );
2116 EllVar3._range() = Range;
2117 #ifdef MC__ELLIMAGE_DEBUG
2118 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2119 EI->_dbugout <<
"Product ends: i= " << i <<
" k= "<< k <<
" l= " << l <<std::endl;
2120 EI->_dbugout <<
"Product block starts: " << EI->_ip << std::endl;
2121 EI->_dbugout <<
" _q =\n" ;
2122 EI->_dbugout << EI->_q << std::endl;
2123 EI->_dbugout <<
" _Q =\n" ;
2124 EI->_dbugout << EI->_Q << std::endl;
2135 (
const EllVar<T>& EllVar1 ,
2140 if( EllVar1._is_constant )
return EllVar1._const_val * DVal;
2141 return EllVar1._Range * DVal;
2144 EllImg<T>* EI = EllVar1._EI;
2145 long i = EI->_current_row;
2146 long k = EllVar1._RowInd;
2148 EllVar<T> EllVar3( EI, i );
2150 EI->_q( i ) = EI->_q(k) * DVal;
2152 if( EI-> _depmap_flag )
2155 for (
long j = 0; j < i ; ++j )
2157 if( EI->_depmap.isListed(i,j) ) EI->_Q(i,j) = DVal * EI->_Q(k,j) ;
2160 EI->_Q(i,i) = DVal*DVal*EI->_Q(k,k) ;
2165 for (
long j = 0; j < i ; ++j )
2167 EI->_Q.put(i, j, DVal*EI->_Q(k,j) );
2170 EI->_Q.put( i, i, DVal*DVal*EI->_Q(k,k) );
2173 T Range = EI->_q(i) + std::sqrt(EI->_Q(i,i))*T(-1.,1.);
2174 EllVar3._range() = Range;
2183 (
const double DVal,
2184 const EllVar<T>& EllVar1 )
2186 return EllVar1 * DVal;
2193 (
const EllVar<T>& EllVar1 ,
2198 if( EllVar1._is_constant )
return IVal * EllVar1._const_val;
2199 return IVal * EllVar1._Range;
2202 EllImg<T>* EI = EllVar1._EI;
2203 long i = EI->_current_row;
2204 long k = EllVar1._RowInd;
2231 const EllVar<T>& EllVar1 )
2235 if( EllVar1._is_constant )
return IVal * EllVar1._const_val;
2236 return IVal * EllVar1._Range;
2239 EllImg<T>* EI = EllVar1._EI;
2240 long i = EI->_current_row;
2241 long k = EllVar1._RowInd;
2267 (
const EllVar<T>& EllVar1,
2268 const EllVar<T>& EllVar2 )
2270 if( EllVar1._EI == NULL && EllVar1._is_constant &&
2271 EllVar2._EI == NULL && EllVar2._is_constant )
2273 return EllVar1._const_val / EllVar2._const_val;
2275 else if( EllVar1._EI == NULL && EllVar1._is_constant )
2277 return EllVar1._const_val * inv(EllVar2) ;
2279 else if( EllVar2._EI == NULL && EllVar2._is_constant )
2281 return (1./EllVar2._const_val) * EllVar1 ;
2283 else if( EllVar1._EI == NULL && ! EllVar1._is_constant &&
2284 EllVar2._EI == NULL && ! EllVar2._is_constant )
2286 return EllVar1._Range / EllVar2._Range;
2288 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2292 else if( EllVar2._EI == NULL && ! EllVar2._is_constant )
2296 else if( EllVar1._EI != EllVar2._EI )
2302 return EllVar1 * inv( EllVar2 );
2310 (
const EllVar<T>& EllVar1,
2313 if( isequal( DVal, 0. ) )
2315 return ( 1./DVal ) * EllVar1;
2322 (
const double DVal,
2323 const EllVar<T>& EllVar1 )
2325 return DVal * inv( EllVar1 );
2332 (
const EllVar<T>& EllVar1,
2335 return ( 1./IVal ) * EllVar1;
2343 const EllVar<T>& EllVar1 )
2345 return IVal * inv( EllVar1 );
2352 (
const EllVar<T>& EllVar1 )
2354 if( EllVar1._EI == NULL && EllVar1._is_constant )
2356 return 1./( EllVar1._const_val ) ;
2358 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2360 return inv( EllVar1._Range ) ;
2364 EllImg<T>* EI = EllVar1._EI;
2365 long i = EI->_current_row;
2366 long k = EllVar1._RowInd;
2369 EllVar<T> EllVar3( EI, i );
2371 T domain = EllVar1._range();
2372 if( Op<T>::l(domain) <= 0. && Op<T>::u(domain) >= 0. )
2377 double c_0, c_1, eta;
2378 if( EI->options.CHEBUSE )
2380 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( inv , domain );
2384 double m = Op<T>::mid( domain );
2385 double r = 0.5 * Op<T>::diam( domain );
2386 double c_sec=0., x_tan=0., c_tan=0.;
2387 c_sec = m/(std::pow(m,2) - std::pow(r,2));
2388 c_1 = r/(std::pow(r,2) - std::pow(m,2));
2389 if ( m > 0 ) x_tan = (std::sqrt(-r/c_1)-m)/r;
2390 else x_tan = 1./((std::sqrt(-r/c_1)-m)/r);
2391 c_tan = 1./(m+r*x_tan)-c_1*x_tan;
2392 eta = (c_sec - c_tan)/2.;
2397 EI->_univupdate( i , k , c_0 , c_1 , eta );
2400 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), 1./(domain) );
2401 EllVar3._range() = Range;
2403 #ifdef MC__ELLIMAGE_DEBUG
2404 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2405 EI->_dbugout <<
"inv ends: i= " << i <<
" k= "<< k <<std::endl;
2406 EI->_dbugout <<
"Range, q , Q\n" ;
2407 for(
long i = 0 ; i < EI->_Q.n ; ++i )
2409 EI->_dbugout <<
"\t" << EI->_q(i) <<
"\t" << EI->_Q.row(i);
2411 EI->_dbugout << std::endl;
2421 (
const EllVar<T>& EllVar1 )
2423 if( EllVar1._EI == NULL && EllVar1._is_constant )
2425 return std::exp( EllVar1._const_val ) ;
2427 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2429 return exp( EllVar1._Range ) ;
2433 EllImg<T>* EI = EllVar1._EI;
2434 long i = EI->_current_row;
2435 long k = EllVar1._RowInd;
2437 EllVar<T> EllVar3( EI, i );
2439 T domain = EllVar1._range();
2441 double c_0, c_1, eta;
2442 if( EI->options.CHEBUSE )
2444 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( exp , domain );
2448 double m = Op<T>::mid( domain );
2449 double r = 0.5 * Op<T>::diam( domain );
2450 double c_sec=0., x_tan=0., c_tan=0.;
2451 c_sec = 0.5*(std::exp(m-r)+std::exp(m+r));
2452 c_1 = 0.5*(std::exp(m+r)-std::exp(m-r));
2453 x_tan = (std::log(c_1/r) - m)/r;
2454 c_tan = std::exp(m+r*x_tan)-c_1*x_tan;
2455 eta = (c_sec - c_tan)/2.0;
2460 EI->_univupdate( i , k , c_0 , c_1 , eta );
2463 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), exp(domain) );
2464 EllVar3._range() = Range;
2474 (
const EllVar<T>& EllVar1 )
2477 if( !EllVar1._EI && EllVar1._is_constant )
2478 return std::log( EllVar1._const_val );
2481 else if( !EllVar1._EI && !EllVar1._is_constant )
2482 return log( EllVar1._Range );
2485 T domain = EllVar1._range();
2486 if( Op<T>::l(domain) <= 0. )
2489 EllImg<T>* EI = EllVar1._EI;
2490 long i = EI->_current_row;
2491 long k = EllVar1._RowInd;
2492 #ifdef MC__ELLIMAGE_DEBUG
2493 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2494 EI->_dbugout <<
"log starts: i= " << i <<
" k= "<< k << std::endl;
2495 EI->_dbugout <<
"q \n" << EI->_q << std::endl;
2496 EI->_dbugout <<
"Q \n" << EI->_Q << std::endl;
2500 EllVar<T> EllVar3( EI, i );
2501 double c_0, c_1, eta;
2504 if( EI->options.CHEBUSE )
2505 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( log, domain );
2509 double m = Op<T>::mid( domain );
2510 double r = 0.5 * Op<T>::diam( domain );
2511 double c_sec=0., x_tan=0., c_tan=0.;
2512 c_sec = (1./2.)*(std::log(m-r)+std::log(m+r));
2513 c_1 = (1./2.)*(std::log(m+r)-std::log(m-r));
2514 x_tan = (1./c_1)-(m/r);
2515 c_tan = std::log(m+r*x_tan)-c_1*x_tan;
2516 eta = std::fabs((c_sec - c_tan)/2.);
2522 EI->_univupdate( i, k, c_0, c_1, eta );
2523 Op<T>::inter( EllVar3._range(), EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1.), log(domain) );
2524 #ifdef MC__ELLIMAGE_DEBUG
2525 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2526 EI->_dbugout <<
"log ends: i= " << i <<
" k= "<< k <<std::endl;
2527 EI->_dbugout <<
"q \n" ;
2528 EI->_dbugout << EI->_q <<std::endl;
2529 EI->_dbugout <<
"Q \n" ;
2530 EI->_dbugout << EI->_Q <<std::endl;
2540 (
const EllVar<T>& EllVar1 )
2542 if( EllVar1._EI == NULL && EllVar1._is_constant )
2544 return std::sqrt( EllVar1._const_val ) ;
2546 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2548 return sqrt( EllVar1._Range ) ;
2552 EllImg<T>* EI = EllVar1._EI;
2553 long i = EI->_current_row;
2554 long k = EllVar1._RowInd;
2557 EllVar<T> EllVar3( EI, i );
2559 T domain = EllVar1._range();
2560 if( Op<T>::l(domain) < 0. )
2565 double c_0, c_1, eta;
2566 if( EI->options.CHEBUSE )
2568 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( sqrt , domain );
2572 double m = Op<T>::mid( domain );
2573 double r = 0.5 * Op<T>::diam( domain );
2574 double c_sec=0., x_tan=0., c_tan=0.;
2575 c_sec = (0.5)*(std::sqrt(m-r)+std::sqrt(m+r));
2576 c_1 = (0.5)*(std::sqrt(m+r)-std::sqrt(m-r));
2577 x_tan = (std::pow(r,2) - 4.0*std::pow((c_1),2)*m )/(4.0*std::pow((c_1),2)*r);
2578 c_tan = std::sqrt(m+r*x_tan)-c_1*x_tan;
2579 eta = std::fabs((c_sec - c_tan)/2.0);
2584 EI->_univupdate( i , k , c_0 , c_1 , eta );
2587 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), sqrt(domain) );
2588 EllVar3._range() = Range;
2598 (
const EllVar<T>& EllVar1 )
2600 if( EllVar1._EI == NULL && EllVar1._is_constant )
2602 return std::pow( EllVar1._const_val ,2 ) ;
2604 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2606 return sqr( EllVar1._Range ) ;
2610 EllImg<T>* EI = EllVar1._EI;
2611 long i = EI->_current_row;
2612 long k = EllVar1._RowInd;
2614 EllVar<T> EllVar3( EI, i );
2615 #ifdef MC__ELLIMAGE_DEBUG
2616 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2617 EI->_dbugout <<
"sqr starts: i= " << i <<
" k= "<< k <<std::endl;
2618 EI->_dbugout <<
"q \n" ;
2619 EI->_dbugout << EI->_q <<std::endl;
2620 EI->_dbugout <<
"Q \n" ;
2621 EI->_dbugout << EI->_Q <<std::endl;
2624 T domain = EllVar1._range();
2626 double c_0, c_1, eta;
2627 if( EI->options.CHEBUSE )
2629 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( sqr , domain );
2633 double m = Op<T>::mid( domain );
2634 double r = 0.5 * Op<T>::diam( domain );
2635 double c_sec=0., x_tan=0., c_tan=0.;
2636 c_sec = std::pow(m,2)+std::pow(r,2);
2638 x_tan = (c_1-2.0*m*r)/(2.0*std::pow(r,2));
2639 c_tan = std::pow((m+r*x_tan),2)-c_1*x_tan;
2640 eta = (c_sec - c_tan)/2.0;
2645 EI->_univupdate( i , k , c_0 , c_1 , eta );
2648 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), sqr(domain) );
2649 EllVar3._range() = Range;
2650 #ifdef MC__ELLIMAGE_DEBUG
2651 EI->_dbugout << std::scientific << std::setprecision(3) << std::right;
2652 EI->_dbugout <<
"sqr ends: i= " << i <<
" k= "<< k <<std::endl;
2653 EI->_dbugout <<
"q \n" ;
2654 EI->_dbugout << EI->_q <<std::endl;
2655 EI->_dbugout <<
"Q \n" ;
2656 EI->_dbugout << EI->_Q <<std::endl;
2666 (
const EllVar<T>& EllVar1 ,
const int n )
2668 if( EllVar1._EI == NULL && EllVar1._is_constant )
2670 return std::pow( EllVar1._const_val , n ) ;
2672 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2674 return pow( EllVar1._Range , n ) ;
2678 EllImg<T>* EI = EllVar1._EI;
2679 long i = EI->_current_row;
2680 long k = EllVar1._RowInd;
2682 EllVar<T> EllVar3( EI, i );
2684 T domain = EllVar1._range();
2686 double c_0, c_1, eta;
2687 if( EI->options.CHEBUSE )
2689 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( n , domain );
2693 double m = Op<T>::mid( domain );
2694 double r = 0.5 * Op<T>::diam( domain );
2695 double c_sec=0., x_tan=0., c_tan=0.;
2696 double x_tanL, x_tanU, c_tanL, c_tanU;
2699 c_sec = (1./2.)*(std::pow((m+r),n)+std::pow((m-r),n));
2700 c_1 = (1./2.)*(std::pow((m+r),n)-std::pow((m-r),n));
2701 x_tan = (std::pow((c_1/(n*r)),1./(n-1))-m)/r;
2702 c_tan = std::pow((m+r*x_tan),n)-c_1*x_tan;
2703 eta = (c_sec - c_tan)/2.;
2708 if(Op<T>::l( domain ) >= 0 || Op<T>::u( domain ) <= 0)
2710 c_1 = (1./2.)*(std::pow((m+r),n)-std::pow((m-r),n));
2711 c_sec = (1./2.)*(std::pow((m+r),n)+std::pow((m-r),n));
2712 x_tan = (sign(m)*std::pow((c_1/(n*r)),1./(n-1))-m)/r;
2713 c_tan = std::pow((m+r*x_tan),n)-c_1*x_tan;
2714 eta = (c_sec - c_tan)/2.;
2719 c_1 = (1./2.)*(std::pow((m+r),n)-std::pow((m-r),n));
2720 x_tanU = (std::pow((c_1/(n*r)),1./(n-1))-m)/r;
2721 x_tanL = (-1.0*std::pow((c_1/(n*r)),1./(n-1))-m)/r;
2722 c_tanU = std::pow((m+r*x_tanU),n)-c_1*x_tanU;
2723 c_tanL = std::pow((m+r*x_tanL),n)-c_1*x_tanL;
2724 eta = std::fabs((c_tanL - c_tanU)/2.);
2725 c_0 = std::fabs(c_tanL - eta);
2731 EI->_univupdate( i , k , c_0 , c_1 , eta );
2734 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), pow(domain,n) );
2735 EllVar3._range() = Range;
2745 (
const EllVar<T>& EllVar1 )
2747 if( EllVar1._EI == NULL && EllVar1._is_constant )
2749 return std::cos( EllVar1._const_val ) ;
2751 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2753 return cos( EllVar1._Range ) ;
2757 EllImg<T>* EI = EllVar1._EI;
2758 long i = EI->_current_row;
2759 long k = EllVar1._RowInd;
2761 EllVar<T> EllVar3( EI, i );
2763 T domain = EllVar1._range();
2765 double c_0, c_1, eta;
2766 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( cos , domain );
2768 EI->_univupdate( i , k , c_0 , c_1 , eta );
2771 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), cos(domain) );
2772 EllVar3._range() = Range;
2782 (
const EllVar<T>& EllVar1 )
2784 if( EllVar1._EI == NULL && EllVar1._is_constant )
2786 return std::sin( EllVar1._const_val ) ;
2788 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2790 return sin( EllVar1._Range ) ;
2794 EllImg<T>* EI = EllVar1._EI;
2795 long i = EI->_current_row;
2796 long k = EllVar1._RowInd;
2798 EllVar<T> EllVar3( EI, i );
2800 T domain = EllVar1._range();
2802 double c_0, c_1, eta;
2803 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( sin , domain );
2805 EI->_univupdate( i , k , c_0 , c_1 , eta );
2808 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), sin(domain) );
2809 EllVar3._range() = Range;
2819 (
const EllVar<T>& EllVar1 )
2821 if( EllVar1._EI == NULL && EllVar1._is_constant )
2823 return std::tan( EllVar1._const_val ) ;
2825 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2827 return tan( EllVar1._Range ) ;
2831 EllImg<T>* EI = EllVar1._EI;
2832 long i = EI->_current_row;
2833 long k = EllVar1._RowInd;
2835 EllVar<T> EllVar3( EI, i );
2837 T domain = EllVar1._range();
2838 if( Op<T>::l(cos(domain)) <= 0. && Op<T>::u(cos(domain)) >= 0. )
2843 double c_0, c_1, eta;
2844 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( tan , domain );
2846 EI->_univupdate( i , k , c_0 , c_1 , eta );
2849 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), tan(domain) );
2850 EllVar3._range() = Range;
2860 (
const EllVar<T>& EllVar1 )
2862 if( EllVar1._EI == NULL && EllVar1._is_constant )
2864 return std::acos( EllVar1._const_val ) ;
2866 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2868 return acos( EllVar1._Range ) ;
2872 EllImg<T>* EI = EllVar1._EI;
2873 long i = EI->_current_row;
2874 long k = EllVar1._RowInd;
2876 EllVar<T> EllVar3( EI, i );
2878 T domain = EllVar1._range();
2879 if( Op<T>::l(domain) < -1. && Op<T>::u(domain) > 1. )
2884 double c_0, c_1, eta;
2885 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( acos , domain );
2887 EI->_univupdate( i , k , c_0 , c_1 , eta );
2890 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), acos(domain) );
2891 EllVar3._range() = Range;
2901 (
const EllVar<T>& EllVar1 )
2903 if( EllVar1._EI == NULL && EllVar1._is_constant )
2905 return std::asin( EllVar1._const_val ) ;
2907 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2909 return asin( EllVar1._Range ) ;
2913 EllImg<T>* EI = EllVar1._EI;
2914 long i = EI->_current_row;
2915 long k = EllVar1._RowInd;
2917 EllVar<T> EllVar3( EI, i );
2919 T domain = EllVar1._range();
2920 if( Op<T>::l(domain) < -1. && Op<T>::u(domain) > 1. )
2925 double c_0, c_1, eta;
2926 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( asin , domain );
2928 EI->_univupdate( i , k , c_0 , c_1 , eta );
2931 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), asin(domain) );
2932 EllVar3._range() = Range;
2942 (
const EllVar<T>& EllVar1 )
2944 if( EllVar1._EI == NULL && EllVar1._is_constant )
2946 return std::atan( EllVar1._const_val ) ;
2948 else if( EllVar1._EI == NULL && ! EllVar1._is_constant )
2950 return atan( EllVar1._Range ) ;
2954 EllImg<T>* EI = EllVar1._EI;
2955 long i = EI->_current_row;
2956 long k = EllVar1._RowInd;
2958 EllVar<T> EllVar3( EI, i );
2960 T domain = EllVar1._range();
2962 double c_0, c_1, eta;
2963 std::tie( c_0, c_1, eta ) = EI->_cmodel_linear( atan , domain );
2965 EI->_univupdate( i , k , c_0 , c_1 , eta );
2968 Op<T>::inter( Range, EI->_q(i)+std::sqrt(EI->_Q( i,i ))*T(-1.,1. ), atan(domain) );
2969 EllVar3._range() = Range;
2975 template <
typename T>
inline std::ostream&
2977 ( std::ostream&out,
const EllVar<T>&EllVar )
2979 return out << std::scientific << EllVar.range() <<
"(index: " << EllVar.index() <<
")";
2983 inline std::ostream&
2985 ( std::ostream&out,
const EllImg<T>&E )
2987 return out << static_cast<const Ellipsoid&>( E );
2996 template <>
template<
typename T>
struct Op< mc::
EllVar<T> >
2999 static EV point(
const double c ) {
return EV( c ); }
3001 static void I(
EV& x,
const EV&y) { x = y; }
3007 static EV inv (
const EV& x) {
return mc::inv(x); }
3008 static EV sqr (
const EV& x) {
return mc::sqr(x); }
3009 static EV sqrt(
const EV& x) {
return mc::sqrt(x); }
3010 static EV log (
const EV& x) {
return mc::log(x); }
3011 static EV xlog(
const EV& x) {
return x*mc::log(x); }
3013 static EV exp (
const EV& x) {
return mc::exp(x); }
3014 static EV sin (
const EV& x) {
return mc::sin(x); }
3015 static EV cos (
const EV& x) {
return mc::cos(x); }
3016 static EV tan (
const EV& x) {
return mc::tan(x); }
3017 static EV asin(
const EV& x) {
return mc::asin(x); }
3018 static EV acos(
const EV& x) {
return mc::acos(x); }
3019 static EV atan(
const EV& x) {
return mc::atan(x); }
3020 static EV arh (
const EV& x,
const double k) {
return mc::exp(-k/x); }
3028 template <
typename X,
typename Y>
static EV pow(
const X& x,
const Y& y) {
return mc::pow(x,y); }
3030 static bool inter(
EV& xIy,
const EV& x,
const EV& y) {
return false; }
3031 static bool eq(
const EV& x,
const EV& y) {
return x.env() == y.env() && x.
index() == y.
index() && x.
range() == y.
range(); }
3032 static bool ne(
const EV& x,
const EV& y) {
return !eq( x, y ); }
double r(const unsigned int i) const
Return maximum radius for for index .
Definition: ellipsoid.hpp:568
const CPPL::dsymatrix & Q() const
Return shape matrix of ellipsoid.
Definition: ellipsoid.hpp:415
EllVar< T > & set(EllImg< T > &EI, const unsigned i, const T &Irange)
set variable in ellipsoidal image environment and tailored range
Definition: ellimage.hpp:626
EllImg< T > & set(const EllImg< T > &E)
Set an ellipsoid identical to E
Definition: ellimage.hpp:464
Structure containing the options for EllImg.
Definition: ellimage.hpp:387
long index() const
get pointer to row index
Definition: ellimage.hpp:636
C++ class for ellipsoidal arithmetic - Ellipsoidal image propagation.
Definition: ellimage.hpp:288
int ierr()
Error flag.
Definition: ellimage.hpp:365
CPPL::dcovector c_lift()
Returns the centre of the lifted Ellipsoid.
Definition: ellimage.hpp:434
const CPPL::dcovector & c() const
Return center of ellipsoid.
Definition: ellipsoid.hpp:396
C++ class for ellipsoidal arithmetic - Ellipsoidal image environment.
Definition: ellimage.hpp:301
std::ostream & output(std::ostream &os=std::cout)
Output lifted ellipsoid to os
Definition: ellimage.hpp:805
EllVar< T > & set(EllImg< T > &EI, const unsigned i)
set variable the ellipsoidal image environment
Definition: ellimage.hpp:623
Square-root operation with negative numbers in domain.
Definition: ellimage.hpp:355
unsigned CHEBORDER
Order of the Chebyshev model used for the linearisation of univariate functions – Used only if CHEBUS...
Definition: ellimage.hpp:398
Ellipsoid options.
Definition: ellipsoid.hpp:130
EllVar()
Default constructor.
Definition: ellimage.hpp:1021
CPPL::dssmatrix Q_lift()
Returns the shape matrix of the lifted Ellipsoid.
Definition: ellimage.hpp:430
C++ class for the computation of Chebyshev models of factorable function - Chebyshev model environmen...
Definition: cmodel.hpp:218
Tangent operation with zero in domain of cosine, tan(x) = sin(x)/cos(x)
Definition: ellimage.hpp:356
T range() const
get variable range
Definition: ellimage.hpp:630
Failed to construct ellipsoidal variable EllVar.
Definition: ellimage.hpp:358
EllImg()
Default constructor.
Definition: ellimage.hpp:675
Feature not yet implemented in mc::EllImg.
Definition: ellimage.hpp:360
Options()
Constructor of mc::EllImg<>::Options.
Definition: ellimage.hpp:390
Exceptions of mc::EllImg.
Definition: ellimage.hpp:348
virtual ~EllVar()
Destructor.
Definition: ellimage.hpp:620
EllImg< T > * image() const
get pointer to ellipsoidal image
Definition: ellimage.hpp:633
C++ class for ellipsoidal calculus.
Definition: ellipsoid.hpp:37
Inverse operation with zero in domain.
Definition: ellimage.hpp:353
Sine/Cosine inverse operation with domain outside [-1,1].
Definition: ellimage.hpp:357
TYPE
Enumeration type for EllImg exception handling.
Definition: ellimage.hpp:351
Ellipsoid & set(const CPPL::dsymatrix &Q=CPPL::dsymatrix(), const CPPL::dcovector &c=CPPL::dcovector())
Define ellipsoid of dimension with center and shape matrix .
Definition: ellipsoid.hpp:267
EllImg< T > & reset()
Reset ellipsoidal image to underlying defining ellipsoid.
Definition: ellimage.hpp:486
std::string what()
Error description.
Definition: ellimage.hpp:367
bool CHEBUSE
Whether to use Chebyshev models to obtain the linearisation of univariate functions.
Definition: ellimage.hpp:396
Operation between ellipsoidal variables EllVar linked to different ellipsoidal images EllImg...
Definition: ellimage.hpp:359
unsigned int n() const
Return dimension of ellipsoid.
Definition: ellipsoid.hpp:391
virtual ~EllImg()
Destructor.
Definition: ellimage.hpp:734
Log operation with non-positive numbers in domain.
Definition: ellimage.hpp:354
long PREALLOC
Sets number of rows to preallocate in the shape matrix and center vector.
Definition: ellimage.hpp:394
Exceptions(TYPE ierr)
Constructor for error ierr
Definition: ellimage.hpp:363
Division by zero scalar.
Definition: ellimage.hpp:352
C++ structure to allow usage of various template parameters in the types mc::McCormick, mc::TModel, mc::TVar, and mc::SpecBnd of MC++ _ Specialization of this structure is required for the template parameters can be found in the header files defining the types mc::McCormick, mc::TModel, mc::TVar, and mc::SpecBnd.
Definition: mcop.hpp:13