Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  HomalgBigradedObject.gi   Sprache: unbekannt

 
# SPDX-License-Identifier: GPL-2.0-or-later
# homalg: A homological algebra meta-package for computable Abelian categories
#
# Implementations
#

##  Implementations for homalg bigraded objects.

##  <#GAPDoc Label="BigradedObjects:intro">
##    Bigraded objects in &homalg; provide a data structure for the sheets (or pages) of spectral sequences.
##  <#/GAPDoc>

####################################
#
# representations:
#
####################################

##  <#GAPDoc Label="IsBigradedObjectOfFinitelyPresentedObjectsRep">
##  <ManSection>
##    <Filt Type="Representation" Arg="Er" Name="IsBigradedObjectOfFinitelyPresentedObjectsRep"/>
##    <Returns><C>true</C> or <C>false</C></Returns>
##    <Description>
##      The &GAP; representation of bigraded objects of finitley generated &homalg; objects. <P/>
##      (It is a representation of the &GAP; category <Ref Filt="IsHomalgBigradedObject"/>,
##       which is a subrepresentation of the &GAP; representation <C>IsFinitelyPresentedObjectRep</C>.)
##    </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareRepresentation( "IsBigradedObjectOfFinitelyPresentedObjectsRep",
        IsHomalgBigradedObject and IsFinitelyPresentedObjectRep,
        [  ] );

####################################
#
# families and types:
#
####################################

# a new family:
BindGlobal( "TheFamilyOfHomalgBigradedObjectes",
        NewFamily( "TheFamilyOfHomalgBigradedObjectes" ) );

# four new types:
BindGlobal( "TheTypeZerothHomalgBigradedObjectAssociatedToABicomplexOfLeftObjects",
        NewType( TheFamilyOfHomalgBigradedObjectes,
                IsBigradedObjectOfFinitelyPresentedObjectsRep and
                IsHomalgBigradedObjectAssociatedToABicomplex and
                IsHomalgLeftObjectOrMorphismOfLeftObjects ) );

BindGlobal( "TheTypeZerothHomalgBigradedObjectAssociatedToABicomplexOfRightObjects",
        NewType( TheFamilyOfHomalgBigradedObjectes,
                IsBigradedObjectOfFinitelyPresentedObjectsRep and
                IsHomalgBigradedObjectAssociatedToABicomplex and
                IsHomalgRightObjectOrMorphismOfRightObjects ) );

BindGlobal( "TheTypeHigherHomalgBigradedObjectAssociatedToABicomplexOfLeftObjects",
        NewType( TheFamilyOfHomalgBigradedObjectes,
                IsBigradedObjectOfFinitelyPresentedObjectsRep and
                IsHomalgBigradedObjectAssociatedToABicomplex and
                IsHomalgBigradedObjectAssociatedToAnExactCouple and
                IsHomalgLeftObjectOrMorphismOfLeftObjects ) );

BindGlobal( "TheTypeHigherHomalgBigradedObjectAssociatedToABicomplexOfRightObjects",
        NewType( TheFamilyOfHomalgBigradedObjectes,
                IsBigradedObjectOfFinitelyPresentedObjectsRep and
                IsHomalgBigradedObjectAssociatedToABicomplex and
                IsHomalgBigradedObjectAssociatedToAnExactCouple and
                IsHomalgRightObjectOrMorphismOfRightObjects ) );

####################################
#
# immediate methods for properties:
#
####################################

##
InstallImmediateMethod( IsStableSheet,
        IsHomalgBigradedObject, 0,
        
  function( Er )
    
    if IsBound( Er!.stability_table ) then
        return Position( Flat( Er!.stability_table ), '*' ) = fail;
    fi;
    
    TryNextMethod( );
    
end );

####################################
#
# methods for properties:
#
####################################

##
InstallMethod( IsStableSheet,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    
    if IsBound( Er!.stability_table ) then
        return Position( Flat( Er!.stability_table ), '*' ) = fail;
    fi;
    
    TryNextMethod( );
    
end );

####################################
#
# methods for operations:
#
####################################

##
InstallMethod( homalgResetFilters,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    local property;
    
    if not IsBound( HOMALG.PropertiesOfBigradedObjectes ) then
        HOMALG.PropertiesOfBigradedObjectes :=
          [ IsZero,
            IsStableSheet ];
    fi;
    
    for property in HOMALG.PropertiesOfBigradedObjectes do
        ResetFilterObj( Er, property );
    od;
    
end );

##
InstallMethod( StructureObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    
    return StructureObject( LowestBidegreeObjectInBigradedObject( Er ) );
    
end );

## provided to avoid branching in the code and always returns fail
InstallMethod( PositionOfTheDefaultPresentation,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    
    return fail;
    
end );

