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


Quelle  fileacc.gi   Sprache: unbekannt

 
############################################################################
##
#W  fileacc.gi                  QuaGroup                     Willem de Graaf
##
##
##  Writing and reading algebras, modules to, from files
##

QGPrivateFunctions.GetQEARecord:= function( U )
    
    local   r,  U0,  R,  tt,  T,  x,  i,  j,  rel,  k;
    
    r:= rec();
    if IsGenericQUEA( U ) then
        U0:= U;
        r.isGeneric:= true;
    else
        U0:= QuantizedUEA( RootSystem( U ) );
        r.isGeneric:= false;
        r.qpar:= QuantumParameter( U );
        r.field:= LeftActingDomain( U );
    fi;
    
    # First we make a record containing the data that defines the
    # root system.
    R:= RootSystem(U0 );
                               
    if HasLongestWeylWord( R ) then
        r.longw:= LongestWeylWord( R );
    fi;
    
    if HasTypeOfRootSystem( R ) then
        r.type:= TypeOfRootSystem( R );
    fi;
    
    r.posR:= PositiveRoots(R);
    r.simp:= SimpleSystem(R);
    r.cm:= CartanMatrix(R);
    r.bl:= BilinearFormMat(R);
    r.posRNF:= PositiveRootsNF(R);
    r.simpNF:= SimpleSystemNF(R);
    r.blNF:=BilinearFormMatNF(R);
    
    # Now we do the algebra (mainly the multiplication table):
    tt:= ElementsFamily( FamilyObj( U0 ) )!.multTab;
    T:= [ ];
    x:= Indeterminate( Rationals, "_q" );
    for i in [1..Length(tt)] do
        if IsBound(tt[i]) then
            T[i]:= [ ];
            for j in [1..Length(tt[i])] do
                if IsBound( tt[i][j] ) then
                    rel:= ShallowCopy( tt[i][j] );
                    for k in [2,4..Length(rel)] do
                        rel[k]:= Value( rel[k], x );
                    od;
                    T[i][j]:= rel;
                fi;
            od;
        fi;
    od;
    r.table:= T;
    return r;
end;


InstallMethod( WriteQEAToFile,
        "for qea and string", true, [IsQuantumUEA,IsString],0,        
        function( U, file )
    
    PrintTo( file, "return ", QGPrivateFunctions.GetQEARecord( U ),";");
end );

QGPrivateFunctions.ConstructGenericQEA:= function( r )
    
    local   R,  n,  rank,  B,  fam,  tt,  T,  i,  j,  rel,  k,  gens,  
            qp,  A;
    
    R:= Objectify( NewType( NewFamily( "RootSystemFam", IsObject ),
                IsAttributeStoringRep and 
                IsRootSystem ), rec() );
    SetPositiveRoots( R, r.posR );
    SetNegativeRoots( R, -r.posR );
    SetSimpleSystem( R, r.simp );
    SetCartanMatrix( R, r.cm );
    SetBilinearFormMat( R, r.bl );
    SetPositiveRootsNF( R, r.posRNF );
    SetSimpleSystemNF( R, r.simpNF );
    SetBilinearFormMatNF( R, r.blNF );
    
    if IsBound( r.type ) then
        SetTypeOfRootSystem( R, r.type );
    fi;
    if IsBound( r.longw ) then
        SetLongestWeylWord( R , r.longw );
    fi;
    
    # Reconstruct the algebra:
    
    n:= Length(PositiveRoots(R));
    rank:= Length( CartanMatrix(R) );
    B:= BilinearFormMatNF( R );
    
    fam:= NewFamily( "QEAEltFam", IsQEAElement );
    fam!.packedQEAElementDefaultType:=
      NewType( fam, IsPackedElementDefaultRep );
    fam!.noPosRoots:= Length( PositiveRoots(R) );
    fam!.rank:= Length( CartanMatrix(R) );
    fam!.rootSystem:= R;
    fam!.convexRoots:= PositiveRootsInConvexOrder( R );
    
    tt:= r.table;
    T:= [ ];
    for i in [1..Length(tt)] do
        if IsBound(tt[i]) then
            T[i]:= [ ];
            for j in [1..Length(tt[i])] do
                if IsBound( tt[i][j] ) then
                    rel:= ShallowCopy( tt[i][j] );
                    for k in [2,4..Length(rel)] do
                        rel[k]:= _q^0*rel[k];
                    od;
                    T[i][j]:= rel;
                fi;
            od;
        fi;
    od;
    fam!.multTab:= T;
    fam!.quantumPar:= _q;
    
    # Finally construct the generators.

    gens:= [ ];
    for i in [1..n] do
        gens[i]:= ObjByExtRep( fam, [ [ i, 1 ], _q^0 ] );
    od;
    for i in [1..Length( CartanMatrix(R) )] do
        Add( gens,  ObjByExtRep( fam, [ [ [ n+i, 1 ], 0 ], _q^0 ] ) );
        qp:= _q^(B[i][i]/2);
        Add( gens,  ObjByExtRep( fam, [ [ [ n+i, 1 ], 0 ], _q^0, 
                   [ [ n+i, 0 ], 1 ], qp^-1-qp ] ) );
    od;
    for i in [1..n] do
        Add( gens, ObjByExtRep( fam, 
                [ [ n+Length(CartanMatrix(R)) +i, 1 ], _q^0 ] ) );
    od;
    
    A:= Objectify( NewType( CollectionsFamily( FamilyObj( gens[1] ) ),
                                IsMagmaRingModuloRelations
                            and IsQuantumUEA
                            and IsGenericQUEA
                            and IsAttributeStoringRep ),
                   rec() );
    SetIsAssociative( A, true );
    SetLeftActingDomain( A, QuantumField );
    SetGeneratorsOfLeftOperatorRing( A, gens );
    SetGeneratorsOfLeftOperatorRingWithOne( A, gens );
    SetOne( A, gens[1]^0 );
    SetRootSystem( A, R );
    SetQuantumParameter( A, _q );

    # add a pointer to `A' to the family of the generators:
    fam!.qAlgebra:= A;
    
    return A;
