|
|
|
last edited 4 years ago by Bill Page |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | ||
|
Editor: Bill Page
Time: 2011/03/09 19:01:24 GMT-8 |
||
| Note: product and composition | ||
added:
Linear transformations (operators) over n-dimensional cartesian vector spaces oveer a commutative ring
. Members of this domain are morphisms
. Products, co-products and composition (grafting) of morphisms is implemented. Operators are represented internally as tensors.
Operator composition and products can be visualized by directed graphs (read from top to bottom) such as:
n = 3 inputs
\ | / \ / / \ |
\ | / \/ / \ / \
\|/ \ / / \ / \
/ \ \/ / \ \ /
/ \ \ / / \ \ /
/ \ \ / / \ |
m = 2 outputs
Lines (edges) in the graph represent vectors, nodes represent operators. Horizontal juxtaposition represents product. Vertical juxtaposition represents composition.
(1) -> <spad>
)abbrev domain LIN LinearOperator LinearOperator(dim:NonNegativeInteger,K:CommutativeRing): Join(Ring, BiModule(K, K)) with arity: % -> DirectProduct(2, NonNegativeInteger) elt: (%, %) -> % id: ()->% inp: List K -> % ++ incoming vector inp: List % -> % out: List K -> % ++ output vector out: List % -> % coerce: SquareMatrix(dim, K) -> % _*: (%, NonNegativeInteger) -> % == add import List NonNegativeInteger T == CartesianTensor(1, dim, K) Rep == Record(n:NonNegativeInteger, m:NonNegativeInteger, t:T) rep(x:%):Rep == x pretend Rep per(x:Rep):% == x pretend %
arity(x:%):DirectProduct(2,NonNegativeInteger) == directProduct [rep(x).n, rep(x).m]
0 == per [0,0, 0]
(x:% + y:%):% == rep(x).t=0 => per [rep(y).n,rep(y).m, rep(y).t] rep(y).t=0 => per [rep(x).n, rep(x).m, rep(x).t] rep(x).n ~= rep(y).n or rep(x).m ~= rep(y).m => error "arity" per [rep(x).n, rep(x).m, rep(x).t+rep(y).t]
(x:% - y:%):% == rep(x).t=0 => per [rep(y).n,rep(y).m, -rep(y).t] rep(y).t=0 => per [rep(x).n, rep(x).m, rep(x).t] rep(x).n ~= rep(y).n or rep(x).m ~= rep(y).m => error "arity" per [rep(x).n, rep(x).m, rep(x).t-rep(y).t]
1 == per [0,0, 1]
-- -- f*g : A^n -> A^{m+p} = f:A^n -> A^m * g:A^n -> A^p -- (x:% * y:%):% == output("* rep(x).n",rep(x).n::OutputForm)$OutputPackage output("* rep(y).n", rep(y).n::OutputForm)$OutputPackage rep(x).n ~= rep(y).n => error "arity" r := product(rep(x).t, rep(y).t) u := 1$DirectProduct(dim, K)::T ud:= product(u, kroneckerDelta()$T) for i in 1..rep(x).n repeat --output("rank", rank(r)::OutputForm)$OutputPackage --output("n", rep(x).n::OutputForm)$OutputPackage r := contract(contract(ud, 1, r, rep(x).n+1), 1, rep(x).n+1) --output("rank", rank(r)::OutputForm)$OutputPackage per [rep(x).n, rep(x).m+rep(y).m, r]
-- repeated product ((x:%)^(p:NonNegativeInteger)):% == q:=subtractIfCan(p,1) q case NonNegativeInteger => x^q * x per [rep(x).n, 0, 1]
-- -- f+g : A^{n+m} -> A^p = f:A^n -> A^p + g:A^m -> A^p -- (x:% + y:%):% == output("+ rep(x).m",rep(x).m::OutputForm)$OutputPackage output("+ rep(y).m", rep(y).m::OutputForm)$OutputPackage rep(x).m ~= rep(y).m => error "arity" output("+ rep(x).n", rep(x).n::OutputForm)$OutputPackage output("+ rep(y).n", rep(y).n::OutputForm)$OutputPackage r := product(rep(x).t, rep(y).t) u := 1$DirectProduct(dim, K)::T du:= product(kroneckerDelta()$T, u) for i in 1..rep(y).m repeat output("+ rank", rank(r)::OutputForm)$OutputPackage output("+ rep(y).m", rep(y).m::OutputForm)$OutputPackage r := contract(contract(du, 1, r, rep(y).m+1), 1, rep(y).m+2) --output("rank", rank(r)::OutputForm)$OutputPackage per [rep(x).n+rep(y).n, rep(y).m, r]
-- repeated sum (x:% * p:NonNegativeInteger):% == q:=subtractIfCan(p,1) q case NonNegativeInteger => x*q + x per [0, rep(x).m, 1] -- need identity for + !!!
(x:% = y:%):Boolean == rep(x).n ~= rep(y).n or rep(x).m ~= rep(y).m => error "arity" rep(x).t = rep(y).t
(x:K * y:%):% == per [rep(y).n,rep(y).m, x*rep(y).t]
(x:% * y:K):% == per [rep(x).n,rep(x).m, rep(x).t*y]
elt(x:%,y:%):% == r:=product(rep(x).t, rep(y).t) yn:=rep(y).n -- outputs of y xm:=rep(x).m -- inputs of x while yn>0 and xm>0 repeat output("yn", yn::OutputForm)$OutputPackage output("xm", xm::OutputForm)$OutputPackage output("rank", rank(r)::OutputForm)$OutputPackage r:=contract(r, rep(y).n+xm, yn+rep(y).m) yn:=subtractIfCan(yn, 1)::NonNegativeInteger xm:=subtractIfCan(xm, 1)::NonNegativeInteger per [rep(x).n+xm, yn+rep(y).m, r]
id():% == per [1,1, kroneckerDelta()$T]
inp(x:List K):% == per [1,0, entries(x)::T]
inp(x:List %):% == #removeDuplicates([rep(y).n for y in x])~=1 or #removeDuplicates([rep(y).m for y in x])~=1 => error "arity" per [rep(first x).n+1,rep(first x).m, [rep(y).t for y in x]::T]$Rep
out(x:List K):% == per [0,1, entries(x)::T]
out(x:List %):% == #removeDuplicates([rep(y).n for y in x])~=1 or #removeDuplicates([rep(y).m for y in x])~=1 => error "arity" per [rep(first x).n,rep(first x).m+1, [rep(y).t for y in x]::T]$Rep
coerce(x:%):OutputForm == (rep(x).t)::OutputForm</spad>
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/6154772542123042263-25px001.spad
using system compiler.
LIN abbreviates domain LinearOperator
------------------------------------------------------------------------
initializing NRLIB LIN for LinearOperator
compiling into NRLIB LIN
importing List NonNegativeInteger
************* USER ERROR **********
available signatures for T:
NONE
NEED T: () -> ?
****** comp fails at level 1 with expression: ******
((DEF (T) (NIL) (|CartesianTensor| 1 |dim| K)))
****** level 1 ******
x:= (DEF (T) (NIL) (CartesianTensor (1) dim K))
m:= $EmptyMode
f:=
((((|#| #) (< #) (<= #) (= #) ...)))
>> Apparent user error:
unspecified errorConstruction operators: input and output
L:=LIN(2,FRAC POLY INT)
LinearOperator is an unknown constructor and so is unavailable. Did you mean to use -> but type something different instead?
A12p := A1 * A2; A12p::OutputForm = A1::OutputForm * A2::OutputForm
| (1) |
arity(A12p)::OutputForm = arity(A1)::OutputForm * arity(A2)::OutputForm
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
Powers
A3p:=(A1*A1)*A1
| (2) |
arity(A3p)
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
B3p:=(B1*B1)*B1
| (3) |
arity(B3p)
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
A12s := A1 + A2; A12s::OutputForm = A1::OutputForm + A2::OutputForm
| (4) |
arity(A12s)::OutputForm = arity(A1)::OutputForm + arity(A2)::OutputForm
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
Multiplication
A3s:=(A1+A1)+A1
| (5) |
arity(A3s)
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
B3s:=(B1+B1)+B1
| (6) |
arity(B3s)
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
Expected error
B1A1:=B1*A1
| (7) |
arity(B1A1)
There are 1 exposed and 0 unexposed library operations named arity having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse,or issue )display op arity to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named arity with argument type(s) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
Composition
AB11:=A1 B1
There are no library operations named A1 Use HyperDoc Browse or issue )what op A1 to learn if there is any operation containing " A1 " in its name.
Cannot find a definition or applicable library operation named A1 with argument type(s) Variable(B1)
Perhaps you should use "@" to indicate the required return type,or "$" to specify which version of the function you need.
Multiple inputs and outputs
W:L:=out[inp[inp([script(w,[[i, j], [k]]) for j in 1..2])$L for i in 1..2] for k in 1..2]
L is not a valid type.
___ _ _ _ _ ___ _) = _\_ _ _\/_ _/ ___ _) _/\_