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