##
InstallMethod( ObjectDegreesOfBigradedObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    
    return Er!.bidegrees;
    
end );

##
InstallMethod( CertainObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject, IsList ],
        
  function( Er, pq )
    local Epq;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    if not IsBound(Er!.(String( pq ))) then
        return fail;
    fi;
    
    Epq := Er!.(String( pq ));
    
    if IsHomalgMorphism( Epq ) then
        return Source( Epq );
    fi;
    
    return Epq;
    
end );

##
InstallMethod( ObjectsOfBigradedObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    local bidegrees;
    
    bidegrees := ObjectDegreesOfBigradedObject( Er );
    
    return List( Reversed( bidegrees[2] ), q -> List( bidegrees[1], p -> CertainObject( Er, [ p, q ] ) ) );
    
end );

##
InstallMethod( LowestBidegreeInBigradedObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    local bidegrees;
    
    bidegrees := ObjectDegreesOfBigradedObject( Er );
    
    return [ bidegrees[1][1], bidegrees[2][1] ];
    
end );

##
InstallMethod( HighestBidegreeInBigradedObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    local bidegrees;
    
    bidegrees := ObjectDegreesOfBigradedObject( Er );
    
    return [ bidegrees[1][Length( bidegrees[1] )], bidegrees[2][Length( bidegrees[2] )] ];
    
end );

##
InstallMethod( LowestBidegreeObjectInBigradedObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    local pq;
    
    pq := LowestBidegreeInBigradedObject( Er );
    
    return CertainObject( Er, pq );
    
end );

##
InstallMethod( HighestBidegreeObjectInBigradedObject,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    local pq;
    
    pq := HighestBidegreeInBigradedObject( Er );
    
    return CertainObject( Er, pq );
    
end );

##
InstallMethod( CertainMorphism,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject, IsList ],
        
  function( Er, pq )
    local Epq;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    if not IsBound(Er!.(String( pq ))) then
        return fail;
    fi;
    
    Epq := Er!.(String( pq ));
    
    if not IsHomalgMorphism( Epq ) then
        return fail;
    fi;
    
    return Epq;
    
end );

##
InstallMethod( LevelOfBigradedObject,
        "for homalg bigraded objects stemming from an exact couple",
        [ IsBigradedObjectOfFinitelyPresentedObjectsRep and IsHomalgBigradedObjectAssociatedToAFilteredComplex ],
        
  function( Er )
    
    return Er!.level;
    
end );

##
InstallMethod( BidegreeOfDifferential,
        "for homalg bigraded objects stemming from a bicomplex",
        [ IsBigradedObjectOfFinitelyPresentedObjectsRep and IsEndowedWithDifferential ],
        
  function( Er )
    
    return Er!.BidegreeOfDifferential;
    
end );

##
InstallMethod( UnderlyingBicomplex,
        "for homalg bigraded objects stemming from a bicomplex",
        [ IsHomalgBigradedObjectAssociatedToABicomplex and IsBigradedObjectOfFinitelyPresentedObjectsRep ],
        
  function( Er )
    
    if IsBound(Er!.bicomplex) then
        return Er!.bicomplex;
    fi;
    
    Error( "it seems that the bigraded object does not stem from a bicomplex\n" );
    
end );

##
InstallMethod( DecideZero,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    
    List( Flat( ObjectsOfBigradedObject( Er ) ), DecideZero );
    
    return Er;
    
end );

##  <#GAPDoc Label="ByASmallerPresentation:bigradedobject">
##  <ManSection>
##    <Meth Arg="Er" Name="ByASmallerPresentation" Label="for bigraded objects"/>
##    <Returns>a &homalg; bigraded object</Returns>
##    <Description>
##    It invokes <C>ByASmallerPresentation</C> for &homalg; (static) objects.
##      <Listing Type="Code"><![CDATA[
InstallMethod( ByASmallerPresentation,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( Er )
    
    List( Flat( ObjectsOfBigradedObject( Er ) ), ByASmallerPresentation );
    
    return Er;
    
end );
##  ]]></Listing>
##      This method performs side effects on its argument <A>Er</A> and returns it.
##    </Description>
##  </ManSection>
##  <#/GAPDoc>

####################################
#
# constructor functions and methods:
#
####################################

