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

Edit detail for LinearOperator revision 14 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 22:14:38 GMT-7
Note: bug fix in product

changed:
-Monoidal(R:AbelianSemiGroup):Category == SemiRng with
)abbrev category MONAL Monoidal
Monoidal(R:AbelianSemiGroup):Category == Monoid with

changed:
-    elt:(%,%) -> %
-      ++ horizontal composition (product)
    apply:(%,%) -> %
      ++ horizontal composition
    coerce:(x:List None) -> %
      ++ identity for composition

changed:
-    (f:% / g:%):% == g*f
    (f:% / g:%):% == apply(g,f)

changed:
-Prop(R:AbelianSemiGroup): Join(Monoidal R, CoercibleTo OutputForm) with
Prop(R:Ring): Join(Monoidal R, CoercibleTo OutputForm) with

changed:
-    (g:% * f:%):% ==
    apply(g:%, f:%):% ==

changed:
-    elt(f:%,g:%):% == per [dom(f)+dom(g),cod(f)+cod(g)]
    coerce(x:List None):% == per [1,1]
    (f:% * g:%):% == per [dom(f)+dom(g),cod(f)+cod(g)]

added:
    coerce: K -> %

added:
    apply: (%,%) -> %

added:
      dat(f)=0 => g
      dat(g)=0 => f

changed:
-    -- g*f : A^n -> A^p = g:A^m -> A^p * f:A^n -> A^m
    -- g f : A^n -> A^p = g:A^m -> A^p * f:A^n -> A^m

changed:
-    (g:% * f:%):% ==
-      cod(f) ~= dom(g) => error "arity"
    apply(g:%,f:%):% ==
      dom(g) ~= cod(f) => error "arity"

changed:
-      n:=dom(f)+1
-      m:=n+cod(f)
-      while m>n repeat
-        r := contract(r,n,m)
-        m:=m-1
      n:Integer:=dom(f)+1
      m:Integer:=dom(f)+cod(f)+1
      for i in 0..cod(f)-1 repeat
        r := contract(r,n,m-i)
        --(m1:=subtractIfCan(m,1)) case NNI =>m:=m1

changed:
-    1:% == per [1,1,kroneckerDelta()$T]
    coerce(x:List None):% == per [1,1,kroneckerDelta()$T]
    1:% == per [0,0,1]

    coerce(x:K):% == 1*x

added:
      print(p::OutputForm)

changed:
-    elt(f:%,g:%):% ==
    (f:% * g:%):% ==

changed:
-        [dom(f)+dom(g)+i for i in 1..cod(f)], _
-        [dom(f)+i for i in 1..dom(g)],        _
        [dom(f)+cod(f)+i for i in 1..dom(g)], _
        [dom(f)+i for i in 1..cod(f)],        _

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


removed:
-

changed:
-      #removeDuplicates([dom(y) for y in x])~=1 or
-        #removeDuplicates([cod(y) for y in x])~=1 => error "arity"
      #removeDuplicates([dom(y) for y in x]) ~= 1 or
        #removeDuplicates([cod(y) for y in x]) ~= 1 => error "arity"

changed:
-AB3:=(AB1/AB1)/AB1
AB3:=(AB1*AB1)*AB1

changed:
-test(AB3=AB1/(AB1/AB1))
test(AB3=AB1*(AB1*AB1))

changed:
-AB11:=A1 B1
AB11:=A1*B1

changed:
-BA11:= B1 A1
BA11:= B1*A1

changed:
-AB := A B
AB := A*B

changed:
-BA := B A
BA := B*A

changed:
-XB21:=X2 B1
XB21:=X2*B1

changed:
-XY22:=X2 Y2
XY22:=X2*Y2

changed:
-YX22:=Y2 X2
YX22:=Y2*X2

changed:
-\end{axiom}
test((A*A)*A=A*(A*A))
test((B*B)*B=B*(B*B))
test((A*B)*A=A*(B*A))

\end{axiom}

Linear transformations (operators) over n-dimensional cartesian vector spaces over 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.

We try to start the right way by defining the concept of a monoidal category.

