racket/collects/math/private/array/array-pointwise.rkt
Neil Toronto f5fa93572d Moar `math/matrix' review/refactoring
* Gram-Schmidt using vector type

* QR decomposition

* Operator 1-norm and maximum norm; stub for 2-norm and angle between
  subspaces (`matrix-basis-angle')

* `matrix-absolute-error' and `matrix-relative-error'; also predicates
  based on them, such as `matrix-identity?'

* Lots of shuffling code about

* Types that can have contracts, and an exhaustive test to make sure
  every value exported by `math/matrix' has a contract when used in
  untyped code

* Some more tests (still needs some)
2012-12-31 14:17:17 -07:00

95 lines
2.4 KiB
Racket

#lang racket/base
(require typed/untyped-utils
racket/math
(rename-in "typed-array-pointwise.rkt"
[array-map typed:array-map])
(rename-in "untyped-array-pointwise.rkt"
[array-map untyped:array-map]))
(define-typed/untyped-identifier array-map
typed:array-map untyped:array-map)
(define-syntax-rule (define-array-op1 name op)
(define-syntax-rule (name arr) (array-map op arr)))
(define-syntax-rule (define-array-op2 name op)
(define-syntax-rule (name arr0 arr1) (array-map op arr0 arr1)))
(define-syntax-rule (define-array-op1+ name op)
(define-syntax-rule (name arr0 arrs (... ...)) (array-map op arr0 arrs (... ...))))
(define-syntax-rule (define-array-op2+ name op)
(define-syntax-rule (name arr0 arr1 arrs (... ...)) (array-map op arr0 arr1 arrs (... ...))))
(define-syntax-rule (define-array-op name op)
(define-syntax-rule (name arrs (... ...)) (array-map op arrs (... ...))))
(define-syntax-rule (array-scale arr x-expr)
(let ([x x-expr])
(inline-array-map (λ (y) (* x y)) arr)))
(define-array-op1 array-sqr sqr)
(define-array-op1 array-sqrt sqrt)
(define-array-op1 array-abs abs)
(define-array-op1 array-magnitude magnitude)
(define-array-op1 array-angle angle)
(define-array-op1 array-conjugate conjugate)
(define-array-op1 array-real-part real-part)
(define-array-op1 array-imag-part imag-part)
(define-array-op2 array-make-rectangular make-rectangular)
(define-array-op2 array-make-polar make-polar)
(define-array-op array+ +)
(define-array-op array* *)
(define-array-op1+ array- -)
(define-array-op1+ array/ /)
(define-array-op1+ array-min min)
(define-array-op1+ array-max max)
(define-array-op2+ array< <)
(define-array-op2+ array<= <=)
(define-array-op2+ array> >)
(define-array-op2+ array>= >=)
(define-array-op2+ array= =)
(define-array-op2 array-not not)
(define-syntax-rule (array-and arrs ...) (inline-array-map and arrs ...))
(define-syntax-rule (array-or arrs ...) (inline-array-map or arrs ...))
(define-syntax-rule (array-if arr0 arr1 arr2) (inline-array-map if arr0 arr1 arr2))
(provide
;; Mapping
inline-array-map
array-map
;; Lifted operators
array-scale
array-sqr
array-sqrt
array-abs
array-magnitude
array-angle
array-conjugate
array-real-part
array-imag-part
array-make-rectangular
array-make-polar
array+
array-
array*
array/
array-min
array-max
array=
array<
array<=
array>
array>=
array-not
array-and
array-or
array-if)