annotate TensorMappings.jl @ 159:b790082032da boundary_conditions

Add discussion about what a TensorMapping apply()s to
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 10 May 2019 15:05:26 +0200
parents a3fac8298e3c
children d33b13d2d92b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 module TensorMappings
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 # Needs a better name ImplicitTensorMappings? Get rid of "Tensor" in the name_
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 abstract type TensorMapping{T,R,D} end
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 abstract type TensorOperator{T,D} <: TensorMapping{T,D,D} end # Does this help?
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 range_dim(::TensorMapping{T,R,D}) where {T,R,D} = R
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 domain_dim(::TensorMapping{T,R,D}) where {T,R,D} = D
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 range_size(::TensorOperator{T,D}, domain_size::NTuple{D,Integer}) where {T,D} = domain_size
158
a3fac8298e3c Add domain_size() method
Jonatan Werpers <jonatan@werpers.com>
parents: 157
diff changeset
11 domain_size(::TensorOperator{T,D}, range_size::NTuple{D,Integer}) where {T,D} = range_size
a3fac8298e3c Add domain_size() method
Jonatan Werpers <jonatan@werpers.com>
parents: 157
diff changeset
12 # More precise domain_size/range_size type?
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14 # Should be implemented by a TensorMapping
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 # ========================================
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16 # apply(t::TensorMapping{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {R,D,T} =
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 # apply_transpose(t::TensorMapping{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {R,D,T} =
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 # Does it make sense that apply should work for any size of v? And the application adapts?
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19 # Think about boundschecking!
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
21 # range_size(::TensorMapping{T,R,D}, domain_size::NTuple{D,Integer}) where {T,R,D} =
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22 # More prciese domain_size type?
158
a3fac8298e3c Add domain_size() method
Jonatan Werpers <jonatan@werpers.com>
parents: 157
diff changeset
23 # domain_size(::TensorMapping{T,R,D}, range_size::NTuple{R,Integer}) where {T,R,D} =
a3fac8298e3c Add domain_size() method
Jonatan Werpers <jonatan@werpers.com>
parents: 157
diff changeset
24
a3fac8298e3c Add domain_size() method
Jonatan Werpers <jonatan@werpers.com>
parents: 157
diff changeset
25 # Implementing apply_transpose and domain_size is only needed if you want to take transposes of the TensorMapping.
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
26
159
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
27 # What does a TensorMapping apply() to?
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
28 # =====================================
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
29 # Is it too strict that TensorMappings apply to AbstractArrays? Maybe we don't need
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
30 # to know the operands size. That could simplify the handeling of the range_size...
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
31 # It would just fail if apply does something out of bounds..
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
32 # No i think knowing the size is a requirement. The TensorMapping must be able to do
b790082032da Add discussion about what a TensorMapping apply()s to
Jonatan Werpers <jonatan@werpers.com>
parents: 158
diff changeset
33 # different things for different indecies based for example on how close to the boundary we are.
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 # Allow using the ' operator:
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 struct TensorMappingTranspose{T,R,D} <: TensorMapping{T,D,R}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 tm::TensorMapping{T,R,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39 end
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 Base.adjoint(t::TensorMapping) = TensorMappingTranspose(t) # Maybe this should be implemented on a type by type basis or through a trait to provide earlier errors.
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 Base.adjoint(t::TensorMappingTranspose) = t.tm
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 apply(tm::TensorMappingTranspose{T,R,D}, v::AbstractArray{T,R}, I::Vararg) where {T,R,D} = apply_transpose(tm.tm, v, I...)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 apply_transpose(tm::TensorMappingTranspose{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {T,R,D} = apply(tm.tm, v, I...)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 # range_size(::TensorMappingTranspose{T,R,D}, domain_size::NTuple{}) = range_size_of_transpose???
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48
157
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
49
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
50
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 struct TensorApplication{T,R,D} <: AbstractArray{T,R}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 t::TensorMapping{R,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 o::AbstractArray{T,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54 end
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 Base.size(ta::TensorApplication) = range_size(ta.t,size(ta.o))
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57 ## What else is needed so that we have a proper AbstractArray?
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 Base.getindex(tm::TensorApplication, I::Vararg) = apply(tm.t, tm.o, I...)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60
156
ef3e6c70b6f9 Add missing type parameter to application operator
Jonatan Werpers <jonatan@werpers.com>
parents: 155
diff changeset
61 →(t::TensorMapping{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = TensorApplication(t,o)
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
62 # Should we overload some other infix binary operator?
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63 # * has the wrong parsing properties... a*b*c is parsed to (a*b)*c (through a*b*c = *(a,b,c))
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 # while a→b→c is parsed as a→(b→c)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
65 # The associativity of the operators might be fixed somehow... (rfold/lfold?)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
66 # ∘ also is an option but that has the same problem as * (but is not n-ary) (or is this best used for composition of Mappings?)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
67
157
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
68 # If we want to use * it would be something like this:
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
69 import Base.*
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
70 *(args::Union{TensorMapping{T}, AbstractArray{T}}...) where T = foldr(*,args)
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
71 *(t::TensorMapping{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = TensorApplication(t,o)
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
72 # We need to be really careful about good error messages.
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
73 # For example what happens if you try to multiply TensorApplication with a TensorMapping(wrong order)?
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
74
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
75
63b495d5dbc7 Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents: 156
diff changeset
76
155
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
77 struct TensorMappingComposition{T,R,K,D} <: TensorMapping{T,R,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
78 t1::TensorMapping{T,R,K}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
79 t2::TensorMapping{T,K,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
80 end
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
81
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
82 import Base.∘
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
83 ∘(s::TensorMapping{T,R,K}, t::TensorMapping{T,K,D}) where {T,R,K,D} = TensorMappingComposition(s,t)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
84
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
85 function apply(c::TensorMappingComposition{T,R,K,D}, v::AbstractArray{T,D}, I::Vararg) where {T,R,K,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
86 apply(c.t1, TensorApplication(c.t2,v), I...)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
87 end
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
88
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
89 function apply_transpose(c::TensorMappingComposition{T,R,K,D}, v::AbstractArray{T,D}, I::Vararg) where {T,R,K,D}
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
90 apply_transpose(c.t2, TensorApplication(c.t1',v), I...)
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
91 end
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
92
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
93 # Have i gone too crazy with the type parameters? Maybe they aren't all needed?
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
94
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
95
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
96 export apply
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
97 export apply_transpose
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
98 export range_dim
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
99 export domain_dim
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
100 export range_size
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
101 export →
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
102
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
103
9fdbae11dd77 Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
104 end #module