##  <#GAPDoc Label="HomalgBigradedObject">
##  <ManSection>
##    <Oper Arg="B" Name="HomalgBigradedObject" Label="constructor for bigraded objects given a bicomplex"/>
##    <Returns>a &homalg; bigraded object</Returns>
##    <Description>
##    This constructor creates a homological (resp. cohomological) bigraded object given a homological
##    (resp. cohomological) &homalg; bicomplex <A>B</A>
##    (&see; <Ref Func="HomalgBicomplex" Label="constructor for bicomplexes given a complex of complexes"/>).
##    This is nothing but the level zero sheet (without differential) of the spectral sequence associated to
##    the bicomplex <A>B</A>. So it is the double array of &homalg; objects (i.e. static objects or complexes) in <A>B</A>
##    forgetting the morphisms.
##      <Example><![CDATA[
##  gap> zz := HomalgRingOfIntegers( );
##  Z
##  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, zz );;
##  gap> M := LeftPresentation( M );
##  <A non-torsion left module presented by 2 relations for 3 generators>
##  gap> d := Resolution( M );;
##  gap> dd := Hom( d );;
##  gap> C := Resolution( dd );;
##  gap> CC := Hom( C );
##  <A non-zero acyclic complex containing a single morphism of left cocomplexes a\
##  t degrees [ 0 .. 1 ]>
##  gap> B := HomalgBicomplex( CC );
##  <A non-zero bicomplex containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  gap> E0 := HomalgBigradedObject( B );
##  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  gap> Display( E0 );
##  Level 0:
##  
##   * *
##   * *
##  ]]></Example>
##    </Description>
##  </ManSection>
##  <#/GAPDoc>
##
InstallMethod( HomalgBigradedObject,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local bidegrees, Er, p, q, type;
    
    bidegrees := ObjectDegreesOfBicomplex( B );
    
    Er := rec( bidegrees := bidegrees,
              level := 0,
              bicomplex := B );
    
    for p in bidegrees[1] do
        for q in bidegrees[2] do
            Er.(String( [ p, q ] )) := CertainObject( B, [ p, q ] );
        od;
    od;
    
    if IsHomalgLeftObjectOrMorphismOfLeftObjects( Er.(String( [ p, q ] )) ) then
        type := TheTypeZerothHomalgBigradedObjectAssociatedToABicomplexOfLeftObjects;
    else
        type := TheTypeZerothHomalgBigradedObjectAssociatedToABicomplexOfRightObjects;
    fi;
    
    ## Objectify
    Objectify( type, Er );
    
    return Er;
    
end );

