LogicalSparseUnitTests.cpp

Go to the documentation of this file.
00001 // $Id: LogicalSparseUnitTests.cpp,v 1.1.2.1 2009/03/05 20:35:26 etphipp Exp $ 
00002 // $Source: /space/CVS/Trilinos/packages/sacado/test/TestSuite/LogicalSparseUnitTests.cpp,v $ 
00003 // @HEADER
00004 // ***********************************************************************
00005 // 
00006 //                           Sacado Package
00007 //                 Copyright (2006) Sandia Corporation
00008 // 
00009 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00010 // the U.S. Government retains certain rights in this software.
00011 // 
00012 // This library is free software; you can redistribute it and/or modify
00013 // it under the terms of the GNU Lesser General Public License as
00014 // published by the Free Software Foundation; either version 2.1 of the
00015 // License, or (at your option) any later version.
00016 //  
00017 // This library is distributed in the hope that it will be useful, but
00018 // WITHOUT ANY WARRANTY; without even the implied warranty of
00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020 // Lesser General Public License for more details.
00021 //  
00022 // You should have received a copy of the GNU Lesser General Public
00023 // License along with this library; if not, write to the Free Software
00024 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00025 // USA
00026 // Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
00027 // (etphipp@sandia.gov).
00028 // 
00029 // ***********************************************************************
00030 // @HEADER
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   // Compare sizes
00079   CPPUNIT_ASSERT(x_dfad.size() == x_ls.size());
00080   
00081   // Compare hasFastAccess
00082   CPPUNIT_ASSERT(x_dfad.hasFastAccess() == x_ls.hasFastAccess());
00083   
00084   // Compare values
00085   compareDoubles(x_dfad.val(), x_ls.val());
00086   
00087   for (int i=0; i<x_ls.size(); i++) {
00088     
00089     // Compare dx
00090     compareDx(x_dfad.dx(i), x_ls.dx(i));
00091     
00092     // Compare fastAccessDx
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   // Expr, Expr (same)
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   // Expr, Expr (different)
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     // Expr, Expr (same)
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   // Expr, Expr (different)
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 }

Generated on Wed May 12 21:59:04 2010 for Sacado Package Browser (Single Doxygen Collection) by  doxygen 1.4.7