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: 418346############################################################################# ## ## SimplicialSet.gi SCO package Simon Goertzen ## ## Copyright 2007-2008 Lehrstuhl B für Mathematik, RWTH Aachen ## ## The Simplicial Set data type and constructor. ## ############################################################################# ## DeclareRepresentation( "IsSimplicialSetRep", IsSimplicialSet, [ "simplicial_set", "orbifold_triangulation", "regular", "singular", "connectivity", "dimension" ] ); ## BindGlobal( "SimplicialSetFamily", NewFamily( "SimplicialSetFamily" ) ); ## BindGlobal( "SimplicialSetType", NewType( SimplicialSetFamily, IsSimplicialSetRep ) ); ## <#GAPDoc Label="SimplicialSet"> ## <ManSection> ## <Meth Arg="ot" Name="SimplicialSet" Label="constructor"/> ## <Returns>SimplicialSet</Returns> ## <Description> ## The constructor for simplicial sets based on an orbifold triangulation <A>ot</A>. ## This just sets up the object without any computations. ## These can be triggered later, either explicitly or by <Ref Meth="SimplicialSet" Label="data access"/>. ## <Example><![CDATA[ ## gap> Teardrop; ## <OrbifoldTriangulation "Teardrop" of dimension 2. 4 simplices on 4 vertices wi\ ## th Isotropy on 1 vertex and nontrivial mu-maps> ## gap> S := SimplicialSet( Teardrop ); ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 0 with Length vector [ 4 ]> ## ]]></Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ## InstallMethod( SimplicialSet, "constructor", [ IsOrbifoldTriangulation ], function( ot ) local ss, a; ss := rec( ); ss.orbifold_triangulation := ot; ss.dimension := 0; ss.0 := Set( ot!.max_simplices, x->[x] ); ss.simplicial_set := []; ss.simplicial_set[1] := ss!.0; ss.regular := []; ss.singular := []; ss.connectivity := []; ss.last_faces := []; for a in ot!.vertices do ss.connectivity[a] := Filtered( ot!.max_simplices, x -> a in x ); ss.last_faces[a] := List( ss.connectivity[a], x -> [ x ] ); if not IsBound( ot!.isotropy.( a ) ) or Order( ot!.isotropy.( a ) ) = 1 then Add( ss.regular, a ); else Add( ss.singular, a ); fi; od; return Objectify( SimplicialSetType, ss ); end ); ## <#GAPDoc Label="SimplicialSet2"> ## <ManSection> ## <Meth Arg="S, i" Name="SimplicialSet" Label="data access"/> ## <Returns>List <A>S</A>_<A>i</A></Returns> ## <Description> ## This returns the components of dimension <A>i</A> of the simplicial set <A>S</A>. ## Should be used to access existing data instead of using <C>S!.simplicial_set[ i + 1 ]</C>, ## as it has the additional side effect of computing <A>S</A> up to dimension <A>i</A>, thus ## always returning the desired result. ## <Example><![CDATA[ ## gap> S := SimplicialSet( Teardrop ); ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 0 with Length vector [ 4 ]> ## gap> S!.simplicial_set[1]; ## [ [ [ 1, 2, 3 ] ], [ [ 1, 2, 4 ] ], [ [ 1, 3, 4 ] ], [ [ 2, 3, 4 ] ] ] ## gap> S!.simplicial_set[2];; ## Error, List Element: <list>[2] must have an assigned value ## gap> SimplicialSet( S, 0 ); ## [ [ [ 1, 2, 3 ] ], [ [ 1, 2, 4 ] ], [ [ 1, 3, 4 ] ], [ [ 2, 3, 4 ] ] ] ## gap> SimplicialSet( S, 1 );; ## gap> S; ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 1 with Length vector [ 4, 12 ]> ## ]]></Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ## InstallMethod( SimplicialSet, "creation and accessment of the simplicial set up to the neccessary index", [ IsSimplicialSet, IsInt ], function( ss, n ); if ss!.dimension < n then Extend( ss, n ); fi; return ss!.simplicial_set[ n + 1 ]; end ); ## <#GAPDoc Label="ComputeNextDimension"> ## <ManSection> ## <Meth Arg="S" Name="ComputeNextDimension"/> ## <Returns><A>S</A></Returns> ## <Description> ## This computes the component of the next dimension of ## the simplicial set <A>S</A>. <A>S</A> is extended ## as a side effect. ## <Example><![CDATA[ ## gap> S; ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 1 with Length vector [ 4, 12 ]> ## gap> ComputeNextDimension( S ); ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 2 with Length vector [ 4, 12, 22 ]> ## ]]></Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ## InstallMethod( ComputeNextDimension, [ IsSimplicialSet ], function( ss ) local dim, last, conn, P, u, a, x, y, z, g; last := ss!.last_faces; conn := ss!.connectivity; P := []; u := []; for a in ss!.regular do P[a] := Concatenation( List( last[a], x->List( Filtered( conn[a], y->y>x[1] ), z->Concatenation( [ z, () ], x ) ) ) ); last[a] := P[a]; u := Union( u, P[a] ); od; for a in ss!.singular do P[a] := []; for x in last[a] do for g in Elements( ss!.orbifold_triangulation!.isotropy.( a ) ) do for y in conn[a] do if y > x[1] or ( x[1] = y and Order( g ) <> 1 ) then #this is the key to reducing simplicial set length Append( P[a], [ Concatenation( [ y, g ], x ) ]); fi; od; od; od; last[a] := P[a]; u := Union( u, P[a] ); od; ss!.dimension := ss!.dimension + 1; dim := ss!.dimension; ss!.(String( dim )) := Set( u ); ss!.simplicial_set[ dim + 1 ] := ss!.(String( dim )); return ss; end ); ## <#GAPDoc Label="Extend"> ## <ManSection> ## <Meth Arg="S, i" Name="Extend"/> ## <Returns><A>S</A></Returns> ## <Description> ## This computes the components of the simplicial set <A>S</A> ## up to dimension <A>i</A>. <A>S</A> is extended as a side effect. ## This method is equivalent to calling <Ref Meth="ComputeNextDimension"/> ## the appropriate number of times. ## <Example><![CDATA[ ## gap> S; ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 2 with Length vector [ 4, 12, 22 ]> ## gap> Extend( S, 5 ); ## <The simplicial set of the orbifold triangulation "Teardrop", computed up to d\ ## imension 5 with Length vector [ 4, 12, 22, 33, 51, 73 ]> ## ]]></Example> ## </Description> ## </ManSection> ## <#/GAPDoc> ## InstallMethod( Extend, [ IsSimplicialSet, IsInt ], function( ss, n ) while ss!.dimension < n do ComputeNextDimension( ss ); od; return ss; end ); ## InstallMethod( ViewObj, [ IsSimplicialSet ], function( ss ) local info, str; info := ss!.orbifold_triangulation!.info; if info <> "" then str := Concatenation( "The simplicial set of the orbifold triangulation \"", info, "\"," ); else str := "A simplicial set"; fi; str := Concatenation( "<", str, " computed up to dimension ", String( ss!.dimension ), " with Length vector ", String( List( ss!.simplicial_set, Length ) ), ">" ); Print( str ); end ); ## InstallMethod( PrintObj, [ IsSimplicialSet ], function( ss ) Print( "Extend( SimplicialSet( ", ss!.orbifold_triangulation, " ), ", ss!.dimension, " )\n" ); end ); ## InstallMethod( Display, [ IsSimplicialSet ], function( ss ) local s; Display( List( ss!.simplicial_set, function( s ) if Length( s ) < 1000 then return s; else return [ "..." ]; fi; end ) ); end );