##  <#GAPDoc Label="AsDifferentialObject:bicomplex">
##  <ManSection>
##    <Meth Arg="Er" Name="AsDifferentialObject" Label="for homalg bigraded objects stemming from a bicomplex"/>
##    <Returns>a &homalg; bigraded object</Returns>
##    <Description>
##    Add the induced bidegree <M>( -r, r - 1 )</M> (resp. <M>( r, -r + 1 )</M>) differential to the level <A>r</A>
##    homological (resp. cohomological) bigraded object stemming from a homological (resp. cohomological) bicomplex.
##    This method performs side effects on its argument <A>Er</A> and returns it. <P/>
##    For an example see <Ref Meth="DefectOfExactness" Label="for homalg differential bigraded objects"/> below.
##    </Description>
##  </ManSection>
##  <#/GAPDoc>
##
InstallMethod( AsDifferentialObject,
        "for homalg bigraded objects stemming from a bicomplex",
        [ IsHomalgBigradedObjectAssociatedToABicomplex and IsBigradedObjectOfFinitelyPresentedObjectsRep ],
        
  function( Er )
    local bidegrees, B, r, cpx, bidegree, lp, lq, q_degrees, p_degrees, d, max,
          p, q, i, j, source, target, mor_h, mor_v, emb_source, emb_target,
          bidegrees_target, mor, bidegrees_source, aid, k;
    
    bidegrees := ObjectDegreesOfBigradedObject( Er );
    
    ## the associated bicomplex
    B := UnderlyingBicomplex( Er );
    
    r := LevelOfBigradedObject( Er );
    
    cpx := IsBicomplexOfFinitelyPresentedObjectsRep( B );
    
    if cpx then
        bidegree := [ -r, r - 1 ];
    else
        bidegree := [ r, 1 - r ];
    fi;
    
    Er!.BidegreeOfDifferential := bidegree;
    
    lp := Length( bidegrees[1] );
    lq := Length( bidegrees[2] );
    
    if r = 0 then
        if cpx then
            q_degrees := bidegrees[2]{[ 2 .. lq ]};
            d := r -> [ -r, r - 1 ];
        else
            q_degrees := bidegrees[2]{[ 1 .. lq - 1 ]};
            d := r -> [ r, 1 - r ];
        fi;
        
        for p in bidegrees[1] do
            for q in q_degrees do
                Er!.(String( [ p, q ] )) := CertainVerticalMorphism( B, [ p, q ] );
            od;
        od;
        
        max := Minimum( lp, lq );
        
        p := bidegrees[1];
        q := bidegrees[2];
        
        ## create the stability table for the zeroth sheet
        Er!.stability_table := List( [ 1 .. lq ], a -> ListWithIdenticalEntries( lp, '.' ) );
        for i in [ 1 .. lp ] do
            for j in [ 1 .. lq ] do
                if not IsZero( CertainObject( Er, [ p[i], q[j] ] ) ) then
                    Er!.stability_table[lq-j+1][i] := '*';
                fi;
            od;
        od;
        for i in [ 1 .. lp ] do
            for j in [ 1 .. lq ] do
                if Er!.stability_table[lq-j+1][i] = '*' then
                    if ForAll( [ r .. max ],
                               a -> not ( i + d(a)[1] in [ 1 .. lp ] and j + d(a)[2] in [ 1 .. lq ] and Er!.stability_table[lq-(j + d(a)[2])+1][i + d(a)[1]] <> '.' ) and
                               not ( i - d(a)[1] in [ 1 .. lp ] and j - d(a)[2] in [ 1 .. lq ] and Er!.stability_table[lq-(j - d(a)[2])+1][i - d(a)[1]] <> '.' ) ) then
                        
                        Er!.stability_table[lq-j+1][i] := 's';
                    fi;
                fi;
            od;
        od;
    else
        if cpx then
            p_degrees := bidegrees[1]{[ r + 1 .. lp ]};
            q_degrees := bidegrees[2]{[ 1 .. lq - ( r - 1 ) ]};
            for p in p_degrees do
                for q in q_degrees do
                    source := CertainObject( Er, [ p, q ] );
                    target := CertainObject( Er, [ p, q ] + bidegree );
                    if not ForAny( [ source, target ], IsZero ) then
                        mor_h := List( [ 0 .. r - 1 ], i -> CertainHorizontalMorphism( B, [ p - i, q + i ] ) );
                        mor_v := List( [ 1 .. r - 1 ], i -> CertainVerticalMorphism( B, [ p - i, q + i ] ) );
                        if ForAny( mor_h, IsZero ) or ForAny( mor_v, IsZero ) then
                            mor := TheZeroMorphism( source, target );
                        else
                            emb_source := Er!.absolute_embeddings.(String( [ p, q ] ));
                            emb_target := Er!.absolute_embeddings.(String( [ p, q ] + bidegree ));
                            if r = 1 then
                                mor := PreCompose( emb_source, mor_h[1] );
                            elif r > 1 then
                                bidegrees_target := List( [ 1 .. r - 1 ], i -> [ p - i, q + i - 1 ] );
                                mor := PreCompose( emb_source, MorphismOfTotalComplex( B, [ [ p, q ] ], bidegrees_target ) );
                                mor_v := MorphismOfTotalComplex( B, [ [ p - r + 1, q + r - 1 ] ], bidegrees_target );
                                if r > 2 then
                                    bidegrees_source := List( [ 1 .. r - 2 ], i -> [ p - i, q + i ] );
                                    aid := MorphismOfTotalComplex( B, bidegrees_source, bidegrees_target );
                                    mor_v := GeneralizedMorphism( mor_v, aid );
                                fi;
                                mor := - mor / mor_v; ## generalized lift
                                mor := PreCompose( mor, mor_h[r] );
                            fi;
                            mor := mor / emb_target; ## generalized lift
                        fi;
                        Assert( 3, IsMorphism( mor ) );
                        SetIsMorphism( mor, true );
                        Er!.(String( [ p, q ] )) := mor;
                    fi;
                od;
            od;
        else
            p_degrees := bidegrees[1]{[ 1 .. lp - r ]};
            q_degrees := bidegrees[2]{[ r .. lq ]};
            for p in p_degrees do
                for q in q_degrees do
                    source := CertainObject( Er, [ p, q ] );
                    target := CertainObject( Er, [ p, q ] + bidegree );
                    if not ForAny( [ source, target ], IsZero ) then
                        mor_h := List( [ 0 .. r - 1 ], i -> CertainHorizontalMorphism( B, [ p + i, q - i ] ) );
                        mor_v := List( [ 1 .. r - 1 ], i -> CertainVerticalMorphism( B, [ p + i, q - i ] ) );
                        if ForAny( mor_h, IsZero ) or ForAny( mor_v, IsZero ) then
                            mor := TheZeroMorphism( source, target );
                        else
                            emb_source := Er!.absolute_embeddings.(String( [ p, q ] ));
                            emb_target := Er!.absolute_embeddings.(String( [ p, q ] + bidegree ));
                            if r = 1 then
                                mor := PreCompose( emb_source, mor_h[1] );
                            elif r > 1 then
                                bidegrees_target := List( [ 1 .. r - 1 ], i -> [ p + i, q - i + 1 ] );
                                mor := PreCompose( emb_source, MorphismOfTotalComplex( B, [ [ p, q ] ], bidegrees_target ) );
                                mor_v := MorphismOfTotalComplex( B, [ [ p + r - 1, q - r + 1 ] ], bidegrees_target );
                                if r > 2 then
                                    bidegrees_source := List( [ 1 .. r - 2 ], i -> [ p + i, q - i ] );
                                    aid := MorphismOfTotalComplex( B, bidegrees_source, bidegrees_target );
                                    mor_v := GeneralizedMorphism( mor_v, aid );
                                fi;
                                mor := - mor / mor_v; ## generalized lift
                                mor := PreCompose( mor, mor_h[r] );
                            fi;
                            mor := mor / emb_target; ## generalized lift
                        fi;
                        Assert( 3, IsMorphism( mor ) );
                        SetIsMorphism( mor, true );
                        Er!.(String( [ p, q ] )) := mor;
                    fi;
                od;
            od;
        fi;
    fi;
    
    SetIsEndowedWithDifferential( Er, true );
    
    return Er;
    
end );