spad
)abbrev category MONAL Monoidal
)abbrev category MONAL Monoidal
Monoidal(R:AbelianSemiGroup):Category == Monoid with
    dom: % -> R
      ++ domain
    cod: % -> R
      ++ co-domain
    _/: (%,%) -> %
      ++ vertical composition f/g = g*f
    apply:(%,%) -> %
      ++ horizontal composition
    coerce:(x:List None) -> %
      ++ identity for composition
  add
    (f:% / g:%):% == apply(g,f)
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/6761162726479353213-25px001.spad using 
      old system compiler.
   MONAL abbreviates category Monoidal 
   MONAL abbreviates category Monoidal 
------------------------------------------------------------------------
   initializing NRLIB MONAL for Monoidal 
   compiling into NRLIB MONAL 
;;; *** |Monoidal| REDEFINED Time: 0.03 SEC.
MONAL- abbreviates domain Monoidal& ------------------------------------------------------------------------ initializing NRLIB MONAL- for Monoidal& compiling into NRLIB MONAL- compiling exported / : (S,S) -> S Time: 0.33 SEC.
(time taken in buildFunctor: 0)
;;; *** |Monoidal&| REDEFINED Time: 0 SEC.
Cumulative Statistics for Constructor Monoidal& Time: 0.33 seconds
finalizing NRLIB MONAL- Processing Monoidal& for Browser database: --------(dom (R %))--------- --------(cod (R %))--------- --------(/ (% % %))--------- --->-->Monoidal&((/ (% % %))): Improper first word in comments: vertical "vertical composition \\spad{f/g} = \\spad{g*f}" --------(apply (% % %))--------- --------(coerce (% (List (None))))--------- --->-->Monoidal&((coerce (% (List (None))))): Improper first word in comments: identity "identity for composition" --->-->Monoidal&(constructor): Not documented!!!! --->-->Monoidal&(): Missing Description ; compiling file "/var/zope2/var/LatexWiki/MONAL-.NRLIB/MONAL-.lsp" (written 09 APR 2011 10:14:08 PM):
; /var/zope2/var/LatexWiki/MONAL-.NRLIB/MONAL-.fasl written ; compilation finished in 0:00:00.066 ------------------------------------------------------------------------ Monoidal& is now explicitly exposed in frame initial Monoidal& will be automatically loaded when needed from /var/zope2/var/LatexWiki/MONAL-.NRLIB/MONAL- finalizing NRLIB MONAL Processing Monoidal for Browser database: --------(dom (R %))--------- --------(cod (R %))--------- --------(/ (% % %))--------- --->-->Monoidal((/ (% % %))): Improper first word in comments: vertical "vertical composition \\spad{f/g} = \\spad{g*f}" --------(apply (% % %))--------- --------(coerce (% (List (None))))--------- --->-->Monoidal((coerce (% (List (None))))): Improper first word in comments: identity "identity for composition" --->-->Monoidal(constructor): Not documented!!!! --->-->Monoidal(): Missing Description ; compiling file "/var/zope2/var/LatexWiki/MONAL.NRLIB/MONAL.lsp" (written 09 APR 2011 10:14:08 PM):
; /var/zope2/var/LatexWiki/MONAL.NRLIB/MONAL.fasl written ; compilation finished in 0:00:00.018 ------------------------------------------------------------------------ Monoidal is now explicitly exposed in frame initial Monoidal will be automatically loaded when needed from /var/zope2/var/LatexWiki/MONAL.NRLIB/MONAL
>> System error: The bounding indices 163 and 162 are bad for a sequence of length 162. See also: The ANSI Standard, Glossary entry for "bounding index designator" The ANSI Standard, writeup for Issue SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR

The initial object in this category is the domain Prop (Products and Permutations).

spad
)abbrev domain PROP Prop
Prop(R:Ring): Join(Monoidal R, CoercibleTo OutputForm) with
    _/:(R,R) -> %
  == add
    Rep == Record(domain:R,codomain:R)
    rep(x:%):Rep == x pretend Rep
    per(x:Rep):% == x pretend %
