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


Quelle  HomalgBicomplex.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 bicomplexes.

##  <#GAPDoc Label="Bicomplexes:intro">
##    Each bicomplex in &homalg; has an underlying complex of complexes. The bicomplex structure is simply
##    the addition of the known sign trick which induces the obvious equivalence between the category of bicomplexes
##    and the category of complexes with complexes as objects and chain morphisms as morphisms.
##    The majority of filtered complexes in algebra and geometry (unlike topology) arise as the total complex
##    of a bicomplex. Hence, most spectral sequences in algebra are spectral sequences of bicomplexes.
##    Indeed, bicomplexes in &homalg; are mainly used as an input for the spectral sequence machinery.
##  <#/GAPDoc>

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

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

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

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

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

# four new types:
BindGlobal( "TheTypeHomalgBicomplexOfLeftObjects",
        NewType( TheFamilyOfHomalgBicomplexes,
                IsBicomplexOfFinitelyPresentedObjectsRep and IsHomalgLeftObjectOrMorphismOfLeftObjects ) );

BindGlobal( "TheTypeHomalgBicomplexOfRightObjects",
        NewType( TheFamilyOfHomalgBicomplexes,
                IsBicomplexOfFinitelyPresentedObjectsRep and IsHomalgRightObjectOrMorphismOfRightObjects ) );

BindGlobal( "TheTypeHomalgBicocomplexOfLeftObjects",
        NewType( TheFamilyOfHomalgBicomplexes,
                IsBicocomplexOfFinitelyPresentedObjectsRep and IsHomalgLeftObjectOrMorphismOfLeftObjects ) );

BindGlobal( "TheTypeHomalgBicocomplexOfRightObjects",
        NewType( TheFamilyOfHomalgBicomplexes,
                IsBicocomplexOfFinitelyPresentedObjectsRep and IsHomalgRightObjectOrMorphismOfRightObjects ) );

####################################
#
# methods for attributes:
#
####################################

##
InstallMethod( TotalComplex,
        "for homalg bicomplexes",
        [ IsBicomplexOfFinitelyPresentedObjectsRep ],
        
  function( B )
    local pq_lowest, n_lowest, n_highest, tot, n;
    
    pq_lowest := LowestBidegreeInBicomplex( B );
    
    n_lowest := pq_lowest[1] + pq_lowest[2];
    n_highest := HighestTotalObjectDegreeInBicomplex( B );
    
    tot := HomalgComplex( CertainObject( B, pq_lowest ), n_lowest );
    
    for n in [ n_lowest + 1 .. n_highest ] do
        Add( tot, MorphismOfTotalComplex( B, n ) );
    od;
    
    if HasIsBicomplex( B ) then
        SetIsComplex( tot, IsBicomplex( B ) );
    fi;
    
    return tot;
    
end );

##
InstallMethod( TotalComplex,
        "for homalg bicomplexes",
        [ IsBicomplexOfFinitelyPresentedObjectsRep and IsTransposedWRTTheAssociatedComplex ],
        
  function( B )
    
    return TotalComplex( TransposedBicomplex( B ) );
    
end );

##
InstallMethod( TotalComplex,
        "for homalg bicomplexes",
        [ IsBicocomplexOfFinitelyPresentedObjectsRep ],
        
  function( B )
    local pq_lowest, n_lowest, n_highest, tot, n;
    
    pq_lowest := LowestBidegreeInBicomplex( B );
    
    n_lowest := pq_lowest[1] + pq_lowest[2];
    n_highest := HighestTotalObjectDegreeInBicomplex( B );
    
    tot := HomalgCocomplex( CertainObject( B, pq_lowest ), n_lowest );
    
    for n in [ n_lowest .. n_highest - 1 ] do
        Add( tot, MorphismOfTotalComplex( B, n ) );
    od;
    
    if HasIsBicomplex( B ) then
        SetIsComplex( tot, IsBicomplex( B ) );
    fi;
    
    return tot;
    
end );

##
InstallMethod( TotalComplex,
        "for homalg bicomplexes",
        [ IsBicocomplexOfFinitelyPresentedObjectsRep and IsTransposedWRTTheAssociatedComplex ],
        
  function( B )
    
    return TotalComplex( TransposedBicomplex( B ) );
    
end );