end;

InstallMethod( ReadQEAFromFile,
        "for a file name", true, [IsString], 0,  
        function( file )
    
    local   r,  U0,  R,  F,  v,  n,  rank,  B,  fam,  tt,  tt_new,  k,  
            i,  j,  rel,  gens,  qp,  A;
    
    r:= ReadAsFunction( file )();
    U0:= QGPrivateFunctions.ConstructGenericQEA( r );
    if r.isGeneric then
        return U0;
    else
        
        R:= RootSystem( U0 );
        F:= r.field;
        v:= r.qpar;
        n:= Length(PositiveRoots(R));
        rank:= Length( CartanMatrix(R) );
        B:= BilinearFormMatNF( R );
        
        fam:= NewFamily( "QEAEltFam", IsQEAElement );
        fam!.packedQEAElementDefaultType:=
          NewType( fam, IsPackedElementDefaultRep );
        fam!.noPosRoots:= n;
        fam!.rank:= rank;
        fam!.rootSystem:= R;
        
        fam!.genericQUEA:= U0;
        
        tt:= ElementsFamily( FamilyObj( U0 ) )!.multTab;
        # copy tt and substitute v for q:
        tt_new:= List([1..n], x -> [] );  
        for k in [1..n] do
            tt_new[k+rank+n]:= [];
        od;
        for i in [1..Length(tt)] do
            if IsBound( tt[i] ) then
                for j in [1..Length(tt[i]) ] do
                    if IsBound( tt[i][j] ) then
                        rel:= List( tt[i][j], ShallowCopy );
                        for k in [2,4..Length(rel)] do
                            rel[k]:= Value( rel[k], v );
                        od;
                        tt_new[i][j]:= rel;
                    fi;
                od;
            fi;
        od;
        
        fam!.multTab:= tt_new;
        
        # some more data:
        fam!.convexRoots:= ElementsFamily( FamilyObj( U0 ) )!.convexRoots;
        fam!.quantumPar:= v;
        
        # Finally construct the generators.
        
        gens:= [ ];
        for i in [1..n] do
            gens[i]:= ObjByExtRep( fam, [ [ i, 1 ], v^0 ] );
        od;
        for i in [1..Length( CartanMatrix(R) )] do
            Add( gens,  ObjByExtRep( fam, [ [ [ n+i, 1 ], 0 ], v^0 ] ) );
            qp:= v^(B[i][i]/2);
            if IsZero( qp^-1-qp ) then
                Add( gens,  ObjByExtRep( fam, [ [ [ n+i, 1 ], 0 ], qp^0 ] ) );
            else
                Add( gens,  ObjByExtRep( fam, [ [ [ n+i, 1 ], 0 ], qp^0, 
                        [ [ n+i, 0 ], 1 ], qp^-1-qp ] ) );
            fi;
        od;
        for i in [1..n] do
            Add( gens, ObjByExtRep( fam, 
                    [ [ n+Length(CartanMatrix(R)) +i, 1 ], v^0 ] ) );
        od;
        
        A:= Objectify( NewType( CollectionsFamily( FamilyObj( gens[1] ) ),
                    IsMagmaRingModuloRelations
                    and IsQuantumUEA
                    and IsAttributeStoringRep ),
                    rec() );
        SetIsAssociative( A, true );
        SetLeftActingDomain( A, F );
        SetGeneratorsOfLeftOperatorRing( A, gens );
        SetGeneratorsOfLeftOperatorRingWithOne( A, gens );
        SetOne( A, gens[1]^0 );
        SetRootSystem( A, R );
        SetQuantumParameter( A, v );
        
        # add a pointer to `A' to the family of the generators:
        fam!.qAlgebra:= A;
        
        return A;
    fi;
        
end );

