login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

Edit detail for LinearOperator revision 11 of 63

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: page
Time: 2011/04/09 01:34:24 GMT-7
Note: composition

changed:
-    id: ()->%
      ++ tensor product
    _/: (%,%) -> %
      ++ operator composition

changed:
-    T == CartesianTensor(1,dim,K)
-    Rep == Record(n:NonNegativeInteger, m:NonNegativeInteger, t:T)
    T ==> CartesianTensor(1,dim,K)
    NNI ==> NonNegativeInteger
    Rep == Record(domain:NNI, codomain:NNI, data:T)

changed:
-    arity(x:%):DirectProduct(2,NonNegativeInteger) == directProduct [rep(x).n,rep(x).m]
    dom(f:%):NNI == rep(f).domain
    cod(f:%):NNI == rep(f).codomain
    dat(f:%):T == rep(f).data

    arity(f:%):DirectProduct(2,NonNegativeInteger) == directProduct [dom f,cod f]

removed:
-    (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]
-

changed:
-    (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]
    (f:% + g:%):% ==
      dom(f) ~= dom(g) or cod(f) ~= cod(g) => error "arity"
      per [dom(f),cod(f),dat(f)+dat(g)]

    (f:% - g:%):% ==
      dom(f) ~= dom(f) or cod(g) ~= cod(g) => error "arity"
      per [dom(f),cod(f),dat(f)-dat(g)]

    --
    -- f/g : A^n -> A^p = f:A^n -> A^m / g:A^m -> A^p
    -- g*f : A^n -> A^p = g:A^m -> A^p * f:A^n -> A^m
    --
    (f:% / g:%):% ==
      cod(f) ~= dom(g) => error "arity"
      r:T := product(dat(f), dat(g))
      n:=dom(f)+1
      m:=n+cod(f)
      while m>n repeat
        r := contract(r,n,m)
        m:=m-1
      per [dom f,cod g,r]

    (g:% * f:%):% == f/g

    1:% == per [1,1,kroneckerDelta()$T]

    -- repeated composition
    (f:% ^ p:NNI):% ==
      cod(f) ~= dom(f) => error "arity"
      q:=subtractIfCan(p,1)
      q case NonNegativeInteger => f^q * f
      1

changed:
-    (x:% * p:NonNegativeInteger):% ==
    (f:% * p:NNI):% ==

changed:
-      q case NonNegativeInteger => x*q + x
-      per [0,rep(x).m,1]  -- need identity for + !!!
      q case NonNegativeInteger => f*q + f
      0

changed:
-      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]
      dom(x) ~= dom(y) or cod(x) ~= cod(y) => error "arity"
      dat(x) = dat(y)

    (x:K * y:%):% == per [dom(y),cod(y),x*dat(y)]

    (x:% * y:K):% == per [dom(x),cod(x),dat(x)*y]

changed:
-      #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
      #removeDuplicates([dom(y) for y in x])~=1 or
        #removeDuplicates([cod(y) for y in x])~=1 => error "arity"
      per [dom(first x)+1,cod(first x),[dat(y) for y in x]::T]$Rep

changed:
-      #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
      #removeDuplicates([dom(y) for y in x])~=1 or
        #removeDuplicates([cod(y) for y in x])~=1 => error "arity"
      per [dom(first x),cod(first x)+1,[dat(y) for y in x]::T]$Rep

    coerce(x:%):OutputForm == (dat(x))::OutputForm

Linear transformations (operators) over n-dimensional cartesian vector spaces oveer a commutative ring K. Members of this domain are morphisms K^n \to K^m. 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.

fricas
(1) -> <spad>
fricas
)abbrev domain LIN LinearOperator
LinearOperator(dim:NonNegativeInteger,K:CommutativeRing): Join(Ring,BiModule(K,K)) with
    arity: % -> DirectProduct(2,NonNegativeInteger)
    elt: (%,%) -> %
      ++ tensor product
    _/: (%,%) -> %
      ++ operator composition
    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)
    NNI ==> NonNegativeInteger
    Rep == Record(domain:NNI, codomain:NNI, data:T)
    rep(x:%):Rep == x pretend Rep
    per(x:Rep):% == x pretend %
