| 404 | } |
| 405 | |
| 406 | void fillPatternCodeLUT(PatternCode pcode[PATTERN_NB][PATTERN_NB][PATTERN_NB][PATTERN_NB]) |
| 407 | { |
| 408 | constexpr int N = PATTERN_NB; |
| 409 | constexpr int N2 = N * N; |
| 410 | constexpr int N3 = N2 * N; |
| 411 | constexpr int N4 = N3 * N; |
| 412 | int v[N4] = {-1}; |
| 413 | |
| 414 | for (int x = 0, i = 0; x < N; x++) |
| 415 | for (int y = 0; y < N; y++) |
| 416 | for (int z = 0; z < N; z++) |
| 417 | for (int w = 0; w < N; w++) { |
| 418 | int a = x, b = y, c = z, d = w; |
| 419 | if (a > b) |
| 420 | std::swap(a, b); |
| 421 | if (c > d) |
| 422 | std::swap(c, d); |
| 423 | if (a > c) |
| 424 | std::swap(a, c); |
| 425 | if (b > d) |
| 426 | std::swap(b, d); |
| 427 | if (b > c) |
| 428 | std::swap(b, c); |
| 429 | |
| 430 | v[i++] = a * N3 + b * N2 + c * N + d; |
| 431 | } |
| 432 | |
| 433 | for (int i = 0; i < N4; i++) |
| 434 | if (v[i] > -1) |
| 435 | for (int j = i + 1; j < N4; j++) |
| 436 | if (v[i] == v[j]) |
| 437 | v[j] = -1; |
| 438 | |
| 439 | for (int i = 0, count = 0; i < N4; i++) |
| 440 | if (v[i] > -1) |
| 441 | v[i] = count++; |
| 442 | |
| 443 | for (int i = 0; i < N; i++) |
| 444 | for (int j = 0; j < N; j++) |
| 445 | for (int m = 0; m < N; m++) |
| 446 | for (int n = 0; n < N; n++) { |
| 447 | int a = i, b = j, c = m, d = n; |
| 448 | if (a > b) |
| 449 | std::swap(a, b); |
| 450 | if (c > d) |
| 451 | std::swap(c, d); |
| 452 | if (a > c) |
| 453 | std::swap(a, c); |
| 454 | if (b > d) |
| 455 | std::swap(b, d); |
| 456 | if (b > c) |
| 457 | std::swap(b, c); |
| 458 | |
| 459 | pcode[i][j][m][n] = v[a * N3 + b * N2 + c * N + d]; |
| 460 | } |
| 461 | } |
| 462 | |
| 463 | template <Rule R> |