GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#############################################################################
##
## GAPHomalg.gi RingsForHomalg package Mohamed Barakat
##
## Copyright 2007-2008 Lehrstuhl B für Mathematik, RWTH Aachen
##
## Implementation stuff for the external computer algebra system GAP.
##
#############################################################################
####################################
#
# global variables:
#
####################################
InstallValue( HOMALG_IO_GAP,
rec(
cas := "gap", ## normalized name on which the user should have no control
name := "GAP",
executable := [ "gapL", "gap" ], ## this list is processed from left to right
options := [ "-q", "-T", "-m", "128m", "-o", "15g" ],
BUFSIZE := 1024,
READY := "!$%&/(",
CUT_POS_BEGIN := 1, ## these are the most
CUT_POS_END := 4, ## delicate values!
eoc_verbose := ";",
eoc_quiet := ";;",
show_banner := false, ## the GAP banner screws the display of several terminals :(
define := ":=",
delete := function( var, stream ) homalgSendBlocking( [ "Unbind( ", var, " )" ], "need_command", stream, HOMALG_IO.Pictograms.delete ); end,
multiple_delete := _ExternalGAP_multiple_delete,
garbage_collector := function( stream ) homalgSendBlocking( [ "GASMAN( \"collect\" )" ], "need_command", stream, HOMALG_IO.Pictograms.garbage_collector ); end,
prompt := "\033[01mgap>\033[0m ",
output_prompt := "\033[1;37;44m<gap\033[0m ",
display_color := "\033[0;35m",
init_string := "LoadPackage(\"HomalgToCAS\")", ## needed for LoadHomalgMatrixFromFile
InitializeCASMacros := InitializeGAPHomalgMacros,
time := function( stream, t ) return Int( homalgSendBlocking( [ "homalgTotalRuntimes( )" ], "need_output", stream, HOMALG_IO.Pictograms.time ) ) - t; end,
)
);
HOMALG_IO_GAP.READY_LENGTH := Length( HOMALG_IO_GAP.READY );
####################################
#
# representations:
#
####################################
# a new subrepresentation of the representation IshomalgExternalRingObjectRep:
DeclareRepresentation( "IsHomalgExternalRingObjectInGAPRep",
IshomalgExternalRingObjectRep,
[ ] );
# a new subrepresentation of the representation IsHomalgExternalRingRep:
DeclareRepresentation( "IsHomalgExternalRingInGAPRep",
IsHomalgExternalRingRep,
[ ] );
####################################
#
# families and types:
#
####################################
# a new type:
BindGlobal( "TheTypeHomalgExternalRingObjectInGAP",
NewType( TheFamilyOfHomalgRings,
IsHomalgExternalRingObjectInGAPRep ) );
# a new type:
BindGlobal( "TheTypeHomalgExternalRingInGAP",
NewType( TheFamilyOfHomalgRings,
IsHomalgExternalRingInGAPRep ) );
####################################
#
# global functions and variables:
#
####################################
##
InstallGlobalFunction( _ExternalGAP_multiple_delete,
function( var_list, stream )
local str;
str := [ "for _del in ", String( var_list ), " do UnbindGlobal( _del ); od" ];
homalgSendBlocking( str, "need_command", stream, HOMALG_IO.Pictograms.multiple_delete );
end );
##
InstallValue( GAPHomalgMacros,
rec(
)
);
##
InstallGlobalFunction( InitializeGAPHomalgMacros,
function( stream )
return InitializeMacros( GAPHomalgMacros, stream );
end );
####################################
#
# constructor functions and methods:
#
####################################
##
InstallGlobalFunction( RingForHomalgInExternalGAP,
function( arg )
local nargs, ext_ring_obj_type, ar, a, type, R;
nargs := Length( arg );
## passing the ring object type and ring type
## should be done using an option record and supported
## in all RingForHomalgIn* methods
if IsType( arg[1] ) then
ext_ring_obj_type := arg[1];
arg := arg{[ 2 .. nargs ]};
nargs := nargs - 1;
else
ext_ring_obj_type := TheTypeHomalgExternalRingObjectInGAP;
fi;
ar := [ arg[1] ];
Add( ar, ext_ring_obj_type );
## passing the ring object type and ring type
## should be done using an option record and supported
## in all RingForHomalgIn* methods
if nargs > 1 then
for a in arg{[ 2 .. nargs ]} do
if IsType( a ) then
type := a;
else
Add( ar, a );
fi;
od;
fi;
if not IsBound( type ) then
type := TheTypeHomalgExternalRingInGAP;
fi;
ar := [ ar, type ];
Add( ar, "HOMALG_IO_GAP" );
R := CallFuncList( CreateHomalgExternalRing, ar );
if IsBound( HOMALG_MATRICES.PreferDenseMatrices ) then
homalgSendBlocking( [ "HOMALG_MATRICES.PreferDenseMatrices := ", HOMALG_MATRICES.PreferDenseMatrices ], "need_command", R, HOMALG_IO.Pictograms.initialize );
fi;
return R;
end );
##
InstallGlobalFunction( HomalgRingOfIntegersInExternalGAP,
function( arg )
local nargs, l, c, R;
nargs := Length( arg );
if nargs > 0 and IsInt( arg[1] ) and arg[1] <> 0 then
l := 2;
## characteristic:
c := AbsInt( arg[1] );
else
if nargs > 0 and arg[1] = 0 then
l := 2;
else
l := 1;
fi;
## characteristic:
c := 0;
fi;
R := [ "HomalgRingOfIntegers( ", c, " )" ];
R := Concatenation( [ R, IsPrincipalIdealRing ], arg{[ l .. nargs ]} );
R := CallFuncList( RingForHomalgInExternalGAP, R );
SetIsResidueClassRingOfTheIntegers( R, true );
SetRingProperties( R, c );
return R;
end );
##
InstallMethod( HomalgRingOfIntegersInUnderlyingCAS,
"for an integer and homalg ring in external GAP",
[ IsInt, IsHomalgExternalRingInGAPRep ],
HomalgRingOfIntegersInExternalGAP );
##
InstallGlobalFunction( HomalgFieldOfRationalsInExternalGAP,
function( arg )
local R;
R := "HomalgFieldOfRationals( )";
R := Concatenation( [ R ], [ IsPrincipalIdealRing ], arg );
R := CallFuncList( RingForHomalgInExternalGAP, R );
SetIsRationalsForHomalg( R, true );
SetRingProperties( R, 0 );
return R;
end );
##
InstallMethod( FieldOfFractions,
"for homalg rings in GAP",
[ IsHomalgExternalRingInGAPRep and IsIntegersForHomalg ],
function( ZZ )
return HomalgFieldOfRationalsInExternalGAP( ZZ );
end );
##
InstallMethod( SetMatElm,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep and IsMutable, IsPosInt, IsPosInt, IsString, IsHomalgExternalRingInGAPRep ],
function( M, r, c, s, R )
homalgSendBlocking( [ "SetMatElm( ", M, r, c, ",", s, ",", R, " )" ], "need_command", HOMALG_IO.Pictograms.SetMatElm );
end );
##
InstallMethod( AddToMatElm,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep and IsMutable, IsPosInt, IsPosInt, IsHomalgExternalRingElementRep, IsHomalgExternalRingInGAPRep ],
function( M, r, c, a, R )
homalgSendBlocking( [ "AddToMatElm( ", M, r, c, a, R, " )" ], "need_command", HOMALG_IO.Pictograms.AddToMatElm );
end );
##
InstallMethod( CreateHomalgMatrixFromString,
"constructor for homalg external matrices in GAP",
[ IsString, IsHomalgExternalRingInGAPRep ],
function( S, R )
local ext_obj;
## external GAP sees S as a listlist (and not as a string)
ext_obj := homalgSendBlocking( [ "HomalgMatrix( ", S, ", ", R, " )" ], HOMALG_IO.Pictograms.HomalgMatrix );
return HomalgMatrix( ext_obj, R );
end );
##
InstallMethod( CreateHomalgMatrixFromString,
"constructor for homalg external matrices in GAP",
[ IsString, IsInt, IsInt, IsHomalgExternalRingInGAPRep ],
function( S, r, c, R )
local ext_obj;
ext_obj := homalgSendBlocking( [ "CreateHomalgMatrixFromString( \"", S, "\", ", r, c , R, " )" ], HOMALG_IO.Pictograms.HomalgMatrix );
return HomalgMatrix( ext_obj, r, c, R );
end );
##
InstallMethod( CreateHomalgMatrixFromSparseString,
"constructor for homalg external matrices in GAP",
[ IsString, IsInt, IsInt, IsHomalgExternalRingInGAPRep ],
function( S, r, c, R )
local ext_obj, s;
s := homalgSendBlocking( [ "\"", S, "\"" ], R, HOMALG_IO.Pictograms.sparse );
ext_obj := homalgSendBlocking( [ "CreateHomalgMatrixFromSparseString( ", s, r, c , R, " )" ], HOMALG_IO.Pictograms.HomalgMatrix );
return HomalgMatrix( ext_obj, R );
end );
##
InstallMethod( MatElmAsString,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep, IsPosInt, IsPosInt, IsHomalgExternalRingInGAPRep ],
function( M, r, c, R )
return EvalString( homalgSendBlocking( [ "String( MatElm( ", M, r, c, R, " ) )" ], "need_output", HOMALG_IO.Pictograms.MatElm ) );
end );
##
InstallMethod( MatElm,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep, IsPosInt, IsPosInt, IsHomalgExternalRingInGAPRep ],
function( M, r, c, R )
local Mrc;
Mrc := homalgSendBlocking( [ "MatElm( ", M, r, c, R, " )" ], HOMALG_IO.Pictograms.MatElm );
return HomalgExternalRingElement( Mrc, R );
end );
##
InstallMethod( GetListOfHomalgMatrixAsString,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep, IsHomalgExternalRingInGAPRep ],
function( M, R )
local s, l;
s := homalgSendBlocking( [ "GetListOfHomalgMatrixAsString( ", M, " )" ], "need_output", HOMALG_IO.Pictograms.GetListOfHomalgMatrixAsString );
l := Length( s );
if l < 3 then
return s;
fi;
return s{[ 2 .. l-1 ]};
end );
##
InstallMethod( GetListListOfHomalgMatrixAsString,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep, IsHomalgExternalRingInGAPRep ],
function( M, R )
local s, l;
s := homalgSendBlocking( [ "GetListListOfHomalgMatrixAsString( ", M, " )" ], "need_output", HOMALG_IO.Pictograms.GetListListOfHomalgMatrixAsString );
l := Length( s );
if l < 3 then
return s;
fi;
return s{[ 2 .. l-1 ]};
end );
##
InstallMethod( GetSparseListOfHomalgMatrixAsString,
"for homalg external matrices in Maple",
[ IsHomalgExternalMatrixRep, IsHomalgExternalRingInGAPRep ],
function( M, R )
local s, l;
s := homalgSendBlocking( [ "GetSparseListOfHomalgMatrixAsString( ", M, " )" ], "need_output", HOMALG_IO.Pictograms.GetSparseListOfHomalgMatrixAsString );
l := Length( s );
if l < 3 then
return s;
fi;
return s{[ 2 .. l-1 ]};
end );
##
InstallMethod( homalgSetName,
"for homalg ring elements",
[ IsHomalgExternalRingElementRep, IsString, IsHomalgExternalRingInGAPRep ],
function( r, name, R )
SetName( r, EvalString( homalgSendBlocking( [ "String( ", r, " )" ], "need_output", HOMALG_IO.Pictograms.homalgSetName ) ) );
end );
####################################
#
# transfer methods:
#
####################################
##
InstallMethod( SaveHomalgMatrixToFile,
"for homalg external matrices in GAP",
[ IsString, IsHomalgMatrix, IsHomalgExternalRingInGAPRep ],
function( filename, M, R )
local mode, command;
if not IsBound( M!.SaveAs ) then
mode := "ListList";
else
mode := M!.SaveAs; #not yet supported
fi;
if mode = "ListList" then
command := [ "SaveHomalgMatrixToFile( \"", filename, "\", ", M, " )" ];
homalgSendBlocking( command, "need_command", HOMALG_IO.Pictograms.SaveHomalgMatrixToFile );
fi;
return true;
end );
##
InstallMethod( LoadHomalgMatrixFromFile,
"for external rings in GAP",
[ IsString, IsHomalgExternalRingInGAPRep ],
function( filename, R )
local mode, command, M;
if not IsBound( R!.LoadAs ) then
mode := "ListList";
else
mode := R!.LoadAs; #not yet supported
fi;
M := HomalgVoidMatrix( R );
if mode = "ListList" then
command := [ M, " := LoadHomalgMatrixFromFile( \"", filename, "\", ", R, " )" ];
homalgSendBlocking( command, "need_command", HOMALG_IO.Pictograms.LoadHomalgMatrixFromFile );
fi;
return M;
end );
####################################
#
# View, Print, and Display methods:
#
####################################
InstallMethod( Display,
"for homalg external matrices in GAP",
[ IsHomalgExternalMatrixRep ], 1,
function( o )
if IsHomalgExternalRingInGAPRep( HomalgRing( o ) ) then
Print( homalgSendBlocking( [ "Display( ", o, " )" ], "need_display", HOMALG_IO.Pictograms.Display ) );
else
TryNextMethod( );
fi;
end );