Mercurial > repos > public > sbplib_julia
annotate TensorMappings.jl @ 178:64b9751b3cb2 boundary_conditions
Fix error in getindex for TensorApplicationExpression
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Mon, 17 Jun 2019 10:41:20 +0200 |
parents | 24779d423243 |
children |
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 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 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
|
7 domain_dim(::TensorMapping{T,R,D}) where {T,R,D} = D |
160
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
8 # range_size(::TensorMapping{T,R,D}, domain_size::NTuple{D,Integer}) where {T,R,D} |
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
9 # domain_size(::TensorMapping{T,R,D}, range_size::NTuple{R,Integer}) where {T,R,D} |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 # 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
|
12 # apply_transpose(t::TensorMapping{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {R,D,T} = |
160
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
13 # Implementing apply_transpose and domain_size is only needed if you want to take transposes of the TensorMapping. |
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
14 # TODO: Think about boundschecking! |
158
a3fac8298e3c
Add domain_size() method
Jonatan Werpers <jonatan@werpers.com>
parents:
157
diff
changeset
|
15 |
160
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
16 abstract type TensorOperator{T,D} <: TensorMapping{T,D,D} end |
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
17 domain_size(::TensorOperator{T,D}, range_size::NTuple{D,Integer}) where {T,D} = range_size |
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
18 range_size(::TensorOperator{T,D}, domain_size::NTuple{D,Integer}) where {T,D} = domain_size |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 |
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 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 # Allow using the ' operator: |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 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
|
24 tm::TensorMapping{T,R,D} |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 end |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 |
160
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
27 Base.adjoint(t::TensorMapping) = TensorMappingTranspose(t) |
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
28 # TBD: Should this be implemented on a type by type basis or through a trait to provide earlier errors? |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 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
|
30 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 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
|
32 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
|
33 |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
34 range_size(tmt::TensorMappingTranspose{T,R,D}, domain_size::NTuple{D,Integer}) where {T,R,D} = domain_size(tmt.tm, domain_size) |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
35 domain_size(tmt::TensorMappingTranspose{T,R,D}, range_size::NTuple{D,Integer}) where {T,R,D} = range_size(tmt.tm, range_size) |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 |
157
63b495d5dbc7
Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents:
156
diff
changeset
|
37 |
63b495d5dbc7
Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents:
156
diff
changeset
|
38 |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 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
|
40 t::TensorMapping{R,D} |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 o::AbstractArray{T,D} |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 end |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
44 Base.size(ta::TensorApplication{T,R,D}) where {T,R,D} = range_size(ta.t,size(ta.o)) |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
45 Base.getindex(ta::TensorApplication{T,R,D}, I::Vararg) where {T,R,D} = apply(ta.t, ta.o, I...) |
160
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
46 # TODO: What else is needed to implement the AbstractArray interface? |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
47 import Base.* |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
48 →(tm::TensorMapping{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = TensorApplication(tm,o) |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 # Should we overload some other infix binary operator? |
160
d33b13d2d92b
Move things around in TensorMappings and improve the comments
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
50 # We need the associativity to be a→b→c = a→(b→c), which is the case for '→' |
157
63b495d5dbc7
Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents:
156
diff
changeset
|
51 *(args::Union{TensorMapping{T}, AbstractArray{T}}...) where T = foldr(*,args) |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
52 *(tm::TensorMapping{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = TensorApplication(tm,o) |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
53 *(scalar, ta::TensorApplication{T,R,D}) where {T,R,D} = scalar*ta.o |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
54 *(ta::TensorApplication{T,R,D}, scalar::Number) where {T,R,D} = scalar*ta |
157
63b495d5dbc7
Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents:
156
diff
changeset
|
55 # 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
|
56 # 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
|
57 |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
58 # NOTE: TensorApplicationExpressions attempt to handle the situation when a TensorMapping |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
59 # acts on a TensorApplication +- AbstractArray, such that the expression still can be |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
60 # evaluated lazily per index. |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
61 # TODO: Better naming of both struct and members |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
62 # Since this is a lower layer which shouldnt be exposed, my opinion is that |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
63 # we can afford to be quite verbose. |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
64 struct TensorApplicationExpression{T,R,D} <: AbstractArray{T,R} |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
65 ta::TensorApplication{R,D} |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
66 o::AbstractArray{T,D} |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
67 end |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
68 Base.size(tae::TensorApplicationExpression) = size(tae.ta) #TODO: Not sure how to handle this |
178
64b9751b3cb2
Fix error in getindex for TensorApplicationExpression
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
176
diff
changeset
|
69 Base.getindex(tae::TensorApplicationExpression, I::Vararg) = tae.ta[I...] + tae.o[I...] |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
70 import Base.+ |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
71 import Base.- |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
72 +(ta::TensorApplication{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = TensorApplicationExpression(ta,o) |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
73 +(o::AbstractArray{T,D},ta::TensorApplication{T,R,D}) where {T,R,D} = ta + o |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
74 -(ta::TensorApplication{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = ta + -o |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
75 -(o::AbstractArray{T,D},ta::TensorApplication{T,R,D}) where {T,R,D} = -ta + o |
157
63b495d5dbc7
Add *-operator for tensor application
Jonatan Werpers <jonatan@werpers.com>
parents:
156
diff
changeset
|
76 |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
77 # NOTE: Another (quite neat) way to handle lazy evaluation of |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
78 # TensorApplication + AbstractArray is by using broadcasting. |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
79 # However, with the drafted implementation below a |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
80 # TensorApplication+AbstractArray now results in a generic function and we would |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
81 # then need to define TensorMapping*generic function which does not seem like a |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
82 # good idea. |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
83 # NOTE: Could one use MappedArrays.jl instead? |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
84 # |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
85 # # Lazy evaluations of expressions on TensorApplications |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
86 # # TODO: Need to decide on some good naming here. |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
87 # +(ta::TensorApplication,o::AbstractArray) = I -> ta[I] + o[I] |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
88 # +(o::AbstractArray,ta::TensorApplication) = ta+o |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
89 # *(scalar::Number,ta::TensorApplication) = I -> scalar*ta[I] |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
90 # *(ta::TensorApplication,scalar::Number) = scalar*ta |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
91 # -(ta::TensorApplication,o::AbstractArray) = ta + -o |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
92 # -(o::AbstractArray + ta::TensorApplication) = -ta + o |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
93 |
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
94 struct TensorMappingComposition{T,R,K,D} <: TensorMapping{T,R,D} where K<:typeof(R) |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
95 t1::TensorMapping{T,R,K} |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
96 t2::TensorMapping{T,K,D} |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
97 end |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
98 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
99 import Base.∘ |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
100 ∘(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
|
101 |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
102 function range_size(tm::TensorMappingComposition{T,R,K,D}, domain_size::NTuple{D,Integer}) where {T,R,K,D} |
161
ea01b5550ff6
Add some missing methods in TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
160
diff
changeset
|
103 range_size(tm.t1, domain_size(tm.t2, domain_size)) |
ea01b5550ff6
Add some missing methods in TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
160
diff
changeset
|
104 end |
ea01b5550ff6
Add some missing methods in TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
160
diff
changeset
|
105 |
176
24779d423243
Attempt to handle TensorMappings acting on expressions of TensorApplications and AbstractArrays
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
163
diff
changeset
|
106 function domain_size(tm::TensorMappingComposition{T,R,K,D}, range_size::NTuple{R,Integer}) where {T,R,K,D} |
161
ea01b5550ff6
Add some missing methods in TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
160
diff
changeset
|
107 domain_size(tm.t1, domain_size(tm.t2, range_size)) |
ea01b5550ff6
Add some missing methods in TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
160
diff
changeset
|
108 end |
ea01b5550ff6
Add some missing methods in TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
160
diff
changeset
|
109 |
155
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
110 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
|
111 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
|
112 end |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
113 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
114 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
|
115 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
|
116 end |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
117 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
118 # 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
|
119 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
120 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
121 export apply |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
122 export apply_transpose |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
123 export range_dim |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
124 export domain_dim |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
125 export range_size |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
126 export → |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
127 |
9fdbae11dd77
Add sketch of how Implicitly definied tensor mappings might work
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
128 |
163
766403c677b1
Add comment and sketch for automatic dimension expansion
Jonatan Werpers <jonatan@werpers.com>
parents:
162
diff
changeset
|
129 # # Automatic dimension expansion? |
766403c677b1
Add comment and sketch for automatic dimension expansion
Jonatan Werpers <jonatan@werpers.com>
parents:
162
diff
changeset
|
130 # struct TensorOperator1dAd2d{T,I} <: TensorOperator{T,2} |
766403c677b1
Add comment and sketch for automatic dimension expansion
Jonatan Werpers <jonatan@werpers.com>
parents:
162
diff
changeset
|
131 # t::TensorOperator{T,1} |
766403c677b1
Add comment and sketch for automatic dimension expansion
Jonatan Werpers <jonatan@werpers.com>
parents:
162
diff
changeset
|
132 # end |
766403c677b1
Add comment and sketch for automatic dimension expansion
Jonatan Werpers <jonatan@werpers.com>
parents:
162
diff
changeset
|
133 |
162
be50c5e40121
Add missing newline at end of TensorMappings.jl
Jonatan Werpers <jonatan@werpers.com>
parents:
161
diff
changeset
|
134 end #module |