dom(f:%):NNI == rep(f).domain cod(f:%):NNI == rep(f).codomain dat(f:%):T == rep(f).data
arity(f:%):DirectProduct(2,NonNegativeInteger) == directProduct [dom f,cod f]
0 == per [0,0,0]
-- -- f+g : A^{n+m} -> A^p = f:A^n -> A^p + g:A^m -> A^p -- (f:% + g:%):% == dom(f) ~= dom(g) or cod(f) ~= cod(g) => error "arity" per [dom(f),cod(f),dat(f)+dat(g)]
(f:% - g:%):% == dom(f) ~= dom(f) or cod(g) ~= cod(g) => error "arity" per [dom(f),cod(f),dat(f)-dat(g)]
-- -- f/g : A^n -> A^p = f:A^n -> A^m / g:A^m -> A^p -- g*f : A^n -> A^p = g:A^m -> A^p * f:A^n -> A^m -- (f:% / g:%):% == cod(f) ~= dom(g) => error "arity" r:T := product(dat(f), dat(g)) n:=dom(f)+1 m:=n+cod(f) while m>n repeat r := contract(r,n,m) m:=m-1 per [dom f,cod g,r]
(g:% * f:%):% == f/g
1:% == per [1,1,kroneckerDelta()$T]
-- repeated composition (f:% ^ p:NNI):% == cod(f) ~= dom(f) => error "arity" q:=subtractIfCan(p,1) q case NonNegativeInteger => f^q * f 1
-- repeated sum (f:% * p:NNI):% == q:=subtractIfCan(p,1) q case NonNegativeInteger => f*q + f 0
(x:% = y:%):Boolean == dom(x) ~= dom(y) or cod(x) ~= cod(y) => error "arity" dat(x) = dat(y)
(x:K * y:%):% == per [dom(y),cod(y),x*dat(y)]
(x:% * y:K):% == per [dom(x),cod(x),dat(x)*y]
inp(x:List K):% == per [1,0,entries(x)::T]
inp(x:List %):% == #removeDuplicates([dom(y) for y in x])~=1 or #removeDuplicates([cod(y) for y in x])~=1 => error "arity" per [dom(first x)+1,cod(first x),[dat(y) for y in x]::T]$Rep
out(x:List K):% == per [0,1,entries(x)::T]
out(x:List %):% == #removeDuplicates([dom(y) for y in x])~=1 or #removeDuplicates([cod(y) for y in x])~=1 => error "arity" per [dom(first x),cod(first x)+1,[dat(y) for y in x]::T]$Rep
coerce(x:%):OutputForm == (dat(x))::OutputForm</spad>
fricas
Compiling FriCAS source code from file 
      /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/2505091042092146672-25px001.spad
      using old system compiler.
   LIN abbreviates domain LinearOperator 
------------------------------------------------------------------------
   initializing NRLIB LIN for LinearOperator 
   compiling into NRLIB LIN 
   importing List NonNegativeInteger
   processing macro definition T$ ==> CartesianTensor(One,dim,K) 
   processing macro definition NNI ==> NonNegativeInteger 
************* USER ERROR **********
available signatures for Rep: 
    NONE
NEED Rep: () -> ?
****** comp fails at level 1 with expression: ******
((DEF (|Rep|) (NIL)
  (|Record| (|:| |domain| (|NonNegativeInteger|))
            (|:| |codomain| (|NonNegativeInteger|))
            (|:| |data| (|CartesianTensor| 1 |dim| K)))))
