packages feed

egison-3.10.3: lib/math/algebra/tensor.egi

;;;;;
;;;;;
;;;;; Tensor
;;;;;
;;;;;

(define $tensor-order
  (lambda [%A]
    (length (tensor-shape A))))

(define $unit-tensor
  (lambda [$ns]
    (generate-tensor kronecker-delta ns)))

(define $scalar-to-tensor
  (lambda [$x $ns]
    (* x (unit-tensor ns))))

(define $zero-tensor
  (lambda [$ns]
    (generate-tensor (cambda $xs 0) ns)))

(define $b..' (lambda [%t1 %t2] (contract +' (*' t1 t2))))
(define $b.. (lambda [%t1 %t2] (contract + (* t1 t2))))

(define $.' (cambda $xs (foldl b..' (car xs) (cdr xs))))

(define $.
  (cambda $xs
    (match xs (list something)
      {;[<join _ <cons (& ?scalar? ?tensor-symbol?) _>> (capply `. xs)]
       [_ (foldl b.. (car xs) (cdr xs))]})))

(define $T.+
  (lambda [%t1 %t2]
    (tensor (tensor-shape t1)
            (map2 + (tensor-to-list t1) (tensor-to-list t2)))))


(define $T.-
  (lambda [%t1 %t2]
    (tensor (tensor-shape t1)
            (map2 - (tensor-to-list t1) (tensor-to-list t2)))))