Mercurial > repos > public > sbplib_julia
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 |
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 |