adouble func_eval(adouble *x){ adouble fad=0; x[0]=x[0]-x[1]; x[1]=x[2]-x[1]; condassign(fad,x[0],x[3]*x[4],x[4]*x[5]); condassign(x[0],x[1],x[2]*x[3],x[3]*x[4]); fad-=x[0]*x[3]; condassign(x[1],x[5],x[2]+x[3]); fad/=x[1]; return fad; }
adouble func_eval(adouble *x){ adouble fad=0; advector adv(NUM_IND); adv[x[0]]=x[0]; adv[x[1]]=x[1]; adv[x[2]]=x[2]; condassign(adv[x[3]],x[0]-x[1],x[0],(adouble)adv[x[1]]); condassign(adv[x[4]],x[2]-x[1],(adouble)adv[x[2]],(adouble)adv[x[3]]); condassign(adv[x[5]],x[3]-x[2],x[5]); adv[x[0]]+=cosh((adouble)adv[x[0]]); adv[x[1]]-=0.2; adv[x[1]-x[0]]=exp((adouble)adv[x[5]]); fad+=adv[0]*adv[1]*adv[2]*adv[3]*adv[4]*adv[5]; // adv[x[0]]=adv[x[1]]; // fad=adv[x[0]]+adv[x[2]]; return fad; }
/* ADOUBLE ROUTINE */ adouble activeCubicLighthouse( adouble t ) { adouble p, q, d, r, u, u1, u2, v, a, b, c, z; /*---------------------*/ p = tan(t); q = p - 0.2; p /= 3.0; d = q*q; d -= p*p*p; /* 1. branch ----------*/ r = sqrt(d); u = q + r; u1 = pow(fabs(u),1.0/3.0); u2 = -u1; condassign(u,u,u1,u2); v = q - r; u1 = pow(fabs(v),1.0/3.0); u2 = -u1; condassign(v,v,u1,u2); c = u + v; /* 2. branch ----------*/ p = fabs(p); p = sqrt(p); q /= p*p*p; a = acos(q); a /= 3.0; z = cos(a); b = a + PI/3.0; b = -cos(b); z = fmin(z,b); b = a - PI/3.0; b = -cos(b); z = fmin(z,b); z = 2.0*z*p; /*---------------------*/ condassign(z,d,c); z += 2.0; return z; }
/* ADOUBLE ROUTINE */ adouble activeCubicLighthouse1( adouble t ) { adouble p, q, d, r, u, u1,u2, v, c; /*---------------------*/ p = tan(t); q = p - 0.2; p /= 3.0; d = q*q; d -= p*p*p; /* 1. branch ----------*/ r = sqrt(d); u = q + r; u1 = pow(fabs(u),1.0/3.0); u2 = -u1; condassign(u,u,u1,u2); v = q - r; u1 = pow(fabs(v),1.0/3.0); u2 = -u1; condassign(v,v,u1,u2); c = u + v; /*---------------------*/ c += 2.0; return c; }
inline adouble CondExpOp( enum CppAD::CompareOp cop , const adouble &left , const adouble &right , const adouble &trueCase , const adouble &falseCase ) { adouble result; switch( cop ) { case CompareLt: // left < right condassign(result, right - left, trueCase, falseCase); break; case CompareLe: // left <= right condassign(result, left - right, falseCase, trueCase); break; case CompareEq: // left == right condassign(result, left - right, falseCase, trueCase); condassign(result, right - left, falseCase, result); break; case CompareGe: // left >= right condassign(result, right - left, falseCase, trueCase); break; case CompareGt: // left > right condassign(result, left - right, trueCase, falseCase); break; default: CppAD::ErrorHandler::Call( true , __LINE__ , __FILE__ , "CppAD::CondExp", "Error: for unknown reason." ); result = trueCase; } return result; }
inline adouble condExpGt(const adouble& left, const adouble& right, const adouble& exp_if_true, const adouble& exp_if_false) { adouble temp; condassign(temp, left - right, exp_if_true, exp_if_false); return temp; }
inline adouble condExpLt(const adouble& left, const adouble& right, const adouble& exp_if_true, const adouble& exp_if_false) { adouble temp; condassign(temp, right - left, exp_if_true, exp_if_false); // temp = (right - left>0)? exp_if_true: exp_if_false return temp; }