TODO.md (7810B)
1 # Ideas, improvements, things that I may never do... 2 3 This document contains a list of ideas for possible new features or 4 improvements to nissy-core. This file used to be private, but it makes 5 more sense to have it public, in case someone else wants to contribute. 6 7 ## Priorities 8 9 Items in this section are what I consider top priorities. They enable or 10 simplify using nissy-core as a library inside other projects. 11 12 ### Python packaging and distribution 13 14 Make a [PyPI](https://pypi.org/) package for nissy-core. There is already 15 a Python module in the `python/` folder, and it builds both on UNIX and on 16 Windows, so this should not require too much work. It is also possible to 17 make this process automatic using GitHub actions or something similar. 18 19 The documentation of the Python module should also be improved. 20 21 ### WASM interface improvements 22 23 Currently there is a proof-of-concept web version for the H48 optimal 24 solver (see [h48.tronto.net](https://h48.tronto.net) - it is based on 25 a very old version of the solver). This needs some polishing, namely: 26 27 * The main thing we want to do is enabling downloading the pruning tables 28 in small pieces and show a progress bar of some sort. The best way to do 29 this would probably be handling all the data storage logic in JavaScript 30 code (`http/worker.mjs`) rather than in C++ (`storage.cpp`). With this, 31 we should also be able to remove the `-sASYNCIFY` and `-sFETCH` options 32 from the Emscripten build command. 33 * Table generation can be removed from the web version. 34 * Logging can also be simplified by just using `console.log`. We will then 35 loose the ability to show the log pane in the HTML page, but this is not 36 very interesting to the user. If future applications based on nissy-core 37 want to notify the user of the status of the solver, we can handle this 38 later with callback parameters to the solve function. 39 * For now it is fine to stick to 32-bit WASM and limit ourselves to 1.8GB 40 tables at most. 41 42 If possible, it would be nice to publish a nissy-core package on 43 [NPM](https://www.npmjs.com/). 44 45 ### Improved documentation 46 47 Currently, there is documentation in multiple places, like the `doc/` 48 folder and the `nissy.h` header. This documentation should be expanded 49 into a sort of "developer guide" for contributing to the project. 50 Some critical parts of the code base could also be better commented. 51 52 For example, a list of instructions for implementing a new solver can 53 be useful. 54 55 ## Turning this into a usable application 56 57 There are at least three ways to turn this into a useful tool for FMC 58 training. I don't know if I want to work on any of these in the near 59 future - they are all up for grabs! 60 61 ### CLI application 62 63 The easiest interface to make for nissy-core is a command line 64 one. This can be done be either improving on the shell in this 65 repository (see `shell/`), or by plugging this library into the old 66 [nissy](https://nissy.tronto.net). In either case, the result would not 67 be much different from the latest version of nissy-classic: there would 68 be a faster optimal solver, but some other features may be missing. 69 70 ### Desktop application 71 72 It is easy to use nissy-core as a library in a C or C++ based 73 application. I have some examples using the QT framework in 74 [qt-experiments](https://github.com/sebastianotronto/qt-experiments) 75 (note: the examples there are based on a very old version of nissy-core). 76 77 Distribution could be a bit of a pain, especially for Linux. That's why 78 I would personally prefer making a TUI-based application. For example, 79 [termbox2](https://github.com/termbox/termbox2) could be a good library 80 for this, if they implement Windows support. 81 82 Yet another option is using Python (for example with QT, via 83 [PySide6](https://doc.qt.io/qtforpython-6/)). 84 85 ### Web application 86 87 Since nissy-core builds to WebAssembly, it is possible to use it as a 88 library for a WebApp. This would run entirely in the user's browser, 89 like [h48.tronto.net](https://h4.tronto.net). 90 91 It would also be nice to turn it into an installable PWA, see [this 92 repository](https://github.com/chr15m/minimal-pwa) for a minimal example. 93 94 ## Additional features 95 96 Possible new features for nissy. 97 98 ### Additional solvers 99 100 More solvers, or options for current solvers, can be added: 101 102 * Finish from HTR. This is available in nissy-classic and it is not hard 103 to implement. 104 * Direct HTR, without having DR or EO. This can be useful for finding HTR 105 trigger that break DR. The pruning table for this one is too big, but 106 we can take advantage of the H48 tables. 107 * Floppy reduction. 108 * JZP / Axial reduction, from EO or direct. 109 * Slice solver, using 110 [VR](https://www.youtube.com/watch?v=8SHjQtvuz5Q&list=PL0DmWpJUeHN-o0OKYhDe7w8O6GahIvOtx&index=2). 111 * Finish / leave double slice from JZP. This is a different type of solver, 112 because we want to look from both sides for increasingly long solutions 113 and meet in the middle. Similarly, we may also want to implement a 114 "leave double slice" and a "solve double slice" steps. 115 * Finish / HTR / JZP finish / leave slice etc... with minimal number of 116 quarter turns. 117 118 ### Coordinate solvers improvements 119 120 The coordinate solvers do not support pause / resume / stop via callback 121 function. This is not too hard to add (just copy what the H48 solver is doing), 122 but also not too useful, as coordinate solvers are generally very fast. 123 124 ## Performance improvements 125 126 I have worked a lot on performance, but some things can still be improved. 127 128 ### H48 performance improvements 129 130 The only idea I have left for improving the performance of the H48 optimal 131 solver is implementing *microthreading*. This means making the main 132 solve DFS iterative, and working on multiple DFS branches at the same 133 time on the same physical thread. The end goal is taking advantage of 134 [prefetching](https://sebastiano.tronto.net/blog/2026-01-28-prefetch/) 135 even further. 136 137 ### Coordinate solvers 138 139 Neither the solve algorithm nor the pruning table generation for 140 coordinate solver is parallelized. It should not be hard to do (just 141 copy what is done for the H48 optimal solver), but coordinate solvers 142 are generally small and fast. Parallelized pruning table generation 143 could save some time though. 144 145 ### Cube analysis 146 147 A new API function can be added to analyze a given cube position. 148 Example of analysis are: 149 150 * HTR state. Should return a short name for the HTR case. 151 * EO state (no NISS). First a nomenclature for EO cases should be defined. 152 * ARM subsets. 153 * VR case. 154 155 ## Technical improvements 156 157 I lumped together here a bunch of possible improvements that would not 158 affect the use of the library much, but can still be useful or interesting 159 for developers. 160 161 ### On-line (internal) documentation 162 163 Currently the only way to know which solvers are available is reading the 164 `doc/solver.md` page. There should be an API function to list available 165 solvers. Same thing for variations. 166 167 In general, there should be more documentation available from within 168 the library itself. 169 170 ### Python pause / stop / resume 171 172 The pause / stop / resume via callback functionality for the H48 optimal 173 solver is not supported in the Python module. I tried to make it to work, 174 but I had some issues which I suspect were related to the GIL and the 175 fact the the solver is multi-threaded. However, I get the exact same 176 issues with no-GIL versions of Python. 177 178 I have tried calling the callback function from within an `ALLOW_THREADS` 179 block, but I get a segfault. If I remove the `ALLOW_THREADS` blocks, 180 the program hangs indefinitely. 181 182 Good luck debugging this. 183 184 ### Better Windows development support 185 186 The build script for Windows has fewer options than the UNIX one. For 187 example, to configure the maximum number of threads a developer would 188 have to manually edit the build script. 189 190 I'll leave this one to anyone who actually wants to work on nissy-core 191 from Windows.