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
Path: gap4r8 / pkg / GeneralizedMorphismsForCAP-2017.09.09 / gap / GeneralizedMorphismCategoryByCospans.gi
Views: 418346############################################################################# ## ## GeneralizedMorphismsForCAP package ## ## Copyright 2015, Sebastian Gutsche, TU Kaiserslautern ## Sebastian Posur, RWTH Aachen ## ############################################################################# DeclareRepresentation( "IsGeneralizedMorphismCategoryByCospansObjectRep", IsCapCategoryObjectRep and IsGeneralizedMorphismCategoryByCospansObject, [ ] ); BindGlobal( "TheTypeOfGeneralizedMorphismCategoryByCospansObject", NewType( TheFamilyOfCapCategoryObjects, IsGeneralizedMorphismCategoryByCospansObjectRep ) ); DeclareRepresentation( "IsGeneralizedMorphismByCospanRep", IsCapCategoryMorphismRep and IsGeneralizedMorphismByCospan, [ ] ); BindGlobal( "TheTypeOfGeneralizedMorphismByCospan", NewType( TheFamilyOfCapCategoryMorphisms, IsGeneralizedMorphismByCospanRep ) ); #################################### ## ## Installer ## #################################### ## InstallGlobalFunction( INSTALL_FUNCTIONS_FOR_GENERALIZED_MORPHISM_CATEGORY_BY_COSPANS, function( category ) local entry, underlying_honest_category; underlying_honest_category := UnderlyingHonestCategory( category ); ## AddIsEqualForCacheForObjects( category, IsIdenticalObj ); ## AddIsEqualForCacheForMorphisms( category, IsIdenticalObj ); AddIsEqualForObjects( category, function( object_1, object_2 ) return IsEqualForObjects( UnderlyingHonestObject( object_1 ), UnderlyingHonestObject( object_2 ) ); end ); AddIsCongruentForMorphisms( category, function( morphism1, morphism2 ) local arrow_tuple, pullback_diagram1, pullback_diagram2, subobject1, subobject2; arrow_tuple := [ Arrow( morphism1 ), ReversedArrow( morphism1 ) ]; pullback_diagram1 := [ ProjectionInFactorOfFiberProduct( arrow_tuple, 1 ), ProjectionInFactorOfFiberProduct( arrow_tuple, 2 ) ]; arrow_tuple := [ Arrow( morphism2 ), ReversedArrow( morphism2 ) ]; pullback_diagram2 := [ ProjectionInFactorOfFiberProduct( arrow_tuple, 1 ), ProjectionInFactorOfFiberProduct( arrow_tuple, 2 ) ]; subobject1 := UniversalMorphismIntoDirectSum( pullback_diagram1 ); subobject2 := UniversalMorphismIntoDirectSum( pullback_diagram2 ); ## TODO: added more logic to make the following line obsolete Assert( 4, IsMonomorphism( subobject1 ) ); SetIsMonomorphism( subobject1, true ); Assert( 4, IsMonomorphism( subobject2 ) ); SetIsMonomorphism( subobject2, true ); return IsEqualAsSubobjects( subobject1, subobject2 ); end ); ## PreCompose AddPreCompose( category, [ [ function( morphism1, morphism2 ) local pushout_diagram, injection_left, injection_right; pushout_diagram := [ ReversedArrow( morphism1 ), Arrow( morphism2 ) ]; injection_left := InjectionOfCofactorOfPushout( pushout_diagram, 1 ); injection_right := InjectionOfCofactorOfPushout( pushout_diagram, 2 ); return GeneralizedMorphismByCospan( PreCompose( Arrow( morphism1 ), injection_left ), PreCompose( ReversedArrow( morphism2 ), injection_right ) ); end, [ ] ], [ function( morphism1, morphism2 ) local arrow, reversed_arrow; arrow := PreCompose( Arrow( morphism1 ), Arrow( morphism2 ) ); return AsGeneralizedMorphismByCospan( arrow ); end, [ HasIdentityAsReversedArrow, HasIdentityAsReversedArrow ] ], [ function( morphism1, morphism2 ) local arrow; arrow := PreCompose( Arrow( morphism1 ), Arrow( morphism2 ) ); return GeneralizedMorphismByCospan( arrow, ReversedArrow( morphism2 ) ); end, [ HasIdentityAsReversedArrow, ] ] ] ); ## AdditionForMorphisms AddAdditionForMorphisms( category, [ [ function( morphism1, morphism2 ) local pushout_diagram, pushout_left, pushout_right, arrow, reversed_arrow; pushout_diagram := [ ReversedArrow( morphism1 ), ReversedArrow( morphism2 ) ]; pushout_left := InjectionOfCofactorOfPushout( pushout_diagram, 1 ); pushout_right := InjectionOfCofactorOfPushout( pushout_diagram, 2 ); arrow := PreCompose( Arrow( morphism1 ), pushout_left ) + PreCompose( Arrow( morphism2 ), pushout_right ); reversed_arrow := PreCompose( pushout_diagram[ 1 ], pushout_left ); return GeneralizedMorphismByCospan( arrow, reversed_arrow ); end, [ ] ], [ function( morphism1, morphism2 ) return AsGeneralizedMorphismByCospan( Arrow( morphism1 ) + Arrow( morphism2 ) ); end, [ HasIdentityAsReversedArrow, HasIdentityAsReversedArrow ] ] ] ); AddAdditiveInverseForMorphisms( category, [ [ function( morphism ) return GeneralizedMorphismByCospan( - Arrow( morphism ), ReversedArrow( morphism ) ); end, [ ] ], [ function( morphism ) return AsGeneralizedMorphismByCospan( - Arrow( morphism ) ); end, [ HasIdentityAsReversedArrow ] ] ] ); AddZeroMorphism( category, function( obj1, obj2 ) local morphism; morphism := ZeroMorphism( UnderlyingHonestObject( obj1 ), UnderlyingHonestObject( obj2 ) ); return AsGeneralizedMorphismByCospan( morphism ); end ); ## identity AddIdentityMorphism( category, function( generalized_object ) local identity_morphism; identity_morphism := IdentityMorphism( UnderlyingHonestObject( generalized_object ) ); return AsGeneralizedMorphismByCospan( identity_morphism ); end ); if CurrentOperationWeight( underlying_honest_category!.derivations_weight_list, "IsWellDefinedForObjects" ) < infinity then AddIsWellDefinedForObjects( category, function( object ) return IsWellDefined( UnderlyingHonestObject( object ) ); end ); fi; if CurrentOperationWeight( underlying_honest_category!.derivations_weight_list, "IsWellDefinedForMorphisms" ) < infinity then AddIsWellDefinedForMorphisms( category, function( generalized_morphism ) local category; category := CapCategory( Arrow( generalized_morphism ) ); if not ForAll( [ Arrow( generalized_morphism ), ReversedArrow( generalized_morphism ) ], x -> IsIdenticalObj( CapCategory( x ), category ) ) then return false; fi; if not ( ForAll( [ Arrow( generalized_morphism ), ReversedArrow( generalized_morphism ) ], IsWellDefined ) ) then return false; fi; return true; end ); fi; return; end ); #################################### ## ## Constructors ## #################################### ## InstallMethod( GeneralizedMorphismCategoryByCospans, [ IsCapCategory ], function( category ) local name, generalized_morphism_category, category_weight_list, i, preconditions; if not IsFinalized( category ) then Error( "category must be finalized" ); return; elif not IsAbelianCategory( category ) then Error( "the category must be abelian" ); return; fi; preconditions := [ "IsEqualAsSubobjects", "IsEqualAsFactorobjects", "LiftAlongMonomorphism", "ColiftAlongEpimorphism", "PreCompose", "IdentityMorphism", "FiberProduct", "Pushout", "ProjectionInFactorOfFiberProduct", "InjectionOfCofactorOfPushout", "AdditionForMorphisms", "CoastrictionToImage", "ImageEmbedding" ]; category_weight_list := category!.derivations_weight_list; for i in preconditions do if CurrentOperationWeight( category_weight_list, i ) = infinity then Error( Concatenation( "category must be able to compute ", i ) ); return; fi; od; name := Name( category ); name := Concatenation( "Generalized morphism category of ", name, " by cospan" ); generalized_morphism_category := CreateCapCategory( name ); SetUnderlyingHonestCategory( generalized_morphism_category, category ); INSTALL_FUNCTIONS_FOR_GENERALIZED_MORPHISM_CATEGORY_BY_COSPANS( generalized_morphism_category ); SetIsEnrichedOverCommutativeRegularSemigroup( generalized_morphism_category, true ); SetFilterObj( generalized_morphism_category, WasCreatedAsGeneralizedMorphismCategoryByCospans ); AddPredicateImplicationFileToCategory( generalized_morphism_category, Filename( DirectoriesPackageLibrary( "GeneralizedMorphismsForCAP", "LogicForGeneralizedMorphismCategory" ), "PredicateImplicationsForGeneralizedMorphismCategory.tex" ) ); Finalize( generalized_morphism_category ); return generalized_morphism_category; end ); InstallMethod( GeneralizedMorphismByCospansObject, [ IsCapCategoryObject ], function( object ) local gen_object, generalized_category; gen_object := rec( ); ObjectifyWithAttributes( gen_object, TheTypeOfGeneralizedMorphismCategoryByCospansObject, UnderlyingHonestObject, object ); generalized_category := GeneralizedMorphismCategoryByCospans( CapCategory( object ) ); Add( generalized_category, gen_object ); AddToToDoList( ToDoListEntryForEqualAttributes( gen_object, "IsWellDefined", object, "IsWellDefined" ) ); return gen_object; end ); ## InstallMethodWithCacheFromObject( GeneralizedMorphismByCospan, [ IsCapCategoryMorphism, IsCapCategoryMorphism ], function( arrow, reversed_arrow ) local generalized_morphism, generalized_category; if not IsEqualForObjects( Range( arrow ), Range( reversed_arrow ) ) then Error( "Ranges of morphisms must coincide" ); fi; generalized_morphism := rec( ); ObjectifyWithAttributes( generalized_morphism, TheTypeOfGeneralizedMorphismByCospan, Source, GeneralizedMorphismByCospansObject( Source( arrow ) ), Range, GeneralizedMorphismByCospansObject( Source( reversed_arrow ) ) ); SetArrow( generalized_morphism, arrow ); SetReversedArrow( generalized_morphism, reversed_arrow ); generalized_category := GeneralizedMorphismCategoryByCospans( CapCategory( arrow ) ); Add( generalized_category, generalized_morphism ); return generalized_morphism; end ); ## InstallMethod( AsGeneralizedMorphismByCospan, [ IsCapCategoryMorphism ], function( arrow ) local generalized_morphism; generalized_morphism := GeneralizedMorphismByCospan( arrow, IdentityMorphism( Range( arrow ) ) ); SetIsHonest( generalized_morphism, true ); SetHasIdentityAsReversedArrow( generalized_morphism, true ); return generalized_morphism; end ); #################################### ## ## Constructors of lifts of exact functors ## #################################### ## InstallMethod( AsGeneralizedMorphismByCospan, [ IsCapFunctor, IsString ], function( F, name ) local A, B, gmcF; A := GeneralizedMorphismCategoryByCospans( AsCapCategory( Source( F ) ) ); B := GeneralizedMorphismCategoryByCospans( AsCapCategory( Range( F ) ) ); gmcF := CapFunctor( name, A, B ); AddObjectFunction( gmcF, function( obj ) return GeneralizedMorphismByCospansObject( ApplyFunctor( F, UnderlyingHonestObject( obj ) ) ); end ); AddMorphismFunction( gmcF, function( new_source, mor, new_range ) return GeneralizedMorphismByCospan( ApplyFunctor( F, Arrow( mor ) ), ApplyFunctor( F, ReversedArrow( mor ) ) ); end ); return gmcF; end ); ## InstallMethod( AsGeneralizedMorphismByCospan, [ IsCapFunctor ], function( F ) local name; name := "GeneralizedMorphismByCospan version of "; name := Concatenation( name, Name( F ) ); return AsGeneralizedMorphismByCospan( F, name ); end ); ################################# ## ## Additional methods ## ################################# InstallMethod( HasIdentityAsReversedArrow, [ IsGeneralizedMorphismByCospan ], function( morphism ) local reversed_arrow; reversed_arrow := ReversedArrow( morphism ); if not IsEqualForObjects( Source( reversed_arrow ), Range( reversed_arrow ) ) then return false; fi; return IsCongruentForMorphisms( reversed_arrow, IdentityMorphism( Source( reversed_arrow ) ) ); end ); InstallMethod( NormalizedCospanTuple, [ IsGeneralizedMorphismByCospan ], function( morphism ) local arrow_tuple, pullback_diagram; arrow_tuple := [ Arrow( morphism ), ReversedArrow( morphism ) ]; pullback_diagram := [ ProjectionInFactorOfFiberProduct( arrow_tuple, 1 ), ProjectionInFactorOfFiberProduct( arrow_tuple, 2 ) ]; return [ InjectionOfCofactorOfPushout( pullback_diagram, 1 ), InjectionOfCofactorOfPushout( pullback_diagram, 2 ) ]; end ); InstallMethod( NormalizedCospan, [ IsGeneralizedMorphismByCospan ], function( morphism ) return CallFuncList( GeneralizedMorphismByCospan, NormalizedCospanTuple( morphism ) ); end ); InstallMethod( PseudoInverse, [ IsGeneralizedMorphismByCospan ], function( morphism ) return GeneralizedMorphismByCospan( ReversedArrow( morphism ), Arrow( morphism ) ); end ); InstallMethod( GeneralizedInverseByCospan, [ IsCapCategoryMorphism ], function( morphism ) return GeneralizedMorphismByCospan( IdentityMorphism( Range( morphism ) ), morphism ); end ); InstallMethod( HonestRepresentative, [ IsGeneralizedMorphismByCospan ], function( generalized_morphism ) local normalization; normalization := NormalizedCospanTuple( generalized_morphism ); return PreCompose( normalization[ 1 ], Inverse( normalization[ 2 ] ) ); end ); ## InstallMethod( HasFullCodomain, [ IsGeneralizedMorphismByCospan ], function( generalized_morphism ) return IsMonomorphism( ReversedArrow( generalized_morphism ) ); end ); ## InstallMethod( HasFullDomain, [ IsGeneralizedMorphismByCospan ], function( generalized_morphism ) local cokernel_projection; cokernel_projection := CokernelProjection( ReversedArrow( generalized_morphism ) ); return IsZero( PreCompose( Arrow( generalized_morphism ), cokernel_projection ) ); end ); InstallMethodWithCacheFromObject( GeneralizedMorphismFromFactorToSubobjectByCospan, [ IsCapCategoryMorphism, IsCapCategoryMorphism ], function( factor, subobject ) local pushout_diagram; factor := AsGeneralizedMorphismByCospan( factor ); subobject := AsGeneralizedMorphismByCospan( subobject ); return PreCompose( PseudoInverse( factor ), PseudoInverse( subobject ) ); end ); InstallMethod( IdempotentDefinedBySubobjectByCospan, [ IsCapCategoryMorphism ], function( subobject ) local generalized; generalized := AsGeneralizedMorphismByCospan( subobject ); return PreCompose( PseudoInverse( generalized ), generalized ); end ); InstallMethod( IdempotentDefinedByFactorobjectByCospan, [ IsCapCategoryMorphism ], function( factorobject ) return GeneralizedMorphismByCospan( factorobject, factorobject ); end ); InstallMethod( GeneralizedInverseByCospan, [ IsCapCategoryMorphism ], function( morphism ) return PseudoInverse( AsGeneralizedMorphismByCospan( morphism ) ); end ); ## InstallMethodWithCacheFromObject( CommonCoastrictionOp, [ IsList, IsGeneralizedMorphismByCospan ], function( morphism_list, method_selection_object ) local arrow_list, reversedarrow_list, i, j, current_pushout_left, current_pushout_right, test_source; if not ForAll( morphism_list, IsGeneralizedMorphismByCospan ) then TryNextMethod(); fi; if Length( morphism_list ) = 1 then return morphism_list; fi; test_source := Range( morphism_list[ 1 ] ); if not ForAll( [ 2 .. Length( morphism_list ) ], i -> IsEqualForObjects( test_source, Range( morphism_list[ i ] ) ) ) then Error( "not all ranges are equal" ); fi; arrow_list := List( morphism_list, Arrow ); reversedarrow_list := List( morphism_list, ReversedArrow ); for i in [ 2 .. Length( morphism_list ) ] do current_pushout_left := InjectionOfCofactorOfPushout( [ reversedarrow_list[ i - 1 ], reversedarrow_list[ i ] ], 1 ); current_pushout_right := InjectionOfCofactorOfPushout( [ reversedarrow_list[ i - 1 ], reversedarrow_list[ i ] ], 2 ); for j in [ 1 .. i - 1 ] do arrow_list[ j ] := PreCompose( arrow_list[ j ], current_pushout_left ); reversedarrow_list[ j ] := PreCompose( reversedarrow_list[ j ], current_pushout_left ); od; arrow_list[ i ] := PreCompose( arrow_list[ i ], current_pushout_right ); reversedarrow_list[ i ] := PreCompose( reversedarrow_list[ i ], current_pushout_right ); od; return List( [ 1 .. Length( morphism_list ) ], i -> GeneralizedMorphismByCospan( arrow_list[ i ], reversedarrow_list[ i ] ) ); end : ArgumentNumber := 2 ); ## InstallMethodWithCacheFromObject( ConcatenationProductOp, [ IsList, IsGeneralizedMorphismByCospan ], function( generalized_morphism_list, method_selection_object ) return GeneralizedMorphismByCospan( DirectSumFunctorial( List( generalized_morphism_list, Arrow ) ), DirectSumFunctorial( List( generalized_morphism_list, ReversedArrow ) ) ); end : ArgumentNumber := 2 ); ###################################### ## ## Compatibility ## ###################################### InstallMethod( GeneralizedMorphismByCospan, [ IsCapCategoryMorphism, IsCapCategoryMorphism, IsCapCategoryMorphism ], function( source_aid, morphism_aid, range_aid ) local morphism1, morphism2; morphism1 := PseudoInverse( AsGeneralizedMorphismByCospan( source_aid ) ); morphism2 := GeneralizedMorphismByCospan( morphism_aid, range_aid ); return PreCompose( morphism1, morphism2 ); end ); InstallMethodWithCacheFromObject( DomainAssociatedMorphismCodomainTriple, [ IsGeneralizedMorphismByCospan ], function( morphism ) local three_arrow; three_arrow := GeneralizedMorphismByThreeArrowsWithRangeAid( Arrow( morphism ), ReversedArrow( morphism ) ); return DomainAssociatedMorphismCodomainTriple( three_arrow ); end ); InstallMethod( GeneralizedMorphismByCospanWithSourceAid, [ IsCapCategoryMorphism, IsCapCategoryMorphism ], function( source_aid, morphism_aid ) local morphism1, morphism2; morphism1 := GeneralizedInverseByCospan( source_aid ); morphism2 := AsGeneralizedMorphismByCospan( morphism_aid ); return PreCompose( morphism1, morphism2 ); end );