[CppAD] Own Data Type

Dominik Skanda Dominik.Skanda at biologie.uni-freiburg.de
Mon Feb 28 12:23:26 EST 2011


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




More information about the CppAD mailing list