##
InstallMethod( SpectralSequence,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    return HomalgSpectralSequence( B );
    
end );

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

##
InstallMethod( StructureObject,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    return StructureObject( UnderlyingComplex( B ) );
    
end );

##  <#GAPDoc Label="UnderlyingComplex">
##  <ManSection>
##    <Func Arg="BC" Name="UnderlyingComplex"/>
##    <Returns>a &homalg; complex</Returns>
##    <Description>
##    The (co)complex of (co)complexes underlying the (co)homological bicomplex <A>BC</A>.
##    </Description>
##  </ManSection>
##  <#/GAPDoc>
##
InstallMethod( UnderlyingComplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    return B!.complex;
    
end );

##
InstallMethod( homalgResetFilters,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local property;
    
    if not IsBound( HOMALG.PropertiesOfBicomplexes ) then
        HOMALG.PropertiesOfBicomplexes :=
          [ IsZero,
            IsBisequence,
            IsBicomplex ];
    fi;
    
    for property in HOMALG.PropertiesOfBicomplexes do
        ResetFilterObj( B, property );
    od;
    
    if HasTotalComplex( B ) then
        ResetFilterObj( B, TotalComplex );
        Unbind( B!.TotalComplex );
    fi;
    
    if HasSpectralSequence( B ) then
        ResetFilterObj( B, SpectralSequence );
        Unbind( B!.SpectralSequence );
    fi;
    
end );

## provided to avoid branching in the code and always returns fail
InstallMethod( PositionOfTheDefaultPresentation,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    return fail;
    
end );

##
InstallMethod( ObjectDegreesOfBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local C, deg_p, o, deg_q;
    
    C := UnderlyingComplex( B );
    
    deg_p := ObjectDegreesOfComplex( C );
    
    o := LowestDegreeObject( C );
    
    deg_q := ObjectDegreesOfComplex( o );
    
    if IsComplexOfFinitelyPresentedObjectsRep( C ) and IsCocomplexOfFinitelyPresentedObjectsRep( o ) then
        deg_q := Reversed( -deg_q );
        ConvertToRangeRep( deg_q );
    elif IsCocomplexOfFinitelyPresentedObjectsRep( C ) and IsComplexOfFinitelyPresentedObjectsRep( o ) then
        deg_q := Reversed( -deg_q );
        ConvertToRangeRep( deg_q );
    fi;
    
    if HasIsTransposedWRTTheAssociatedComplex( B ) and
       IsTransposedWRTTheAssociatedComplex( B ) then
        return [ deg_q, deg_p ];
    else
        return [ deg_p, deg_q ];
    fi;
    
end );

##
InstallMethod( CertainObject,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsList ],
        
  function( B, pq )
    local bidegree, C, obj_p;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    bidegree := B!.bidegree_getter( pq );
    
    C := UnderlyingComplex( B );
    
    obj_p := CertainObject( C, bidegree[1] );
    
    if obj_p = fail then
        return fail;
    fi;
    
    return CertainObject( obj_p, bidegree[2] );
    
end );

##
InstallMethod( ObjectsOfBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local bidegrees;
    
    bidegrees := ObjectDegreesOfBicomplex( B );
    
    return List( Reversed( bidegrees[2] ), q -> List( bidegrees[1], p -> CertainObject( B, [ p, q ] ) ) );
    
end );

##
InstallMethod( LowestBidegreeInBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local bidegrees;
    
    bidegrees := ObjectDegreesOfBicomplex( B );
    
    return [ bidegrees[1][1], bidegrees[2][1] ];
    
end );

##
InstallMethod( HighestBidegreeInBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local bidegrees;
    
    bidegrees := ObjectDegreesOfBicomplex( B );
    
    return [ bidegrees[1][Length( bidegrees[1] )], bidegrees[2][Length( bidegrees[2] )] ];
    
end );

##
InstallMethod( LowestTotalObjectDegreeInBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local pq_lowest;
    
    pq_lowest := LowestBidegreeInBicomplex( B );
    
    return pq_lowest[1] + pq_lowest[2];
    
end );

##
InstallMethod( HighestTotalObjectDegreeInBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local pq_highest;
    
    pq_highest := HighestBidegreeInBicomplex( B );
    
    return pq_highest[1] + pq_highest[2];
    
end );