##  <#GAPDoc Label="DefectOfExactness:bigradedobject">
##  <ManSection>
##    <Meth Arg="Er" Name="DefectOfExactness" Label="for homalg differential bigraded objects"/>
##    <Returns>a &homalg; bigraded object</Returns>
##    <Description>
##    Homological:
##    Compute the homology of a level <A>r</A> <E>differential</E> homological bigraded object, that is the <A>r</A>-th
##    sheet of a homological spectral sequence endowed with a bidegree <M>( -r, r - 1 )</M> differential.
##    The result is a level <A>r</A><M>+1</M> homological bigraded object <E>without</E> its differential.
##    <P/>
##    Cohomological:
##    Compute the cohomology of a level <A>r</A> <E>differential</E> cohomological bigraded object, that is the <A>r</A>-th
##    sheet of a cohomological spectral sequence endowed with a bidegree <M>( r, -r + 1 )</M> differential.
##    The result is a level <A>r</A><M>+1</M> cohomological bigraded object <E>without</E> its differential.
##    <P/>
##    The differential of the resulting level <A>r</A><M>+1</M> object can a posteriori be computed using
##    <Ref Meth="AsDifferentialObject" Label="for homalg bigraded objects stemming from a bicomplex"/>.
##    The objects in the result are subquotients of the objects in <A>Er</A>. An object in <A>Er</A> (at
##    a spot <M>(p,q)</M>) is called <E>stable</E> if no passage to a true subquotient occurs at any higher level.
##    Of course, a zero object (at a spot <M>(p,q)</M>) is always stable.
##      <Example><![CDATA[
##  gap> zz := HomalgRingOfIntegers( );
##  Z
##  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, zz );;
##  gap> M := LeftPresentation( M );
##  <A non-torsion left module presented by 2 relations for 3 generators>
##  gap> d := Resolution( M );;
##  gap> dd := Hom( d );;
##  gap> C := Resolution( dd );;
##  gap> CC := Hom( C );
##  <A non-zero acyclic complex containing a single morphism of left cocomplexes a\
##  t degrees [ 0 .. 1 ]>
##  gap> B := HomalgBicomplex( CC );
##  <A non-zero bicomplex containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  ]]></Example>
##    Now we construct the spectral sequence associated to the bicomplex <M>B</M>, also called the <E>first</E>
##    spectral sequence:
##      <Example><![CDATA[
##  gap> I_E0 := HomalgBigradedObject( B );
##  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  gap> Display( I_E0 );
##  Level 0:
##  
##   * *
##   * *
##  gap> AsDifferentialObject( I_E0 );
##  <A bigraded object with a differential of bidegree
##  [ 0, -1 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
##  gap> I_E0;
##  <A bigraded object with a differential of bidegree
##  [ 0, -1 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
##  gap> AsDifferentialObject( I_E0 );
##  <A bigraded object with a differential of bidegree
##  [ 0, -1 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
##  gap> I_E1 := DefectOfExactness( I_E0 );
##  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  gap> Display( I_E1 );
##  Level 1:
##  
##   * *
##   . .
##  gap> AsDifferentialObject( I_E1 );
##  <A bigraded object with a differential of bidegree
##  [ -1, 0 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
##  gap> I_E2 := DefectOfExactness( I_E1 );
##  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  gap> Display( I_E2 );
##  Level 2:
##  
##   s .
##   . .
##  ]]></Example>
##    Legend:
##    <List>
##      <Item>A star <A>*</A> stands for a nonzero object.</Item>
##      <Item>A dot <A>.</A> stands for a zero object.</Item>
##      <Item>The letter <A>s</A> stands for a nonzero object that became stable.</Item>
##    </List>
##    <P/>
##    The <E>second</E> spectral sequence of the bicomplex is, by definition, the spectral sequence associated to
##    the transposed bicomplex:
##      <Example><![CDATA[
##  gap> tB := TransposedBicomplex( B );
##  <A non-zero bicomplex containing left modules at bidegrees [ -1 .. 0 ]x
##  [ 0 .. 1 ]>
##  gap> II_E0 := HomalgBigradedObject( tB );
##  <A bigraded object containing left modules at bidegrees [ -1 .. 0 ]x
##  [ 0 .. 1 ]>
##  gap> Display( II_E0 );
##  Level 0:
##  
##   * *
##   * *
##  gap> AsDifferentialObject( II_E0 );
##  <A bigraded object with a differential of bidegree
##  [ 0, -1 ] containing left modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
##  gap> II_E1 := DefectOfExactness( II_E0 );
##  <A bigraded object containing left modules at bidegrees [ -1 .. 0 ]x
##  [ 0 .. 1 ]>
##  gap> Display( II_E1 );
##  Level 1:
##  
##   * *
##   . s
##  gap> AsDifferentialObject( II_E1 );
##  <A bigraded object with a differential of bidegree
##  [ -1, 0 ] containing left modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
##  gap> II_E2 := DefectOfExactness( II_E1 );
##  <A bigraded object containing left modules at bidegrees [ -1 .. 0 ]x
##  [ 0 .. 1 ]>
##  gap> Display( II_E2 );
##  Level 2:
##  
##   s .
##   . s
##  ]]></Example>
##    </Description>
##  </ManSection>
##  <#/GAPDoc>
##
InstallMethod( DefectOfExactness,
        "for homalg differential bigraded objects stemming from a bicomplex",
        [ IsBigradedObjectOfFinitelyPresentedObjectsRep and IsEndowedWithDifferential ],
        
  function( Er )
    local left, bidegree, r, degree, cpx, bidegrees, B, C, compute_nat_trafos,
          natural_transformations, outer_functor_on_natural_epis, p, q, lp, lq,
          H, i, j, Epq, post, pre, def, nat, emb, emb_new, relative_embeddings,
          absolute_embeddings, type, d, max;
    
    left := IsHomalgLeftObjectOrMorphismOfLeftObjects( Er );
    
    bidegree := BidegreeOfDifferential( Er );
    
    r := LevelOfBigradedObject( Er );
    
    degree := Sum( bidegree );
    
    bidegrees := ObjectDegreesOfBigradedObject( Er );
    
    ## the associated bicomplex
    B := UnderlyingBicomplex( Er );
    
    cpx := IsBicomplexOfFinitelyPresentedObjectsRep( B );
    
    p := bidegrees[1];
    q := bidegrees[2];
    
    lp := Length( p );
    lq := Length( q );
    
    H := rec( bidegrees := bidegrees,
              level := r + 1,
              bicomplex := B,
              embeddings := rec( ),
              stability_table := List( [ 1 .. lq ], a -> ListWithIdenticalEntries( lp, '.' ) ) );
    
    if r = 0 and not IsTransposedWRTTheAssociatedComplex( B )
       and IsBound( B!.OuterFunctorOnNaturalEpis ) then
        compute_nat_trafos := true;
        natural_transformations := rec( );
        H.NaturalTransformations := natural_transformations;
        outer_functor_on_natural_epis := B!.OuterFunctorOnNaturalEpis;
    else
        compute_nat_trafos := false;
    fi;
    
    for i in [ 1 .. lp ] do
        for j in [ 1 .. lq ] do
            Epq := CertainObject( Er, [ p[i], q[j] ] );
            post := CertainMorphism( Er, [ p[i], q[j] ] );
            pre := CertainMorphism( Er, [ p[i], q[j] ] - bidegree );
            if IsHomalgMorphism( post ) and not IsZero( Epq ) then
                if IsHomalgMorphism( pre ) then
                    if left then
                        def := DefectOfExactness( pre, post );
                    else
                        def := DefectOfExactness( post, pre );
                    fi;
                    emb := NaturalGeneralizedEmbedding( def );
                else
                    def := Kernel( post );
                    emb := KernelEmb( post );
                    ## construct the natural monomorphism/equivalence
                    ## F(G(P_p)) -> R^0(F)(G(P_p))
                    if compute_nat_trafos and q[j] = 0 then
                        nat := outer_functor_on_natural_epis.(String( [ p[i], 0 ] )) / emb; ## generalized lift
                        Assert( 3, IsMonomorphism( nat ) );
                        SetIsMonomorphism( nat, true );
                        natural_transformations.(String( [ p[i], 0 ] )) := nat;
                    fi;
                fi;
                if IsZero( def ) then
                    H.stability_table[lq-j+1][i] := '.';
                    SetIsZero( emb, true );
                else
                    H.stability_table[lq-j+1][i] := '*';
                fi;
                H.embeddings.(String( [ p[i], q[j] ] )) := emb;
            elif IsHomalgMorphism( pre ) and not ( HasIsZero( Epq ) and IsZero( Epq ) ) then
                def := Cokernel( pre );
                emb := CokernelNaturalGeneralizedIsomorphism( pre );
                ## construct the natural epimorphism/equivalence
                ## L_0(F)(G(P_p)) -> F(G(P_p))
                if compute_nat_trafos and q[j] = 0 then
                    nat := PreCompose( RemoveMorphismAid( emb ), outer_functor_on_natural_epis.(String( [ p[i], 0 ] )) );
                    Assert( 3, IsEpimorphism( nat ) );
                    SetIsEpimorphism( nat, true );
                    natural_transformations.(String( [ p[i], 0 ] )) := nat;
                fi;
                if IsZero( def ) then
                    H.stability_table[lq-j+1][i] := '.';
                    SetIsZero( emb, true );
                else
                    H.stability_table[lq-j+1][i] := '*';
                fi;
                H.embeddings.(String( [ p[i], q[j] ] )) := emb;
            else
                def := CertainObject( Er, [ p[i], q[j] ] );
                emb := TheIdentityMorphism( def );
                if IsZero( def ) then
                    H.stability_table[lq-j+1][i] := '.';
                    SetIsZero( emb, true );
                else
                    H.stability_table[lq-j+1][i] := '*';
                fi;
                H.embeddings.(String( [ p[i], q[j] ] )) := emb;
            fi;
            H.(String( [ p[i], q[j] ] )) := def;
        od;
    od;
    
    if IsHomalgBigradedObjectAssociatedToAFilteredComplex( Er ) then
        
        ## construct the generalized embeddings into the objects of the special sheet Ea
        ## and store them under the component "relative_embeddings"
        if IsBound( Er!.SpecialSheet ) and Er!.SpecialSheet = true  then
            H.relative_embeddings := H.embeddings;
            H.relative_embeddings.target_level := r;
        elif IsBound( Er!.relative_embeddings ) then
            ## build an absolute embedding table using the previous one
            relative_embeddings := rec( target_level := Er!.relative_embeddings.target_level );
            
            for i in [ 1 .. lp ] do
                for j in [ 1 .. lq ] do
                    emb := Er!.relative_embeddings.(String( [ p[i], q[j] ] ));
                    if Er!.stability_table[lq-j+1][i] = '*' then; ## not yet stable
                        emb_new := H.embeddings.(String( [ p[i], q[j] ] ));
                        emb := PreCompose( emb_new, emb );
                    fi;
                    
                    ## check assertion
                    Assert( 5, IsGeneralizedMonomorphism( emb ) );
                    
                    SetIsGeneralizedMonomorphism( emb, true );
                    
                    relative_embeddings.(String( [ p[i], q[j] ] )) := emb;
                od;
            od;
            
            H.relative_embeddings := relative_embeddings;
        fi;
        
        ## construct the generalized embeddings into the objects of the 0-th sheet E0
        ## and store them under the component "absolute_embeddings"
        if r = 0 then
            H.absolute_embeddings := H.embeddings;
        elif IsBound( Er!.absolute_embeddings ) then
            ## build an absolute embedding table using the previous one
            absolute_embeddings := rec( );
            
            for i in [ 1 .. lp ] do
                for j in [ 1 .. lq ] do
                    emb := Er!.absolute_embeddings.(String( [ p[i], q[j] ] ));
                    if Er!.stability_table[lq-j+1][i] = '*' then; ## not yet stable
                        emb_new := H.embeddings.(String( [ p[i], q[j] ] ));
                        emb := PreCompose( emb_new, emb );
                    fi;
                    
                    ## check assertion
                    Assert( 5, IsGeneralizedMonomorphism( emb ) );
                    
                    SetIsGeneralizedMonomorphism( emb, true );
                    
                    absolute_embeddings.(String( [ p[i], q[j] ] )) := emb;
                od;
            od;
            
            H.absolute_embeddings := absolute_embeddings;
        fi;
        
        ## find stable spots:
        if cpx then
            d := r -> [ -r, r - 1 ];
        else
            d := r -> [ r, 1 - r ];
        fi;
        
        max := Minimum( lp, lq );
        
        for i in [ 1 .. lp ] do
            for j in [ 1 .. lq ] do
                if H.stability_table[lq-j+1][i] = '*' then
                    if ForAll( [ r + 1 .. max ],
                               a -> not ( i + d(a)[1] in [ 1 .. lp ] and j + d(a)[2] in [ 1 .. lq ] and H.stability_table[lq-(j + d(a)[2])+1][i + d(a)[1]] <> '.' ) and
                               not ( i - d(a)[1] in [ 1 .. lp ] and j - d(a)[2] in [ 1 .. lq ] and H.stability_table[lq-(j - d(a)[2])+1][i - d(a)[1]] <> '.' ) ) then
                        
                        H.stability_table[lq-j+1][i] := 's';
                    fi;
                fi;
            od;
        od;
    fi;
    
    if left then
        type := TheTypeHigherHomalgBigradedObjectAssociatedToABicomplexOfLeftObjects;
    else
        type := TheTypeHigherHomalgBigradedObjectAssociatedToABicomplexOfRightObjects;
    fi;
    
    ## Objectify
    Objectify( type, H );
    
    return H;
    
end );

