34 #define __ADTraits_H 1
38 #if defined( FEELPP_USES_BOOST_INTERVAL )
40 #ifndef BOOST_UBLAS_USE_INTERVAL
41 # define BOOST_UBLAS_USE_INTERVAL
44 #include <boost/numeric/interval.hpp>
49 #if defined( FEELPP_USES_BOOST_INTERVAL )
50 using namespace boost::numeric;
51 using namespace boost::numeric::interval_lib;
54 class my_checking_base
56 public boost::numeric::interval_lib::checking_base<T>
59 static bool is_nan(
const T& x )
64 static bool is_empty(
const T& l,
const T& u )
70 typedef boost::numeric::interval_lib::policies<boost::numeric::interval_lib::save_state<boost::numeric::interval_lib::rounded_transc_exact<double> >, my_checking_base<double> > interval_policy_exact_type;
71 typedef boost::numeric::interval_lib::policies<boost::numeric::interval_lib::save_state<boost::numeric::interval_lib::rounded_transc_opp<double> >, my_checking_base<double> > interval_policy_opp_type;
72 typedef boost::numeric::interval_lib::policies<boost::numeric::interval_lib::save_state<boost::numeric::interval_lib::rounded_transc_std<double> >, my_checking_base<double> > interval_policy_std_type;
74 typedef boost::numeric::interval_lib::default_policies<double>::type interval_policy_default_type;
76 template<
class T,
class P>
79 typedef boost::numeric::interval<T,P> type;
81 #endif // FEELPP_USES_BOOST_INTERVAL
83 template <
class A,
class B>
84 class SNumericalTraits
91 class SNumericalTraits<T,T>
97 #define NUMERICAL_TRAITS(type1,type2,type3) \
98 template <> class SNumericalTraits<type1,type2> { \
100 typedef type3 promote; \
102 template <> class SNumericalTraits<type2,type1> { \
104 typedef type3 promote; \
107 #if defined( FEELPP_USES_BOOST_INTERVAL )
108 #define INTERVAL_TRAITS( TYPE ) \
109 typedef interval<double, interval_policy_## TYPE ##_type>::type interval_## TYPE ##_type; \
110 NUMERICAL_TRAITS(interval_## TYPE ##_type,double,interval_## TYPE ##_type) \
111 NUMERICAL_TRAITS(interval_## TYPE ##_type,float,interval_## TYPE ##_type) \
112 NUMERICAL_TRAITS(interval_## TYPE ##_type,long,interval_## TYPE ##_type) \
113 NUMERICAL_TRAITS(interval_## TYPE ##_type,int,interval_## TYPE ##_type)
115 INTERVAL_TRAITS (
default );
116 INTERVAL_TRAITS ( exact );
117 INTERVAL_TRAITS ( opp );
118 INTERVAL_TRAITS ( std );
120 #undef INTERVAL_TRAITS
121 #endif // FEELPP_USES_BOOST_INTERVAL
123 NUMERICAL_TRAITS(
double,std::complex<float>,std::complex<double> )
124 NUMERICAL_TRAITS(
double,
float,
double )
125 NUMERICAL_TRAITS(
double,
long,
double )
126 NUMERICAL_TRAITS(
double,
int,
double )
127 NUMERICAL_TRAITS(
float,
long,
float )
128 NUMERICAL_TRAITS(
float,
int,
float )
131 #if defined( FEELPP_USES_BOOST_INTERVAL )
132 #define FEELPP_INTERVAL_DEBUG( TYPE ) \
133 SDebugStream& operator<<( SDebugStream& o, Feel::interval_## TYPE ##_type const& e ); \
134 SNDebugStream& operator<<( SNDebugStream& o, Feel::interval_## TYPE ##_type const& e );
136 FEELPP_INTERVAL_DEBUG(
default );
137 FEELPP_INTERVAL_DEBUG( std );
138 FEELPP_INTERVAL_DEBUG( opp );
139 FEELPP_INTERVAL_DEBUG( exact );
140 #undef FEELPP_INTERVAL_DEBUG
142 #endif // FEELPP_USES_BOOST_INTERVAL
147 #if defined( FEELPP_USES_BOOST_INTERVAL )
148 template<
typename T,
typename P>
149 std::ostream& operator<< ( std::ostream& __os, boost::numeric::interval<T,P>
const& __i )
151 __os <<
'[' << __i.lower() <<
',' << __i.upper() <<
']';
154 #endif // FEELPP_USES_BOOST_INTERVAL