##
InstallMethod( TotalObjectDegreesOfBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    return [ LowestTotalObjectDegreeInBicomplex( B ) .. HighestTotalObjectDegreeInBicomplex( B ) ];
    
end );

##
InstallMethod( LowestBidegreeObjectInBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local pq;
    
    pq := LowestBidegreeInBicomplex( B );
    
    return CertainObject( B, pq );
    
end );

##
InstallMethod( HighestBidegreeObjectInBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local pq;
    
    pq := HighestBidegreeInBicomplex( B );
    
    return CertainObject( B, pq );
    
end );

##
InstallMethod( CertainVerticalMorphism,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsList ],
        
  function( B, pq )
    local bidegree, C, obj_p, mor;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    bidegree := B!.bidegree_getter( pq );
    
    C := UnderlyingComplex( B );
    
    obj_p := CertainObject( C, bidegree[1] );
    
    if obj_p = fail then
        return fail;
    fi;
    
    mor := CertainMorphism( obj_p, bidegree[2] );
    
    if mor = fail then
        return fail;
    fi;
    
    if IsEvenInt( pq[1] ) then
        return mor;
    else
        return -mor;
    fi;
    
end );

##
InstallMethod( CertainVerticalMorphism,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex and IsTransposedWRTTheAssociatedComplex, IsList ],
        
  function( B, pq )
    local bidegree, C, mor_p;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    bidegree := B!.bidegree_getter( pq );
    
    C := UnderlyingComplex( B );
    
    mor_p := CertainMorphism( C, bidegree[1] );
    
    if mor_p = fail then
        return fail;
    fi;
    
    return CertainMorphism( mor_p, bidegree[2] );
    
end );

##
InstallMethod( CertainHorizontalMorphism,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsList ],
        
  function( B, pq )
    local bidegree, C, mor_p;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    bidegree := B!.bidegree_getter( pq );
    
    C := UnderlyingComplex( B );
    
    mor_p := CertainMorphism( C, bidegree[1] );
    
    if mor_p = fail then
        return fail;
    fi;
    
    return CertainMorphism( mor_p, bidegree[2] );
    
end );

##
InstallMethod( CertainHorizontalMorphism,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex and IsTransposedWRTTheAssociatedComplex, IsList ],
        
  function( B, pq )
    local bidegree, C, obj_p, mor;
    
    if not ForAll( pq, IsInt ) or not Length( pq ) = 2 then
        Error( "the second argument must be a list of two integers\n" );
    fi;
    
    bidegree := B!.bidegree_getter( pq );
    
    C := UnderlyingComplex( B );
    
    obj_p := CertainObject( C, bidegree[1] );
    
    if obj_p = fail then
        return fail;
    fi;
    
    mor := CertainMorphism( obj_p, bidegree[2] );
    
    if mor = fail then
        return fail;
    fi;
    
    if IsEvenInt( pq[2] ) then ## yes pq[2], not pq[1]
        return mor;
    else
        return -mor;
    fi;
    
end );

##
InstallMethod( BidegreesOfBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsInt ],
        
  function( B, n )
    local bidegrees, lq, max, n_lowest, n_highest, tot_n, p, q;
    
    bidegrees := ObjectDegreesOfBicomplex( B );
    
    lq := Length( bidegrees[2] );
    max := Minimum( Length( bidegrees[1] ),  lq ) - 1;
    
    n_lowest := LowestTotalObjectDegreeInBicomplex( B );
    n_highest := HighestTotalObjectDegreeInBicomplex( B );
    
    tot_n := [ ];
    
    if n < n_lowest or n > n_highest then
        return tot_n;
    fi;
    
    if n - n_lowest < lq then
        for p in bidegrees[1][1] + [ 0 .. Minimum( n - n_lowest, max ) ] do
            Add( tot_n, [ p, n - p ] );
        od;
    else
        for q in bidegrees[2][lq] - [ 0 .. Minimum( n_highest - n, max ) ] do
            Add( tot_n, [ n - q, q ] );
        od;
    fi;
    
    return tot_n;
    
end );

##
InstallMethod( BidegreesOfObjectOfTotalComplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsInt ],
        
  function( B, n )
    
    return BidegreesOfBicomplex( B, n );
    
end );

