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 "DFadUnitTests.hpp"
00033
00034 CPPUNIT_TEST_SUITE_REGISTRATION( DFadOpsUnitTest );
00035
00036 void FAD::error(const char *msg) {
00037 std::cout << msg << endl;
00038 }
00039
00040 DFadOpsUnitTest::DFadOpsUnitTest() :
00041 urand(0.0, 1.0), n(5), tol_a(1.0e-15), tol_r(1.0e-14) {}
00042
00043 DFadOpsUnitTest::DFadOpsUnitTest(int numComponents, double absolute_tolerance,
00044 double relative_tolerance) :
00045 urand(0.0, 1.0),
00046 n(numComponents),
00047 tol_a(absolute_tolerance),
00048 tol_r(relative_tolerance) {}
00049
00050 void DFadOpsUnitTest::setUp() {
00051 double val;
00052
00053 val = urand.number();
00054 a_dfad = DFadType(n,val);
00055 a_fad = FAD::Fad<double>(n,val);
00056
00057 val = urand.number();
00058 b_dfad = DFadType(n,val);
00059 b_fad = FAD::Fad<double>(n,val);
00060
00061 for (int i=0; i<n; i++) {
00062 val = urand.number();
00063 a_dfad.fastAccessDx(i) = val;
00064 a_fad.fastAccessDx(i) = val;
00065
00066 val = urand.number();
00067 b_dfad.fastAccessDx(i) = val;
00068 b_fad.fastAccessDx(i) = val;
00069 }
00070 }
00071
00072 void DFadOpsUnitTest::tearDown() {}
00073
00074 void DFadOpsUnitTest::compareFads(const DFadType& x_dfad,
00075 const FAD::Fad<double>& x_fad) {
00076
00077
00078 CPPUNIT_ASSERT(x_dfad.size() == x_fad.size());
00079
00080
00081 CPPUNIT_ASSERT(x_dfad.hasFastAccess() == x_fad.hasFastAccess());
00082
00083
00084 compareDoubles(x_dfad.val(), x_fad.val());
00085
00086 for (int i=0; i<x_fad.size(); i++) {
00087
00088
00089 compareDoubles(x_dfad.dx(i), x_fad.dx(i));
00090
00091
00092 compareDoubles(x_dfad.fastAccessDx(i), x_fad.fastAccessDx(i));
00093 }
00094 }
00095
00096 void DFadOpsUnitTest::compareDoubles(double a, double b) {
00097 CPPUNIT_ASSERT( fabs(a-b) < tol_a + tol_r*fabs(a) );
00098 }
00099
00100 void DFadOpsUnitTest::testMax() {
00101 double val;
00102
00103 DFadType aa_dfad = a_dfad + 1.0;
00104 c_dfad = max(aa_dfad, a_dfad);
00105 compareDoubles(c_dfad.val(), aa_dfad.val());
00106 for (int i=0; i<n; i++) {
00107 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00108 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00109 }
00110
00111 c_dfad = max(a_dfad, aa_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+1.0, a_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, a_dfad+1.0);
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
00133 this->c_dfad = max(this->a_dfad+1.0, this->a_dfad+1.0);
00134 compareDoubles(c_dfad.val(), aa_dfad.val());
00135 for (int i=0; i<n; i++) {
00136 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00137 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00138 }
00139
00140
00141 this->c_dfad = max(this->a_dfad+1.0, this->a_dfad-1.0);
00142 compareDoubles(c_dfad.val(), aa_dfad.val());
00143 for (int i=0; i<n; i++) {
00144 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00145 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00146 }
00147 this->c_dfad = max(this->a_dfad-1.0, this->a_dfad+1.0);
00148 compareDoubles(c_dfad.val(), aa_dfad.val());
00149 for (int i=0; i<n; i++) {
00150 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00151 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00152 }
00153
00154 val = a_dfad.val() + 1;
00155 c_dfad = max(a_dfad, val);
00156 compareDoubles(c_dfad.val(), val);
00157 for (int i=0; i<n; i++)
00158 compareDoubles(c_dfad.dx(i), 0.0);
00159
00160 val = a_dfad.val() - 1;
00161 c_dfad = max(a_dfad, val);
00162 compareDoubles(c_dfad.val(), a_dfad.val());
00163 for (int i=0; i<n; i++) {
00164 compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00165 compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00166 }
00167
00168 val = b_dfad.val() + 1;
00169 c_dfad = max(val, b_dfad);
00170 compareDoubles(c_dfad.val(), val);
00171 for (int i=0; i<n; i++)
00172 compareDoubles(c_dfad.dx(i), 0.0);
00173
00174 val = b_dfad.val() - 1;
00175 c_dfad = max(val, b_dfad);
00176 compareDoubles(c_dfad.val(), b_dfad.val());
00177 for (int i=0; i<n; i++) {
00178 compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00179 compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00180 }
00181 }
00182
00183 void DFadOpsUnitTest::testMin() {
00184 double val;
00185
00186 DFadType aa_dfad = a_dfad - 1.0;
00187 c_dfad = min(aa_dfad, a_dfad);
00188 compareDoubles(c_dfad.val(), aa_dfad.val());
00189 for (int i=0; i<n; i++) {
00190 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00191 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00192 }
00193
00194 c_dfad = min(a_dfad, aa_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
00202 this->c_dfad = min(this->a_dfad-1.0, this->a_dfad-1.0);
00203 compareDoubles(c_dfad.val(), aa_dfad.val());
00204 for (int i=0; i<n; i++) {
00205 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00206 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00207 }
00208
00209
00210 this->c_dfad = min(this->a_dfad+1.0, this->a_dfad-1.0);
00211 compareDoubles(c_dfad.val(), aa_dfad.val());
00212 for (int i=0; i<n; i++) {
00213 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00214 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00215 }
00216 this->c_dfad = min(this->a_dfad-1.0, this->a_dfad+1.0);
00217 compareDoubles(c_dfad.val(), aa_dfad.val());
00218 for (int i=0; i<n; i++) {
00219 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00220 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00221 }
00222
00223 val = a_dfad.val() - 1;
00224 c_dfad = min(a_dfad, val);
00225 compareDoubles(c_dfad.val(), val);
00226 for (int i=0; i<n; i++)
00227 compareDoubles(c_dfad.dx(i), 0.0);
00228
00229 val = a_dfad.val() + 1;
00230 c_dfad = min(a_dfad, val);
00231 compareDoubles(c_dfad.val(), a_dfad.val());
00232 for (int i=0; i<n; i++) {
00233 compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00234 compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00235 }
00236
00237 val = b_dfad.val() - 1;
00238 c_dfad = min(val, b_dfad);
00239 compareDoubles(c_dfad.val(), val);
00240 for (int i=0; i<n; i++)
00241 compareDoubles(c_dfad.dx(i), 0.0);
00242
00243 val = b_dfad.val() + 1;
00244 c_dfad = min(val, b_dfad);
00245 compareDoubles(c_dfad.val(), b_dfad.val());
00246 for (int i=0; i<n; i++) {
00247 compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00248 compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00249 }
00250 }