6 ms·
The best practical technique is generate random problems, and compare your solver with another (or two), and hope you didn't both have the same bugs :) You can
by CJefferson 2y ago
The best practical technique is generate random problems, and compare your solver with another (or two), and hope you didn't both have the same bugs :)
You can also often make progress by "shuffling" problems (reordering constraints / variables), or solving sub-problems + super-problems.
- hansvm 2y agoThis is my go-to technique for tricky code. Most of the time it's pretty easy to write a dumb, slow, almost certainly correct version of the thing in question and just fuzz the two implementations on small inputs. E.g., if you're speeding up floating-point division by 2 with bit-hacks in the exponent field, compare it to just dividing by 2 (and for up to 32-bit floats, just check all of them). If you're implementing a sort, compare it to bubble-sort. If you're implementing a SAT solver, compare that to just checking every possible solution (and even for a comparison solver that slow you can check every possible problem up to ~4-6 terms (depending a bit on how you define a "term") and spot-check problems with many terms and 30 independent variables).
- CJefferson 2y agoYes, I've done exactly this with my constraint solver ( https://github.com/minion/minion https://github.com/minion/minion ). Famous last words, almost all bugs that have been reported have been repeatable with 6 variables of domain size at most 6 (maybe even less). The only exceptions are cases where integer overflow occurs, and those really need seperate tests. I'm mostly handling that by putting fairly conservative bounds on maximum integer values, and asserting if those are ever violated, because (particularly as academic software), an assertion where your solve might work but is undertested is (in my mind) infinitely better than a wrong answer.
- hansvm 2y agoWhat sorts of code normally causes integer overflows in minion? I have to be super cautious of float overflows in most of my code, but usually with integers I'm implementing a bitmask or a 64-bit counter or something similarly not prone to such problems.
- CJefferson 2y agoJust boring old arithmetic, it's quite common for people to write maths problems which end up overflowing a 64-bit integer. Here's one I remember someone writing: There is a 'numbers game' on the UK show countdown, where you are given a series of 6 numbers, and need to add, multiply, subtract and divide them to make a target. They were considering generalisations. They wanted to allow '500' as an input number, and also allow 8 numbers. While their targets were numbers less than 10,000, 500^8 overflows a 64-bit integer, and we often want to find things like upper and lower bounds early on.