Sacado Package Browser (Single Doxygen Collection)  Version of the Day
LogicalSparseUnitTests.cpp
Go to the documentation of this file.
1 // $Id$
2 // $Source$
3 // @HEADER
4 // ***********************************************************************
5 //
6 // Sacado Package
7 // Copyright (2006) Sandia Corporation
8 //
9 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
10 // the U.S. Government retains certain rights in this software.
11 //
12 // This library is free software; you can redistribute it and/or modify
13 // it under the terms of the GNU Lesser General Public License as
14 // published by the Free Software Foundation; either version 2.1 of the
15 // License, or (at your option) any later version.
16 //
17 // This library is distributed in the hope that it will be useful, but
18 // WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 // Lesser General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public
23 // License along with this library; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
25 // USA
26 // Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
27 // (etphipp@sandia.gov).
28 //
29 // ***********************************************************************
30 // @HEADER
31 
33 
35 
37  urand(0.0, 1.0), n(5), tol_a(1.0e-15), tol_r(1.0e-14) {}
38 
40  double absolute_tolerance,
41  double relative_tolerance) :
42  urand(0.0, 1.0),
43  n(numComponents),
44  tol_a(absolute_tolerance),
45  tol_r(relative_tolerance) {}
46 
48  double val;
49 
50  val = urand.number();
51  a_dfad = DFadType(n,val);
52  a_ls = LSType(n,val);
53 
54  val = urand.number();
55  b_dfad = DFadType(n,val);
56  b_ls = LSType(n,val);
57 
58  val = urand.number();
59  c_dfad = val;
60  c_ls = val;
61 
62  for (int i=0; i<n; i++) {
63  val = urand.number();
64  a_dfad.fastAccessDx(i) = val;
65  a_ls.fastAccessDx(i) = 1;
66 
67  val = urand.number();
68  b_dfad.fastAccessDx(i) = val;
69  b_ls.fastAccessDx(i) = 1;
70  }
71 }
72 
74 
76  const LSType& x_ls) {
77 
78  // Compare sizes
79  CPPUNIT_ASSERT(x_dfad.size() == x_ls.size());
80 
81  // Compare hasFastAccess
82  CPPUNIT_ASSERT(x_dfad.hasFastAccess() == x_ls.hasFastAccess());
83 
84  // Compare values
85  compareDoubles(x_dfad.val(), x_ls.val());
86 
87  for (int i=0; i<x_ls.size(); i++) {
88 
89  // Compare dx
90  compareDx(x_dfad.dx(i), x_ls.dx(i));
91 
92  // Compare fastAccessDx
93  compareDx(x_dfad.fastAccessDx(i), x_ls.fastAccessDx(i));
94  }
95 }
96 
98  CPPUNIT_ASSERT( fabs(a-b) < tol_a + tol_r*fabs(a) );
99 }
100 
102  CPPUNIT_ASSERT( a == b );
103 }
104 
106  CPPUNIT_ASSERT( (a && b) || !(a || b) );
107 }
108 
110  double val;
111 
112  // LFAd, LFad
113  LSType aa_ls = a_ls + 1.0;
114  c_ls = max(aa_ls, a_ls);
115  compareDoubles(c_ls.val(), aa_ls.val());
116  for (int i=0; i<n; i++) {
117  compareBools(c_ls.dx(i), aa_ls.dx(i));
118  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
119  }
120  c_ls = max(a_ls, aa_ls);
121  compareDoubles(c_ls.val(), aa_ls.val());
122  for (int i=0; i<n; i++) {
123  compareBools(c_ls.dx(i), aa_ls.dx(i));
124  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
125  }
126 
127  // Expr, LFad
128  c_ls = max(a_ls+1.0, a_ls);
129  compareDoubles(c_ls.val(), aa_ls.val());
130  for (int i=0; i<n; i++) {
131  compareBools(c_ls.dx(i), aa_ls.dx(i));
132  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
133  }
134  c_ls = max(a_ls, a_ls+1.0);
135  compareDoubles(c_ls.val(), aa_ls.val());
136  for (int i=0; i<n; i++) {
137  compareBools(c_ls.dx(i), aa_ls.dx(i));
138  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
139  }
140 
141  // Expr, Expr (same)
142  c_ls = max(a_ls+1.0, a_ls+1.0);
143  compareDoubles(c_ls.val(), aa_ls.val());
144  for (int i=0; i<n; i++) {
145  compareBools(c_ls.dx(i), aa_ls.dx(i));
146  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
147  }
148 
149  // Expr, Expr (different)
150  c_ls = max(a_ls+1.0, a_ls-1.0);
151  compareDoubles(c_ls.val(), aa_ls.val());
152  for (int i=0; i<n; i++) {
153  compareBools(c_ls.dx(i), aa_ls.dx(i));
154  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
155  }
156  c_ls = max(a_ls-1.0, a_ls+1.0);
157  compareDoubles(c_ls.val(), aa_ls.val());
158  for (int i=0; i<n; i++) {
159  compareBools(c_ls.dx(i), aa_ls.dx(i));
160  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
161  }
162 
163  // LFad, const
164  val = a_ls.val() + 1;
165  c_ls = max(a_ls, val);
166  compareDoubles(c_ls.val(), val);
167  for (int i=0; i<n; i++)
168  compareBools(c_ls.dx(i), 0);
169  val = a_ls.val() - 1;
170  c_ls = max(a_ls, val);
171  compareDoubles(c_ls.val(), a_ls.val());
172  for (int i=0; i<n; i++) {
173  compareBools(c_ls.dx(i), a_ls.dx(i));
174  compareBools(c_ls.fastAccessDx(i), a_ls.fastAccessDx(i));
175  }
176  val = b_ls.val() + 1;
177  c_ls = max(val, b_ls);
178  compareDoubles(c_ls.val(), val);
179  for (int i=0; i<n; i++)
180  compareBools(c_ls.dx(i), 0);
181  val = b_ls.val() - 1;
182  c_ls = max(val, b_ls);
183  compareDoubles(c_ls.val(), b_ls.val());
184  for (int i=0; i<n; i++) {
185  compareBools(c_ls.dx(i), b_ls.dx(i));
186  compareBools(c_ls.fastAccessDx(i), b_ls.fastAccessDx(i));
187  }
188 
189  // Expr, const
190  val = a_ls.val();
191  c_ls = max(a_ls+1.0, val);
192  compareDoubles(c_ls.val(), aa_ls.val());
193  for (int i=0; i<n; i++) {
194  compareBools(c_ls.dx(i), aa_ls.dx(i));
195  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
196  }
197  c_ls = max(val, a_ls+1.0);
198  compareDoubles(c_ls.val(), aa_ls.val());
199  for (int i=0; i<n; i++) {
200  compareBools(c_ls.dx(i), aa_ls.dx(i));
201  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
202  }
203 
204 }
205 
207  double val;
208 
209  // LFad, LFad
210  LSType aa_ls = a_ls - 1.0;
211  c_ls = min(aa_ls, a_ls);
212  compareDoubles(c_ls.val(), aa_ls.val());
213  for (int i=0; i<n; i++) {
214  compareBools(c_ls.dx(i), aa_ls.dx(i));
215  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
216  }
217  c_ls = min(a_ls, aa_ls);
218  compareDoubles(c_ls.val(), aa_ls.val());
219  for (int i=0; i<n; i++) {
220  compareBools(c_ls.dx(i), aa_ls.dx(i));
221  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
222  }
223 
224  // Expr, LFad
225  c_ls = min(a_ls-1.0, a_ls);
226  compareDoubles(c_ls.val(), aa_ls.val());
227  for (int i=0; i<n; i++) {
228  compareBools(c_ls.dx(i), aa_ls.dx(i));
229  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
230  }
231  c_ls = min(a_ls, a_ls-1.0);
232  compareDoubles(c_ls.val(), aa_ls.val());
233  for (int i=0; i<n; i++) {
234  compareBools(c_ls.dx(i), aa_ls.dx(i));
235  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
236  }
237 
238  // Expr, Expr (same)
239  c_ls = min(a_ls-1.0, a_ls-1.0);
240  compareDoubles(c_ls.val(), aa_ls.val());
241  for (int i=0; i<n; i++) {
242  compareBools(c_ls.dx(i), aa_ls.dx(i));
243  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
244  }
245 
246  // Expr, Expr (different)
247  c_ls = min(a_ls+1.0, a_ls-1.0);
248  compareDoubles(c_ls.val(), aa_ls.val());
249  for (int i=0; i<n; i++) {
250  compareBools(c_ls.dx(i), aa_ls.dx(i));
251  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
252  }
253  c_ls = min(a_ls-1.0, a_ls+1.0);
254  compareDoubles(c_ls.val(), aa_ls.val());
255  for (int i=0; i<n; i++) {
256  compareBools(c_ls.dx(i), aa_ls.dx(i));
257  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
258  }
259 
260  // LFad, const
261  val = a_ls.val() - 1;
262  c_ls = min(a_ls, val);
263  compareDoubles(c_ls.val(), val);
264  for (int i=0; i<n; i++)
265  compareBools(c_ls.dx(i), 0);
266  val = a_ls.val() + 1;
267  c_ls = min(a_ls, val);
268  compareDoubles(c_ls.val(), a_ls.val());
269  for (int i=0; i<n; i++) {
270  compareBools(c_ls.dx(i), a_ls.dx(i));
271  compareBools(c_ls.fastAccessDx(i), a_ls.fastAccessDx(i));
272  }
273  val = b_ls.val() - 1;
274  c_ls = min(val, b_ls);
275  compareDoubles(c_ls.val(), val);
276  for (int i=0; i<n; i++)
277  compareBools(c_ls.dx(i), 0);
278  val = b_ls.val() + 1;
279  c_ls = min(val, b_ls);
280  compareDoubles(c_ls.val(), b_ls.val());
281  for (int i=0; i<n; i++) {
282  compareBools(c_ls.dx(i), b_ls.dx(i));
283  compareBools(c_ls.fastAccessDx(i), b_ls.fastAccessDx(i));
284  }
285 
286  // Expr, const
287  val = a_ls.val();
288  c_ls = min(a_ls-1.0, val);
289  compareDoubles(c_ls.val(), aa_ls.val());
290  for (int i=0; i<n; i++) {
291  compareBools(c_ls.dx(i), aa_ls.dx(i));
292  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
293  }
294  c_ls = min(val, a_ls-1.0);
295  compareDoubles(c_ls.val(), aa_ls.val());
296  for (int i=0; i<n; i++) {
297  compareBools(c_ls.dx(i), aa_ls.dx(i));
298  compareBools(c_ls.fastAccessDx(i), aa_ls.fastAccessDx(i));
299  }
300 }
void compareDoubles(double a, double b)
void compareDx(double a, bool b)
expr val()
Sacado::Fad::DFad< double > DFadType
ScalarT number()
Get random number.
CPPUNIT_TEST_SUITE_REGISTRATION(LogicalSparseOpsUnitTest)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
KOKKOS_INLINE_FUNCTION Expr< FAbsOp< Expr< T > > > fabs(const Expr< T > &expr)
Sacado::LFad::LogicalSparse< double, bool > LSType
Sacado::Random< double > urand
void compareFads(const DFadType &x_dfad, const LSType &x_ls)