##
InstallMethod( BidegreesOfObjectOfTotalComplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex and IsTransposedWRTTheAssociatedComplex, IsInt ],
        
  function( B, n )
    
    return BidegreesOfBicomplex( TransposedBicomplex( B ), n );
    
end );

##
InstallMethod( MorphismOfTotalComplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsList, IsList ],
        
  function( B, bidegrees_source, bidegrees_target )
    local horizontal, vertical, stack, pq_source, augment, pq_target,
          source, diff, mor;
    
    if IsBicomplexOfFinitelyPresentedObjectsRep( B ) then
        horizontal := [ -1, 0 ];
        vertical := [ 0, -1 ];
    else
        horizontal := [ 1, 0 ];
        vertical := [ 0, 1 ];
    fi;
    
    if bidegrees_source = [ ] or bidegrees_target = [ ] then
        return fail;
    fi;
    
    stack := [ ];
    
    for pq_source in bidegrees_source do
        augment := [ ];
        for pq_target in bidegrees_target do
            source := CertainObject( B, pq_source );
            diff := pq_target - pq_source;
            if diff = horizontal then
                mor := CertainHorizontalMorphism( B, pq_source );
                if mor = fail then
                    Error( "expected a horizontal morphism at bidegree ", pq_source, " but received fail\n" );
                fi;
                Add( augment, mor );
            elif diff = vertical then
                mor := CertainVerticalMorphism( B, pq_source );
                if mor = fail then
                    Error( "expected a vertical morphism at bidegree ", pq_source, " but received fail\n" );
                fi;
                Add( augment, mor );
            else
                Add( augment, TheZeroMorphism( source, CertainObject( B, pq_target ) ) );
            fi;
        od;
        Add( stack, Iterated( augment, ProductMorphism ) );
    od;
    
    stack := Iterated( stack, CoproductMorphism );
    
    return stack;
    
end );

##
InstallMethod( MorphismOfTotalComplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex, IsInt ],
        
  function( B, n )
    local bidegrees_source, bidegrees_target;
    
    bidegrees_source := Reversed( BidegreesOfObjectOfTotalComplex( B, n ) ); ## this has the effect, that [ n, 0 ] comes last
    
    if IsBicomplexOfFinitelyPresentedObjectsRep( B ) then
        bidegrees_target := Reversed( BidegreesOfObjectOfTotalComplex( B, n - 1 ) ); ## this has the effect, that [ n - 1, 0 ] comes last
    else
        bidegrees_target := Reversed( BidegreesOfObjectOfTotalComplex( B, n + 1 ) ); ## this has the effect, that [ n + 1, 0 ] comes last
    fi;
    
    return MorphismOfTotalComplex( B, bidegrees_source, bidegrees_target );
    
end );
    
##
InstallMethod( DecideZero,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    DecideZero( UnderlyingComplex( B ) );
    
    IsZero( B );
    
    return B;
    
end );

##  <#GAPDoc Label="ByASmallerPresentation:bicomplex">
##  <ManSection>
##    <Meth Arg="B" Name="ByASmallerPresentation" Label="for bicomplexes"/>
##    <Returns>a &homalg; bicomplex</Returns>
##    <Description>
##    See <Ref Meth="ByASmallerPresentation" Label="for complexes"/> on complexes.
##      <Listing Type="Code"><![CDATA[
InstallMethod( ByASmallerPresentation,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    
    ByASmallerPresentation( UnderlyingComplex( B ) );
    
    IsZero( B );
    
    return B;
    
end );
##  ]]></Listing>
##      This method performs side effects on its argument <A>B</A> and returns it.
##    </Description>
##  </ManSection>
##  <#/GAPDoc>

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

