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