00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "ELRDFadUnitTests.hpp"
00033
00034 CPPUNIT_TEST_SUITE_REGISTRATION( ELRDFadOpsUnitTest );
00035
00036 ELRDFadOpsUnitTest::ELRDFadOpsUnitTest() :
00037 urand(0.0, 1.0), n(5), tol_a(1.0e-15), tol_r(1.0e-14) {}
00038
00039 ELRDFadOpsUnitTest::ELRDFadOpsUnitTest(int numComponents,
00040 double absolute_tolerance,
00041 double relative_tolerance) :
00042 urand(0.0, 1.0),
00043 n(numComponents),
00044 tol_a(absolute_tolerance),
00045 tol_r(relative_tolerance) {}
00046
00047 void ELRDFadOpsUnitTest::setUp() {
00048 double val;
00049
00050 val = urand.number();
00051 a_dfad = DFadType(n,val);
00052 a_fad = FAD::Fad<double>(n,val);
00053
00054 val = urand.number();
00055 b_dfad = DFadType(n,val);
00056 b_fad = FAD::Fad<double>(n,val);
00057
00058 for (int i=0; i<n; i++) {
00059 val = urand.number();
00060 a_dfad.fastAccessDx(i) = val;
00061 a_fad.fastAccessDx(i) = val;
00062
00063 val = urand.number();
00064 b_dfad.fastAccessDx(i) = val;
00065 b_fad.fastAccessDx(i) = val;
00066 }
00067 }
00068
00069 void ELRDFadOpsUnitTest::tearDown() {}
00070
00071 void ELRDFadOpsUnitTest::compareFads(const DFadType& x_dfad,
00072 const FAD::Fad<double>& x_fad) {
00073
00074 if (x_dfad.size() != x_fad.size()) {
00075 std::cout << "x_dfad.size() = " << x_dfad.size() << std::endl
00076 << "x_fad.size() = " << x_fad.size() << std::endl
00077 << "x_dfad = " << x_dfad << std::endl
00078 << "x_fad = " << x_fad << std::endl;
00079 }
00080
00081
00082 CPPUNIT_ASSERT(x_dfad.size() == x_fad.size());
00083
00084
00085 CPPUNIT_ASSERT(x_dfad.hasFastAccess() == x_fad.hasFastAccess());
00086
00087
00088 compareDoubles(x_dfad.val(), x_fad.val());
00089
00090 for (int i=0; i<x_fad.size(); i++) {
00091
00092
00093 compareDoubles(x_dfad.dx(i), x_fad.dx(i));
00094
00095
00096 compareDoubles(x_dfad.fastAccessDx(i), x_fad.fastAccessDx(i));
00097 }
00098 }
00099
00100 void ELRDFadOpsUnitTest::compareDoubles(double a, double b) {
00101 if ( fabs(a-b) >= tol_a + tol_r*fabs(a) )
00102 std::cout << "a = " << a << std::endl
00103 << "b = " << b << std::endl;
00104 CPPUNIT_ASSERT( fabs(a-b) < tol_a + tol_r*fabs(a) );
00105 }
00106
00107 void ELRDFadOpsUnitTest::testMax() {
00108 double val;
00109
00110 DFadType aa_dfad = a_dfad + 1.0;
00111 c_dfad = max(aa_dfad, a_dfad);
00112 compareDoubles(c_dfad.val(), aa_dfad.val());
00113 for (int i=0; i<n; i++) {
00114 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00115 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00116 }
00117
00118 c_dfad = max(a_dfad, aa_dfad);
00119 compareDoubles(c_dfad.val(), aa_dfad.val());
00120 for (int i=0; i<n; i++) {
00121 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00122 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00123 }
00124
00125 c_dfad = max(a_dfad+1.0, a_dfad);
00126 compareDoubles(c_dfad.val(), aa_dfad.val());
00127 for (int i=0; i<n; i++) {
00128 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00129 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00130 }
00131
00132 c_dfad = max(a_dfad, a_dfad+1.0);
00133 compareDoubles(c_dfad.val(), aa_dfad.val());
00134 for (int i=0; i<n; i++) {
00135 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00136 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00137 }
00138
00139
00140 this->c_dfad = max(this->a_dfad+1.0, this->a_dfad+1.0);
00141 compareDoubles(c_dfad.val(), aa_dfad.val());
00142 for (int i=0; i<n; i++) {
00143 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00144 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00145 }
00146
00147
00148 this->c_dfad = max(this->a_dfad+1.0, this->a_dfad-1.0);
00149 compareDoubles(c_dfad.val(), aa_dfad.val());
00150 for (int i=0; i<n; i++) {
00151 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00152 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00153 }
00154 this->c_dfad = max(this->a_dfad-1.0, this->a_dfad+1.0);
00155 compareDoubles(c_dfad.val(), aa_dfad.val());
00156 for (int i=0; i<n; i++) {
00157 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00158 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00159 }
00160
00161 val = a_dfad.val() + 1;
00162 c_dfad = max(a_dfad, val);
00163 compareDoubles(c_dfad.val(), val);
00164 for (int i=0; i<n; i++)
00165 compareDoubles(c_dfad.dx(i), 0.0);
00166
00167 val = a_dfad.val() - 1;
00168 c_dfad = max(a_dfad, val);
00169 compareDoubles(c_dfad.val(), a_dfad.val());
00170 for (int i=0; i<n; i++) {
00171 compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00172 compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00173 }
00174
00175 val = b_dfad.val() + 1;
00176 c_dfad = max(val, b_dfad);
00177 compareDoubles(c_dfad.val(), val);
00178 for (int i=0; i<n; i++)
00179 compareDoubles(c_dfad.dx(i), 0.0);
00180
00181 val = b_dfad.val() - 1;
00182 c_dfad = max(val, b_dfad);
00183 compareDoubles(c_dfad.val(), b_dfad.val());
00184 for (int i=0; i<n; i++) {
00185 compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00186 compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00187 }
00188 }
00189
00190 void ELRDFadOpsUnitTest::testMin() {
00191 double val;
00192
00193 DFadType aa_dfad = a_dfad - 1.0;
00194 c_dfad = min(aa_dfad, a_dfad);
00195 compareDoubles(c_dfad.val(), aa_dfad.val());
00196 for (int i=0; i<n; i++) {
00197 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00198 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00199 }
00200
00201 c_dfad = min(a_dfad, aa_dfad);
00202 compareDoubles(c_dfad.val(), aa_dfad.val());
00203 for (int i=0; i<n; i++) {
00204 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00205 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00206 }
00207
00208
00209 this->c_dfad = min(this->a_dfad-1.0, this->a_dfad-1.0);
00210 compareDoubles(c_dfad.val(), aa_dfad.val());
00211 for (int i=0; i<n; i++) {
00212 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00213 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00214 }
00215
00216
00217 this->c_dfad = min(this->a_dfad+1.0, this->a_dfad-1.0);
00218 compareDoubles(c_dfad.val(), aa_dfad.val());
00219 for (int i=0; i<n; i++) {
00220 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00221 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00222 }
00223 this->c_dfad = min(this->a_dfad-1.0, this->a_dfad+1.0);
00224 compareDoubles(c_dfad.val(), aa_dfad.val());
00225 for (int i=0; i<n; i++) {
00226 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00227 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00228 }
00229
00230 val = a_dfad.val() - 1;
00231 c_dfad = min(a_dfad, val);
00232 compareDoubles(c_dfad.val(), val);
00233 for (int i=0; i<n; i++)
00234 compareDoubles(c_dfad.dx(i), 0.0);
00235
00236 val = a_dfad.val() + 1;
00237 c_dfad = min(a_dfad, val);
00238 compareDoubles(c_dfad.val(), a_dfad.val());
00239 for (int i=0; i<n; i++) {
00240 compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00241 compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00242 }
00243
00244 val = b_dfad.val() - 1;
00245 c_dfad = min(val, b_dfad);
00246 compareDoubles(c_dfad.val(), val);
00247 for (int i=0; i<n; i++)
00248 compareDoubles(c_dfad.dx(i), 0.0);
00249
00250 val = b_dfad.val() + 1;
00251 c_dfad = min(val, b_dfad);
00252 compareDoubles(c_dfad.val(), b_dfad.val());
00253 for (int i=0; i<n; i++) {
00254 compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00255 compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00256 }
00257 }