dom(f:%):R == rep(f).domain cod(f:%):R == rep(f).codomain
coerce(f:%):OutputForm == dom(f)::OutputForm / cod(f)::OutputForm (f:R / g:R):% == per [f,g] apply(g:%, f:%):% == cod(f) ~= dom(g) => error "arity" per [dom f,cod g] coerce(x:List None):% == per [1,1] (f:% * g:%):% == per [dom(f)+dom(g),cod(f)+cod(g)] -- preserves arity (f:% + g:%):% == dom(f)~=dom(g) or cod(g) ~= cod(g) => error "arity" f
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/2209711262636362952-25px002.spad using 
      old system compiler.
   PROP abbreviates domain Prop 
------------------------------------------------------------------------
   initializing NRLIB PROP for Prop 
   compiling into NRLIB PROP 
   compiling local rep : $ -> Record(domain: R,codomain: R)
      PROP;rep is replaced by x 
Time: 0.04 SEC.
compiling local per : Record(domain: R,codomain: R) -> $ PROP;per is replaced by x Time: 0 SEC.
compiling exported dom : $ -> R Time: 0 SEC.
compiling exported cod : $ -> R Time: 0 SEC.
compiling exported coerce : $ -> OutputForm Time: 0.01 SEC.
compiling exported / : (R,R) -> $ Time: 0 SEC.
compiling exported apply : ($,$) -> $ Time: 0.01 SEC.
compiling exported coerce : List None -> $ Time: 0.01 SEC.
compiling exported * : ($,$) -> $ Time: 0 SEC.
compiling local + : ($,$) -> $ Time: 0.01 SEC.
(time taken in buildFunctor: 10)
;;; *** |Prop| REDEFINED
;;; *** |Prop| REDEFINED Time: 0.01 SEC.
Cumulative Statistics for Constructor Prop Time: 0.09 seconds
finalizing NRLIB PROP Processing Prop for Browser database: --->-->Prop((/ (% R R))): Not documented!!!! --->-->Prop(constructor): Not documented!!!! --->-->Prop(): Missing Description ; compiling file "/var/zope2/var/LatexWiki/PROP.NRLIB/PROP.lsp" (written 09 APR 2011 10:14:09 PM):
; /var/zope2/var/LatexWiki/PROP.NRLIB/PROP.fasl written ; compilation finished in 0:00:00.247 ------------------------------------------------------------------------ Prop is now explicitly exposed in frame initial Prop will be automatically loaded when needed from /var/zope2/var/LatexWiki/PROP.NRLIB/PROP
>> System error: The bounding indices 163 and 162 are bad for a sequence of length 162. See also: The ANSI Standard, Glossary entry for "bounding index designator" The ANSI Standard, writeup for Issue SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR

The LinearOperator? domain is Moniodal over NonNegativeInteger?

spad
)abbrev domain LIN LinearOperator
LinearOperator(dim:NonNegativeInteger,K:CommutativeRing): Exports == Implementation where
  NNI ==> NonNegativeInteger
