h48

A prototype for an optimal Rubik's cube solver, work in progress.
git clone https://git.tronto.net/h48
Download | Log | Files | Refs | README | LICENSE

commit a26ae103faf8fa53b65f7757fb8b4255a37fcd22
parent d5e7698d0c7ecb61fe49263982f750c053147089
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Thu, 16 Nov 2023 22:12:13 +0100

Cleaned + updated TODO

Diffstat:
MTODO.txt | 138++++++++++++++++++++++++++++++++++---------------------------------------------
1 file changed, 59 insertions(+), 79 deletions(-)

diff --git a/TODO.txt b/TODO.txt @@ -1,82 +1,43 @@ -## Roadmap - -See the sections below for details - -* Tests for multisolve -* More tests for simple solver? -* Benchmarks? -* More complex optimal solvers, pruning tables -* (More) benchmarks -* Multithreading (build-time option number of threads) -* Other optimizations -* Extend cube and moves to include centers -* NISS -* Move manipulation utilities -* Coordinate solvers and other steps -* More output formats -* Adapters for other languages (at least python) -* More documentation (or keep all in cube.h?) -* Rename to libnissy -* Release 1.0 - -## Small change - -* solve tests: make smaller, split - -## Solving - -### Simple (slow, light) solver - -* Decide on API for solve() (see above) -* solve generic becomes private, use cube_fast_t instead of cube_t -* write simple solver based on generic -* tests: solve full cube (max 7-8 moves?) -* benchmarks - -### Coordinates - -TODO: specify in the comments that coordinates return 0 if solved - -* [done] eo -* co -* ep -* epsep -* cp -* cpsep -* cphtr - -What about symcoord? - -### More solvers - -* solve_light: first based on solve_generic, then optimize; benchmark - to see up to what length it works best (7 moves? 10 moves?) - -### Implement the following solvers: - -* Slow: basic solver without any table. -* H48: one-bit-per-entry table + fallback, 48 symmetries and so on. - See planner. -* nxopt31: mostly for comparison. -* other nxopt solvers: make generic and take the type as parameter. -* Step solver: take a coordinate function and a moveset as a parameter. - -### New method: - -* 48 symmetries, cocsep (or chtr, or similar) + epsep + some EO -* 1 bit per entry + fallback -* store necessary stuff (e.g. ttrep) all interleaved in the same table - -### Other considerations: - -* Reconsider going corners-first, so there is no need to sumco() - -### Pruning tables - -* ptable should contain some extra data at the beginning: - an integer (size) - a checksum - some summary info, maybe even in text form +## (find better name) H48 solver, ideas + +First compute co + csep. Use csep as a binary number (2^8 instead of 70, +loose a factor of 3.66 but still fits in a few megabytes or less). Use +co + csep as an index in a table whose entries have: 6 bits for ttrep, +12 bits for rep, 4 bits for pruning. Optionally, 4 more bits could be +used for the base of the pruning table, if we want to have a different +base for each corner state; but probably not useful. + +If the first pruning is enough, or if the base value of the pruning table +(see below) is too low, do not compute the full coordinate (which includes +epsep + partial EO, 12 different sizes depending on how many edges). + +Otherwise, transform edges only using ttrep and compute full coordinate. +Look up in table. 3 types of table: +1. 4 bits per entry, full pruning table +2. 3 bits with base value (let's try, why not) +3. 2 bits with base value, nxopt style +4. 1 bit per entry, telling only if more or less than mid value +Types 2-4 require benchmarks, a lot of them. + +Inverse probing (no need to compute inverse, compute one at the beginning +and keep adding premoves); better do first part of pruning for both +normal and inverse and only then search in the full table. + +If inverse probing gives tight bound, reduce branching factor, optionally +switch. Here NISS may be useful. + +## Other solvers + +* ptable should contain some extra data at the beginning: an integer (size) + a checksum some summary info, maybe even in text form +* multisolve +* use threads +* nxopt (various sizes, for comparison; also use base value probing + and benchmarking) +* Coordinate solver for replacing nissy backend (specify in the comments + that coordinates return 0 if solved) +* improve light solver with no table; consider using a small, hard-coded + table, e.g. H48 corner table? ## Optimizations @@ -147,3 +108,22 @@ For example, to apply the transformation RBm (mirrored RB) to a cube C: 2. Rotate the mirrored cube with z' y2 3. Apply the cube C to the transformed solved cube 4. Apply the transformations of step 1a and 1b in reverse + +## Roadmap + +* Tests for multisolve +* More tests for simple solver? +* Benchmarks? +* More complex optimal solvers, pruning tables +* (More) benchmarks +* Multithreading (build-time option number of threads) +* Other optimizations +* Extend cube and moves to include centers +* NISS +* Move manipulation utilities +* Coordinate solvers and other steps +* More output formats +* Adapters for other languages (at least python) +* More documentation (or keep all in cube.h?) +* Rename to libnissy +* Release 1.0