arith.hpp gecode/third-party/boost/config.hpp gecode/third-party/boost/numeric/interval/interval.hpp gecode/third-party/boost/numeric/interval/detail/bugs.hpp gecode/third-party/boost/numeric/interval/detail/test_input.hpp gecode/third-party/boost/numeric/interval/detail/division.hpp algorithm /usr/include/gecode/third-party/boost/numeric/interval/arith2.hpp /usr/include/gecode/third-party/boost/numeric/interval/transc.hpp /usr/include/gecode/third-party/boost/numeric/interval.hpp boost boost::numeric /*Boostinterval/arith.hpptemplateimplementationfile * *Copyright2000JensMaurer *Copyright2002-2003HervéBrönnimann,GuillaumeMelquiond,SylvainPion * *DistributedundertheBoostSoftwareLicense,Version1.0. *(SeeaccompanyingfileLICENSE_1_0.txtor *copyathttp://www.boost.org/LICENSE_1_0.txt) */ #ifndefBOOST_NUMERIC_INTERVAL_ARITH_HPP #defineBOOST_NUMERIC_INTERVAL_ARITH_HPP #include<gecode/third-party/boost/config.hpp> #include<gecode/third-party/boost/numeric/interval/interval.hpp> #include<gecode/third-party/boost/numeric/interval/detail/bugs.hpp> #include<gecode/third-party/boost/numeric/interval/detail/test_input.hpp> #include<gecode/third-party/boost/numeric/interval/detail/division.hpp> #include<algorithm> namespaceboost{ namespacenumeric{ /* *Basicarithmeticoperators */ template<classT,classPolicies>inline constinterval<T,Policies>&operator+(constinterval<T,Policies>&x) { returnx; } template<classT,classPolicies>inline interval<T,Policies>operator-(constinterval<T,Policies>&x) { if(interval_lib::detail::test_input(x)) returninterval<T,Policies>::empty(); returninterval<T,Policies>(-x.upper(),-x.lower(),true); } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator+=(constinterval<T,Policies>&r) { if(interval_lib::detail::test_input(*this,r)) set_empty(); else{ typenamePolicies::roundingrnd; set(rnd.add_down(low,r.low),rnd.add_up(up,r.up)); } return*this; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator+=(constT&r) { if(interval_lib::detail::test_input(*this,r)) set_empty(); else{ typenamePolicies::roundingrnd; set(rnd.add_down(low,r),rnd.add_up(up,r)); } return*this; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator-=(constinterval<T,Policies>&r) { if(interval_lib::detail::test_input(*this,r)) set_empty(); else{ typenamePolicies::roundingrnd; set(rnd.sub_down(low,r.up),rnd.sub_up(up,r.low)); } return*this; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator-=(constT&r) { if(interval_lib::detail::test_input(*this,r)) set_empty(); else{ typenamePolicies::roundingrnd; set(rnd.sub_down(low,r),rnd.sub_up(up,r)); } return*this; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator*=(constinterval<T,Policies>&r) { return*this=*this*r; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator*=(constT&r) { return*this=r**this; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator/=(constinterval<T,Policies>&r) { return*this=*this/r; } template<classT,classPolicies>inline interval<T,Policies>&interval<T,Policies>::operator/=(constT&r) { return*this=*this/r; } template<classT,classPolicies>inline interval<T,Policies>operator+(constinterval<T,Policies>&x, constinterval<T,Policies>&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); typenamePolicies::roundingrnd; returninterval<T,Policies>(rnd.add_down(x.lower(),y.lower()), rnd.add_up(x.upper(),y.upper()),true); } template<classT,classPolicies>inline interval<T,Policies>operator+(constT&x,constinterval<T,Policies>&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); typenamePolicies::roundingrnd; returninterval<T,Policies>(rnd.add_down(x,y.lower()), rnd.add_up(x,y.upper()),true); } template<classT,classPolicies>inline interval<T,Policies>operator+(constinterval<T,Policies>&x,constT&y) {returny+x;} template<classT,classPolicies>inline interval<T,Policies>operator-(constinterval<T,Policies>&x, constinterval<T,Policies>&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); typenamePolicies::roundingrnd; returninterval<T,Policies>(rnd.sub_down(x.lower(),y.upper()), rnd.sub_up(x.upper(),y.lower()),true); } template<classT,classPolicies>inline interval<T,Policies>operator-(constT&x,constinterval<T,Policies>&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); typenamePolicies::roundingrnd; returninterval<T,Policies>(rnd.sub_down(x,y.upper()), rnd.sub_up(x,y.lower()),true); } template<classT,classPolicies>inline interval<T,Policies>operator-(constinterval<T,Policies>&x,constT&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); typenamePolicies::roundingrnd; returninterval<T,Policies>(rnd.sub_down(x.lower(),y), rnd.sub_up(x.upper(),y),true); } template<classT,classPolicies>inline interval<T,Policies>operator*(constinterval<T,Policies>&x, constinterval<T,Policies>&y) { BOOST_USING_STD_MIN(); BOOST_USING_STD_MAX(); typedefinterval<T,Policies>I; if(interval_lib::detail::test_input(x,y)) returnI::empty(); typenamePolicies::roundingrnd; constT&xl=x.lower(); constT&xu=x.upper(); constT&yl=y.lower(); constT&yu=y.upper(); if(interval_lib::user::is_neg(xl)) if(interval_lib::user::is_pos(xu)) if(interval_lib::user::is_neg(yl)) if(interval_lib::user::is_pos(yu))//M*M returnI(minBOOST_PREVENT_MACRO_SUBSTITUTION(rnd.mul_down(xl,yu),rnd.mul_down(xu,yl)), maxBOOST_PREVENT_MACRO_SUBSTITUTION(rnd.mul_up(xl,yl),rnd.mul_up(xu,yu)),true); else//M*N returnI(rnd.mul_down(xu,yl),rnd.mul_up(xl,yl),true); else if(interval_lib::user::is_pos(yu))//M*P returnI(rnd.mul_down(xl,yu),rnd.mul_up(xu,yu),true); else//M*Z returnI(static_cast<T>(0),static_cast<T>(0),true); else if(interval_lib::user::is_neg(yl)) if(interval_lib::user::is_pos(yu))//N*M returnI(rnd.mul_down(xl,yu),rnd.mul_up(xl,yl),true); else//N*N returnI(rnd.mul_down(xu,yu),rnd.mul_up(xl,yl),true); else if(interval_lib::user::is_pos(yu))//N*P returnI(rnd.mul_down(xl,yu),rnd.mul_up(xu,yl),true); else//N*Z returnI(static_cast<T>(0),static_cast<T>(0),true); else if(interval_lib::user::is_pos(xu)) if(interval_lib::user::is_neg(yl)) if(interval_lib::user::is_pos(yu))//P*M returnI(rnd.mul_down(xu,yl),rnd.mul_up(xu,yu),true); else//P*N returnI(rnd.mul_down(xu,yl),rnd.mul_up(xl,yu),true); else if(interval_lib::user::is_pos(yu))//P*P returnI(rnd.mul_down(xl,yl),rnd.mul_up(xu,yu),true); else//P*Z returnI(static_cast<T>(0),static_cast<T>(0),true); else//Z*? returnI(static_cast<T>(0),static_cast<T>(0),true); } template<classT,classPolicies>inline interval<T,Policies>operator*(constT&x,constinterval<T,Policies>&y) { typedefinterval<T,Policies>I; if(interval_lib::detail::test_input(x,y)) returnI::empty(); typenamePolicies::roundingrnd; constT&yl=y.lower(); constT&yu=y.upper(); //xissupposednottobeinfinite if(interval_lib::user::is_neg(x)) returnI(rnd.mul_down(x,yu),rnd.mul_up(x,yl),true); elseif(interval_lib::user::is_zero(x)) returnI(static_cast<T>(0),static_cast<T>(0),true); else returnI(rnd.mul_down(x,yl),rnd.mul_up(x,yu),true); } template<classT,classPolicies>inline interval<T,Policies>operator*(constinterval<T,Policies>&x,constT&y) {returny*x;} template<classT,classPolicies>inline interval<T,Policies>operator/(constinterval<T,Policies>&x, constinterval<T,Policies>&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); if(zero_in(y)) if(!interval_lib::user::is_zero(y.lower())) if(!interval_lib::user::is_zero(y.upper())) returninterval_lib::detail::div_zero(x); else returninterval_lib::detail::div_negative(x,y.lower()); else if(!interval_lib::user::is_zero(y.upper())) returninterval_lib::detail::div_positive(x,y.upper()); else returninterval<T,Policies>::empty(); else returninterval_lib::detail::div_non_zero(x,y); } template<classT,classPolicies>inline interval<T,Policies>operator/(constT&x,constinterval<T,Policies>&y) { if(interval_lib::detail::test_input(x,y)) returninterval<T,Policies>::empty(); if(zero_in(y)) if(!interval_lib::user::is_zero(y.lower())) if(!interval_lib::user::is_zero(y.upper())) returninterval_lib::detail::div_zero<T,Policies>(x); else returninterval_lib::detail::div_negative<T,Policies>(x,y.lower()); else if(!interval_lib::user::is_zero(y.upper())) returninterval_lib::detail::div_positive<T,Policies>(x,y.upper()); else returninterval<T,Policies>::empty(); else returninterval_lib::detail::div_non_zero(x,y); } template<classT,classPolicies>inline interval<T,Policies>operator/(constinterval<T,Policies>&x,constT&y) { if(interval_lib::detail::test_input(x,y)||interval_lib::user::is_zero(y)) returninterval<T,Policies>::empty(); typenamePolicies::roundingrnd; constT&xl=x.lower(); constT&xu=x.upper(); if(interval_lib::user::is_neg(y)) returninterval<T,Policies>(rnd.div_down(xu,y),rnd.div_up(xl,y),true); else returninterval<T,Policies>(rnd.div_down(xl,y),rnd.div_up(xu,y),true); } }//namespacenumeric }//namespaceboost #endif//BOOST_NUMERIC_INTERVAL_ARITH_HPP