<> <> DIRECTORY Rope USING [ROPE], Basics, IO USING [STREAM], AlgebraClasses; <> Matrices: CEDAR DEFINITIONS ~ BEGIN OPEN AC: AlgebraClasses; <> Matrix: TYPE = AC.Object; MatrixData: TYPE = RowSeq; RowSeq: TYPE = REF RowSeqRec; RowSeqRec: TYPE = RECORD[SEQUENCE rowsPlusOne: [1..1000] OF Row]; Row: TYPE = REF RowRec; RowRec: TYPE = RECORD[SEQUENCE columnsPlusOne: [1..1000] OF AC.Object]; <> matrixRingClass: AC.StructureClass; -- Class record for all matrix rings, i.e. matrices over a ring which is not a field. matrixAlgebraClass: AC.StructureClass; -- Class record for matrix algebras which are not division algebras <> MatrixStructureData: TYPE = REF MatrixStructureDataRec; MatrixStructureDataRec: TYPE = RECORD [ elementStructure: AC.Structure, size: NAT ]; <> MatrixOps: TYPE = REF MatrixOpsRec; -- prop key is $MatrixRing. MatrixOpsRec: TYPE = RECORD [ diagonalMatrix: AC.UnaryImbedOp, transpose: AC.UnaryOp, determinant: AC.StructuredToGroundOp _ NIL ]; <> MakeMatrixStructure: PROC [elementStructure: AC.Structure, size: NAT] RETURNS [matrixStructure: AC.Structure]; <> <> IsMatrixRing: PROC [structure: AC.Structure] RETURNS [BOOL]; <<>> DiagonalMatrix: PROC [structure: AC.Structure] RETURNS [AC.UnaryImbedOp]; Transpose: PROC [structure: AC.Structure] RETURNS [AC.UnaryOp]; <> <<>> Determinant: PROC [structure: AC.Structure] RETURNS [AC.StructuredToGroundOp]; <> <> DiagMatrix: AC.UnaryImbedOp; <> Read: AC.ReadOp; FromRope: AC.FromRopeOp; ToRope: AC.ToRopeOp; Write: AC.WriteOp; <> Add: AC.BinaryOp; Negate: AC.UnaryOp; Subtract: AC.BinaryOp; Multiply: AC.BinaryOp; Invert: AC.UnaryOp; Divide: AC.BinaryOp; ScalarMultiply: AC.BinaryOp; <> <> Equal: AC.EqualityOp; Transp: AC.UnaryOp; Det: AC.StructuredToGroundOp; END.