Exports ==> Join(Ring, BiModule(K,K), Monoidal NNI, CoercibleTo Prop NNI) with inp: List K -> % ++ incoming vector inp: List % -> % out: List K -> % ++ output vector out: List % -> % coerce: K -> % coerce: SquareMatrix(dim,K) -> % _*: (%,NonNegativeInteger) -> % arity: % -> Prop(NNI) apply: (%,%) -> %
Implementation ==> add import List NNI T ==> CartesianTensor(1,dim,K) 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:%):Prop NNI == dom(f)/cod(f) coerce(f:%):Prop NNI == arity 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:%):% == dat(f)=0 => g dat(g)=0 => f 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 -- apply(g:%,f:%):% == dom(g) ~= cod(f) => error "arity" r:T := product(dat(f), dat(g)) n:Integer:=dom(f)+1 m:Integer:=dom(f)+cod(f)+1 for i in 0..cod(f)-1 repeat r := contract(r,n,m-i) --(m1:=subtractIfCan(m,1)) case NNI =>m:=m1 per [dom f,cod g,r]
coerce(x:List None):% == per [1,1,kroneckerDelta()$T] 1:% == per [0,0,1]
coerce(x:K):% == 1*x
-- repeated composition (f:% ^ p:NNI):% == cod(f) ~= dom(f) => error "arity" q:=subtractIfCan(p,1) q case NNI => f^q * f 1
-- repeated sum (f:% * p:NNI):% == print(p::OutputForm) q:=subtractIfCan(p,1) q case NNI => f*q + f 0
(f:% * g:%):% == r:T := product(dat f,dat g) -- dom(f) + cod(f) + dom(g) + cod(g) p:List Integer := concat _ [[i for i in 1..dom(f)], _ [dom(f)+cod(f)+i for i in 1..dom(g)], _ [dom(f)+i for i in 1..cod(f)], _ [dom(f)+dom(g)+cod(f)+i for i in 1..cod(g)]] -- dom(f) + dom(g) + cod(f) + cod(g) per [dom(f)+dom(g),cod(f)+cod(g),reindex(r,p)]
(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]
(x:Integer * y:%):% == per [dom(y),cod(y),x*dat(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
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/2457767226733576822-25px003.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) 
   compiling local rep : $ -> Record(domain: NonNegativeInteger,codomain: NonNegativeInteger,data: CartesianTensor(One,dim,K))
      LIN;rep is replaced by x 
Time: 0.05 SEC.
compiling local per : Record(domain: NonNegativeInteger,codomain: NonNegativeInteger,data: CartesianTensor(One,dim,K)) -> $ LIN;per is replaced by x Time: 0 SEC.
compiling exported dom : $ -> NonNegativeInteger Time: 0 SEC.
compiling exported cod : $ -> NonNegativeInteger Time: 0 SEC.
compiling local dat : $ -> CartesianTensor(One,dim,K) Time: 0.01 SEC.
compiling exported arity : $ -> Prop NonNegativeInteger Time: 0 SEC.
compiling exported coerce : $ -> Prop NonNegativeInteger Time: 0 SEC.
compiling exported Zero : () -> $ Time: 0.01 SEC.
compiling exported + : ($,$) -> $ Time: 0.01 SEC.
compiling exported - : ($,$) -> $ Time: 0 SEC.
compiling exported apply : ($,$) -> $ Time: 0.01 SEC.
compiling exported coerce : List None -> $ Time: 0.01 SEC.
compiling exported One : () -> $ Time: 0 SEC.
compiling exported coerce : K -> $ Time: 0 SEC.
compiling exported ^ : ($,NonNegativeInteger) -> $ Time: 0.01 SEC.
compiling exported * : ($,NonNegativeInteger) -> $ Time: 0.01 SEC.
compiling exported * : ($,$) -> $ Time: 0.05 SEC.
compiling exported = : ($,$) -> Boolean Time: 0 SEC.
compiling exported * : (K,$) -> $ Time: 0.01 SEC.
compiling exported * : ($,K) -> $ Time: 0 SEC.
compiling exported * : (Integer,$) -> $ Time: 0 SEC.
compiling exported inp : List K -> $ Time: 0.05 SEC.
compiling exported inp : List $ -> $ Time: 0.25 SEC.
compiling exported out : List K -> $ Time: 0.01 SEC.
compiling exported out : List $ -> $ Time: 0.02 SEC.
compiling exported coerce : $ -> OutputForm Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |LinearOperator| REDEFINED
;;; *** |LinearOperator| REDEFINED Time: 0.02 SEC.
Warnings: [1] not known that (Ring) is of mode (CATEGORY domain (SIGNATURE quo ($ $ $)) (SIGNATURE rem ($ $ $)) (SIGNATURE gcd ($ $ $)) (SIGNATURE divide ((Record (: quotient $) (: remainder $)) $ $)) (SIGNATURE exquo ((Union $ failed) $ $)) (SIGNATURE shift ($ $ (Integer))) (SIGNATURE random ($ $))) [2] arity: not known that (Ring) is of mode (CATEGORY domain (SIGNATURE quo ($ $ $)) (SIGNATURE rem ($ $ $)) (SIGNATURE gcd ($ $ $)) (SIGNATURE divide ((Record (: quotient $) (: remainder $)) $ $)) (SIGNATURE exquo ((Union $ failed) $ $)) (SIGNATURE shift ($ $ (Integer))) (SIGNATURE random ($ $)))
Cumulative Statistics for Constructor LinearOperator Time: 0.53 seconds
finalizing NRLIB LIN Processing LinearOperator for Browser database: --------(inp (% (List K)))--------- --->-->LinearOperator((inp (% (List %)))): Not documented!!!! --------(out (% (List K)))--------- --->-->LinearOperator((out (% (List %)))): Not documented!!!! --->-->LinearOperator((coerce (% K))): Not documented!!!! --->-->LinearOperator((coerce (% (SquareMatrix dim K)))): Not documented!!!! --->-->LinearOperator((* (% % (NonNegativeInteger)))): Not documented!!!! --->-->LinearOperator((arity ((Prop NNI) %))): Not documented!!!! --->-->LinearOperator((apply (% % %))): Not documented!!!! --->-->LinearOperator(constructor): Not documented!!!! --->-->LinearOperator(): Missing Description ; compiling file "/var/zope2/var/LatexWiki/LIN.NRLIB/LIN.lsp" (written 09 APR 2011 10:14:10 PM):
; /var/zope2/var/LatexWiki/LIN.NRLIB/LIN.fasl written ; compilation finished in 0:00:00.439 ------------------------------------------------------------------------ LinearOperator is now explicitly exposed in frame initial LinearOperator will be automatically loaded when needed from /var/zope2/var/LatexWiki/LIN.NRLIB/LIN
>> System error: The bounding indices 163 and 162 are bad for a sequence of length 162. See also: The ANSI Standard, Glossary entry for "bounding index designator" The ANSI Standard, writeup for Issue SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR

Construction operators: input and output

axiom
L:=LIN(2,FRAC POLY INT)

\label{eq1}\hbox{\axiomType{LinearOperator}\ } (2, \hbox{\axiomType{Fraction}\ } (\hbox{\axiomType{Polynomial}\ } (\hbox{\axiomType{Integer}\ })))(1)
Type: Type
axiom
A1:L:=inp[script(a,[[1,i]]) for i in 1..2]

\label{eq2}\left[{a_{1, \: 1}}, \:{a_{1, \: 2}}\right](2)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity A1

\label{eq3}1 \over 0(3)
Type: Prop(NonNegativeInteger?)
axiom
A2:L:=inp[script(a,[[2,i]]) for i in 1..2]

\label{eq4}\left[{a_{2, \: 1}}, \:{a_{2, \: 2}}\right](4)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
A:L:=inp[A1,A2]

\label{eq5}\left[ 
\begin{array}{cc}
{a_{1, \: 1}}&{a_{1, \: 2}}
\
{a_{2, \: 1}}&{a_{2, \: 2}}
(5)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity A

\label{eq6}2 \over 0(6)
Type: Prop(NonNegativeInteger?)
axiom
B1:L:=out[script(b,[[],[1,i]]) for i in 1..2]

\label{eq7}\left[{b^{1, \: 1}}, \:{b^{1, \: 2}}\right](7)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity B1

\label{eq8}0 \over 1(8)
Type: Prop(NonNegativeInteger?)
axiom
B2:L:=out[script(b,[[],[2,i]]) for i in 1..2]

\label{eq9}\left[{b^{2, \: 1}}, \:{b^{2, \: 2}}\right](9)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
B:L:=out[B1,B2]

\label{eq10}\left[ 
\begin{array}{cc}
{b^{1, \: 1}}&{b^{1, \: 2}}
\
{b^{2, \: 1}}&{b^{2, \: 2}}
(10)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity B

\label{eq11}0 \over 2(11)
Type: Prop(NonNegativeInteger?)

Composition


g/f : A^n \to A^{m+p} = f:A^n \to A^m <em> g:A^n \to A^p
 
axiom
AB2 := A2 / B2; AB2::OutputForm = A2::OutputForm / B2::OutputForm

\label{eq12}\begin{array}{@{}l}
\displaystyle
{\left[ 
\begin{array}{cc}
{{b^{2, \: 1}}\ {a_{2, \: 1}}}&{{b^{2, \: 2}}\ {a_{2, \: 1}}}
\
{{b^{2, \: 1}}\ {a_{2, \: 2}}}&{{b^{2, \: 2}}\ {a_{2, \: 2}}}
(12)
Type: Equation(OutputForm?)
axiom
arity(AB2)::OutputForm = arity(A2)::OutputForm / arity(B2)::OutputForm

\label{eq13}{1 \over 1}={{1 \over 0}\over{0 \over 1}}(13)
Type: Equation(OutputForm?)
axiom
BA1 := B1 / A1; BA1::OutputForm = B1::OutputForm / A1::OutputForm

\label{eq14}{{{b^{1, \: 2}}\ {a_{1, \: 2}}}+{{b^{1, \: 1}}\ {a_{1, \: 1}}}}={{\left[{b^{1, \: 1}}, \:{b^{1, \: 2}}\right]}\over{\left[{a_{1, \: 1}}, \:{a_{1, \: 2}}\right]}}(14)
Type: Equation(OutputForm?)
axiom
arity(BA1)::OutputForm = arity(B1)::OutputForm / arity(A1)::OutputForm

\label{eq15}{0 \over 0}={{0 \over 1}\over{1 \over 0}}(15)
Type: Equation(OutputForm?)
axiom
AB1 := A1 / B1; AB1::OutputForm = A1::OutputForm / B1::OutputForm

\label{eq16}\begin{array}{@{}l}
\displaystyle
{\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {a_{1, \: 1}}}&{{b^{1, \: 2}}\ {a_{1, \: 1}}}
\
{{b^{1, \: 1}}\ {a_{1, \: 2}}}&{{b^{1, \: 2}}\ {a_{1, \: 2}}}
(16)
Type: Equation(OutputForm?)
axiom
arity(AB1)::OutputForm = arity(A1)::OutputForm / arity(B1)::OutputForm

\label{eq17}{1 \over 1}={{1 \over 0}\over{0 \over 1}}(17)
Type: Equation(OutputForm?)

Powers

axiom
AB3:=(AB1*AB1)*AB1

\label{eq18}\left[ 
\begin{array}{cc}
{\left[ 
\begin{array}{cc}
{\left[ 
\begin{array}{cc}
{{{b^{1, \: 1}}^3}\ {{a_{1, \: 1}}^3}}&{{{b^{1, \: 1}}^2}\ {b^{1, \: 2}}\ {{a_{1, \: 1}}^3}}
\
{{{b^{1, \: 1}}^2}\ {b^{1, \: 2}}\ {{a_{1, \: 1}}^3}}&{{b^{1, \: 1}}\ {{b^{1, \: 2}}^2}\ {{a_{1, \: 1}}^3}}
(18)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(AB3)

\label{eq19}3 \over 3(19)
Type: Prop(NonNegativeInteger?)
axiom
test(AB3=AB1*(AB1*AB1))

\label{eq20} \mbox{\rm true} (20)
Type: Boolean
axiom
test(AB3=AB1^3)

\label{eq21} \mbox{\rm true} (21)
Type: Boolean

Sums


f+g : A^n \to A^m = f:A^n \to A^m + g:A^n \to A^m
 
axiom
A12s := A1 + A2; A12s::OutputForm = A1::OutputForm + A2::OutputForm

\label{eq22}{\left[{{a_{2, \: 1}}+{a_{1, \: 1}}}, \:{{a_{2, \: 2}}+{a_{1, \: 2}}}\right]}={{\left[{a_{1, \: 1}}, \:{a_{1, \: 2}}\right]}+{\left[{a_{2, \: 1}}, \:{a_{2, \: 2}}\right]}}(22)
Type: Equation(OutputForm?)
axiom
arity(A12s)::OutputForm = arity(A1)::OutputForm + arity(A2)::OutputForm

\label{eq23}{1 \over 0}={{1 \over 0}+{1 \over 0}}(23)
Type: Equation(OutputForm?)
axiom
B12s := B1 + B2; B12s::OutputForm = B1::OutputForm + B2::OutputForm

\label{eq24}{\left[{{b^{2, \: 1}}+{b^{1, \: 1}}}, \:{{b^{2, \: 2}}+{b^{1, \: 2}}}\right]}={{\left[{b^{1, \: 1}}, \:{b^{1, \: 2}}\right]}+{\left[{b^{2, \: 1}}, \:{b^{2, \: 2}}\right]}}(24)
Type: Equation(OutputForm?)
axiom
arity(B12s)::OutputForm = arity(B1)::OutputForm + arity(B2)::OutputForm

\label{eq25}{0 \over 1}={{0 \over 1}+{0 \over 1}}(25)
Type: Equation(OutputForm?)

Multiplication

axiom
A3s:=(A1+A1)+A1

\label{eq26}\left[{3 \ {a_{1, \: 1}}}, \:{3 \ {a_{1, \: 2}}}\right](26)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(A3s)

\label{eq27}1 \over 0(27)
Type: Prop(NonNegativeInteger?)
axiom
test(A3s=A1+(A1+A1))

\label{eq28} \mbox{\rm true} (28)
Type: Boolean
axiom
test(A3s=A1*3)
3 2 1 0

\label{eq29} \mbox{\rm true} (29)
Type: Boolean

axiom
B3s:=(B1+B1)+B1

\label{eq30}\left[{3 \ {b^{1, \: 1}}}, \:{3 \ {b^{1, \: 2}}}\right](30)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(B3s)

\label{eq31}0 \over 1(31)
Type: Prop(NonNegativeInteger?)
axiom
test(B3s=B1+(B1+B1))

\label{eq32} \mbox{\rm true} (32)
Type: Boolean
axiom
test(B3s=B1*3)
3 2 1 0

\label{eq33} \mbox{\rm true} (33)
Type: Boolean

Expected error

axiom
B1A1:=B1*A1

\label{eq34}\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {a_{1, \: 1}}}&{{b^{1, \: 2}}\ {a_{1, \: 1}}}
\
{{b^{1, \: 1}}\ {a_{1, \: 2}}}&{{b^{1, \: 2}}\ {a_{1, \: 2}}}
(34)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(B1A1)

\label{eq35}1 \over 1(35)
Type: Prop(NonNegativeInteger?)

Product

axiom
AB11:=A1*B1

\label{eq36}\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {a_{1, \: 1}}}&{{b^{1, \: 2}}\ {a_{1, \: 1}}}
\
{{b^{1, \: 1}}\ {a_{1, \: 2}}}&{{b^{1, \: 2}}\ {a_{1, \: 2}}}
(36)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(AB11)

\label{eq37}1 \over 1(37)
Type: Prop(NonNegativeInteger?)
axiom
BA11:= B1*A1

\label{eq38}\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {a_{1, \: 1}}}&{{b^{1, \: 2}}\ {a_{1, \: 1}}}
\
{{b^{1, \: 1}}\ {a_{1, \: 2}}}&{{b^{1, \: 2}}\ {a_{1, \: 2}}}
(38)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(BA11)

\label{eq39}1 \over 1(39)
Type: Prop(NonNegativeInteger?)
axiom
AB := A*B

\label{eq40}\left[ 
\begin{array}{cc}
{\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {a_{1, \: 1}}}&{{b^{1, \: 2}}\ {a_{1, \: 1}}}
\
{{b^{2, \: 1}}\ {a_{1, \: 1}}}&{{b^{2, \: 2}}\ {a_{1, \: 1}}}
(40)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(AB)

\label{eq41}2 \over 2(41)
Type: Prop(NonNegativeInteger?)
axiom
BA := B*A

\label{eq42}\left[ 
\begin{array}{cc}
{\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {a_{1, \: 1}}}&{{b^{1, \: 2}}\ {a_{1, \: 1}}}
\
{{b^{2, \: 1}}\ {a_{1, \: 1}}}&{{b^{2, \: 2}}\ {a_{1, \: 1}}}
(42)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(BA)

\label{eq43}2 \over 2(43)
Type: Prop(NonNegativeInteger?)
axiom
X2:L:=inp[inp([script(x,[[i,j]]) for j in 1..2])$L for i in 1..2]

\label{eq44}\left[ 
\begin{array}{cc}
{x_{1, \: 1}}&{x_{1, \: 2}}
\
{x_{2, \: 1}}&{x_{2, \: 2}}
(44)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
XB21:=X2*B1

\label{eq45}\begin{array}{@{}l}
\displaystyle
\left[{\left[ 
\begin{array}{cc}
{{b^{1, \: 1}}\ {x_{1, \: 1}}}&{{b^{1, \: 2}}\ {x_{1, \: 1}}}
\
{{b^{1, \: 1}}\ {x_{1, \: 2}}}&{{b^{1, \: 2}}\ {x_{1, \: 2}}}
(45)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(XB21)

\label{eq46}2 \over 1(46)
Type: Prop(NonNegativeInteger?)
axiom
Y2:L:=out[out([script(y,[[],[i,j]]) for j in 1..2])$L for i in 1..2]

\label{eq47}\left[ 
\begin{array}{cc}
{y^{1, \: 1}}&{y^{1, \: 2}}
\
{y^{2, \: 1}}&{y^{2, \: 2}}
(47)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
XY22:=X2*Y2

\label{eq48}\left[ 
\begin{array}{cc}
{\left[ 
\begin{array}{cc}
{{y^{1, \: 1}}\ {x_{1, \: 1}}}&{{y^{1, \: 2}}\ {x_{1, \: 1}}}
\
{{y^{2, \: 1}}\ {x_{1, \: 1}}}&{{y^{2, \: 2}}\ {x_{1, \: 1}}}
(48)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(XY22)

\label{eq49}2 \over 2(49)
Type: Prop(NonNegativeInteger?)
axiom
YX22:=Y2*X2

\label{eq50}\left[ 
\begin{array}{cc}
{\left[ 
\begin{array}{cc}
{{y^{1, \: 1}}\ {x_{1, \: 1}}}&{{y^{1, \: 2}}\ {x_{1, \: 1}}}
\
{{y^{2, \: 1}}\ {x_{1, \: 1}}}&{{y^{2, \: 2}}\ {x_{1, \: 1}}}
(50)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
arity(XY22)

\label{eq51}2 \over 2(51)
Type: Prop(NonNegativeInteger?)
axiom
test((A*A)*A=A*(A*A))

\label{eq52} \mbox{\rm true} (52)
Type: Boolean
axiom
test((B*B)*B=B*(B*B))

\label{eq53} \mbox{\rm true} (53)
Type: Boolean
axiom
test((A*B)*A=A*(B*A))

\label{eq54} \mbox{\rm true} (54)
Type: Boolean

Multiple inputs and outputs

axiom
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]

\label{eq55}\begin{array}{@{}l}
\displaystyle
\left[{\left[ 
\begin{array}{cc}
{w_{1, \: 1}^{1}}&{w_{1, \: 2}^{1}}
\
{w_{2, \: 1}^{1}}&{w_{2, \: 2}^{1}}
(55)
Type: LinearOperator?(2,Fraction(Polynomial(Integer)))
axiom
WB1:=W B1
>> Error detected within library code: arity

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.

axiom
DirectProduct(2,FRAC INT) has VectorSpace(FRAC INT)

\label{eq56} \mbox{\rm true} (56)
Type: Boolean

Unfortunately:

axiom
DirectProduct(2,DirectProduct(2,FRAC INT)) has VectorSpace(FRAC INT)

\label{eq57} \mbox{\rm false} (57)
Type: Boolean

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:
axiom
FreeModule(Fraction Integer,OrderedVariableList [e1,e1]) has VectorSpace(Fraction Integer)

\label{eq58} \mbox{\rm true} (58)
Type: Boolean