1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
# 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
|