35
35
#include " TiledArray/cp/cp_als.h"
36
36
#include " TiledArray/cp/cp_reconstruct.h"
37
37
38
- const std::string __dirname = dirname(strdup(__FILE__));
38
+ constexpr std::int64_t rank_tile_size = 10 ;
39
+ constexpr bool verbose = false ;
39
40
40
41
using namespace TiledArray ;
41
42
@@ -138,38 +139,17 @@ struct CPFixture : public TiledRangeFixture {
138
139
};
139
140
140
141
template <typename TArrayT>
141
- TArrayT compute_cp (const TArrayT& T, size_t cp_rank) {
142
+ TArrayT compute_cp (const TArrayT& T, size_t cp_rank, bool verbose = false ) {
142
143
cp::CP_ALS<typename TArrayT::value_type, typename TArrayT::policy_type> CPD (
143
144
T);
144
- CPD.compute_rank (cp_rank, 80 , false , 1e-3 , true );
145
+ CPD.compute_rank (cp_rank, rank_tile_size , false , 1e-3 , verbose );
145
146
return CPD.reconstruct ();
146
147
}
147
- // TiledArray::TiledRange1 compute_trange1(std::size_t range_size,
148
- // std::size_t target_block_size) {
149
- // if (range_size > 0) {
150
- // std::size_t nblocks =
151
- // (range_size + target_block_size - 1) / target_block_size;
152
- // auto dv = std::div((int) (range_size + nblocks - 1), (int) nblocks);
153
- // auto avg_block_size = dv.quot - 1, num_avg_plus_one = dv.rem + 1;
154
- // std::vector<std::size_t> hashmarks;
155
- // hashmarks.reserve(nblocks + 1);
156
- // auto block_counter = 0;
157
- // for(auto i = 0; i < num_avg_plus_one; ++i, block_counter +=
158
- // avg_block_size + 1){
159
- // hashmarks.push_back(block_counter);
160
- // }
161
- // for (auto i = num_avg_plus_one; i < nblocks; ++i, block_counter+=
162
- // avg_block_size) {
163
- // hashmarks.push_back(block_counter);
164
- // }
165
- // hashmarks.push_back(range_size);
166
- // return TA::TiledRange1(hashmarks.begin(), hashmarks.end());
167
- // } else
168
- // return TA::TiledRange1{};
169
- // }
170
148
171
149
BOOST_FIXTURE_TEST_SUITE (cp_suite, CPFixture)
172
150
151
+ const auto target_rel_error = std::sqrt(std::numeric_limits<double >::epsilon());
152
+
173
153
BOOST_AUTO_TEST_CASE (btas_cp_als) {
174
154
// Make a tiled range with block size of 1
175
155
TiledArray::TiledRange tr3, tr4, tr5;
@@ -192,11 +172,12 @@ BOOST_AUTO_TEST_CASE(btas_cp_als) {
192
172
&this ->init_unit_tile <TensorD>);
193
173
size_t cp_rank = 1 ;
194
174
factors = cp::btas_cp_als (*GlobalFixture::world, b_dense, cp_rank,
195
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
175
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 ,
176
+ verbose);
196
177
auto b_cp = cp::reconstruct (factors);
197
178
TArrayD diff;
198
179
diff (" a,b,c" ) = b_dense (" a,b,c" ) - b_cp (" a,b,c" );
199
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
180
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
200
181
BOOST_CHECK (accurate);
201
182
}
202
183
// order-4 test
@@ -207,12 +188,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_als) {
207
188
&this ->init_unit_tile <TensorD>);
208
189
size_t cp_rank = 1 ;
209
190
factors = cp::btas_cp_als (*GlobalFixture::world, b_dense, cp_rank,
210
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
191
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 ,
192
+ verbose);
211
193
212
194
auto b_cp = cp::reconstruct (factors);
213
195
TArrayD diff;
214
196
diff (" a,b,c,d" ) = b_dense (" a,b,c,d" ) - b_cp (" a,b,c,d" );
215
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
197
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
216
198
BOOST_CHECK (accurate);
217
199
}
218
200
// order-5 test
@@ -223,12 +205,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_als) {
223
205
&this ->init_unit_tile <TensorD>);
224
206
size_t cp_rank = 1 ;
225
207
factors = cp::btas_cp_als (*GlobalFixture::world, b_dense, cp_rank,
226
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
208
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 ,
209
+ verbose);
227
210
228
211
auto b_cp = cp::reconstruct (factors);
229
212
TArrayD diff;
230
213
diff (" a,b,c,d,e" ) = b_dense (" a,b,c,d,e" ) - b_cp (" a,b,c,d,e" );
231
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
214
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
232
215
BOOST_CHECK (accurate);
233
216
}
234
217
@@ -239,13 +222,14 @@ BOOST_AUTO_TEST_CASE(btas_cp_als) {
239
222
auto b_sparse = make_array<TSpArrayD>(*GlobalFixture::world, tr3,
240
223
&this ->init_rand_tile <TensorD>);
241
224
size_t cp_rank = 77 ;
242
- factors = cp::btas_cp_als (*GlobalFixture::world, b_sparse, cp_rank,
243
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
225
+ factors =
226
+ cp::btas_cp_als (*GlobalFixture::world, b_sparse, cp_rank,
227
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 );
244
228
245
229
auto b_cp = cp::reconstruct (factors);
246
230
TSpArrayD diff;
247
231
diff (" a,b,c" ) = b_sparse (" a,b,c" ) - b_cp (" a,b,c" );
248
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
232
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
249
233
BOOST_CHECK (accurate);
250
234
}
251
235
// order-4 test
@@ -256,12 +240,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_als) {
256
240
&this ->init_unit_tile <TensorD>);
257
241
size_t cp_rank = 1 ;
258
242
factors = cp::btas_cp_als (*GlobalFixture::world, b_sparse, cp_rank,
259
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
243
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 ,
244
+ verbose);
260
245
261
246
auto b_cp = cp::reconstruct (factors);
262
247
TSpArrayD diff;
263
248
diff (" a,b,c,d" ) = b_sparse (" a,b,c,d" ) - b_cp (" a,b,c,d" );
264
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
249
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
265
250
BOOST_CHECK (accurate);
266
251
}
267
252
// order-5 test
@@ -272,7 +257,8 @@ BOOST_AUTO_TEST_CASE(btas_cp_als) {
272
257
&this ->init_unit_tile <TensorD>);
273
258
size_t cp_rank = 1 ;
274
259
factors = cp::btas_cp_als (*GlobalFixture::world, b_sparse, cp_rank,
275
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
260
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 ,
261
+ verbose);
276
262
277
263
auto b_cp = cp::reconstruct (factors);
278
264
TSpArrayD diff;
@@ -304,12 +290,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_rals) {
304
290
&this ->init_unit_tile <TensorD>);
305
291
size_t cp_rank = 1 ;
306
292
factors = cp::btas_cp_rals (*GlobalFixture::world, b_dense, cp_rank,
307
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
293
+ compute_trange1 (cp_rank, rank_tile_size), 0 ,
294
+ 1e-3 , verbose);
308
295
309
296
auto b_cp = cp::reconstruct (factors);
310
297
TArrayD diff;
311
298
diff (" a,b,c" ) = b_dense (" a,b,c" ) - b_cp (" a,b,c" );
312
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
299
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
313
300
BOOST_CHECK (accurate);
314
301
}
315
302
// order-4 test
@@ -320,12 +307,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_rals) {
320
307
&this ->init_unit_tile <TensorD>);
321
308
size_t cp_rank = 1 ;
322
309
factors = cp::btas_cp_rals (*GlobalFixture::world, b_dense, cp_rank,
323
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
310
+ compute_trange1 (cp_rank, rank_tile_size), 0 ,
311
+ 1e-3 , verbose);
324
312
325
313
auto b_cp = cp::reconstruct (factors);
326
314
TArrayD diff;
327
315
diff (" a,b,c,d" ) = b_dense (" a,b,c,d" ) - b_cp (" a,b,c,d" );
328
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
316
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
329
317
BOOST_CHECK (accurate);
330
318
}
331
319
// order-5 test
@@ -336,12 +324,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_rals) {
336
324
&this ->init_unit_tile <TensorD>);
337
325
size_t cp_rank = 1 ;
338
326
factors = cp::btas_cp_rals (*GlobalFixture::world, b_dense, cp_rank,
339
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
327
+ compute_trange1 (cp_rank, rank_tile_size), 0 ,
328
+ 1e-3 , verbose);
340
329
341
330
auto b_cp = cp::reconstruct (factors);
342
331
TArrayD diff;
343
332
diff (" a,b,c,d,e" ) = b_dense (" a,b,c,d,e" ) - b_cp (" a,b,c,d,e" );
344
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
333
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
345
334
BOOST_CHECK (accurate);
346
335
}
347
336
@@ -353,12 +342,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_rals) {
353
342
&this ->init_rand_tile <TensorD>);
354
343
size_t cp_rank = 77 ;
355
344
factors = cp::btas_cp_rals (*GlobalFixture::world, b_sparse, cp_rank,
356
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
345
+ compute_trange1 (cp_rank, rank_tile_size), 0 ,
346
+ 1e-3 , verbose);
357
347
358
348
auto b_cp = cp::reconstruct (factors);
359
349
TSpArrayD diff;
360
350
diff (" a,b,c" ) = b_sparse (" a,b,c" ) - b_cp (" a,b,c" );
361
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
351
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
362
352
BOOST_CHECK (accurate);
363
353
}
364
354
// order-4 test
@@ -369,12 +359,13 @@ BOOST_AUTO_TEST_CASE(btas_cp_rals) {
369
359
&this ->init_unit_tile <TensorD>);
370
360
size_t cp_rank = 1 ;
371
361
factors = cp::btas_cp_rals (*GlobalFixture::world, b_sparse, cp_rank,
372
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
362
+ compute_trange1 (cp_rank, rank_tile_size), 0 ,
363
+ 1e-3 , verbose);
373
364
374
365
auto b_cp = cp::reconstruct (factors);
375
366
TSpArrayD diff;
376
367
diff (" a,b,c,d" ) = b_sparse (" a,b,c,d" ) - b_cp (" a,b,c,d" );
377
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
368
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
378
369
BOOST_CHECK (accurate);
379
370
}
380
371
// order-5 test
@@ -385,7 +376,8 @@ BOOST_AUTO_TEST_CASE(btas_cp_rals) {
385
376
&this ->init_unit_tile <TensorD>);
386
377
size_t cp_rank = 1 ;
387
378
factors = cp::btas_cp_als (*GlobalFixture::world, b_sparse, cp_rank,
388
- compute_trange1 (cp_rank, 80 ), 0 , 1e-3 );
379
+ compute_trange1 (cp_rank, rank_tile_size), 0 , 1e-3 ,
380
+ verbose);
389
381
390
382
auto b_cp = cp::reconstruct (factors);
391
383
TSpArrayD diff;
@@ -415,10 +407,10 @@ BOOST_AUTO_TEST_CASE(ta_cp_als) {
415
407
auto b_dense = make_array<TArrayD>(*GlobalFixture::world, tr3,
416
408
&this ->init_unit_tile <TensorD>);
417
409
size_t cp_rank = 1 ;
418
- auto b_cp = compute_cp (b_dense, cp_rank);
410
+ auto b_cp = compute_cp (b_dense, cp_rank, verbose );
419
411
TArrayD diff;
420
412
diff (" a,b,c" ) = b_dense (" a,b,c" ) - b_cp (" a,b,c" );
421
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
413
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
422
414
BOOST_CHECK (accurate);
423
415
}
424
416
// order-4 test
@@ -427,11 +419,11 @@ BOOST_AUTO_TEST_CASE(ta_cp_als) {
427
419
auto b_dense = make_array<TArrayD>(*GlobalFixture::world, tr4,
428
420
&this ->init_unit_tile <TensorD>);
429
421
size_t cp_rank = 1 ;
430
- auto b_cp = compute_cp (b_dense, cp_rank);
422
+ auto b_cp = compute_cp (b_dense, cp_rank, verbose );
431
423
432
424
TArrayD diff;
433
425
diff (" a,b,c,d" ) = b_dense (" a,b,c,d" ) - b_cp (" a,b,c,d" );
434
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
426
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
435
427
BOOST_CHECK (accurate);
436
428
}
437
429
// order-5 test
@@ -441,11 +433,11 @@ BOOST_AUTO_TEST_CASE(ta_cp_als) {
441
433
auto b_dense = make_array<TArrayD>(*GlobalFixture::world, tr5,
442
434
&this ->init_unit_tile <TensorD>);
443
435
size_t cp_rank = 1 ;
444
- auto b_cp = compute_cp (b_dense, cp_rank);
436
+ auto b_cp = compute_cp (b_dense, cp_rank, verbose );
445
437
446
438
TArrayD diff;
447
439
diff (" a,b,c,d,e" ) = b_dense (" a,b,c,d,e" ) - b_cp (" a,b,c,d,e" );
448
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < 1e-10 );
440
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_dense) < target_rel_error );
449
441
BOOST_CHECK (accurate);
450
442
}
451
443
@@ -458,10 +450,10 @@ BOOST_AUTO_TEST_CASE(ta_cp_als) {
458
450
&this ->init_rand_tile <TensorD>);
459
451
b_sparse.truncate ();
460
452
size_t cp_rank = 77 ;
461
- auto b_cp = compute_cp (b_sparse, cp_rank);
453
+ auto b_cp = compute_cp (b_sparse, cp_rank, verbose );
462
454
TSpArrayD diff;
463
455
diff (" a,b,c" ) = b_sparse (" a,b,c" ) - b_cp (" a,b,c" );
464
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
456
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
465
457
BOOST_CHECK (accurate);
466
458
}
467
459
// order-4 test
@@ -472,10 +464,10 @@ BOOST_AUTO_TEST_CASE(ta_cp_als) {
472
464
&this ->init_unit_tile <TensorD>);
473
465
b_sparse.truncate ();
474
466
size_t cp_rank = 1 ;
475
- auto b_cp = compute_cp (b_sparse, cp_rank);
467
+ auto b_cp = compute_cp (b_sparse, cp_rank, verbose );
476
468
TSpArrayD diff;
477
469
diff (" a,b,c,d" ) = b_sparse (" a,b,c,d" ) - b_cp (" a,b,c,d" );
478
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
470
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
479
471
BOOST_CHECK (accurate);
480
472
}
481
473
// order-5 test
@@ -485,10 +477,10 @@ BOOST_AUTO_TEST_CASE(ta_cp_als) {
485
477
auto b_sparse = make_array<TSpArrayD>(*GlobalFixture::world, tr5,
486
478
&this ->init_unit_tile <TensorD>);
487
479
double cp_rank = 1 ;
488
- auto b_cp = compute_cp (b_sparse, cp_rank);
480
+ auto b_cp = compute_cp (b_sparse, cp_rank, verbose );
489
481
TSpArrayD diff;
490
482
diff (" a,b,c,d,e" ) = b_sparse (" a,b,c,d,e" ) - b_cp (" a,b,c,d,e" );
491
- bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < 1e-10 );
483
+ bool accurate = (TA::norm2 (diff) / TA::norm2 (b_sparse) < target_rel_error );
492
484
BOOST_CHECK (accurate);
493
485
}
494
486
}
0 commit comments