****** level 1  ******
x:= (DEF (Rep) (NIL) (Record (: domain (NonNegativeInteger)) (: codomain (NonNegativeInteger)) (: data (CartesianTensor (One) dim K))))
m:= $EmptyMode
f:=
((((NNI #) (T$ #) (|#| #) (< #) ...)))
>> Apparent user error: unspecified error

Construction operators: input and output

fricas
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?

Products


f<em>g : A^n \to A^{m+p} = f:A^n \to A^m </em> g:A^n \to A^p
 
fricas
A12p := A1 * A2; A12p::OutputForm = A1::OutputForm * A2::OutputForm

\label{eq1}{A 1 \  A 2}={A 1 \  A 2}(1)
Type: Equation(OutputForm?)
fricas
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

fricas
A3p:=(A1*A1)*A1

\label{eq2}{A 1}^{3}(2)
Type: Polynomial(Integer)
fricas
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.

fricas
B3p:=(B1*B1)*B1

\label{eq3}{B 1}^{3}(3)
Type: Polynomial(Integer)
fricas
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.

Sums


f+g : A^{n+m} \to A^p = f:A^n \to A^p + g:A^m \to A^p
 
fricas
A12s := A1 + A2; A12s::OutputForm = A1::OutputForm + A2::OutputForm

\label{eq4}{A 2 + A 1}={A 1 + A 2}(4)
Type: Equation(OutputForm?)
fricas
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

fricas
A3s:=(A1+A1)+A1

\label{eq5}3 \  A 1(5)
Type: Polynomial(Integer)
fricas
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.

fricas
B3s:=(B1+B1)+B1

\label{eq6}3 \  B 1(6)
Type: Polynomial(Integer)
fricas
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

fricas
B1A1:=B1*A1

\label{eq7}A 1 \  B 1(7)
Type: Polynomial(Integer)
fricas
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

fricas
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

fricas
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.

product and composition --Bill Page, Wed, 09 Mar 2011 18:53:36 -0800 reply
Another kind of diagram:
  ___ _       _        _  _
  ___ _)  =   _\_ _    _\/_
  _/          ___ _)   _/\_

Linear operators as morphisms --Bill Page, Thu, 10 Mar 2011 09:42:33 -0800 reply
If linear operators really are to be morphisms (in the sense of category theory) then they must have a domain and a co-domain that are vector spaces, not just an in-degree and out-degree. E.g.:
  Rep == Record(Dom:VectorSpace, Cod:VectorSpace, t:T)

But VectorSpace? is a category which would make Dom and Cod domains. The domains that currently satisfy VectorSpace? in Axiom are rather limited and seem oddly focused on number theory (finite fields). It is a good thing however that DirectProduct? is a conditional member of this cateogry.

fricas
DirectProduct(2,FRAC INT) has VectorSpace(FRAC INT)
There are no library operations named VectorSpace Use HyperDoc Browse or issue )what op VectorSpace to learn if there is any operation containing " VectorSpace " in its name.
Cannot find a definition or applicable library operation named VectorSpace with argument type(s) Type
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

Unfortunately:

fricas
DirectProduct(2,DirectProduct(2,FRAC INT)) has VectorSpace(FRAC INT)
There are no library operations named VectorSpace Use HyperDoc Browse or issue )what op VectorSpace to learn if there is any operation containing " VectorSpace " in its name.
Cannot find a definition or applicable library operation named VectorSpace with argument type(s) Type
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

The problem with VectorSpace? is that the domain [Vector]? is not a member of this category instead it satisfies VectoryCategory?.

Is it possible to treat tensors from CartesianTensor? as maps from VectorSpace? to VectorSpace?? We would like for example:

  T:DirectProduct(dim,DirectProduct(dim,FRAC INT)) -> DirectProduct(dim,FRAC INT))

To be a linear operator with two inputs and one output.

A [FreeModule]? over a [Field]? is a VectorSpace? unfortunately this is not currently understood by Axiom:
fricas
FreeModule(Fraction Integer,OrderedVariableList [e1,e1]) has VectorSpace(Fraction Integer)
There are no library operations named VectorSpace Use HyperDoc Browse or issue )what op VectorSpace to learn if there is any operation containing " VectorSpace " in its name.
Cannot find a definition or applicable library operation named VectorSpace with argument type(s) Type
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.