Skip to content

Instantly share code, notes, and snippets.

@MHenderson
Last active December 18, 2015 22:59
Show Gist options
  • Save MHenderson/5857903 to your computer and use it in GitHub Desktop.
Save MHenderson/5857903 to your computer and use it in GitHub Desktop.
Kite-form PLS in IPython using Ryser.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Completing Symmetric Kite-Form Partial Latin Squares\n",
"\n",
"Created 26th March 2013. Last updated Thu Nov 21 23:06:55 GMT 2013.\n",
"\n",
"In this notebook we introduce the ``ryser`` package and demonstrate how to use it to complete partial latin squares, especially ones of kite-form.\n",
"\n",
"This notebook can be viewed online at: [http://nbviewer.ipython.org/5857903](http://nbviewer.ipython.org/5857903)\n",
"\n",
"The source code for this notebook can be found at: [https://gist.github.com/MHenderson/5857903](https://gist.github.com/MHenderson/5857903)\n",
"\n",
"## 1. Introduction\n",
"\n",
"The first step is to import the Ryser package. We also import the examples module to have some ready-made examples to play with."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import ryser"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first few examples in the ``examples`` module are all incompletable partial latin squares. ``eg8``, however, is completable."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P = ryser.examples.eg8\n",
"print P"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"|3|1|7|4|.|.|.|.|\n",
"|1|2|4|3|.|.|.|.|\n",
"|7|4|6|5|.|.|.|.|\n",
"|4|3|5|8|.|.|.|.|\n",
"|.|.|.|.|.|3|.|.|\n",
"|.|.|.|.|3|.|.|.|\n",
"|.|.|.|.|.|.|.|5|\n",
"|.|.|.|.|.|.|5|.|\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. The Method\n",
"\n",
"Here we describe the method described in the paper \"Completing Symmetric Kite-Form Partial Latin Squares\" by the author for completing KF-SPLS.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Implementation Details\n",
"\n",
"In the next few cells we describe how Algorithm 1 above is implemented in the ```ryser``` Python package.\n",
"\n",
"The first step is to construct a first extension using the ```extend``` function from the ```completion``` module."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.1 The Augmented Row-Absences Multigraph\n",
"\n",
"Central to our method is the **augmented row-absences multigraph**. The ```ryser``` package provides the ```aram``` function to construct this multigraph from a KF-SPLS."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"G = ryser.graphs.aram(P, 4, 4, 0)\n",
"import networkx\n",
"networkx.draw_circular(G)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nmMD+H+XeZK9Jcy24AAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x2e110d0>"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"first_extension = ryser.completion.extension(P, 4, 4, 0)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With the first extension we can extend P, using P's ```extend``` member-function."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P.extend(first_extension)\n",
"print P"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"|3|1|7|4|2|5|.|.|\n",
"|1|2|4|3|5|6|.|.|\n",
"|7|4|6|5|1|8|.|.|\n",
"|4|3|5|8|6|7|.|.|\n",
"|2|5|1|6|8|3|.|.|\n",
"|5|6|8|7|3|2|.|.|\n",
"|.|.|.|.|.|.|.|5|\n",
"|.|.|.|.|.|.|5|.|\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, to complete P, we simply repeat the same process once more, this time in one step."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P.extend(ryser.completion.extension(P,6,2,0))\n",
"print P"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"|3|1|7|4|2|5|6|8|\n",
"|1|2|4|3|5|6|8|7|\n",
"|7|4|6|5|1|8|2|3|\n",
"|4|3|5|8|6|7|1|2|\n",
"|2|5|1|6|8|3|7|4|\n",
"|5|6|8|7|3|2|4|1|\n",
"|6|8|2|1|7|4|3|5|\n",
"|8|7|3|2|4|1|5|6|\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Complete Implementation\n",
"\n",
"The completion can be accomplished in a single step using the ```complete``` method from the ```completion``` module. We have to reload the ```examples``` module so that ```eg8``` returns to being an incomplete KF-SPLS."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"reload(ryser.examples)\n",
"P = ryser.examples.eg8\n",
"print P\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"|3|1|7|4|.|.|.|.|\n",
"|1|2|4|3|.|.|.|.|\n",
"|7|4|6|5|.|.|.|.|\n",
"|4|3|5|8|.|.|.|.|\n",
"|.|.|.|.|.|3|.|.|\n",
"|.|.|.|.|3|.|.|.|\n",
"|.|.|.|.|.|.|.|5|\n",
"|.|.|.|.|.|.|5|.|\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ryser.completion.complete(P,4,4,0)\n",
"print P"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"|3|1|7|4|2|5|6|8|\n",
"|1|2|4|3|5|6|8|7|\n",
"|7|4|6|5|1|8|2|3|\n",
"|4|3|5|8|6|7|1|2|\n",
"|2|5|1|6|8|3|7|4|\n",
"|5|6|8|7|3|2|4|1|\n",
"|6|8|2|1|7|4|3|5|\n",
"|8|7|3|2|4|1|5|6|\n"
]
}
],
"prompt_number": 8
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment