Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 511244################################################################# ################################################################# FilteredCubicalComplexToFilteredRegularCWComplex:= function(arg) local M, C, BinLst, LstBin, dim, dimm, flen, Boundaries, Coboundaries, filtration, Orientation, Properties, Boundary, ArrayValueDim, n, i, j, v, bnd, k, b; M:=arg[1]; if Length(arg)>1 then dim:=arg[2]; else dim:=EvaluateProperty(M,"dimension"); fi; flen:=Maximum(Flat(M!.filtration)); C:=SparseFilteredChainComplexOfFilteredCubicalComplex(M); BinLst:=C!.coordinateToPosition; LstBin:=C!.positionToCoordinate; dimm:=Position(List([0..dim],i->C!.dimension(i)),0); if dimm=fail then dimm:=dim; else dimm:=dimm-2; fi; Properties:=[["dimension", dimm ],["filtration_length",flen]]; ArrayValueDim:=ArrayValueFunctions(EvaluateProperty(M,"dimension")); ####################################### Boundary:=function(n,j) local pos, neg, bnd; bnd:=C!.boundary(n,j); pos:=Filtered(bnd,x->x[2]>0); Apply(pos,x->x[1]); neg:=Filtered(bnd,x->x[2]<0); Apply(neg,x->x[1]); return [pos,neg]; end; ################################ ############################## Boundaries:=[]; Boundaries[1]:=List([1..C!.dimension(0)],x->[1,0]); Orientation:=[]; Orientation[1]:=List([1..C!.dimension(0)],x->[1]); for n in [1..dim] do Boundaries[n+1]:=[]; Orientation[n+1]:=[]; for i in [1..C!.dimension(n)] do v:=StructuralCopy(Boundary(n,i)); bnd:=Concatenation([Length(v[1])+Length(v[2])],Flat(v)); Add(Boundaries[n+1],bnd); Add(Orientation[n+1], Concatenation(List([1..Length(v[1])],a->1),List([1..Length(v[2])],a->-1))); od; od; Boundaries[dim+2]:=[]; ############################## ### COBOUNDARIES BEGIN ###################### Coboundaries:=[];; #Coboundaries[n+1] contains the info on n-cells. for n in [0..dim] do k:=2*(n+1)+1;#k:=1+2^(n+1); Coboundaries[n+1]:=List(Boundaries[n+1],i->[0]); for j in [1..Length(Boundaries[n+2])] do b:=Boundaries[n+2][j]; #k:=Length(b); for i in b{[2..k]} do Coboundaries[n+1][i][1]:=Coboundaries[n+1][i][1]+1; Add(Coboundaries[n+1][i],j); od; od; # for b in Coboundaries[n+1] do # Append(b,List([1..Length(b)-1],a->1)); # od; od; Coboundaries[dim+1]:=List(Boundaries[dim+1],a->[0]); ### COBOUNDARIES END ############################### return Objectify(HapFilteredRegularCWComplex, rec( nrCells:=C!.dimension, filteredDimension:=C!.filteredDimension, boundaries:=Boundaries, coboundaries:=Coboundaries, vectorField:=fail, inverseVectorField:=fail, criticalCells:=fail, orientation:=Orientation, properties:=Properties)); end; ################################################################# ################################################################# ################################################################# ################################################################# StructuralCopyOfFilteredRegularCWComplex:=function(Y) local nrcells, Boundaries, filtdim, filtdimrec, F, n, i; Boundaries:=1*Y!.boundaries; F:=EvaluateProperty(Y,"filtration_length"); nrcells:=function(n); return Length(Boundaries[n+1]); end; filtdimrec:=[]; for n in [0..Dimension(Y)] do filtdimrec[n+1]:=[]; for i in [1..F] do filtdimrec[n+1][i]:=Y!.filteredDimension(i,n); od; od; filtdim:=function(i,n); return filtdimrec[n+1][i]; end; return Objectify(HapFilteredRegularCWComplex, rec( nrCells:=nrcells, filteredDimension:=filtdim, boundaries:=Boundaries, coboundaries:=1*Y!.coboundaries, vectorField:=StructuralCopy(Y!.vectorField), inverseVectorField:=StructuralCopy(Y!.inverseVectorField), criticalCells:=StructuralCopy(Y!.criticalCells), orientation:=StructuralCopy(Y!.orientation), properties:=StructuralCopy(Y!.properties))); end; ################################################################# ################################################################# ########################################################## ########################################################## SparseChainComplexOfFilteredRegularCWComplex:= function(Y) local C; C:=SparseChainComplexOfRegularCWComplex(Y); return Objectify(HapFilteredSparseChainComplex, rec( dimension:=C!.dimension, boundary:=C!.boundary, filteredDimension:=Y!.filteredDimension, properties:=[ ["length",EvaluateProperty(Y,"dimension")], ["filtration_length",EvaluateProperty(Y,"filtration_length")], ["type","FilteredChainComplex"], ["characteristic",0]] )); end; ########################################################## ########################################################## ############################################# ############################################# InstallOtherMethod(Dimension, "Dimension of filtered regular CW-complex", [IsHapFilteredRegularCWComplex], function(f) return EvaluateProperty(f,"dimension"); return EvaluateProperty(f,"dimension"); end); ############################################# ############################################# ############################################# ############################################# InstallOtherMethod(Dimension, "Dimension of filtered simplicial complex", [IsHapFilteredSimplicialComplex], function(f) return EvaluateProperty(f,"dimension"); return EvaluateProperty(f,"dimension"); end); ############################################# ############################################# ############################################# ############################################# InstallOtherMethod(Size, "Size of filtered regular CW-complex", [IsHapFilteredRegularCWComplex], function(Y) local sz, i; sz:=0; for i in [0..Dimension(Y)] do sz:=sz+Y!.nrCells(i); od; return sz; end); ############################################# ############################################# ############################################# ############################################# HAPContractFilteredRegularCWComplex:= function(arg) local Y, Start, Contract, nn, dim, bool, BOOL, FREE, degrees,F, CNT; Y:=arg[1]; if Length(arg)=2 then Start:=arg[2]; else Start:=1; fi; CNT:=0; ############################################# ##### The work-horse function.############### Contract:=function(n,F) local b, C, i, j, t, cob, pos, bool, cnt, CoboundCondition, Free, mybool, MCoboundaries, U; #This function removes pairs of n- and (n+1)-cells if possible. #U=Upper, M=Middle and L=Lower dimensional cells. #################### #################### if CNT=0 then Y!.degrees:=[]; for i in [1..Dimension(Y)+1] do Y!.degrees[i]:=List([1..Y!.filteredDimension(1,i-1)],a->1); t:=1; while t<EvaluateProperty(Y,"filtration_length") do t:=t+1; for j in [1+Y!.filteredDimension(t-1,i-1)..Y!.filteredDimension(t,i-1)] do Y!.degrees[i][j]:=t; od; od; od; fi; CNT:=1; #################### #################### MCoboundaries:=Y!.coboundaries[n+1]; C:=Length(MCoboundaries); ############# ############# CoboundCondition:=function(i) local cnt; if Y!.degrees[n+1][i]>F then return [false]; fi; if F>1 and Y!.degrees[n+1][i]<F then return [false]; fi; cnt:=MCoboundaries[i]{[2..Length(MCoboundaries[i])]}; cnt:=Filtered(cnt,x->Y!.degrees[n+2][x]<=F); if Length(cnt)=1 then Y!.degrees[n+1][i]:=Y!.degrees[n+1][i]+1; Y!.degrees[n+2][cnt[1]]:=Y!.degrees[n+2][cnt[1]]+1; return [true,cnt[1]]; fi; return [false]; end; ############# ############# ####################### #######################THIS TAKES ALL THE TIME FREE:=Filtered([1..Y!.filteredDimension(F,n)], i->Y!.degrees[n+1][i]=F); mybool:=false; for i in FREE do if CoboundCondition(i)[1] then mybool:=true;fi; od; return mybool; ####################### ####################### end; ####End of work-horse function.############# ############################################ dim:=EvaluateProperty(Y,"dimension"); for F in [1..EvaluateProperty(Y,"filtration_length")] do bool:=true; BOOL:=true; nn:=dim-1; while BOOL or nn>0 do BOOL:=false; for nn in Reversed([0..dim-1]) do while bool do bool:=Contract(nn,F); if bool=true then BOOL:=true; fi; od; bool:=true; od; od; od; end; ############################################ ############################################ ############################################ ############################################ ContractedFilteredRegularCWComplex:=function(YY) local Y, W, bnd, perm,F, cnt, d, i,j, newboundaries, adjust, f, properties, filtdim, orien, nrcells; Y:=StructuralCopyOfFilteredRegularCWComplex(YY); F:=EvaluateProperty(Y,"filtration_length"); HAPContractFilteredRegularCWComplex(Y); perm:=[]; cnt:=[]; #### for d in [1..Length(Y!.boundaries)] do cnt[d]:=List([1..F+1],i->0); for i in [1..Length(Y!.boundaries[d])] do cnt[d][Y!.degrees[d][i]]:=1*cnt[d][Y!.degrees[d][i]]+1; od; od; #### #### adjust:=[]; for d in [1..Length(Y!.boundaries)] do adjust[d]:=[0]; for i in [2..F+1] do adjust[d][i]:=adjust[d][i-1]+cnt[d][i-1]; od; od; #### #### for d in [1..Length(Y!.boundaries)] do perm[d]:=[]; cnt[d]:=List([1..F+1],i->0); for i in [1..Length(Y!.boundaries[d])] do cnt[d][Y!.degrees[d][i]]:=1*cnt[d][Y!.degrees[d][i]]+1; perm[d][i]:=1*cnt[d][Y!.degrees[d][i]]+adjust[d][Y!.degrees[d][i]]; od; od; #### newboundaries:=List([1..Length(Y!.boundaries)],i->[]); orien:=List([1..Length(Y!.boundaries)],i->[]); for d in [1..Length(Y!.boundaries)] do newboundaries[d]:=[]; orien[d]:=[]; for i in [1..Length(Y!.boundaries[d])] do newboundaries[d][perm[d][i]]:=StructuralCopy(Y!.boundaries[d][i]); orien[d][perm[d][i]]:=StructuralCopy(Y!.orientation[d][i]); od; od; for d in [2..Length(Y!.boundaries)] do for i in [1..Length(Y!.boundaries[d])] do bnd:=newboundaries[d][i]; for j in [2..Length(bnd)] do bnd[j]:=perm[d-1][bnd[j]]; od; od; od; #################### filtdim:=function(i,d); return adjust[d+1][i]; end; #################### for d in [1..Length(newboundaries)] do newboundaries[d]:=newboundaries[d]{[1..filtdim(F,d-1)]}; od; W:=RegularCWComplex(newboundaries); properties:=W!.properties; Add(properties,["filtration_length",F]); return Objectify(HapFilteredRegularCWComplex, rec( nrCells:=W!.nrCells, filteredDimension:=filtdim, boundaries:=W!.boundaries, coboundaries:=W!.coboundaries, vectorField:=fail, inverseVectorField:=fail, criticalCells:=fail, orientation:=orien, properties:=properties)); end; ############################################ ############################################ ##################################################################### ##################################################################### FilteredSimplicialComplexToFilteredCWComplex:= function(M) local Y, fd; Y:=SimplicialComplexToRegularCWComplex(M); Add(Y!.properties,["filtration_length",M!.filtrationLength]); return Objectify(HapFilteredRegularCWComplex, rec( nrCells:=Y!.nrCells, filteredDimension:=M!.filteredDimension, boundaries:=Y!.boundaries, coboundaries:=Y!.coboundaries, vectorField:=fail, inverseVectorField:=fail, criticalCells:=fail, orientation:=Y!.orientation, properties:=Y!.properties)); end; ################################################################# #################################################################