From 64d67bd61bc1d7c7c256bb451c1c54735a92f39c Mon Sep 17 00:00:00 2001 From: Mohamed Barakat Date: Wed, 7 Dec 2022 19:45:59 +0100 Subject: [PATCH] installed derivations for Abelian categories * IsomorphismFromKernelOfCokernelToImageObject * IsomorphismFromCoimageToCokernelOfKernel --- CAP/PackageInfo.g | 2 +- CAP/gap/DerivedMethods.gi | 40 +++++++++++++++++++ LinearAlgebraForCAP/PackageInfo.g | 4 +- LinearAlgebraForCAP/gap/CompilerLogic.gi | 10 +++++ .../MatrixCategoryPrecompiled.gi | 32 +++++++-------- 5 files changed, 67 insertions(+), 21 deletions(-) diff --git a/CAP/PackageInfo.g b/CAP/PackageInfo.g index 04b2429ec2..053fa23694 100644 --- a/CAP/PackageInfo.g +++ b/CAP/PackageInfo.g @@ -10,7 +10,7 @@ SetPackageInfo( rec( PackageName := "CAP", Subtitle := "Categories, Algorithms, Programming", -Version := "2022.12-14", +Version := "2022.12-15", Date := Concatenation( "01/", ~.Version{[ 6, 7 ]}, "/", ~.Version{[ 1 .. 4 ]} ), License := "GPL-2.0-or-later", diff --git a/CAP/gap/DerivedMethods.gi b/CAP/gap/DerivedMethods.gi index a6f8362ffe..9b91480722 100644 --- a/CAP/gap/DerivedMethods.gi +++ b/CAP/gap/DerivedMethods.gi @@ -1820,6 +1820,26 @@ AddDerivationToCAP( IsomorphismFromKernelOfCokernelToImageObject, end : Description := "IsomorphismFromKernelOfCokernelToImageObject as the inverse of IsomorphismFromImageObjectToKernelOfCokernel" ); +## +AddDerivationToCAP( IsomorphismFromKernelOfCokernelToImageObject, + [ [ ImageEmbedding, 1 ], + [ CokernelProjection, 1 ], + [ KernelEmbedding, 1 ], + [ LiftAlongMonomorphism, 1 ] ], + + function( cat, mor ) + local image_embedding, ker_of_coker_embedding; + + image_embedding := ImageEmbedding( cat, mor ); + + ker_of_coker_embedding := KernelEmbedding( cat, CokernelProjection( cat, mor ) ); + + return LiftAlongMonomorphism( cat, image_embedding, ker_of_coker_embedding ); + + end : CategoryFilter := IsAbelianCategory, ##FIXME: PreAbelian? + Description := "IsomorphismFromKernelOfCokernelToImageObject as the unique lift of the kernel of the cokernel along the image embedding" +); + ## AddDerivationToCAP( IsomorphismFromImageObjectToKernelOfCokernel, @@ -1875,6 +1895,26 @@ AddDerivationToCAP( IsomorphismFromCoimageToCokernelOfKernel, end : Description := "IsomorphismFromCoimageToCokernelOfKernel as the inverse of IsomorphismFromCokernelOfKernelToCoimage" ); +## +AddDerivationToCAP( IsomorphismFromCoimageToCokernelOfKernel, + [ [ CoimageProjection, 1 ], + [ KernelEmbedding, 1 ], + [ CokernelProjection, 1 ], + [ ColiftAlongEpimorphism, 1 ] ], + + function( cat, mor ) + local coimage_projection, coker_of_ker_projection; + + coimage_projection := CoimageProjection( cat, mor ); + + coker_of_ker_projection := CokernelProjection( cat, KernelEmbedding( cat, mor ) ); + + return ColiftAlongEpimorphism( cat, coimage_projection, coker_of_ker_projection ); + + end : CategoryFilter := IsAbelianCategory, ##FIXME: PreAbelian? + Description := "IsomorphismFromCoimageToCokernelOfKernel as the unique colift of the cokernel of the kernel along the coimage projection" +); + ## AddDerivationToCAP( IsomorphismFromFiberProductToKernelOfDiagonalDifference, diff --git a/LinearAlgebraForCAP/PackageInfo.g b/LinearAlgebraForCAP/PackageInfo.g index 48a240dc14..c45a87c3a8 100644 --- a/LinearAlgebraForCAP/PackageInfo.g +++ b/LinearAlgebraForCAP/PackageInfo.g @@ -10,7 +10,7 @@ SetPackageInfo( rec( PackageName := "LinearAlgebraForCAP", Subtitle := "Category of Matrices over a Field for CAP", -Version := "2022.12-04", +Version := "2022.12-05", Date := Concatenation( "01/", ~.Version{[ 6, 7 ]}, "/", ~.Version{[ 1 .. 4 ]} ), License := "GPL-2.0-or-later", @@ -89,7 +89,7 @@ Dependencies := rec( NeededOtherPackages := [ [ "ToolsForHomalg", ">=2015.09.18" ], [ "MatricesForHomalg", ">= 2021.12-01" ], [ "GaussForHomalg", ">= 2021.04-02" ], - [ "CAP", ">= 2022.12-07" ], + [ "CAP", ">= 2022.12-15" ], [ "MonoidalCategories", ">= 2022.06-01" ], ], SuggestedOtherPackages := [ diff --git a/LinearAlgebraForCAP/gap/CompilerLogic.gi b/LinearAlgebraForCAP/gap/CompilerLogic.gi index 5e0e1a81cd..ef22dc5e71 100644 --- a/LinearAlgebraForCAP/gap/CompilerLogic.gi +++ b/LinearAlgebraForCAP/gap/CompilerLogic.gi @@ -54,3 +54,13 @@ CapJitAddLogicTemplate( needed_packages := [ [ "MatricesForHomalg", ">= 2020.05.19" ] ], ) ); + +# RightDivide( B, A ) * RightDivide( A, C ) => RightDivide( B, C ) +CapJitAddLogicTemplate( + rec( + variable_names := [ "A", "B", "C" ], + variable_filters := [ "IsHomalgMatrix", "IsHomalgMatrix", "IsHomalgMatrix" ], + src_template := "RightDivide( B, A ) * RightDivide( A, C )", + dst_template := "RightDivide( B, C )", + ) +); diff --git a/LinearAlgebraForCAP/gap/precompiled_categories/MatrixCategoryPrecompiled.gi b/LinearAlgebraForCAP/gap/precompiled_categories/MatrixCategoryPrecompiled.gi index daaf2be544..1577c07291 100644 --- a/LinearAlgebraForCAP/gap/precompiled_categories/MatrixCategoryPrecompiled.gi +++ b/LinearAlgebraForCAP/gap/precompiled_categories/MatrixCategoryPrecompiled.gi @@ -2165,16 +2165,14 @@ end ######## function ( cat_1, C_1, alpha_1, I_1 ) - local morphism_attr_1_1, deduped_2_1, deduped_3_1, deduped_4_1; - deduped_4_1 := UnderlyingRing( cat_1 ); - deduped_3_1 := UnderlyingMatrix( alpha_1 ); - deduped_2_1 := SyzygiesOfRows( SyzygiesOfColumns( deduped_3_1 ) ); - morphism_attr_1_1 := RightDivide( HomalgIdentityMatrix( RowRankOfMatrix( deduped_3_1 ), deduped_4_1 ), RightDivide( LeftDivide( BasisOfColumns( deduped_3_1 ), deduped_3_1 ), deduped_2_1 ) * RightDivide( HomalgIdentityMatrix( NumberRows( deduped_2_1 ), deduped_4_1 ), RightDivide( BasisOfRows( deduped_3_1 ), deduped_2_1 ) ) ); + local morphism_attr_1_1, deduped_2_1; + deduped_2_1 := UnderlyingMatrix( alpha_1 ); + morphism_attr_1_1 := RightDivide( HomalgIdentityMatrix( RowRankOfMatrix( deduped_2_1 ), UnderlyingRing( cat_1 ) ), RightDivide( LeftDivide( BasisOfColumns( deduped_2_1 ), deduped_2_1 ), BasisOfRows( deduped_2_1 ) ) ); return CreateCapCategoryMorphismWithAttributes( cat_1, CreateCapCategoryObjectWithAttributes( cat_1, Dimension, NumberRows( morphism_attr_1_1 ) ), C_1, UnderlyingMatrix, morphism_attr_1_1 ); end ######## - , 1817 : IsPrecompiledDerivation := true ); + , 1512 : IsPrecompiledDerivation := true ); ## AddIsAutomorphism( cat, @@ -2603,12 +2601,12 @@ end function ( cat_1, alpha_1 ) local morphism_attr_1_1, deduped_2_1; deduped_2_1 := UnderlyingMatrix( alpha_1 ); - morphism_attr_1_1 := RightDivide( HomalgIdentityMatrix( ColumnRankOfMatrix( deduped_2_1 ), UnderlyingRing( cat_1 ) ), LeftDivide( SyzygiesOfColumns( SyzygiesOfRows( deduped_2_1 ) ), BasisOfColumns( deduped_2_1 ) ) ); + morphism_attr_1_1 := LeftDivide( BasisOfColumns( deduped_2_1 ), SyzygiesOfColumns( SyzygiesOfRows( deduped_2_1 ) ) ); return CreateCapCategoryMorphismWithAttributes( cat_1, CreateCapCategoryObjectWithAttributes( cat_1, Dimension, NumberRows( morphism_attr_1_1 ) ), CreateCapCategoryObjectWithAttributes( cat_1, Dimension, NumberColumns( morphism_attr_1_1 ) ), UnderlyingMatrix, morphism_attr_1_1 ); end ######## - , 808 : IsPrecompiledDerivation := true ); + , 503 : IsPrecompiledDerivation := true ); ## AddIsomorphismFromCokernelOfDiagonalDifferenceToPushout( cat, @@ -2984,15 +2982,14 @@ end ######## function ( cat_1, alpha_1 ) - local morphism_attr_1_1, deduped_2_1, deduped_3_1; - deduped_3_1 := UnderlyingMatrix( alpha_1 ); - deduped_2_1 := SyzygiesOfRows( SyzygiesOfColumns( deduped_3_1 ) ); - morphism_attr_1_1 := RightDivide( HomalgIdentityMatrix( NumberRows( deduped_2_1 ), UnderlyingRing( cat_1 ) ), RightDivide( BasisOfRows( deduped_3_1 ), deduped_2_1 ) ); + local morphism_attr_1_1, deduped_2_1; + deduped_2_1 := UnderlyingMatrix( alpha_1 ); + morphism_attr_1_1 := RightDivide( SyzygiesOfRows( SyzygiesOfColumns( deduped_2_1 ) ), BasisOfRows( deduped_2_1 ) ); return CreateCapCategoryMorphismWithAttributes( cat_1, CreateCapCategoryObjectWithAttributes( cat_1, Dimension, NumberRows( morphism_attr_1_1 ) ), CreateCapCategoryObjectWithAttributes( cat_1, Dimension, NumberColumns( morphism_attr_1_1 ) ), UnderlyingMatrix, morphism_attr_1_1 ); end ######## - , 808 : IsPrecompiledDerivation := true ); + , 503 : IsPrecompiledDerivation := true ); ## AddIsomorphismFromKernelOfDiagonalDifferenceToFiberProduct( cat, @@ -4139,15 +4136,14 @@ end ######## function ( cat_1, C_1, alpha_1, I_1 ) - local morphism_attr_1_1, deduped_2_1, deduped_3_1; - deduped_3_1 := UnderlyingMatrix( alpha_1 ); - deduped_2_1 := SyzygiesOfRows( SyzygiesOfColumns( deduped_3_1 ) ); - morphism_attr_1_1 := RightDivide( LeftDivide( BasisOfColumns( deduped_3_1 ), deduped_3_1 ), deduped_2_1 ) * RightDivide( HomalgIdentityMatrix( NumberRows( deduped_2_1 ), UnderlyingRing( cat_1 ) ), RightDivide( BasisOfRows( deduped_3_1 ), deduped_2_1 ) ); + local morphism_attr_1_1, deduped_2_1; + deduped_2_1 := UnderlyingMatrix( alpha_1 ); + morphism_attr_1_1 := RightDivide( LeftDivide( BasisOfColumns( deduped_2_1 ), deduped_2_1 ), BasisOfRows( deduped_2_1 ) ); return CreateCapCategoryMorphismWithAttributes( cat_1, C_1, CreateCapCategoryObjectWithAttributes( cat_1, Dimension, NumberColumns( morphism_attr_1_1 ) ), UnderlyingMatrix, morphism_attr_1_1 ); end ######## - , 1614 : IsPrecompiledDerivation := true ); + , 1309 : IsPrecompiledDerivation := true ); ## AddMorphismFromFiberProductToSink( cat,