# TODO list This is a list of things that I would like to add or change at some point. It's more of a personal reminder than anything else. ## After symcoord ### Fixing stuff + completing new optimal solver - clean up fst, check if more can be improved - fst inverse tables: save to file ### generic: * all files should have an init function, calling the ones of the files includes + doing more stuff. A static "initiliazed" variable is probably needed too. ### testing! * generic test util: function taking an array of tests, an array of testnames (or maybe tests should be their own type?) and running them * separate "commands" for testing different parts (e.g. ./test coord) * test coordinate (needed anyway to test fst) * other tests (start from bottom: utils.c) * move test_coord to the testing folder ### Solving standard coordinates * add Void * extradata to DfsArg and a custom move function * add optional custom pre-process for generating special table (nx) * copy_dfsdata should copy extra too! ### Solving simplification / refactor * Split solve in solve_coord, solve_generic, solve_singlethread... * Rework choicesteps: simplify, remove one type of rotation... ### nx.c * implement nxopt with all tables and all tricks (maybe compile time variable for maximum memory to use?) * is_valid should also unniss / cleanup the alg ### Other easy refactor * split cubetypes.h into other files ## For version 2.1 ### Changes to Step and Solve * remove cube from dfsarg? (i still need to save the scramble somewhere, but I really only use it in dfs_niss) * coord.c: all old coordinates (WIP...) * steps.c: checkers (use coordinates), all stepalt and steps (WIP...) * commands gen and freemem * commands.c: twophase, ...? ### Rotate, not transform, before solving * solve should re-orient first if needed and not just give up if centers are off ### Documentation * Document how coordinates and pruning tables work now * Write an examples.md file * More screenshots! ### Tables management * Check files in tables directory automatically remove old / extraneous files * Add checksum to check that tables are generated / downloaded correctly ### Conditional compiling * Option to avoid large tables at compile time * option to avoid multithreading (write a simpler solve for t=1, and also check if found enough solutions before checking pruning values) ### Technical * generic option parser * scan system to get best number of threads ### Commands * Easy: add option -I (inverse) and -L (linear, like inverse + normal) to do only linear NISS * message for -N ignored say -n (lowercase) ## Commands ### Commands that are available in nissy 1.0, but not in this version (yet): * drcorners (solve corners after dr) * search and improve non-optimal subsequences * save and edit algs as "variables" (or just use a "logging system" to keep info about previously run commands, including e.g. solutions that were not shown because -c) ### More steps for `solve` * QTM optimal solving * 5-side solve (for robots) * Block-building steps (cross, roux blocks, ...) * Other common steps (LSE, ...) * Larger table for drudfin (include epe)? About 1Gb uncompressed, 500Mb compressed (fallback to noE), 250 compressed + parity trick (is it doable?) ### Improvements to currently implemented commands * solve multidfs: do multithread by step, not by alternative (this way if there are multiple alternatives it can make use of more threads) * solve should try up to a small bound without loading the large pruning table (maybe this is not necessary if loading the table is fast enough) * silent batch mode without >>> * Optimal solver: when asking for only one solution, scan for upper bound in parallel using a two-phase solver. ### New features * EO analysis (and also DR and HTR analysis): group similar EOs together and such (suggested by Jay) * configurability: add an `alias` command, run config file at startup * command notation to list available moves * make multi-step solve much more general and create command * input directly cube status instead of moves (graphical: maybe there is a cubing.js function; command line: ???) ## Distribution * webapp (cgi) ## Technical stuff ### Memory management * free pruning table after solve is done? if I do this I need to deafault to a small table for < 8 moves solutions or smth * improve multi-threading when solving multiple scrambles * nissy -M maxmem option for running with at most maxmem memory; if exceeded when loading a pruning table, return failure (or make every solve command use tiny tables instead?); if maxmem is very 600Mb or less do not use invtables (the performance loss is minimal anyway). If the limit is really tiny, do not use mtables or ttables (but this would be very slow and probably nobody will ever use it) * Check if memory is enough for loading pruning tables; if not, abort * For optimal solver: choose largest that fits in memory between nxopt and light ### Structural changes * client/server architecture: run a server process in the background so that multiple client processess can send it queries and get results; this would open up the door for a web-based version or graphical clients ### Cleanup * sort again functions alphabetically in their files * change some function and variable names to make everything consistent * more stuff to load at start (or when suitable command is called) rather than when called directly, to avoid nasty problems with threading * parse command args: one function per arg type, then each command has a list of options that it accepts (as a string) ### Style * do not declare all variables at the beginning of a function * remove var names from prototypes * various stuff from style(9) ### Random Collect random info like this somewhere: Table pt_nxopt31_HTM Base value: 9 0 1 1 6 2 29 3 164 4 1433 5 16772 6 205033 7 2513871 8 30329976 9 342440769 10 2815191126 11 6147967200 12 524918774 13 3546 14 0 15 0