aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/h48/gendata_h48.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/h48/gendata_h48.h')
-rw-r--r--src/solvers/h48/gendata_h48.h34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/solvers/h48/gendata_h48.h b/src/solvers/h48/gendata_h48.h
index e8ffee3..2a62b1d 100644
--- a/src/solvers/h48/gendata_h48.h
+++ b/src/solvers/h48/gendata_h48.h
@@ -344,7 +344,7 @@ gendata_h48k2(gendata_h48_arg_t *arg)
344 344
345 uint8_t t, selectedbase, *table; 345 uint8_t t, selectedbase, *table;
346 int64_t j; 346 int64_t j;
347 uint64_t nshort, i, ii, inext, count; 347 uint64_t i, ii, inext, count;
348 h48map_t shortcubes; 348 h48map_t shortcubes;
349 gendata_h48short_arg_t shortarg; 349 gendata_h48short_arg_t shortarg;
350 h48k2_dfs_arg_t dfsarg[THREADS]; 350 h48k2_dfs_arg_t dfsarg[THREADS];
@@ -367,8 +367,7 @@ gendata_h48k2(gendata_h48_arg_t *arg)
367 .selfsim = arg->selfsim, 367 .selfsim = arg->selfsim,
368 .map = &shortcubes 368 .map = &shortcubes
369 }; 369 };
370 nshort = gendata_h48short(&shortarg); 370 gendata_h48short(&shortarg);
371 LOG("Cubes in <= %" PRIu8 " moves: %" PRIu64 "\n", shortdepth, nshort);
372 371
373 selectedbase = base[arg->h]; 372 selectedbase = base[arg->h];
374 arg->info = (tableinfo_t) { 373 arg->info = (tableinfo_t) {
@@ -434,6 +433,7 @@ gendata_h48k2_return_size:
434STATIC void * 433STATIC void *
435gendata_h48k2_runthread(void *arg) 434gendata_h48k2_runthread(void *arg)
436{ 435{
436 uint64_t count, coord, mutex;
437 kvpair_t kv; 437 kvpair_t kv;
438 h48k2_dfs_arg_t *dfsarg; 438 h48k2_dfs_arg_t *dfsarg;
439 439
@@ -447,15 +447,22 @@ gendata_h48k2_runthread(void *arg)
447 pthread_mutex_unlock(dfsarg->shortcubes_mutex); 447 pthread_mutex_unlock(dfsarg->shortcubes_mutex);
448 break; 448 break;
449 } 449 }
450 (*dfsarg->count)++; 450 count = ++(*dfsarg->count);
451 if (*dfsarg->count % UINT64_C(1000000) == 0)
452 LOG("Processing %" PRIu64 "th short cube\n",
453 *dfsarg->count);
454
455 pthread_mutex_unlock(dfsarg->shortcubes_mutex); 451 pthread_mutex_unlock(dfsarg->shortcubes_mutex);
456 452
457 dfsarg->cube = invcoord_h48(kv.key, dfsarg->crep, 11); 453 if (count % UINT64_C(1000000) == 0)
458 gendata_h48k2_dfs(dfsarg); 454 LOG("Processing %" PRIu64 "th short cube\n", count);
455
456 if (kv.val < dfsarg->shortdepth) {
457 coord = kv.key >> (int64_t)(11 - dfsarg->h);
458 mutex = H48_INDEX(coord, dfsarg->k) % CHUNKS;
459 pthread_mutex_lock(dfsarg->table_mutex[mutex]);
460 set_h48_pval(dfsarg->table, coord, dfsarg->k, 0);
461 pthread_mutex_unlock(dfsarg->table_mutex[mutex]);
462 } else {
463 dfsarg->cube = invcoord_h48(kv.key, dfsarg->crep, 11);
464 gendata_h48k2_dfs(dfsarg);
465 }
459 } 466 }
460 467
461 return NULL; 468 return NULL;
@@ -524,16 +531,17 @@ STATIC_INLINE void
524gendata_h48k2_mark(cube_t cube, int8_t depth, h48k2_dfs_arg_t *arg) 531gendata_h48k2_mark(cube_t cube, int8_t depth, h48k2_dfs_arg_t *arg)
525{ 532{
526 uint8_t oldval, newval; 533 uint8_t oldval, newval;
527 int64_t coord, fullcoord; 534 int64_t coord, fullcoord, mutex;
528 535
529 FOREACH_H48SIM(cube, arg->cocsepdata, arg->selfsim, 536 FOREACH_H48SIM(cube, arg->cocsepdata, arg->selfsim,
530 fullcoord = coord_h48(cube, arg->cocsepdata, 11); 537 fullcoord = coord_h48(cube, arg->cocsepdata, 11);
531 coord = fullcoord >> (int64_t)(11 - arg->h); 538 coord = fullcoord >> (int64_t)(11 - arg->h);
532 pthread_mutex_lock(arg->table_mutex[coord % CHUNKS]); 539 mutex = H48_INDEX(coord, arg->k) % CHUNKS;
540 pthread_mutex_lock(arg->table_mutex[mutex]);
533 oldval = get_h48_pval(arg->table, coord, arg->k); 541 oldval = get_h48_pval(arg->table, coord, arg->k);
534 newval = (uint8_t)MAX(depth, 0); 542 newval = (uint8_t)MAX(depth, 0);
535 set_h48_pval(arg->table, coord, arg->k, MIN(oldval, newval)); 543 set_h48_pval(arg->table, coord, arg->k, MIN(oldval, newval));
536 pthread_mutex_unlock(arg->table_mutex[coord % CHUNKS]); 544 pthread_mutex_unlock(arg->table_mutex[mutex]);
537 ) 545 )
538} 546}
539 547

Generated with cgit - Back to sebastiano.tronto.net