##  <#GAPDoc Label="HomalgBicomplex">
##  <ManSection>
##    <Func Arg="C" Name="HomalgBicomplex" Label="constructor for bicomplexes given a complex of complexes"/>
##    <Returns>a &homalg; bicomplex</Returns>
##    <Description>
##    This constructor creates a bicomplex (homological bicomplex) given a &homalg; complex of (co)complexes <A>C</A>
##    (&see; <Ref Func="HomalgComplex" Label="constructor for complexes given a chain morphism"/>),
##    resp. creates a bicocomplex (cohomological bicomplex) given a &homalg; cocomplex of (co)complexes <A>C</A>
##    (&see; <Ref Func="HomalgCocomplex" Label="constructor for cocomplexes given a chain morphism"/>).
##    Using the usual sign-trick a complex of complexes gives rise to a bicomplex and vice versa.
##      <Example><![CDATA[
##  gap> zz := HomalgRingOfIntegers( );
##  Z
##  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, zz );
##  <A 2 x 3 matrix over an internal ring>
##  gap> M := LeftPresentation( M );
##  <A non-torsion left module presented by 2 relations for 3 generators>
##  gap> d := Resolution( M );
##  <A non-zero right acyclic complex containing a single morphism of left modules\
##   at degrees [ 0 .. 1 ]>
##  gap> dd := Hom( d );
##  <A non-zero acyclic cocomplex containing a single morphism of right modules at\
##   degrees [ 0 .. 1 ]>
##  gap> C := Resolution( dd );
##  <An acyclic cocomplex containing a single morphism of right complexes at degre\
##  es [ 0 .. 1 ]>
##  gap> CC := Hom( C );
##  <A non-zero acyclic complex containing a single morphism of left cocomplexes a\
##  t degrees [ 0 .. 1 ]>
##  gap> BC := HomalgBicomplex( CC );
##  <A non-zero bicomplex containing left modules at bidegrees [ 0 .. 1 ]x
##  [ -1 .. 0 ]>
##  gap> Display( BC );
##   * *
##   * *
##  gap> UU := UnderlyingComplex( BC );
##  <A non-zero acyclic complex containing a single morphism of left cocomplexes a\
##  t degrees [ 0 .. 1 ]>
##  gap> IsIdenticalObj( UU, CC );
##  true
##  gap> tBC := TransposedBicomplex( BC );
##  <A non-zero bicomplex containing left modules at bidegrees [ -1 .. 0 ]x
##  [ 0 .. 1 ]>
##  gap> Display( tBC );
##   * *
##   * *
##  ]]></Example>
##    </Description>
##  </ManSection>
##  <#/GAPDoc>
##
InstallGlobalFunction( HomalgBicomplex,
  function( arg )
    local nargs, C, transposed, complex, of_complex, left, type, bidegree_getter, B;
    
    nargs := Length( arg );
    
    if nargs = 0 then
        Error( "empty input\n" );
    fi;
    
    C := arg[1];
    
    if not IsHomalgComplex( C ) or not IsHomalgComplex( LowestDegreeObject( C ) ) then
        Error( "the first argument is not a complex of complexes\n" );
    fi;
    
    if nargs > 1 and IsString( arg[nargs] ) and Length( arg[nargs] ) > 0 and LowercaseString( arg[nargs]{[1]} )= "t" then
        transposed := true;
    else
        transposed := false;
    fi;
    
    complex := IsComplexOfFinitelyPresentedObjectsRep( C );
    of_complex := IsComplexOfFinitelyPresentedObjectsRep( LowestDegreeObject( C ) );
    
    left := IsHomalgLeftObjectOrMorphismOfLeftObjects( C );
    
    if complex then
        if left then
            type := TheTypeHomalgBicomplexOfLeftObjects;
        else
            type := TheTypeHomalgBicomplexOfRightObjects;
        fi;
    else
        if left then
            type := TheTypeHomalgBicocomplexOfLeftObjects;
        else
            type := TheTypeHomalgBicocomplexOfRightObjects;
        fi;
    fi;
    
    if ( complex and of_complex ) or ( not complex and not of_complex ) then
        if transposed then
            bidegree_getter := function( pq ) return [ pq[2], pq[1] ]; end;
        else
            bidegree_getter := function( pq ) return [ pq[1], pq[2] ]; end;
        fi;
    else
        if transposed then
            bidegree_getter := function( pq ) return [ pq[2], -pq[1] ]; end;
        else
            bidegree_getter := function( pq ) return [ pq[1], -pq[2] ]; end;
        fi;
    fi;
    
    B := rec( complex := C,
              bidegree_getter := bidegree_getter );
    
    ## Objectify
    ObjectifyWithAttributes(
            B, type,
            IsTransposedWRTTheAssociatedComplex, transposed );
    
    if HasIsComplex( C ) then
        SetIsBicomplex( B, IsComplex( C ) );
    elif HasIsSequence( C ) then
        SetIsBisequence( B, IsSequence( C ) );
    fi;
    
    return B;
    
end );

