814s with v0.1 in Firefox 52 on an i7-6700 CPU @ 3.40GHz
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".
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".
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.
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 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 AntiCirce Assassin introduced in v0.6.4 causing some moves to be missing.
Fixed a bug in AllowTerminalAutoChecks + LeseMajeste which gave spurious solutions.
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.
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.
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: August 14, 2019