<> <> DIRECTORY Rope USING [ROPE], Basics, IO USING [STREAM], AlgebraClasses; <> Matrices: CEDAR DEFINITIONS ~ BEGIN OPEN AC: AlgebraClasses; <> Matrix: TYPE = REF MatrixRec; MatrixRec: TYPE = RECORD[ size: NAT _ 0, rows: RowSeq _ NIL ]; RowSeq: TYPE = REF RowSeqRec; RowSeqRec: TYPE = RECORD[SEQUENCE rowsPlusOne: [1..100] OF Row]; Row: TYPE = REF RowRec; RowRec: TYPE = RECORD[SEQUENCE columnsPlusOne: [1..100] OF REF]; Column: TYPE = REF ColumnRec; ColumnRec: TYPE = RECORD[SEQUENCE rowsPlusOne: [1..100] OF REF]; <> 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 ]; <> DiagonalMatrixConstructorOp: TYPE = PROC [element: REF, size: NAT, elementStructure: AC.Structure] RETURNS [out: Matrix]; MatrixOps: TYPE = REF MatrixOpsRec; -- prop key is $MatrixRing. MatrixOpsRec: TYPE = RECORD [ diagonalMatrix: DiagonalMatrixConstructorOp, transpose: AC.UnaryOp, determinant: AC.StructuredToGroundOp ]; <> MakeMatrixRing: PROC [elementStructure: AC.Structure, size: NAT] RETURNS [matrixRing: AC.Structure]; <> <<>> MakeMatrixAlgebra: PROC [elementField: AC.Structure, size: NAT] RETURNS [matrixAlgebra: AC.Structure]; <> IsMatrixRing: PROC [structure: AC.Structure] RETURNS [BOOL]; <<>> Transpose: PROC [structure: AC.Structure] RETURNS [AC.UnaryOp]; <> <<>> Determinant: PROC [structure: AC.Structure] RETURNS [AC.StructuredToGroundOp]; <> <> DiagMatrix: DiagonalMatrixConstructorOp; <> ReadMatrix: PROC [in: IO.STREAM, size: NAT, elementStructure: AC.Structure] RETURNS [matrix: Matrix]; MatrixFromRope: PROC [in: Rope.ROPE, size: NAT, elementStructure: AC.Structure] RETURNS [out: Matrix]; <<>> MatrixToRope: PROC [in: Matrix, elementStructure: AC.Structure] RETURNS [out: Rope.ROPE]; WriteMatrix: PROC [in: Matrix, elementStructure: AC.Structure, out: IO.STREAM]; <> Add: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [out: Matrix]; Negate: PROC [in: Matrix, elementStructure: AC.Structure] RETURNS [out: Matrix]; Subtract: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [Matrix]; Multiply: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [out: Matrix]; Invert: PROC [in: Matrix, elementField: AC.Structure] RETURNS [out: Matrix]; Divide: PROC [in1, in2: Matrix, elementField: AC.Structure] RETURNS [out: Matrix]; ScalarMultiply: PROC [scalar: REF, inMatrix: Matrix, elementField: AC.Structure] RETURNS [outMatrix: Matrix]; <> Equal: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [BOOL]; Transp: PROC [in: Matrix] RETURNS [out: Matrix]; Det: PROC [in: Matrix, elementStructure: AC.Structure] RETURNS [value: REF]; END.