Skip to content


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Gridlink is a little tool for manipulating the rectangular link diagrams
used by Ivan Dynnikov in his paper:

   Ivan Dynnikov, Recognition algorithms in knot theory. (Russian)
   Uspekhi Mat. Nauk 58 (2003), no. 6(354), 45--92; translation in
   Russian Math. Surveys 58 (2003), no. 6, 1093--1139.

Dynnikov proved in the paper above that any rectangular diagram of an
unknot or split link can be **monotonically** reduced to a trivial
diagram by a sequence of elementary moves.  Thus this gives a recognition
algorithm for grid diagrams of the unknot.

More recently (Fall 2006) these diagrams have been used to give a
combinatorial description of the knot and link Floer homology.

   Ciprian Manolescu, Peter Ozsvath and Sucharit Sarkar, A
   combinatorial description of knot Floer

   Ciprian Manolescu, Peter Ozsvath, Zoltan Szabo and Dylan Thurston,
   On combinatorial link Floer homology, arXiv:math.GT/0610559.

A rectangular link diagram (or gridlink) is a polygonal link
projection consisting of horizontal and vertical line segments lying
in the integer grid, such that whenever two segments cross, the
vertical segment is the overcrossing.  The diagram is also required to
be in standard position, in the sense that no two segments are

Dynnikov defines three elementary moves on a rectangular diagram: the
castling, or exchange move; the cyclic permutation, and the
destabilization move.  The castling move is an isotopy which drags one
vertical (horizontal) segment across an adjacent one, interchanging
the x (y) coordinates of the two segments, and fixes all segments
which do not meet the two that are being interchanged.  (Because it is
an isotopy, a castling move can only be performed when the projections
of boundary 0-spheres of the two segments are unlinked.)  The cyclic
permutation is like a castling move involving the top and bottom (left
and right) horizontal (vertical) segments, thought of as lying on the
2-sphere.  The simplest destabilization move removes a pair of
consecutive segments of length 1.  However, the boundary of a segment
of length 1 can never be linked.  So there is a more general
destabilization move that removes any segment of length 1; this is
the destabilization implemented by the program.


The easiest way to run the program is to type 
from the directory containing the files and  This will start the GUI.

If you want to have access to the internal objects you can also load
gridlink as a python module from the python interpreter with the
>>>   import * from gridlink
For this to work, make sure that your python interpreter can find the
two files and  This can be done by
starting the python interpreter from the directory containing the
files, or by putting them in a directory that is specified in your
PYTHONPATH variable, or by putting them in the python site-packages

When the program starts, a small window with an image of the figure 8
knot is presented.  Each link opens in a new window, and these are
tracked in the Windows menu.  If all of the link windows are closed
the figure 8 window will reappear. Closing the figure 8 window
terminates the program.

Inside a link window, when two segments are highlighted in blue,
click the mouse to exchange.  Click and drag the mouse on the
background to do cyclic permutation.  Gridlinks are oriented, and the
orientation is displayed with an arrow head on each vertical segment.
(They can also be displayed as a matrix of dots, or X's and O's.) The
orientation of a component can be reversed by clicking the "reverse"
button and then selecting the component with the mouse.  The buttons
labelled "NE", "NW" "SE", "SW" select one of the four types of
stabilization moves.  (The checkboxes under these buttons can be used
to limit which types of stabilizations are allowed.)  After clicking a
stabilization button, select a segment to be stabilized.  If a
vertical segment is selected, the move takes place at the tail of the
segment.  To perform a move at the head of a vertical segment, select
the following horizontal segment.  In this case, the stabilization
move is equivalent to stabilizing at the tail of the vertical segment
and then transporting the new length 1 segment to the head by exchange
moves.  To destabilize, click the "destab" button and select a length
1 segment to remove.

There are shortcut keys for all operations except for stabilization:
d to destabilize, r to reverse, u to undo, and arrow keys for
cyclic permutations.

The program records all moves, and the list can be displayed by
running the "print_moves" method at the python prompt.  The number of
moves is displayed at the lower right corner of the gridlink window.
The "Moves->Reset" menu action clears the list of saved moves and
restarts the counter.  The "Moves->Review" menu action allows you to
step forward or backward through your sequence of moves, displaying
the projection at each step.  The "Moves->Simplify" menu action
applies a random sequence of 10000 (unrecorded) elementary moves,
performing (allowed) destabilizations when possible.  In most cases
this will reduce the presentation to something close to minimal.  If
not, try again.  Note that the process does not involve stabilization.
(Question: Can any link diagram be reduced to the minimal number of
segments without stabilizing?)

The "View" menu gives several choices for presenting the grid
projection.  You can save or load a projection together with a list of
moves with "File->Save as ...", or "File->Open".  You can save a
Postscript rendering of the link with "File->Snapshot ...".

A link can be entered as a closed braid from the menu
File->New->ClosedBraid.  A dialog window will ask for the number of
strands and a word in the braid group.  For example, the word
1,1,-2,1,3,-2,3,4,-3,4 describes a 5 strand braid representation of
knot 9_12.  

The program also contains a table of closed braid representions of
knots up to 12 crossings, generated from a query of Chuck Livingston's
knotinfo database: To load a knot
from the table use the File->New->Knot menu.

Finally, the menu File->New->XO link allows entry of a gridlink as
a matrix containing exactly one X and one O in each row and column.
The link is consists of a vertical segment from the X to the O in
each column, and a horizontal segment from the O to the X in each
row.  Enter the link by listing the column indices of the X's and
the column indices of the O's.
Example session (using the interpreter):

% python
>>> from gridlink import *
>>> A = GridlinkApp()
>>> #Here are a couple of links that cannot be reduced by elementary moves.
>>> #Thanks to Dylan Thurston for these.
>>> L4a1 = XOlink(A, [1,2,5,0,3,4], [3,0,1,4,5,2])
>>> Whitehead = XOlink(A, [6,3,2,1,4,5,0], [2,1,0,5,6,3,4])
>>> #Here are a couple of interesting unknots.  Thanks to Ian Agol for these.
>>> K== XOlink(A, [5,1,7,3,12,4,6,0,11,2,8,13,19,10,21,15,17,9,18,14,20,16],
>>> K = XOlink(A, [7,14,15,12,13,9,10,2,1,0,4,3,8,6,5,11],
>>> K9_12 = ClosedBraid(A,5,[1,1,-2,1,3,-2,3,4,-3,4])
>>> K = Knot(A,'11a_123')


No description, website, or topics provided.






No releases published


No packages published