814s with v0.1 in Firefox 52 on an i7-6700 CPU @ 3.40GHz
Jacobi's strengths:
solves fairy proof games faster than Popeye in most cases,
solves proof games with undefined pieces (letter X),
supports special proof game options like AddPieces and ColorThePieces,
supports chaining multiple stipulations together.
Jacobi can also solve some ordinary help stipulations but there is very little reason to do that because Jacobi is on average 5x slower than Popeye for this type of problem. In addition, Popeye and WinChloe support more stipulations, fairy conditions, and fairy pieces. One reason, though, would be for conditions exclusive to Jacobi.
Jacobi can also solve orthodox proof games, but there is very little reason to do that because Jacobi should be slower than Natch or Euclide which are optimized for the orthodox case.
It cannot solve stipulations containing defensive moves, like directmates or selfmate, which is why the subtitle calls it a "helpgame solver". As an exception, Jacobi will accept one defensive halfmove at the very end of the problem.
Find an example problem that interests you from the documentation page.
Click on the corresponding "Load in solver" button.
On the solver page, click "Start".
Click on a solution to view it in the Game editor.
Feel free to experiment by modifying the "Text representation" box, but keep in mind that each time you change something, you have to click on "Set problem from text" and then "Start".
Offline use
Method 1
Just bookmark the latest version page so you can get to it directly. This page contains a WebWorker (and an AppCache manifest as fallback) which tells your browser to store every file needed by Jacobi on your computer/device so that the page still "loads" when offline in that particular browser. Some browsers even offer the option "Add to homescreen", which will turn Jacobi into a Web App that you can launch by clicking on an icon (as long as the browser remains installed and its application cache is not cleared).
Here are the features I'm planning to add soon, so don't bother suggesting them! Jacobi will reach v1.0 when they are all implemented.
Add a graphical editor for diagrams.
Add an editor for stipulations with dropdown menus to select from available stipulations and aims.
Add a graphical viewer for solutions.
Add a few more aims (%, 00, ep).
Add a few more fairy conditions (Chess960, FollowMyLeader, Duelist, Chameleon).
Warn of self-check in the initial position instead of crashing.
Teach the PG solver that doubled pawns imply a capture nearby when the fairy conditions are close to orthodox.
Teach the PG solver that the path traversed by a pawn appearing in the goal diagram can't be vertically crossed in some cases when fairy conditions are close to orthodox.
Rewrite the PG-demolition-mode code, hopefully making it faster.
Add a WebAssembly version of the chess engine for a speed increase of maybe 50% in modern browsers, with fallback to asm.js for the rest.
Document the "elementary commands".
License
Jacobi is freeware, which means that you are free to use it and make a copy for personal use, but not to redistribute copies as I retain the Copyright on it.
The code for the interface is unobfuscated JavaScript, feel free to look at it and propose patches to me. On the other hand, the Chess engine is obfuscated JavaScript, having been compiled from C with Emscripten. I'm keeping the C source code private.
Privacy
The problems that you enter are solved on your own computer using WebAssembly or JavaScript, and are not transmitted over the Internet.
Version history
Here I keep links to future, current, and old versions. Old versions are useful to you if I break something with an update. Future versions are not recommended unless you want to test upcoming features.
Fixed a crash with nightriders in VerticalCylinder.
Fixed a bug causing missing solutions in Circe Antipodes + RexMultiplex PGs.
Added the condition PowerTransfer with 16 options. The conditions Annan, BackToBack, FaceToFace, PointReflection and CircePowerTransfer are now obtained as PowerTransfer variants. The castling rule for these conditions has been modified and no longer matches Popeye 4.83, see the documentation.
Added the condition Nanna invented by Nicolas Dupont, a sort of opposite of Annan made possible by the condition PowerTransfer.
Added the condition MarsCirce with 16 options.
Obtained Make&Take = MarsCirce Couscous Make. See the documentation under MarsCirce Make Make&Take.
Added the Circe options PawnExclusive, Above, and Below. The last two are Jacobi inventions, see the documentation.
Added the AntiCirce options PawnExclusive, Above, and Below.
Improved performance when solving PGs with the option AddPieces and the condition NoCapture.
The error "nonsense combination of fairy conditions" now makes the distinction between "nonsense", "useless", and "unsupported".
Changed the castling notation in Einstein to something like "O-O [f1=B]", reserving O-O=B for cases where the piece that initiated castling is transformed.
Fixed a crash introduced in v0.7 when solving PGs with conditions close to orthodox.
Fixed a crash when solving AntiCirce Cage + Circe Parrain + Duelist PGs.
Fixed a bug when solving SwappingKings ser-dia.
Fixed a bug in UltraSchachZwang. Before, mate and stalemate were fairy but they're supposed to be orthodox. Now implemented as UltraSchachZwang = BlackMustCheck SemiUltra. Added the white and black variants to the list of conditions (bottom section).
Fixed a bug introduced in v0.6.6 causing no solution for normal ColorThePiece PGs (with defined pieces).
Improved the analysis of pawn structures for conditions close to orthodox. For example, the solving time of P1000971 improved 50x. Unfortunately, the solving time of P1353424 (Berolina DoubleMaximummer) is now 4x slower (input given in the documentation under Berolina Chess).
Improved the solving speed of ColorThePiece PGs (with defined pieces). The solving time of P0000111 improved 10000x (input given in the documentation under Coloring Problems).
Improved the detection of obstacle pawns in A-to-B problems. Using an a=>b stipulation can now be faster than a chained stipulation starting from the initial position.
Reenabled the wasm solver on iOS ≥ 13.0, the earliest version that works.
The button "Set problem from text" is now disabled when it is pressed, as a reminder that it has been clicked.
Constraints: Fixed a bug introduced in v0.6.4 causing a constraint like Sb1>c3~a7~c3~ to be sometimes wrongly interpreted as Sb1>c3~a7>c3~ when a square is repeated, causing missing solutions.
Constraints: When declaring a capture using "x" or "*", Jacobi now knows that a piece of the opponent must be sacrificed on the capture square (a few conditions excluded, like Circe).
Game Editor: Fixed a bug which caused the word "undefined" to sometimes appear in the game notation.
Fixed a crash introduced in v0.6.7 when solving GrowingMen + PointReflection PGs.
Fixed a crash introduced in v0.6.6 when solving AntiCirce Clone + BlackOscillatingKings PGs.
Fixed a castling bug when solving Chess960 + Einstein PGs.
Improved the PG solver to take into account some form of pawn obstruction for conditions close to orthodox. For example, the solving time of P1017659 improved 1000000x. Unfortunately, there is a 15% slowdown for problems that trigger the new analysis but don't benefit from it, such as P1004311.
Reenabled the wasm solver on iOS ≥ 13.1.3. It seems that a bug was fixed by Apple.
Constraints: Fixed a crash introduced in v0.6.7 when constraining a king in GrowingMen + KobulKings.
Constraints: The position of constraints in the input now matters. In a chained stipulation, constraints put mid-problem now apply to the game up to that point. If constraints apply to the entire problem, then they must now be put at the end of the problem after the last stipulation.
Fixed a crash introduced in v0.6.6 when solving SuperCirce PGs.
Fixed a bug introduced in v0.6.3 which caused missing checks and king capture with Sentinels + Koeko.
Fixed a bug which caused missing checks and king suicide with AllIn + AntiCirce Relaxed.
Fixed a bug in Fuddled Men which prevented castling through an attack by a fuddled piece.
Fixed game notation when a single move is followed by a series (for example, problems of the type "1w & ser-h").
Fixed a bug which caused the solver to fail to launch in Safari 13.
Added the condition ChameleonPursuit.
Added the condition Circe Cage.
Added the condition Circe Cage RexInclusive (implementing the anti-recursion rules given in the Circe Cage article).
Added the condition AntiCirce Cage.
Added the condition CircePowerTransfer (invented by Cornel Pacurar). A unit moves like the unit standing on its Circe rebirth square.
Added the condition Rapid, a teaching tool. See the documentation.
Added the convenience condition StagnatingMen = GrowingMen + ShrinkingMen.
Improved the speed of Extinction, SiameseKings, Kamikaze RexInclusive, AntiCirce Assassin, Circe Assassin, MemoryCirce RexInclusive, RexMultiplex, and BackHome by about 2x for PGs and non-PGs.
Improved the performance of the PG solver for GrowingMen, ShrinkingMen, and StagnatingMen by 20% to 70x depending on the problem, with a median of maybe 4x.
For fairness, "compute time" now includes preparation time. Before, the preparation step was nearly instantaneous for every problem, but GrowingMen PGs have become an exception, with possibly more exceptions in the future.
Game Editor: Added a button "Create a PG..." to automatically create a PG from the current diagram.
Game Editor: When changing conditions, the illegal portion of a previous game now appears in red instead of being discarded.
Fixed a crash introduced in v0.6.4 with some positions containing a pawn on its first rank.
Fixed a crash when solving Berolina + AntiCirce Platzwechsel PGs.
Fixed a bug in AllowTerminalAutoChecks + LeseMajeste which gave spurious solutions.
Temporarily switched to the asmjs solver on iOS, the wasm solver was causing missing solutions on recent iPhones for an unknown reason. [Update: the reason is probably the WebAssembly bug fixed in Safari Technology Preview Release 86].
Warn that Einstein with fairy pieces is not yet supported.
In Eiffel and Leffie, the order P->S->B->R->Q->P is now adjusted when conditions like CavalierMajeur or Berolina are added. Doing this contradicts Popeye in Eiffel + CavalierMajeur, but agrees with Popeye in ChameleonChess + CavalierMajeur, and seems like the right thing to do.
Modified Extinction + Circe Parrain and Extinction + MemoryCirce to be similar to MemoryCirce RexInclusive. Pieces in memory now cause extinction only when the opponent causes the rebirth to fail.
In Kk ReleasingCheck, when determining if a check is mate, allow capturing the opponent's king if it lifts the check to our own king, since this defense is allowed in orthodox double-mate aims (##).
Added the condition SiameseKings.
Added the condition PointReflection.
Added the condition RexMultiplex.
Added the condition Relay Chess.
Added the condition FuddledMen = Duelist Anti Ultra.
Added new fairy pieces: Waran, Elephant, Dragon, and Ship. These are simply combinations of pieces already available in Jacobi.
Can now use 2-letter fairy pieces in forsyth, for example ".BP" for a white Berolina pawn, and ".bp" for a black Berolina pawn.
Constraints: Improved solving speed by 0% to 100% depending on the problem, with a median of maybe 30%.
Constraints: Can now select a piece on the initial diagram without specifying its type by starting with an X, for example Xc1(0..0). Could be useful in Chess960.
Constraints: Can now use the notation Ke1-e1~ to specify that Ke1 can't castle in the initial position. This reduces solving time in some cases.
Constraints: Allow the "or" keyword to sequentially try different constraints.
Constraints: Allow multiple "constraints" keywords. When those constraints use "or", Jacobi will try every possibility in the Cartesian product. See the documentation under "Logical combinations".
Changed the behavior of Duelist in parry series to match Popeye: the idle side must choose the same unit if possible, even after a gap where it doesn't move.
Changed the behavior of Duelist to be more natural when combined with conditions that can move or modify pieces like Circe or Andernach. Jacobi now disagrees with Popeye, but agrees (for the most part) with WinChloe.
Constraints: Fixed a crash when Jacobi attempted to promote a pawn that is constrained to end on its 7th rank.
Fixed a bug in AntiCirce Relaxed which allowed king suicide.
Fixed a bug in Circe Assassin + Vogtlaender which allowed kings to be assassinated.
Fixed a crash introduced in v0.6.3 with Masand + Glasgow.
Added the condition Kamikaze Chess.
Added the condition Einstein WithPromotions.
Moved the Circe and AntiCirce variants VerticalSymmetry, HorizontalSymmetry, and Ibidem to the top section of conditions.
Improved the solving speed of every problem by 0-25% (depending on the problem and on the browser). Achieved by compiling using the LLVM WebAssembly backend. One exception is the example problem P1068521 which is now 10% slower in Firefox.
Further improved the solving speed of PWC PGs by 0-20%.
Improved the speed even more for PGs with Circe Equipollents, Circe Parrain, Circe ContraParrain, Circe Super, and AntiCirce Super, The improvement is sometimes modest, and sometimes spectacular (60x for P1069097).
Improved the performance of Circe Ibidem PGs (theoretically).
In Circe Parrain RexInclusive, report a single check when a king in memory is threatened because the number of threats is often large and not important. Use v0.6.3 to see multiple checks in the notation.
Constraints: Warn of more types of constraints that are impossible to achieve, for example Sb1>b3.
Constraints: Fixed a crash with AntiCirce Relaxed.
Constraints: Fixed a crash introduced in v0.6.3 when using constraints like Qd1-d1.
Constraints: Upperbounds on the number of moves were not correctly applied to suiciding pieces.
Constraints: For better performance, changed '>' to represent a non-castling move. Use '!' to declare a castling move.
Constraints: Can now constrain the number of rebirths with the notation (r1..3).
Got for free the condition MemoryCirce = Circe WaitCapture Symmetry Diametral.
Changed the behavior of Circe Parrain RexInclusive to be similar to MemoryCirce RexInclusive: A captured king in memory is not yet annihilated; it becomes annihilated only when its rebirth fails.
Improved the speed of Circe RexInclusive, Koeko, Isardam and Leffie by about 2x for PGs, and 2.5x for non-PGs.
Improved the speed of Andernach and AntiAndernach for PGs by 0% to 200% depending on the problem (about 20% on average).
Improved the speed when generating thousands of solutions with the solver setting "Keep going" or "Count only".
Changed a bit how constraints behave with fairy conditions, to accommodate AntiCirce.
Warn of constraints that are impossible to achieve, for example Pa2-b3, or more insidiously Pa2-a8 (forgetting to specify the promotion). Before, Jacobi would often instantly finish without feedback, and sometimes crash.
Unfortunately, there is a 5% slowdown for a few problems, caused by the big code change.
Series dia stipulations now always start with White (by default), to correspond to Popeye and PDB. For example, ser-hdia now starts with White, even though it starts with Black if the aim is different (mate, stalemate, ...).
Added the condition LeseMajeste, to allow illegal starting positions where the player to move is already checking the opponent's king.
Added the condition ReleasingCheck, which modifies the play-after-mate conditions (#R, #C, Kk) to authorize a temporary self-check.
Added a "Heuristic mode" to limit the search to solutions that are locally dual-free. See the documentation.
Constraints: Fixed a crash when using constraints under Circe Assassin or #R Chess.
Game editor: Made the "Editable game notation" box more permissive in what it accepts.
Game editor: Added markers to show legal moves. A marker is green if no local dual is detected, otherwise it is orange or red (depending on the type of dual). This is similar to iNatch.
Improved the dialog error box. The old dialog sometimes had the prefix "wismuth.com says" or a checkbox labeled "Prevent this page from creating additional dialogs".
In All-in Chess, forbid castling with the opponent's pieces if the mover's king is in check.
Added the condition Duelist (also known as Single Combat).
Added the condition WhiteFollowMyLeader.
Added the condition BlackFollowMyLeader.
Added some material to the documentation.
Switched to https for the link to the latest version, which seems to work better for offline.
Modified the condition NoImmediateRepetition to compare only the diagrams, not the positions, so that AllInChess + GrowingMen works as expected.
Fixed the stipulation parser to accept HS# written in uppercase. It stopped working in v0.2.3.
Use Service Workers for offline support instead of AppCache when loading over https. (Firefox's implementation of AppCache seems to be buggy over https.)
Fixed a bug introduced in v0.4.4 causing some rare crashes when solving PGs.
Fixed a crash with Chess960 + RoyalDynasty.
Added the condition BlackCap (implemented as BlackMustCapture SemiUltra + BlackPassesIfStuck).
Added the condition BlackChecks (implemented as BlackMustCheck SemiUltra + BlackPassesIfStuck). The text box also accepts the alternative name "Checking".
Added the condition Zigzag (implemented as WhiteMustCapture Anti SemiUltra + WhiteMustCheck Anti SemiUltra) and the variants ZigzagStapff and ZigzagUltra.
Improved the solving speed of some PGs with doubled pawns some more. Invisible promotions (Phoenix, Prenix and Ceriani-Frolkin) can now sometimes be deduced.
Fixed a crash with Madrasi.
Fixed a crash when solving Chess960 + VerticalCylinder PGs.
Fixed a crash when solving Circe Parrain PGs in demolition mode.
Fixed a bug causing a check by a pawn to be counted as a multiple check when the pawn would otherwise promote, in some fairy conditions.
Fixed a bug introduced in v0.2.3 causing the stipulations s#1 and r#1 to no longer work.
Fixed two bugs introduced in v0.4.2 that caused some crashes when solving PGs, and potentially caused missing solutions with LosingChess and Extinction.
Fixed a bug that prevented the "test" command from applying to the initial position. This is useful for adding constraints to the initial position in Chess960.
Replaced the "Flood protection" checkbox with a menu with a new option "Count only" which is more efficient for path enumeration problems with more than 1000 solutions.
Fixed a crash when solving Circe Parrain Assassin PGs.
Fixed a crash when solving AntiAndernach + NonRoyalKings PGs.
Fixed a bug in EiffelChess (there was paralysis of fairy pieces).
Fixed a bug in Woozles + White/BlackEdgemover.
Fixed bugs in Masand when combined with Disparate, Circe Rexinclusive, NewKoeko, or Isardam.
Changed the behavior of Sentinels + BackHome and Sentinels + Circe Diagram to correspond to Popeye and WinChloe. Sentinels no longer have an origin square.
Improved the solving speed of Isardam by 3-12x for non-PGs, and 12x for PGs.
Added the fairy piece Berolina pawn.
Moved the condition Circe ContraParrain to the bottom section as Circe Parrain Mirror, following Popeye.
Added the condition ChigorinChess (special starting position and promotions).
Added the condition AlmostChess (special starting position and promotions).
Added the condition Knightmate (special starting position and promotions).
Added the condition BerolinaChess (special starting position).
Added the condition ImmunChess.
Added the condition Sentinels Berolina.
Added the aims ++, +++, ... , ++++++++. The number of checks is now displayed in the solution, unless also mate.
Made the PG solver a bit smarter and optimized the code. PG solving speed has improved by 2% to 60% depending on the problem, and a lot more for PWC and Sentinels.
Fixed a crash with Bicapture + Multicapture.
Fixed a crash with Masand.
Fixed a crash with VerticalCylinder + Maximummer. Distance now takes into account the board topology.
Fixed a crash with VerticalCylinder + BlackMustCapture Ultra.
Fixed a crash when solving Tibet PGs.
Fixed a crash when solving ChameleonChess PGs.
Fixed a crash when solving KobulKings + Einstein PGs.
Fixed a crash when solving FaceToFace + BackToBack PGs.
Fixed a crash when solving Circe Turncoats + Masand PGs.
Fixed a crash when solving Circe Turncoats RexInclusive PGs.
Fixed a crash when solving AntiAndernach + NonRoyalKings PGs.
Fixed a crash when solving Bicapture + Circe Couscous PGs.
Reordered the conditions to better reflect the order in which they are applied. For example (following Popeye), Monochromatic affects Madrasi paralysis and Madrasi paralysis affects the definition of observation of Patrol, so these three conditions are listed in the order Monochromatic, Madrasi, Patrol.
Changed the behavior of Madrasi to correspond to Popeye: test for royal units instead of the king piece.
Changed the behavior of Circe Clone to correspond to Popeye: test for royal units instead of the king piece (change detectable by adding KobulKings or LosingChess).
Fixed a bug in Monochromatic + Madrasi causing some missing en-passant paralysis.
Fixed some missing king moves in Monochromatic + FaceToFace.
Correctly apply Monochromatic and Bichromatic to castling rook in Chess960.
Fixed castling distance in Chess960 + Maximummer.
Improved the solving speed of some Monochromatic and Bichromatic PGs. For example, P0008928 improved 250x.
Warn if the side to play can capture the king (instead of crashing).
Fixed a bug causing no solutions in Masand PGs when the goal diagram hides a king as an undefined piece without ColorThePieces.
Fixed a crash when solving Masand PGs.
Fixed a crash when solving Tacu enigmas with AntiAndernach.
Added the condition GridChess.
Added the condition WhiteEdgemover.
Added the condition BlackEdgemover.
Added the condition Madrasi RexInclusive.
Added the condition Woozles.
Added the condition BiWoozles.
Added the condition AllInChess (implemented as MoveAnyPieceFreeForAll + NoImmediateRepetition).
Notate the starting file of a vertical pawn move if ambiguous (common in Annan).
Generalized stipulation closure to any sequence of "h" and "*", with "s" or "r" allowed as the last character. This covers 8 of the 12 series genres listed in an article by Nicolas Dupont in issue 13 of the ChessProblems.ca Bulletin.
Generalized reflex stipulations, with examples given in the new "Reflex stipulations" section above documentation.
Fixed a bug affecting Hypervolage PGs.
Fixed a bug affecting Einstein + VerticalCylinder PGs.
Fixed a crash with Circe RexInclusive Chameleon + KobulKings.
Fixed a crash with Extinction.
Changed the behavior of Circe Chameleon + CavalierMajeur to correspond to Popeye.
Fixed a crash in v0.2 and v0.2.1 when solving VerticalCylinder PGs. Notate extended castling O-O-O-O.
Fixed a bug in v0.2.1 with Vogtlaender.
Added the condition Chess960.
In reflex series, reject solutions when the idle side can reach the aim during the series. With this change there is a unique solution to the ser-hr#8 by Meinking and Petkov, StrateGems 2011, reproduced on p.44 of Dan Meinking's Chess Problem Collection ("forsyth 1S6/pK1R4/3Bk3/r5P1/6P1/8/1PB5/8 stip ser-hr#7" in Jacobi).
Temporarily hardcoded the version number in the "Launch the latest version" button until I resolve issues Firefox has with the auto-updating version.
Many planned features have been postponed to get something out as fast as possible. For now, the problems can only be input in text representation, apart from conditions which can be set by clicking checkboxes.
Page created: October 16, 2017
Page last updated: March 24, 2020