##
InstallMethod( TransposedBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( B )
    local tB, C;
    
    if IsBound(B!.TransposedBicomplex) then
        return B!.TransposedBicomplex;
    fi;
    
    C := UnderlyingComplex( B );
    
    tB := HomalgBicomplex( C, "TransposedBicomplex" );
    
    B!.TransposedBicomplex := tB;
    tB!.TransposedBicomplex := B; ## thanks GAP
    
    return tB;
    
end );

##
InstallMethod( TransposedBicomplex,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex and IsTransposedWRTTheAssociatedComplex ],
        
  function( tB )
    
    return tB!.TransposedBicomplex;
    
end );

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

##
InstallMethod( ViewObj,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( o )
    local cpx, degrees, l, opq;
    
    cpx := IsBicomplexOfFinitelyPresentedObjectsRep( o );
    
    Print( "<A" );
    
    if HasIsZero( o ) then ## if this method applies and HasIsZero is set we already know that o is a non-zero homalg bi(co)complex
        Print( " non-zero" );
    fi;
    
    if HasIsBicomplex( o ) then
        if IsBicomplex( o ) then
            if cpx then
                Print( " bicomplex" );
            else
                Print( " bicocomplex" );
            fi;
        else
            if cpx then
                Print( " non-bicomplex" );
            else
                Print( " non-bicocomplex" );
            fi;
        fi;
    elif HasIsSequence( o ) then
        if IsSequence( o ) then
            if cpx then
                Print( " bisequence" );
            else
                Print( " bicosequence" );
            fi;
        else
            if cpx then
                Print( " bisequence of non-well-definded morphisms" );
            else
                Print( " bicosequence of non-well-definded morphisms" );
            fi;
        fi;
    else
        if cpx then
            Print( " \"bicomplex\"" );
        else
            Print( " \"bicocomplex\"" );
        fi;
    fi;
    
    Print( " containing " );
    
    degrees := ObjectDegreesOfBicomplex( 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 bicomplexes",
        [ IsBicomplexOfFinitelyPresentedObjectsRep and IsZero ],
        
  function( o )
    local degrees;
    
    degrees := ObjectDegreesOfBicomplex( o );
    
    Print( "<A zero " );
    
    if IsHomalgLeftObjectOrMorphismOfLeftObjects( o ) then
        Print( "left" );
    else
        Print( "right" );
    fi;
    
    Print( " bicomplex with bidegrees ", degrees[1], "x", degrees[2], ">" );
    
end );

##
InstallMethod( ViewObj,
        "for homalg bicomplexes",
        [ IsBicocomplexOfFinitelyPresentedObjectsRep and IsZero ],
        
  function( o )
    local degrees;
    
    degrees := ObjectDegreesOfBicomplex( o );
    
    Print( "<A zero " );
    
    if IsHomalgLeftObjectOrMorphismOfLeftObjects( o ) then
        Print( "left" );
    else
        Print( "right" );
    fi;
    
    Print( " bicocomplex with bidegrees ", degrees[1], "x", degrees[2], ">" );
    
end );

##
InstallMethod( Display,
        "for homalg bicomplexes",
        [ IsHomalgBicomplex ],
        
  function( o )
    local bidegrees, q, p, Bpq;
    
    bidegrees := ObjectDegreesOfBicomplex( o );
    for q in Reversed( bidegrees[2] ) do
        for p in bidegrees[1] do
            Bpq := CertainObject( o, [ p, q ] );
            if HasIsZero( Bpq ) and IsZero( Bpq ) then
                Print( " ." );
            else
                Print( " *" );
            fi;
        od;
        Print( "\n" );
    od;
    
end );

##
InstallMethod( Display,
        "for homalg bicomplexes",
        [ IsBicomplexOfFinitelyPresentedObjectsRep and IsZero ],
        
  function( o )
    
    Print( "0\n" );
    
end );

##
InstallMethod( Display,
        "for homalg bicomplexes",
        [ IsBicocomplexOfFinitelyPresentedObjectsRep and IsZero ],
        
  function( o )
    
    Print( "0\n" );
    
end );


[ Dauer der Verarbeitung: 0.21 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