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 "CacheDFadUnitTests.hpp"
00033
00034 CPPUNIT_TEST_SUITE_REGISTRATION( CacheDFadOpsUnitTest );
00035
00036 CacheDFadOpsUnitTest::CacheDFadOpsUnitTest() :
00037 urand(0.0, 1.0), n(5), tol_a(1.0e-15), tol_r(1.0e-14) {}
00038
00039 CacheDFadOpsUnitTest::CacheDFadOpsUnitTest(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 CacheDFadOpsUnitTest::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 CacheDFadOpsUnitTest::tearDown() {}
00070
00071 void CacheDFadOpsUnitTest::compareFads(const DFadType& x_dfad,
00072 const FAD::Fad<double>& x_fad) {
00073
00074
00075 CPPUNIT_ASSERT(x_dfad.size() == x_fad.size());
00076
00077
00078 CPPUNIT_ASSERT(x_dfad.hasFastAccess() == x_fad.hasFastAccess());
00079
00080
00081 compareDoubles(x_dfad.val(), x_fad.val());
00082
00083 for (int i=0; i<x_fad.size(); i++) {
00084
00085
00086 compareDoubles(x_dfad.dx(i), x_fad.dx(i));
00087
00088
00089 compareDoubles(x_dfad.fastAccessDx(i), x_fad.fastAccessDx(i));
00090 }
00091 }
00092
00093 void CacheDFadOpsUnitTest::compareDoubles(double a, double b) {
00094 CPPUNIT_ASSERT( fabs(a-b) < tol_a + tol_r*fabs(a) );
00095 }
00096
00097 void CacheDFadOpsUnitTest::testMax() {
00098 double val;
00099
00100 DFadType aa_dfad = a_dfad + 1.0;
00101 c_dfad = max(aa_dfad, a_dfad);
00102 compareDoubles(c_dfad.val(), aa_dfad.val());
00103 for (int i=0; i<n; i++) {
00104 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00105 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00106 }
00107
00108 c_dfad = max(a_dfad, aa_dfad);
00109 compareDoubles(c_dfad.val(), aa_dfad.val());
00110 for (int i=0; i<n; i++) {
00111 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00112 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00113 }
00114
00115 c_dfad = max(a_dfad+1.0, a_dfad);
00116 compareDoubles(c_dfad.val(), aa_dfad.val());
00117 for (int i=0; i<n; i++) {
00118 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00119 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00120 }
00121
00122 c_dfad = max(a_dfad, a_dfad+1.0);
00123 compareDoubles(c_dfad.val(), aa_dfad.val());
00124 for (int i=0; i<n; i++) {
00125 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00126 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00127 }
00128
00129
00130 this->c_dfad = max(this->a_dfad+1.0, this->a_dfad+1.0);
00131 compareDoubles(c_dfad.val(), aa_dfad.val());
00132 for (int i=0; i<n; i++) {
00133 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00134 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00135 }
00136
00137
00138 this->c_dfad = max(this->a_dfad+1.0, this->a_dfad-1.0);
00139 compareDoubles(c_dfad.val(), aa_dfad.val());
00140 for (int i=0; i<n; i++) {
00141 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00142 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00143 }
00144 this->c_dfad = max(this->a_dfad-1.0, this->a_dfad+1.0);
00145 compareDoubles(c_dfad.val(), aa_dfad.val());
00146 for (int i=0; i<n; i++) {
00147 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00148 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00149 }
00150
00151 val = a_dfad.val() + 1;
00152 c_dfad = max(a_dfad, val);
00153 compareDoubles(c_dfad.val(), val);
00154 for (int i=0; i<n; i++)
00155 compareDoubles(c_dfad.dx(i), 0.0);
00156
00157 val = a_dfad.val() - 1;
00158 c_dfad = max(a_dfad, val);
00159 compareDoubles(c_dfad.val(), a_dfad.val());
00160 for (int i=0; i<n; i++) {
00161 compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00162 compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00163 }
00164
00165 val = b_dfad.val() + 1;
00166 c_dfad = max(val, b_dfad);
00167 compareDoubles(c_dfad.val(), val);
00168 for (int i=0; i<n; i++)
00169 compareDoubles(c_dfad.dx(i), 0.0);
00170
00171 val = b_dfad.val() - 1;
00172 c_dfad = max(val, b_dfad);
00173 compareDoubles(c_dfad.val(), b_dfad.val());
00174 for (int i=0; i<n; i++) {
00175 compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00176 compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00177 }
00178 }
00179
00180 void CacheDFadOpsUnitTest::testMin() {
00181 double val;
00182
00183 DFadType aa_dfad = a_dfad - 1.0;
00184 c_dfad = min(aa_dfad, a_dfad);
00185 compareDoubles(c_dfad.val(), aa_dfad.val());
00186 for (int i=0; i<n; i++) {
00187 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00188 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00189 }
00190
00191 c_dfad = min(a_dfad, aa_dfad);
00192 compareDoubles(c_dfad.val(), aa_dfad.val());
00193 for (int i=0; i<n; i++) {
00194 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00195 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00196 }
00197
00198
00199 this->c_dfad = min(this->a_dfad-1.0, this->a_dfad-1.0);
00200 compareDoubles(c_dfad.val(), aa_dfad.val());
00201 for (int i=0; i<n; i++) {
00202 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00203 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00204 }
00205
00206
00207 this->c_dfad = min(this->a_dfad+1.0, this->a_dfad-1.0);
00208 compareDoubles(c_dfad.val(), aa_dfad.val());
00209 for (int i=0; i<n; i++) {
00210 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00211 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00212 }
00213 this->c_dfad = min(this->a_dfad-1.0, this->a_dfad+1.0);
00214 compareDoubles(c_dfad.val(), aa_dfad.val());
00215 for (int i=0; i<n; i++) {
00216 compareDoubles(c_dfad.dx(i), aa_dfad.dx(i));
00217 compareDoubles(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
00218 }
00219
00220 val = a_dfad.val() - 1;
00221 c_dfad = min(a_dfad, val);
00222 compareDoubles(c_dfad.val(), val);
00223 for (int i=0; i<n; i++)
00224 compareDoubles(c_dfad.dx(i), 0.0);
00225
00226 val = a_dfad.val() + 1;
00227 c_dfad = min(a_dfad, val);
00228 compareDoubles(c_dfad.val(), a_dfad.val());
00229 for (int i=0; i<n; i++) {
00230 compareDoubles(c_dfad.dx(i), a_dfad.dx(i));
00231 compareDoubles(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
00232 }
00233
00234 val = b_dfad.val() - 1;
00235 c_dfad = min(val, b_dfad);
00236 compareDoubles(c_dfad.val(), val);
00237 for (int i=0; i<n; i++)
00238 compareDoubles(c_dfad.dx(i), 0.0);
00239
00240 val = b_dfad.val() + 1;
00241 c_dfad = min(val, b_dfad);
00242 compareDoubles(c_dfad.val(), b_dfad.val());
00243 for (int i=0; i<n; i++) {
00244 compareDoubles(c_dfad.dx(i), b_dfad.dx(i));
00245 compareDoubles(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
00246 }
00247 }