####################################
#
# View, Print, and Display methods:
#
####################################

##
InstallMethod( ViewObj,
        "for homalg bigraded objects",
        [ IsHomalgBigradedObject ],
        
  function( o )
    local degrees, l, opq;
    
    Print( "<A" );
    
    if HasIsZero( o ) then ## if this method applies and HasIsZero is set we already know that o is a non-zero homalg bigraded object
        Print( " non-zero" );
    fi;
    
    Print( " bigraded object" );
    
    if HasIsEndowedWithDifferential( o ) and IsEndowedWithDifferential( o ) then
        Print( " with a differential of bidegree ", BidegreeOfDifferential( o ) );
    fi;
    
    Print( " containing " );
    
    degrees := ObjectDegreesOfBigradedObject( o );
    
    l := Length( degrees[1] ) * Length( degrees[2] );
    
    opq := CertainObject( o, [ degrees[1][1], degrees[2][1] ] );
    
    if l = 1 then
        
        Print( "a single " );
        
        if IsHomalgLeftObjectOrMorphismOfLeftObjects( o ) then
            Print( "left" );
        else
            Print( "right" );
        fi;
        
        if IsHomalgStaticObject( opq ) then
            if IsBound( opq!.string ) then
                Print( " ", opq!.string );
            else
                Print( " object" );
            fi;
        else
            if IsComplexOfFinitelyPresentedObjectsRep( opq ) then
                Print( " complex" );
            else
                Print( " cocomplex" );
            fi;
        fi;
        
        Print( " at bidegree ", [ degrees[1][1], degrees[2][1] ], ">" );
        
    else
        
        if IsBound( opq!.adjective ) then
            Print( opq!.adjective, " " );
        fi;
        
        if IsHomalgLeftObjectOrMorphismOfLeftObjects( o ) then
            Print( "left " );
        else
            Print( "right " );
        fi;
        
        if IsHomalgStaticObject( opq ) then
            if IsBound( opq!.string_plural ) then
                Print( opq!.string_plural );
            else
                Print( "objects" );
            fi;
        else
            if IsComplexOfFinitelyPresentedObjectsRep( opq ) then
                Print( "complexes" );
            else
                Print( "cocomplexes" );
            fi;
        fi;
        
        Print( " at bidegrees ", degrees[1], "x", degrees[2], ">" );
        
    fi;
    
end );

