GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
if not IsBound( VectorSpacesConstructorsLoaded ) then
ReadPackage( "CAP", "examples/testfiles/VectorSpacesConstructors.gi" );
fi;
if not IsCapCategory( vecspaces ) then
vecspaces := CreateCapCategory( "VectorSpacesFinalizeTest" );
fi;
SetIsAbelianCategory( vecspaces, true );
AddIsCongruentForMorphisms( vecspaces,
function( a, b )
return a!.morphism = b!.morphism;
end );
AddIsEqualForObjects( vecspaces,
function( a, b )
return Dimension( a ) = Dimension( b );
end );
## Methods needed for FiberProductEmbeddingInDirectSum:
##
AddKernelEmbedding( vecspaces,
function( morphism )
local kernel_emb, kernel_obj;
kernel_emb := SyzygiesOfRows( morphism!.morphism );
kernel_obj := QVectorSpace( NrRows( kernel_emb ) );
return VectorSpaceMorphism( kernel_obj, kernel_emb, Source( morphism ) );
end );
##
AddPreCompose( vecspaces,
function( mor_left, mor_right )
local composition;
composition := mor_left!.morphism * mor_right!.morphism;
return VectorSpaceMorphism( Source( mor_left ), composition, Range( mor_right ) );
end );
##
AddDirectSum( vecspaces,
function( object_product_list )
local dim;
dim := Sum( List( object_product_list, c -> Dimension( c ) ) );
return QVectorSpace( dim );
end );
##
## the user may assume that Length( object_product_list ) > 1
AddProjectionInFactorOfDirectSumWithGivenDirectSum( vecspaces,
function( object_product_list, projection_number, direct_product )
local components, dim_pre, dim_post, dim_factor, number_of_objects, projection_in_factor;
components := object_product_list;
number_of_objects := Length( components );
dim_pre := Sum( components{ [ 1 .. projection_number - 1 ] }, c -> Dimension( c ) );
dim_post := Sum( components{ [ projection_number + 1 .. number_of_objects ] }, c -> Dimension( c ) );
dim_factor := Dimension( object_product_list[ projection_number ] );
projection_in_factor := HomalgZeroMatrix( dim_pre, dim_factor, VECTORSPACES_FIELD );
projection_in_factor := UnionOfRows( projection_in_factor,
HomalgIdentityMatrix( dim_factor, VECTORSPACES_FIELD ) );
projection_in_factor := UnionOfRows( projection_in_factor,
HomalgZeroMatrix( dim_post, dim_factor, VECTORSPACES_FIELD ) );
return VectorSpaceMorphism( direct_product, projection_in_factor, object_product_list[ projection_number ] );
end );
##
AddUniversalMorphismIntoDirectSumWithGivenDirectSum( vecspaces,
function( diagram, sink, direct_product )
local components, universal_morphism, morphism;
components := sink;
universal_morphism := sink[1]!.morphism;
for morphism in components{ [ 2 .. Length( components ) ] } do
universal_morphism := UnionOfColumns( universal_morphism, morphism!.morphism );
od;
return VectorSpaceMorphism( Source( sink[1] ), universal_morphism, direct_product );
end );
##
AddAdditiveInverseForMorphisms( vecspaces,
function( a )
return VectorSpaceMorphism( Source( a ), - a!.morphism, Range( a ) );
end );
##
AddAdditionForMorphisms( vecspaces,
function( a, b )
return VectorSpaceMorphism( Source( a ), a!.morphism + b!.morphism, Range( a ) );
end );
## Methods needed for FiberProductEmbeddingInDirectSum:
##
AddKernelLift( vecspaces,
function( mor, test_morphism )
local kernel_emb;
kernel_emb := SyzygiesOfRows( mor!.morphism );
return VectorSpaceMorphism( Source( test_morphism ), RightDivide( test_morphism!.morphism, kernel_emb ), Source( kernel_emb ) );
end );
## Methods needed for DirectSumProjectionInPushout
##
AddCokernelObject( vecspaces,
function( morphism )
local homalg_matrix;
homalg_matrix := morphism!.morphism;
return QVectorSpace( NrColumns( homalg_matrix ) - RowRankOfMatrix( homalg_matrix ) );
end );
##
AddCokernelProjectionWithGivenCokernelObject( vecspaces,
function( morphism, cokernel )
local cokernel_proj;
cokernel_proj := SyzygiesOfColumns( morphism!.morphism );
return VectorSpaceMorphism( Range( morphism ), cokernel_proj, cokernel );
end );
##
AddColiftAlongEpimorphism( vecspaces,
function( epimorphism, test_morphism )
return VectorSpaceMorphism( Range( epimorphism ), LeftDivide( epimorphism!.morphism, test_morphism!.morphism ), Range( test_morphism ) );
end );
##
AddUniversalMorphismFromDirectSumWithGivenDirectSum( vecspaces,
function( diagram, sink, coproduct )
local components, universal_morphism, morphism;
components := sink;
universal_morphism := sink[1]!.morphism;
for morphism in components{ [ 2 .. Length( components ) ] } do
universal_morphism := UnionOfRows( universal_morphism, morphism!.morphism );
od;
return VectorSpaceMorphism( coproduct, universal_morphism, Range( sink[1] ) );
end );
##
AddInjectionOfCofactorOfDirectSumWithGivenDirectSum( vecspaces,
function( object_product_list, injection_number, coproduct )
local components, dim_pre, dim_post, dim_cofactor, number_of_objects, injection_of_cofactor;
components := object_product_list;
number_of_objects := Length( components );
dim_pre := Sum( components{ [ 1 .. injection_number - 1 ] }, c -> Dimension( c ) );
dim_post := Sum( components{ [ injection_number + 1 .. number_of_objects ] }, c -> Dimension( c ) );
dim_cofactor := Dimension( object_product_list[ injection_number ] );
injection_of_cofactor := HomalgZeroMatrix( dim_cofactor, dim_pre ,VECTORSPACES_FIELD );
injection_of_cofactor := UnionOfColumns( injection_of_cofactor,
HomalgIdentityMatrix( dim_cofactor, VECTORSPACES_FIELD ) );
injection_of_cofactor := UnionOfColumns( injection_of_cofactor,
HomalgZeroMatrix( dim_cofactor, dim_post, VECTORSPACES_FIELD ) );
return VectorSpaceMorphism( object_product_list[ injection_number ], injection_of_cofactor, coproduct );
end );
##
AddUniversalMorphismFromDirectSumWithGivenDirectSum( vecspaces,
function( diagram, sink, coproduct )
local components, universal_morphism, morphism;
components := sink;
universal_morphism := sink[1]!.morphism;
for morphism in components{ [ 2 .. Length( components ) ] } do
universal_morphism := UnionOfRows( universal_morphism, morphism!.morphism );
od;
return VectorSpaceMorphism( coproduct, universal_morphism, Range( sink[1] ) );
end );