Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418384#Read("Desktop/PREVIOUS/TopBook/DATA/simulatedData.txt");; #DataMatrix:=Concatenation(DataMatrix,DataMatrix+[1,0,-1]); #DataMatrix:=Concatenation(DataMatrix,DataMatrix+[0,-2,1]); #S:=VectorsToSymmetricMatrix(DataMatrix);; #G:=SymmetricMatrixToGraph(S,10);; ######################################################### ######################################################### InstallGlobalFunction(RipsChainComplex, function(G,N) local MaximalTree, Maximal2Complex, ChooseCriticalEdge, VERTICES, V, EDGES, EDGESET, vv,v,i,j,k,b, CRITICALVERTICES,CRITICALEDGES, EDGEBOUNDARIES, FACEBOUNDARIES, F, C, PseudoBoundary, Dimension, Boundary; #Critical vertices and edges coloured 1 or -1. All initially critical. #Redundant vertices and edges coloured 2 N:=N+1; #This is not yet implemented for N>2. For the moment we use the following #in the case N>2. ####################### if N>2 then F:=IncidenceMatrixToGraph(G!.incidenceMatrix); ContractGraph(F); C:=SimplicialNerveOfGraph(F,N); C:=SimplicialComplexToRegularCWComplex(C); C:=SparseChainComplex(C); return C; fi; ####################### EDGES:=StructuralCopy(G!.incidenceMatrix); V:=Length(EDGES); VERTICES:=List([1..V],i->1); EDGESET:=List([1..V],i->Filtered([1..V],j->EDGES[i][j]=1)); ################################################ MaximalTree:=function(v) local i,j,colour,leaves,newleaves; #Find a maximal tree containing the free vertex v. #Colour the edges of the tree 2, and also colour the "initial" vertices 2. colour:=2; VERTICES[v]:=-1; leaves:=[v]; while Size(leaves)>0 do newleaves:=[]; for i in leaves do #for j in [1..V] do for j in EDGESET[i] do if EDGES[i][j]=1 and VERTICES[j]=1 then EDGES[i][j]:=colour; EDGES[j][i]:=colour; VERTICES[j]:=colour; Add(newleaves,j); fi; od; od; leaves:=newleaves; od; end; ################################################ ################################################ Maximal2Complex:=function() local i,j,k,toggle; toggle:=true; while toggle do toggle:=false; for i in [1..V] do #for j in [i+1..V] do for j in EDGESET[i] do if EDGES[i][j]=1 then for k in [1..V] do if EDGES[i][k]+EDGES[j][k]=4 then EDGES[i][j]:=2; EDGES[j][i]:=2; toggle:=true; break; fi; od; fi; od;od; EDGESET:=List([1..V],i->Filtered([1..V],j->EDGES[i][j]=1)); od; end; ################################################ ################################################ ChooseCriticalEdge:=function() local i,j,k; for i in [1..V] do #for j in [i+1..V] do for j in EDGESET[i] do if EDGES[i][j]=1 then for k in [1..V] do if EDGES[i][k]=1 and not EDGES[j][k]=0 then EDGES[i][k]:=-1;EDGES[k][i]:=-1;EDGES[i][j]:=2; return true; fi; if EDGES[j][k]=1 and not EDGES[i][k]=0 then EDGES[j][k]:=-1;EDGES[k][j]:=-1;EDGES[i][j]:=2; return true; fi; od; fi; od;od; return false; end; ################################################ ################### Dimension:=function(n); if n=0 then return Length(CRITICALVERTICES); fi; if n<=N and n>0 then return Length(PseudoBoundary[n]); fi; return 0; end; ################### ################### Boundary:=function(n,i); if n=0 then return []; fi; return PseudoBoundary[n][i]; end; ################### EDGEBOUNDARIES:=[]; FACEBOUNDARIES:=[]; PseudoBoundary:=[[],[]];; ################### C:=Objectify(HapSparseChainComplex, rec( dimension:=Dimension, boundary:=Boundary, properties:= [["length",N], ["type", "chainComplex"], ["characteristic",0 ] ])); ################### ################### CRITICALVERTICES:=[1..V]; if N=0 then return C; fi; ################### ################### v:=Position(VERTICES,1); while IsInt(v) do MaximalTree(v); v:=Position(VERTICES,1); od; CRITICALVERTICES:=Filtered([1..V],v->AbsInt(VERTICES[v])=1); if N=1 then return C; fi; ################### Maximal2Complex(); while ChooseCriticalEdge() do Maximal2Complex(); od; EDGES:=List(EDGES,row->List(row,x->AbsInt(x))); CRITICALEDGES:=[];; for i in [1..V] do for j in [i+1..V] do if EDGES[i][j]=1 then Add(CRITICALEDGES,[i,j]);fi; od;od; EDGEBOUNDARIES:=List(CRITICALEDGES,e->Intersection(e,CRITICALEDGES)); EDGEBOUNDARIES:=List(EDGEBOUNDARIES,e->List(e,i->Position(CRITICALVERTICES,i))); FACEBOUNDARIES:=[]; F:=Length(CRITICALEDGES); for i in [1..F] do for j in [i+1..F] do if Length(Intersection(CRITICALEDGES[i],CRITICALEDGES[j]))>0 then for k in [j+1..F] do if Length(Intersection(CRITICALEDGES[k],CRITICALEDGES[i]))>0 and Length(Intersection(CRITICALEDGES[k],CRITICALEDGES[j]))>0 then Add(FACEBOUNDARIES,[i,j,k]); fi; od; fi; od;od; v:=List([1..Length(CRITICALVERTICES)],i->0); for b in EDGEBOUNDARIES do vv:=[];; for i in b do Add(vv,[AbsInt(i),SignInt(i)]); od; Add(PseudoBoundary[1],vv); od; v:=List([1..Length(CRITICALEDGES)],i->0); for b in FACEBOUNDARIES do vv:=[];; for i in b do Add(vv, [AbsInt(i), SignInt(i)]); od; Add(PseudoBoundary[2],vv); od; if N=2 then return C; fi; end); ######################################################### #########################################################