InstallMethod( WriteModuleToFile,
        "for a module and a string", true, [IsAlgebraModule,IsString],0,
        function( V, file )
  
    local   U,  r,  g,  BV,  bv,  acts,  x,  i,  act,  j,  cf,  vv,  
            k,  acts1,  R,  n,  rank;
    
    # This only works for generic qea's, because in the non-generic
    # case it may be difficult to handle the K-elements. In the generic
    # case the action of a K-element follows from the actions of K, K^-1;
    # but in the non-generic case this may be difficult to achieve.
    # Maybe it would be possible to do it with some kind of fct...
    
    U:= LeftActingAlgebra( V );
    
    if not IsGenericQUEA( U ) then
        Error("Currently WriteModueToFile is only implemented for generic quantized enveloping algebras");
    fi;        
    
    r:= QGPrivateFunctions.GetQEARecord( U );
    g:= GeneratorsOfAlgebra( U );
    BV:= Basis( V );
    bv:= BasisVectors( BV );
    acts:= [ ];
    x:= Indeterminate( Rationals, "_q" );
    
    for i in [1..Length(g)] do
        act:= [ ];
        for j in [1..Length(bv)] do
            cf:= Coefficients( BV, g[i]^bv[j] );
            vv:= [ ];
            for k in [1..Length(cf)] do
                if cf[k] <> 0*cf[k] then
                    Add( vv, k ); Add( vv, Value( cf[k], x ) );
                fi;
            od;
            Add( act, vv );
        od;
        Add( acts, act );
    od;
    
    acts1:= [ ];
    R:= RootSystem(U);
    n:= Length( PositiveRoots(R) );
    rank:= Length( CartanMatrix(R) );
    for i in [1..n] do acts1[i]:= acts[i]; od;
    for i in [1..rank] do Add( acts1, acts[n+2*i-1] ); od;
    for i in [1..rank] do Add( acts1, acts[n+2*i] ); od;
    for i in [1..n] do Add( acts1, acts[n+2*rank+i] ); od;
    
    r.acts:= acts1;
    r.dim:= Dimension( V );
    
    PrintTo( file, "return ", r,";");        
    
end );


InstallMethod( ReadModuleFromFile,
        "for a file-name", true, [IsString], 0,
        function( file )
    
    local   r,  V,  bv,  acts,  aa,  i,  j,  v,  k,  U,  R,  posR,  s,  
            rank,  B,  f;    
    
    r:= ReadAsFunction( file )();
    if not r.isGeneric then
        Error("Currently ReadModueFromFile is only implemented for generic quantized enveloping algebras");
    fi;
    
    V:= FullSparseRowSpace( QuantumField, r.dim );
    bv:= BasisVectors( Basis( V ) );
    acts:= r.acts;
    aa:= [ ];
    for i in [1..Length(acts)] do
        aa[i]:= [ ];
        for j in [1..Length(acts[i])] do
            v:= Zero(V);
            for k in [1,3..Length(acts[i][j])-1] do
                v:= v + ( acts[i][j][k+1]*_q^0 )*bv[ acts[i][j][k] ];
            od;
            Add( aa[i], v );
        od;
    od;
    
    U:= QGPrivateFunctions.ConstructGenericQEA( r );
    R:= RootSystem( U );
    posR:= PositiveRootsInConvexOrder( R );
    s:= Length( posR );
    rank:= Length( CartanMatrix(R) );
    B:= BilinearFormMat( R );
    
    f:= function( x, u ) return 
      QGPrivateFunctions.DIYAction( V, s, rank, B, posR, aa, x, u ); end;
    return LeftAlgebraModule( U, f, V );
    
end );

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