Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: Contra Dance
Views: 139
# This code accompanies work by Matt Thomas and Crystal Peebles at Ithaca College. # Please contact [email protected] for information about this code.
reset() typeset_mode(True)
def all_paths(G,a,b): old_paths = G.all_paths( a, b ) # get all paths without edge multiplicity new_paths=[] for p in old_paths: # traverse each path replacing each edge by a list of (multi) edges multi_path=[] for i,u in enumerate(p): if i < len(p)-1: v = p[i+1] edges = G.edge_boundary([u], [v] ) multi_path.append(edges) new_paths.extend( CartesianProduct(*multi_path )) # each sequence of (multi) edges will be a source of multiple paths #new_paths.extend( cartesian_product(*multi_path )) return new_paths
# start is at position 1 and end is position 5 _ = var('start') _ = var('end')
# define all the positions for i in ['A','B']: for j in [1..2]: for k in ['a','b']: for l in [1..8]: _ = var(str(i)+str(j)+str(k)+'Pos'+str(l))
#Add arrows for calls, small subset, rest are at end # Graph D is the first half of dances reset('D') # create the graph D = DiGraph(multiedges=True) for i in ['BRPT']: D.add_edge(start,A1aPos4,str(i)) for j in [[1,4],[2,1],[3,2],[4,3],[5,8],[6,5],[7,6],[8,7]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['CL4','MAL1','MAR1','WAL1','WAR1','LL','MG1','WG1','MDsD1','WDsD1','NDsD1','NAL1','NAR1']: D.add_edge((start,A1aPos1,str(i))) for j in [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['WHH','MHH']: D.add_edge((start,A1aPos7,str(i))) for j in [[1,7],[2,4],[3,5],[4,2],[5,7],[6,2],[7,5],[8,4]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['WAL1.5','WAR1.5']: D.add_edge((start,A1aPos8,str(i))) for j in [[1,8],[2,5],[3,6],[4,7],[5,2],[6,3],[7,4],[8,1]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['MAL1.5','MAR1.5','MG1.5','MDsD1.5']: D.add_edge((start,A1aPos6,str(i))) for j in [[1,6],[2,7],[3,8],[4,5],[5,4],[6,1],[7,2],[8,3]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['RsLs']: D.add_edge((start,A1aPos6,str(i))) for j in [[1,6],[2,7],[3,8],[4,5],[5,4],[6,1],[7,2],[8,3]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['BRCT']: D.add_edge((start,A1aPos7,str(i))) for j in [[1,7],[2,6],[3,5],[4,8],[5,3],[6,2],[7,1],[8,4]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['WG1.5','WDsD1.5']: D.add_edge((start,A1aPos8,str(i))) for j in [[1,8],[2,7],[3,6],[4,5],[5,4],[6,3],[7,2],[8,1]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['LC']: D.add_edge((start,A1aPos2,str(i))) for j in [[1,2],[2,5],[3,4],[4,7],[5,2],[6,7],[7,4],[8,5]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['PS']: for j in [[2,2],[4,4],[6,4],[8,2]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['NS']: D.add_edge((start,A1aPos5,str(i))) for j in [[1,5],[3,7],[5,5],[7,7]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['PDsD1','PAL1','PAR1']: for j in [[2,2],[4,4],[6,6],[8,8]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['PDsD1.5','PAL1.5','PAR1.5']: for j in [[2,8],[4,6],[6,4],[8,2]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['NDsD1','NALR1']: D.add_edge((start,A1aPos1,str(i))) for j in [[1,1],[3,3],[5,5],[7,7]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['NDsD1.5','NAL1.5','NAR1.5']: D.add_edge((start,A1aPos5,str(i))) for j in [[1,5],[3,7],[5,1],[7,3]]: for k in [['A1a','A1b'],['A1b','A2a'],['A2a','A2b']]: D.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i))
# Graph E is the second half of dances reset('E') # create the graph E = DiGraph(multiedges=True) for i in ['BRPT']: E.add_edge(B2aPos6,end,str(i)) for j in [[1,4],[2,1],[3,2],[4,3],[5,8],[6,5],[7,6],[8,7]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['CL4','MAL1','MAR1','WAL1','WAR1','LL','MG1','WG1','MDsD1','WDsD1','NDsD1','NAL1','NAR1']: E.add_edge((B2aPos5,end,str(i))) for j in [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['WHH','MHH']: E.add_edge((B2aPos3,end,str(i))) E.add_edge((B2aPos7,end,str(i))) for j in [[1,7],[2,4],[3,5],[4,2],[5,7],[6,2],[7,5],[8,4]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['WAL1.5','WAR1.5']: E.add_edge((B2aPos2,end,str(i))) for j in [[1,8],[2,5],[3,6],[4,7],[5,2],[6,3],[7,4],[8,1]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['MAL1.5','MAR1.5','MG1.5','MDsD1.5']: E.add_edge((B2aPos4,end,str(i))) for j in [[1,6],[2,7],[3,8],[4,5],[5,4],[6,1],[7,2],[8,3]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['RsLs']: E.add_edge((B2aPos4,end,str(i))) for j in [[1,6],[2,7],[3,8],[4,5],[5,4],[6,1],[7,2],[8,3]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['BRCT']: E.add_edge((B2aPos3,end,str(i))) for j in [[1,7],[2,6],[3,5],[4,8],[5,3],[6,2],[7,1],[8,4]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['WG1.5','WDsD1.5']: E.add_edge((B2aPos4,end,str(i))) for j in [[1,8],[2,7],[3,6],[4,5],[5,4],[6,3],[7,2],[8,1]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['LC']: E.add_edge((B2aPos2,end,str(i))) E.add_edge((B2aPos8,end,str(i))) for j in [[1,2],[2,5],[3,4],[4,7],[5,2],[6,7],[7,4],[8,5]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['PS']: for j in [[2,2],[4,4],[6,4],[8,2]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['NS']: E.add_edge((B2aPos1,end,str(i))) E.add_edge((B2aPos5,end,str(i))) for j in [[1,5],[3,7],[5,5],[7,7]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['PDsD1','PAL1','PAR1']: for j in [[2,2],[4,4],[6,6],[8,8]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['PDsD1.5','PAL1.5','PAR1.5']: for j in [[2,8],[4,6],[6,4],[8,2]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['NDsD1','NALR1']: E.add_edge((B2aPos5,end,str(i))) for j in [[1,1],[3,3],[5,5],[7,7]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i)) for i in ['NDsD1.5','NAL1.5','NAR1.5']: E.add_edge((B2aPos1,end,str(i))) for j in [[1,5],[3,7],[5,1],[7,3]]: for k in [['A2b','B1a'],['B1a','B1b'],['B1b','B2a']]: E.add_edge(var(str(k[0])+'Pos'+str(j[0])),var(str(k[1])+'Pos'+str(j[1])),str(i))
D.set_pos({ start:[0,4], A1aPos1:[1,7], A1aPos2:[1,6], A1aPos3:[1,5], A1aPos4:[1,4], A1aPos5:[1,3], A1aPos6:[1,2], A1aPos7:[1,1], A1aPos8:[1,0], A1bPos1:[2,7], A1bPos2:[2,6], A1bPos3:[2,5], A1bPos4:[2,4], A1bPos5:[2,3], A1bPos6:[2,2], A1bPos7:[2,1], A1bPos8:[2,0], A2aPos1:[3,7], A2aPos2:[3,6], A2aPos3:[3,5], A2aPos4:[3,4], A2aPos5:[3,3], A2aPos6:[3,2], A2aPos7:[3,1], A2aPos8:[3,0], A2bPos1:[4,7], A2bPos2:[4,6], A2bPos3:[4,5], A2bPos4:[4,4], A2bPos5:[4,3], A2bPos6:[4,2], A2bPos7:[4,1], A2bPos8:[4,0] })
E.set_pos({ A2bPos1:[4,7], A2bPos2:[4,6], A2bPos3:[4,5], A2bPos4:[4,4], A2bPos5:[4,3], A2bPos6:[4,2], A2bPos7:[4,1], A2bPos8:[4,0], B1aPos1:[5,7], B1aPos2:[5,6], B1aPos3:[5,5], B1aPos4:[5,4], B1aPos5:[5,3], B1aPos6:[5,2], B1aPos7:[5,1], B1aPos8:[5,0], B1bPos1:[6,7], B1bPos2:[6,6], B1bPos3:[6,5], B1bPos4:[6,4], B1bPos5:[6,3], B1bPos6:[6,2], B1bPos7:[6,1], B1bPos8:[6,0], B2aPos1:[7,7], B2aPos2:[7,6], B2aPos3:[7,5], B2aPos4:[7,4], B2aPos5:[7,3], B2aPos6:[7,2], B2aPos7:[7,1], B2aPos8:[7,0], end:[8,4] })
D.graphplot(edge_labels=True, vertex_size=5000).show(figsize=4)
E.graphplot(edge_labels=True, vertex_size=3500).show(figsize=4)
D.get_pos() E.get_pos()
{A2aPos7:[3,1],A1bPos2:[2,6],A1aPos4:[1,4],A2aPos5:[3,3],A1bPos7:[2,1],A2bPos8:[4,0],A1aPos2:[1,6],A1bPos5:[2,3],A2bPos6:[4,2],A1aPos7:[1,1],A2aPos8:[3,0],A1aPos5:[1,3],A2aPos6:[3,2],start:[0,4],A1bPos8:[2,0],A2bPos3:[4,5],A1bPos6:[2,2],A1aPos8:[1,0],A2bPos1:[4,7],A2aPos3:[3,5],A1aPos6:[1,2],A2aPos1:[3,7],A1bPos3:[2,5],A2bPos4:[4,4],A1bPos1:[2,7],A2bPos2:[4,6],A1aPos3:[1,5],A2aPos4:[3,4],A2bPos7:[4,1],A1aPos1:[1,7],A2aPos2:[3,6],A1bPos4:[2,4],A2bPos5:[4,3]}\displaystyle \left\{\mathit{A2aPos}_{7} : \left[3, 1\right], \mathit{A1bPos}_{2} : \left[2, 6\right], \mathit{A1aPos}_{4} : \left[1, 4\right], \mathit{A2aPos}_{5} : \left[3, 3\right], \mathit{A1bPos}_{7} : \left[2, 1\right], \mathit{A2bPos}_{8} : \left[4, 0\right], \mathit{A1aPos}_{2} : \left[1, 6\right], \mathit{A1bPos}_{5} : \left[2, 3\right], \mathit{A2bPos}_{6} : \left[4, 2\right], \mathit{A1aPos}_{7} : \left[1, 1\right], \mathit{A2aPos}_{8} : \left[3, 0\right], \mathit{A1aPos}_{5} : \left[1, 3\right], \mathit{A2aPos}_{6} : \left[3, 2\right], \mathit{start} : \left[0, 4\right], \mathit{A1bPos}_{8} : \left[2, 0\right], \mathit{A2bPos}_{3} : \left[4, 5\right], \mathit{A1bPos}_{6} : \left[2, 2\right], \mathit{A1aPos}_{8} : \left[1, 0\right], \mathit{A2bPos}_{1} : \left[4, 7\right], \mathit{A2aPos}_{3} : \left[3, 5\right], \mathit{A1aPos}_{6} : \left[1, 2\right], \mathit{A2aPos}_{1} : \left[3, 7\right], \mathit{A1bPos}_{3} : \left[2, 5\right], \mathit{A2bPos}_{4} : \left[4, 4\right], \mathit{A1bPos}_{1} : \left[2, 7\right], \mathit{A2bPos}_{2} : \left[4, 6\right], \mathit{A1aPos}_{3} : \left[1, 5\right], \mathit{A2aPos}_{4} : \left[3, 4\right], \mathit{A2bPos}_{7} : \left[4, 1\right], \mathit{A1aPos}_{1} : \left[1, 7\right], \mathit{A2aPos}_{2} : \left[3, 6\right], \mathit{A1bPos}_{4} : \left[2, 4\right], \mathit{A2bPos}_{5} : \left[4, 3\right]\right\}
{B1aPos8:[5,0],B2aPos3:[7,5],B1aPos6:[5,2],A2bPos8:[4,0],B2aPos1:[7,7],B1bPos3:[6,5],A2bPos6:[4,2],B1bPos1:[6,7],B1aPos3:[5,5],B2aPos4:[7,4],B1aPos1:[5,7],B2aPos2:[7,6],A2bPos3:[4,5],B1bPos4:[6,4],B2aPos7:[7,1],A2bPos1:[4,7],B1bPos2:[6,6],B1aPos4:[5,4],B2aPos5:[7,3],B1bPos7:[6,1],end:[8,4],B1aPos2:[5,6],A2bPos4:[4,4],B1bPos5:[6,3],B1aPos7:[5,1],B2aPos8:[7,0],A2bPos2:[4,6],B1aPos5:[5,3],B2aPos6:[7,2],A2bPos7:[4,1],B1bPos8:[6,0],A2bPos5:[4,3],B1bPos6:[6,2]}\displaystyle \left\{\mathit{B1aPos}_{8} : \left[5, 0\right], \mathit{B2aPos}_{3} : \left[7, 5\right], \mathit{B1aPos}_{6} : \left[5, 2\right], \mathit{A2bPos}_{8} : \left[4, 0\right], \mathit{B2aPos}_{1} : \left[7, 7\right], \mathit{B1bPos}_{3} : \left[6, 5\right], \mathit{A2bPos}_{6} : \left[4, 2\right], \mathit{B1bPos}_{1} : \left[6, 7\right], \mathit{B1aPos}_{3} : \left[5, 5\right], \mathit{B2aPos}_{4} : \left[7, 4\right], \mathit{B1aPos}_{1} : \left[5, 7\right], \mathit{B2aPos}_{2} : \left[7, 6\right], \mathit{A2bPos}_{3} : \left[4, 5\right], \mathit{B1bPos}_{4} : \left[6, 4\right], \mathit{B2aPos}_{7} : \left[7, 1\right], \mathit{A2bPos}_{1} : \left[4, 7\right], \mathit{B1bPos}_{2} : \left[6, 6\right], \mathit{B1aPos}_{4} : \left[5, 4\right], \mathit{B2aPos}_{5} : \left[7, 3\right], \mathit{B1bPos}_{7} : \left[6, 1\right], \mathit{end} : \left[8, 4\right], \mathit{B1aPos}_{2} : \left[5, 6\right], \mathit{A2bPos}_{4} : \left[4, 4\right], \mathit{B1bPos}_{5} : \left[6, 3\right], \mathit{B1aPos}_{7} : \left[5, 1\right], \mathit{B2aPos}_{8} : \left[7, 0\right], \mathit{A2bPos}_{2} : \left[4, 6\right], \mathit{B1aPos}_{5} : \left[5, 3\right], \mathit{B2aPos}_{6} : \left[7, 2\right], \mathit{A2bPos}_{7} : \left[4, 1\right], \mathit{B1bPos}_{8} : \left[6, 0\right], \mathit{A2bPos}_{5} : \left[4, 3\right], \mathit{B1bPos}_{6} : \left[6, 2\right]\right\}
# count the dances #paths=all_paths(D,start,A2bPos1) #len(paths) #for p in paths: # print p
totaldances = 0 for i in [1..8]: for j in ['a','b']: _ = var(str(j)+str(i))
firstset = [] secondset = [] for i in [1..8]: paths=all_paths(D,start,var('A2bPos'+str(i))) firstset.append(len(paths)) print "Start to A2b Position",i,"is",len(paths),"paths" for i in [1..8]: paths=all_paths(E,var('A2bPos'+str(i)),end) secondset.append(len(paths)) print "A2b Position",i,"to end is",len(paths),"paths"
<string>:11: DeprecationWarning: CartesianProduct is deprecated. Use cartesian_product instead See http://trac.sagemath.org/18411 for details.
Start to A2b Position 1 is 158191 paths Start to A2b Position 2 is 173187 paths Start to A2b Position 3 is 103870 paths Start to A2b Position 4 is 179807 paths Start to A2b Position 5 is 181266 paths Start to A2b Position 6 is 141273 paths Start to A2b Position 7 is 167723 paths Start to A2b Position 8 is 126958 paths A2b Position 1 to end is 181266 paths A2b Position 2 to end is 186557 paths A2b Position 3 to end is 167723 paths A2b Position 4 to end is 238817 paths A2b Position 5 to end is 238764 paths A2b Position 6 to end is 179931 paths A2b Position 7 to end is 178306 paths A2b Position 8 to end is 173131 paths
firstset secondset
[158191\displaystyle 158191, 173187\displaystyle 173187, 103870\displaystyle 103870, 179807\displaystyle 179807, 181266\displaystyle 181266, 141273\displaystyle 141273, 167723\displaystyle 167723, 126958\displaystyle 126958]
[181266\displaystyle 181266, 186557\displaystyle 186557, 167723\displaystyle 167723, 238817\displaystyle 238817, 238764\displaystyle 238764, 179931\displaystyle 179931, 178306\displaystyle 178306, 173131\displaystyle 173131]
totaldances=0 for i in [0..len(firstset)-1]: totaldances = totaldances + (firstset[i]*secondset[i]) totaldances
241931823417\displaystyle 241931823417
matrix(firstset)*transpose(matrix(secondset))
(241931823417)\displaystyle \left(\begin{array}{r} 241931823417 \end{array}\right)