##
InstallMethod( ViewObj,
        "for homalg bigraded objects",
        [ IsBigradedObjectOfFinitelyPresentedObjectsRep and IsZero ],
        
  function( o )
    
    Print( "<A zero " );
    
    if IsHomalgLeftObjectOrMorphismOfLeftObjects( o ) then
        Print( "left" );
    else
        Print( "right" );
    fi;
    
    Print( " bigraded object>" );
    
end );

##
InstallMethod( Display,
        "for homalg bigraded objects",
        [ IsBigradedObjectOfFinitelyPresentedObjectsRep ],
        
  function( o )
    local s, c, bidegrees, q, p, Epq;
    
    if IsBound(o!.level) then
        Print( "Level ", o!.level,":\n\n" );
    fi;
    
    if IsBound( o!.stability_table ) then
        for s in o!.stability_table do
            for c in s do
                Print( " ", [ c ] );
            od;
            Print( "\n" );
        od;
    else
        bidegrees := ObjectDegreesOfBigradedObject( o );
        for q in Reversed( bidegrees[2] ) do
            for p in bidegrees[1] do
                Epq := CertainObject( o, [ p, q ] );
                if HasIsZero( Epq ) and IsZero( Epq ) then
                    Print( " ." );
                else
                    Print( " *" );
                fi;
            od;
            Print( "\n" );
        od;
    fi;
    
end );


[ Dauer der Verarbeitung: 0.42 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge