[CppAD] Own Data Type

Stefan Vigerske stefan at math.hu-berlin.de
Mon Feb 28 17:00:33 EST 2011


Hi,

CppAD work's for me with my own base type.
What kind of error you get?

Stefan

Am 28.02.2011 18:23, schrieb Dominik Skanda:
> Hello all,
>
> I try to implement my own numeric base type for use with cppAD, i.e.
> with QD Library a numeric type with 63 digits
> ( http://crd.lbl.gov/~dhbailey/mpdist/ ). For that I try to extend the
> example ( http://www.coin-or.org/CppAD/Doc/numerictype.cpp.xml ).
> But somehow it's not working correctly. Has someone experience with a
> similar case?
>
> Specially I want that following works:
>
> vector<  CppAD::AD<MyType>  >  X(1);
> vector<  CppAD::AD<MyType>  >  Y(1);
>
>
> CppAD::ADFun<MyType>  F;
> 		
> X[0]=6.2785676;
>
> CppAD::Independent(X);
> 		
>
> Y[0]=X[0]-234.6665675;
> 		
> F.Dependent(X, Y);
>
>
> I have no glue what happens with the numbers 6.2785676 and 234.6665675
> for instance.
>
> The definition of MyType looks by now:
>
>
> 	class MyType {
> 	private:
> 		qd_real d;
> 	public:
> 		// constructor from void
> 		MyType(void) : d(0.)
> 		{ }
> 		// constructor from an int
> 		MyType(int d_) : d(d_)
> 		{ }
> 		
> 		// constructor from an qd_real
> 		MyType(qd_real d_) : d(d_)
> 		{ }
> 		
> 		// constructor from an MyType
> 		MyType(const MyType&d_) : d(d_.d)
> 		{ }
> 				
> 		// assignment operator
> 		
> 		MyType&  operator = (const MyType&x)
> 		{
> 			if (this !=&x) {	
> 			d = x.returnValue();
> 			}	
> 			return *this;
> 		}
> 		
> 		MyType operator = (const double&x)
> 		{
> 			d = x; 	
> 			return *this;
> 		}
> 		
> 		MyType operator = (const qd_real&x)
> 		{
> 			d = x; 	
> 			return *this;
> 		}
> 						
> 		// member function that converts to double
> 		double Double(void) const
> 		{	return to_double(d); }
> 		qd_real returnValue(void) const
> 		{   return d;}
> 		
> 		// unary plus
> 		MyType operator + (void) const
> 		{	MyType x;
> 			x.d =  d;
> 			return x;
> 		}
> 		// unary plus
> 		MyType operator - (void) const
> 		{	MyType x;
> 			x.d = - d;
> 			return x;
> 		}
> 		// binary addition
> 		MyType operator + (const MyType&x) const
> 		{	MyType y;
> 			y.d = d + x.d ;
> 			return y;
> 		}
> 		// binary subtraction
> 		MyType operator - (const MyType&x) const
> 		{	MyType y;
> 			y.d = d - x.d ;
> 			return y;
> 		}
> 		MyType operator - (const double&x) const
> 		{	MyType y;
> 			y.d = d - x ;
> 			return y;
> 		}
> 		
> 		// binary multiplication
> 		MyType operator * (const MyType&x) const
> 		{	MyType y;
> 			y.d = d * x.d ;
> 			return y;
> 		}
> 		// binary division
> 		MyType operator / (const MyType&x) const
> 		{	MyType y;
> 			y.d = d / x.d ;
> 			return y;
> 		}
> 		// computed assignment addition
> 		void operator += (const MyType&x)
> 		{	d += x.d; }
> 		
> 		void operator += (const double&x)
> 		{	d += x; }
> 		// computed assignment subtraction
> 		void operator -= (const MyType&x)
> 		{	d -= x.d; }
> 		
> 		void operator -= (const double&x)
> 		{	d -= x; }
> 		
> 		
> 		
> 		// computed assignment multiplication
> 		void operator *= (const MyType&x)
> 		{	d *= x.d; }
> 		// computed assignment division
> 		void operator /= (const MyType&x)
> 		{	d /= x.d; }
> 		
> 		bool operator == (const MyType&x) const
> 		{return d==x.d;}
> 		
> 		bool operator != (const MyType&x) const
> 		{return d!=x.d;}
> 		
> 		
> 		friend std::ostream&  operator<<(std::ostream&  out, const MyType&  f)
> 			{
> 				out<<  f.d;
> 				
> 				return out;
> 			}		
> 	};
>
>
> namespace CppAD {
> 	inline bool EqualOpSeq(
> 		const MyType&x ,
> 		const MyType&y )
> 	{	
> 		return x == y;
> 	}
>
>
>
> 	inline bool IdenticalPar(const MyType&x)
> 	{	return true; }
> 	inline bool IdenticalZero(const MyType&x)
> 	{	return (x.returnValue() == 0.0 ); }
> 	inline bool IdenticalOne(const MyType&x)
> 	{	return (x.returnValue() == 1.0 ); }
> 	inline bool IdenticalEqualPar(const MyType&x,const MyType&y)
> 	{	return (x==y); }
>
>
>
> 	inline MyType cos(const MyType&x)
> 	{	return MyType(cos(x.returnValue())); }
> 	
> 	inline MyType cosh(const MyType&x)
> 	{	return MyType(cosh(x.returnValue())); }
> 	
> 	inline MyType exp(const MyType&x)
> 	{	return MyType(exp(x.returnValue())); }
> 	
> 	inline MyType log(const MyType&x)
> 	{	return MyType(log(x.returnValue())); }
> 	
> 	inline MyType pow(const MyType&x, const MyType&y)
> 	{	return MyType(pow(x.returnValue(),y.returnValue())); }
> 	
> 	inline MyType sin(const MyType&x)
> 	{	return MyType(sin(x.returnValue())); }
> 	
> 	inline MyType sinh(const MyType&x)
> 	{	return MyType(sinh(x.returnValue())); }
> 	
> 	inline MyType sqrt(const MyType&x)
> 	{	return MyType(sqrt(x.returnValue())); }
> 	
> 	inline MyType atan(const MyType&x)
> 	{	return MyType(atan(x.returnValue())); }
> 	
> 	inline MyType acos(const MyType&x)
> 	{	return MyType(acos(x.returnValue())); }
> 	
> 	inline MyType asin(const MyType&x)
> 	{	return MyType(asin(x.returnValue())); }
>
>
> 	inline MyType CondExpOp(
> 		enum CppAD::CompareOp      cop        ,
> 		const MyType&left      ,
> 		const MyType&right     ,
> 		const MyType&trueCase  ,
> 		const MyType&falseCase )
> 	{	CppAD::ErrorHandler::Call(
> 			true     , __LINE__ , __FILE__ ,
> 			"MyType CondExpOp(...)",
> 			"Error: cannot use CondExp with a MyType by now"
> 		);
> 		return MyType(0);
> 	}
>
> 	inline bool GreaterThanZero(const MyType&x)
> 	{	CppAD::ErrorHandler::Call(
> 			true     , __LINE__ , __FILE__ ,
> 			"GreaterThanZero(x)",
> 			"Error: cannot use GreaterThanZero with MyType"
> 		);
> 		return false;
> 	}
> 	inline bool GreaterThanOrZero(const MyType&x)
> 	{	CppAD::ErrorHandler::Call(
> 			true     , __LINE__ , __FILE__ ,
> 			"GreaterThanZero(x)",
> 			"Error: cannot use GreaterThanZero with MyType"
> 		);
> 		return false;
> 	}
> 	inline bool LessThanZero(const MyType&x)
> 	{	CppAD::ErrorHandler::Call(
> 			true     , __LINE__ , __FILE__ ,
> 			"LessThanZero(x)",
> 			"Error: cannot use LessThanZero with MyType"
> 		);
> 		return false;
> 	}
> 	inline bool LessThanOrZero(const MyType&x)
> 	{	CppAD::ErrorHandler::Call(
> 			true     , __LINE__ , __FILE__ ,
> 			"LessThanZero(x)",
> 			"Error: cannot use LessThanZero with MyType"
> 		);
> 		return false;
> 	}
>
> 	inline int Integer(const MyType&x)
> 	{	return static_cast<int>( x.Double() ); }
> }
>
>
>
>
>
>
>
>
>
>
> Many thanks in advance
>
> Dominik
>
>
> _______________________________________________
> CppAD mailing list
> CppAD at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cppad
>



More information about the CppAD mailing list