Vogel’s algorithm ….

Hello everyone,
The past week has been a great learning curve for me. So let me take you back to where we stopped the last week. So given a oriented gauss code we were able to generate the planar diagram code. Now this week, we start with this planar diagram code and generate the Seifert circles, the regions of the knot, the bad regions and performing the Reidemeister move to correct the bad regions. So let me start by explaining what everything means.
Seifert circles : The regions obtained by smoothing of the crossing.


So in the above crossing t(i) (under cross, entering) goes to t(j) (over cross, leaving) and similarly we have t(j) (over cross, entering) goes to t(i+1) (under crossm leaving)
So we have the following example which shows such kind of a smoothing.
Regions of the knot: For the Seifert circles we moved in a specific direction at every crossing but here we only turn left at every crossing and if we move against the component we note it down with a negative sign.

Screenshot from 2014-06-23 20:45:08

So we have the regions and the seifert circles, now when do we call a region bad, a bad region is one that has two edges(two components) with the same sign, but that belong to different Seifert circles. So now we have the information of everything so we perform the corresponding Reidmeister move to correct the bad regions.

So if we start numbering the components, we eventually end up with the Planar Diagram code, from which we can make out the bad regions and perform the move.
Screenshot from 2014-06-23 21:09:51

So that was just a synopsis of the algorithm we implemented.

So first we generate the Seifert circles, from the PD code (which had all the information of the entering , leaving, + , – , under and over) this was straight forward as we had to match the formula which was mentioned above.

To compute the regions, we first had to turn left at every crossing. So we have arrays of data and we had to map one onto the other to get the regions.

Now we have the Seifert circles and bad regions so we start to look for the bad regions, this was also a bit straight forward as we just had to implement the formula for the bad regions. Now once- the bad regions were recognized we performed the move and renumbering the components was a simple logic of adding multiples of 2 to the respective edges. Then, once this was done we had to renumber the new crossings, the logic was to map the new data to the old data and to compute the numbering we had to use the logic that the greatest among the leaving component will have the lowest component entering. So that setup converted the bad to good regions. Now once this is done we need to compute the Seifert circles once again in order to get to the braid word which is the goal of the algorithm. So till now we have identified the Seifert circles, the regions, the bad regions, corrected them and computed the Seifert circles once again. So the next part of the algorithm is to read the braidword from the Seifert circles obtained.

Here is the gist of the implementation of PD Code, Seifert circles, regions and _is_move_required. A lot of refining has to be done, we just got the bare essentials working. The idea was to first get it going and then optimize as we move along. So that’s it from me, hope we conclude the implementation this week.


Here is the entire file we are working on :

And here is the pull request for the week :

The images have been taken from this document and this document has also been followed to a good extent to get a better understanding :

PS : There has been some edits to the code, will post the remaining part as well as the edited version sooner.