racket/collects/math/matrix.rkt
Neil Toronto f42cc6f14a Fixed major performance issue with matrix arithmetic; please merge to 5.3.2
The fix consists of three parts:

1. Rewriting `inline-matrix*'. The material change here is that the
   expansion now contains only direct applications of `+' and `*'.
   TR's optimizer replaces them with `unsafe-fx+' and `unsafe-fx*',
   which keeps intermediate flonum values from being boxed.

2. Making the types of all functions that operate on (Matrix Number)
   values more precise. Now TR can prove that matrix operations preserve
   inexactness. For example, matrix-conjugate : (Matrix Flonum) ->
   (Matrix Flonum) and three other cases for Real, Float-Complex, and
   Number.

3. Changing the return types of some functions that used to return
   things like (Matrix (U A 0)). Now that we worry about preserving
   inexactness, we can't have `matrix-upper-triangle' always return a
   matrix that contains exact zeros. It now accepts an optional `zero'
   argument of type A.
2013-01-21 22:04:04 -07:00

214 lines
8.2 KiB
Racket

#lang racket/base
(require typed/untyped-utils)
(require "private/matrix/matrix-arithmetic.rkt"
"private/matrix/matrix-conversion.rkt"
"private/matrix/matrix-syntax.rkt"
"private/matrix/matrix-comprehension.rkt"
"private/matrix/matrix-types.rkt"
"private/matrix/matrix-2d.rkt"
;;"private/matrix/matrix-expt.rkt" ; all use require/untyped-contract
;;"private/matrix/matrix-gauss-elim.rkt" ; all use require/untyped-contract
(except-in "private/matrix/matrix-solve.rkt"
matrix-determinant
matrix-inverse
matrix-solve)
(except-in "private/matrix/matrix-constructors.rkt"
vandermonde-matrix)
(except-in "private/matrix/matrix-basic.rkt"
matrix-1norm
matrix-2norm
matrix-inf-norm
matrix-norm
matrix-dot
matrix-cos-angle
matrix-angle
matrix-normalize
matrix-conjugate
matrix-hermitian
matrix-trace
matrix-normalize-rows
matrix-normalize-cols)
(except-in "private/matrix/matrix-subspace.rkt"
matrix-col-space)
(except-in "private/matrix/matrix-operator-norm.rkt"
matrix-op-1norm
matrix-op-2norm
matrix-op-inf-norm
matrix-basis-cos-angle
matrix-basis-angle)
;;"private/matrix/matrix-qr.rkt" ; all use require/untyped-contract
;;"private/matrix/matrix-lu.rkt" ; all use require/untyped-contract
;;"private/matrix/matrix-gram-schmidt.rkt" ; all use require/untyped-contract
)
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-expt.rkt"
[matrix-expt ((Matrix Number) Integer -> (Matrix Number))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"
"private/matrix/matrix-gauss-elim.rkt"))
"private/matrix/matrix-gauss-elim.rkt"
[matrix-gauss-elim
(case-> ((Matrix Number) -> (Values (Matrix Number) (Listof Index)))
((Matrix Number) Any -> (Values (Matrix Number) (Listof Index)))
((Matrix Number) Any Any -> (Values (Matrix Number) (Listof Index)))
((Matrix Number) Any Any Pivoting -> (Values (Matrix Number) (Listof Index))))]
[matrix-row-echelon
(case-> ((Matrix Number) -> (Matrix Number))
((Matrix Number) Any -> (Matrix Number))
((Matrix Number) Any Any -> (Matrix Number))
((Matrix Number) Any Any Pivoting -> (Matrix Number)))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-solve.rkt"
[matrix-determinant
((Matrix Number) -> Number)]
[matrix-inverse
(All (A) (case-> ((Matrix Number) -> (Matrix Number))
((Matrix Number) (-> A) -> (U A (Matrix Number)))))]
[matrix-solve
(All (A) (case->
((Matrix Number) (Matrix Number) -> (Matrix Number))
((Matrix Number) (Matrix Number) (-> A) -> (U A (Matrix Number)))))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-constructors.rkt"
[vandermonde-matrix ((Listof Number) Integer -> (Matrix Number))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-basic.rkt"
[matrix-1norm ((Matrix Number) -> Nonnegative-Real)]
[matrix-2norm ((Matrix Number) -> Nonnegative-Real)]
[matrix-inf-norm ((Matrix Number) -> Nonnegative-Real)]
[matrix-norm (case-> ((Matrix Number) -> Nonnegative-Real)
((Matrix Number) Real -> Nonnegative-Real))]
[matrix-dot
(case-> ((Matrix Number) -> Nonnegative-Real)
((Matrix Number) (Matrix Number) -> Number))]
[matrix-cos-angle
((Matrix Number) (Matrix Number) -> Number)]
[matrix-angle
((Matrix Number) (Matrix Number) -> Number)]
[matrix-normalize
(All (A) (case-> ((Matrix Number) -> (Matrix Number))
((Matrix Number) Real -> (Matrix Number))
((Matrix Number) Real (-> A) -> (U A (Matrix Number)))))]
[matrix-conjugate
((Matrix Number) -> (Matrix Number))]
[matrix-hermitian
((Matrix Number) -> (Matrix Number))]
[matrix-trace
((Matrix Number) -> Number)]
[matrix-normalize-rows
(All (A) (case-> ((Matrix Number) -> (Matrix Number))
((Matrix Number) Real -> (Matrix Number))
((Matrix Number) Real (-> A) -> (U A (Matrix Number)))))]
[matrix-normalize-cols
(All (A) (case-> ((Matrix Number) -> (Matrix Number))
((Matrix Number) Real -> (Matrix Number))
((Matrix Number) Real (-> A) -> (U A (Matrix Number)))))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-subspace.rkt"
[matrix-col-space
(All (A) (case-> ((Matrix Number) -> (Matrix Number))
((Matrix Number) (-> A) -> (U A (Matrix Number)))))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-operator-norm.rkt"
[matrix-op-1norm ((Matrix Number) -> Nonnegative-Real)]
[matrix-op-2norm ((Matrix Number) -> Nonnegative-Real)]
[matrix-op-inf-norm ((Matrix Number) -> Nonnegative-Real)]
[matrix-basis-cos-angle
((Matrix Number) (Matrix Number) -> Number)]
[matrix-basis-angle
((Matrix Number) (Matrix Number) -> Number)])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-qr.rkt"
[matrix-qr
(case-> ((Matrix Number) -> (Values (Matrix Number) (Matrix Number)))
((Matrix Number) Any -> (Values (Matrix Number) (Matrix Number))))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"))
"private/matrix/matrix-lu.rkt"
[matrix-lu
(All (A) (case-> ((Matrix Number) -> (Values (Matrix Number) (Matrix Number)))
((Matrix Number) (-> A) -> (Values (U A (Matrix Number)) (Matrix Number)))))])
(require/untyped-contract
(begin (require "private/matrix/matrix-types.rkt"
"private/array/array-struct.rkt"))
"private/matrix/matrix-gram-schmidt.rkt"
[matrix-gram-schmidt
(case-> ((Matrix Number) -> (Array Number))
((Matrix Number) Any -> (Array Number))
((Matrix Number) Any Integer -> (Array Number)))]
[matrix-basis-extension
((Matrix Number) -> (Array Number))])
(provide (all-from-out
"private/matrix/matrix-arithmetic.rkt"
"private/matrix/matrix-constructors.rkt"
"private/matrix/matrix-conversion.rkt"
"private/matrix/matrix-syntax.rkt"
"private/matrix/matrix-basic.rkt"
"private/matrix/matrix-subspace.rkt"
"private/matrix/matrix-solve.rkt"
"private/matrix/matrix-operator-norm.rkt"
"private/matrix/matrix-comprehension.rkt"
"private/matrix/matrix-types.rkt"
"private/matrix/matrix-2d.rkt")
;; matrix/matrix-expt.rkt
matrix-expt
;; matrix-gauss-elim.rkt
matrix-gauss-elim
matrix-row-echelon
;; matrix-solve.rkt
matrix-determinant
matrix-inverse
matrix-solve
;; matrix-constructors.rkt
vandermonde-matrix
;; matrix-basic.rkt
matrix-1norm
matrix-2norm
matrix-inf-norm
matrix-norm
matrix-dot
matrix-cos-angle
matrix-angle
matrix-normalize
matrix-conjugate
matrix-hermitian
matrix-trace
matrix-normalize-rows
matrix-normalize-cols
;; matrix-subspace.rkt
matrix-col-space
;; matrix-operator-norm.rkt
matrix-op-1norm
matrix-op-2norm
matrix-op-inf-norm
matrix-basis-cos-angle
matrix-basis-angle
;; matrix-qr.rkt
matrix-qr
;; matrix-lu.rkt
matrix-lu
;; matrix-gram-schmidt.rkt
matrix-gram-schmidt
matrix-basis-extension
)