Mercurial > repos > public > sbplib_julia
annotate LazyTensors/src/LazyTensors.jl @ 184:6945c15a6a7a boundary_conditions
Rename package LazyTensor to LazyTensors
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 20 Jun 2019 21:14:20 +0200 |
parents | LazyTensor/src/LazyTensor.jl@b7397ae8afaf |
children | 715ff09bb2ce |
rev | line source |
---|---|
184
6945c15a6a7a
Rename package LazyTensor to LazyTensors
Jonatan Werpers <jonatan@werpers.com>
parents:
180
diff
changeset
|
1 module LazyTensors |
180
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 Mapping{T,R,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 Describes a mapping of a D dimension tensor to an R dimension tensor. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 The action of the mapping is implemented through the method |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 apply(t::Mapping{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {R,D,T} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 The size of range tensor should be dependent on the size of the domain tensor |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 and the type should implement the methods |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 range_size(::Mapping{T,R,D}, domain_size::NTuple{D,Integer}) where {T,R,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 domain_size(::Mapping{T,R,D}, range_size::NTuple{R,Integer}) where {T,R,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 to allow querying for one or the other. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 Optionally the action of the transpose may be defined through |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 apply_transpose(t::Mapping{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {R,D,T} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 abstract type Mapping{T,R,D} end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 apply(t::Mapping{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {R,D,T} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 Return the result of the mapping for a given index. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 function apply end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 export apply |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 apply_transpose(t::Mapping{T,R,D}, v::AbstractArray{T,R}, I::Vararg) where {R,D,T} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 Return the result of the transposed mapping for a given index. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 function apply_transpose end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 export apply_transpose |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 Return the dimension of the range space of a given mapping |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 range_dim(::Mapping{T,R,D}) where {T,R,D} = R |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 Return the dimension of the domain space of a given mapping |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 domain_dim(::Mapping{T,R,D}) where {T,R,D} = D |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 export range_dim, domain_dim |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 range_size(M::Mapping, domain_size) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 Return the resulting range size for the mapping applied to a given domain_size |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 function range_size end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 domain_size(M::Mapping, range_size) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 Return the resulting domain size for the mapping applied to a given range_size |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 function domain_size end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
67 export range_size, domain_size |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
68 # TODO: Think about boundschecking! |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
69 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
70 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
71 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
72 Operator{T,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
73 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
74 A `Mapping{T,D,D}` where the range and domain tensor have the same number of |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
75 dimensions and the same size. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
76 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
77 abstract type Operator{T,D} <: Mapping{T,D,D} end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
78 domain_size(::Operator{T,D}, range_size::NTuple{D,Integer}) where {T,D} = range_size |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
79 range_size(::Operator{T,D}, domain_size::NTuple{D,Integer}) where {T,D} = domain_size |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
80 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
81 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
82 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
83 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
84 MappingTranspose{T,R,D} <: Mapping{T,D,R} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
85 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
86 Struct for lazy transpose of a Mapping. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
87 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
88 If a mapping implements the the `apply_transpose` method this allows working with |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
89 the transpose of mapping `m` by using `m'`. `m'` will work as a regular Mapping lazily calling |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
90 the appropriate methods of `m`. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
91 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
92 struct MappingTranspose{T,R,D} <: Mapping{T,D,R} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
93 tm::Mapping{T,R,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
94 end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
95 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
96 # # TBD: Should this be implemented on a type by type basis or through a trait to provide earlier errors? |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
97 Base.adjoint(t::Mapping) = MappingTranspose(t) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
98 Base.adjoint(t::MappingTranspose) = t.tm |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
99 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
100 apply(tm::MappingTranspose{T,R,D}, v::AbstractArray{T,R}, I::Vararg) where {T,R,D} = apply_transpose(tm.tm, v, I...) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
101 apply_transpose(tm::MappingTranspose{T,R,D}, v::AbstractArray{T,D}, I::Vararg) where {T,R,D} = apply(tm.tm, v, I...) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
102 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
103 range_size(tmt::MappingTranspose{T,R,D}, d_size::NTuple{R,Integer}) where {T,R,D} = domain_size(tmt.tm, domain_size) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
104 domain_size(tmt::MappingTranspose{T,R,D}, r_size::NTuple{D,Integer}) where {T,R,D} = range_size(tmt.tm, range_size) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
105 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
106 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
107 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
108 Application{T,R,D} <: AbstractArray{T,R} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
109 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
110 Struct for lazy application of a Mapping. Created using `*`. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
111 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
112 Allows the result of a `Mapping` applied to a vector to be treated as an `AbstractArray`. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
113 With a mapping `m` and a vector `v` the Application object can be created by `m*v`. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
114 The actual result will be calcualted when indexing into `m*v`. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
115 """ |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
116 struct Application{T,R,D} <: AbstractArray{T,R} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
117 t::Mapping{T,R,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
118 o::AbstractArray{T,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
119 end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
120 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
121 Base.:*(tm::Mapping{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = Application(tm,o) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
122 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
123 Base.getindex(ta::Application{T,R,D}, I::Vararg) where {T,R,D} = apply(ta.t, ta.o, I...) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
124 Base.size(ta::Application{T,R,D}) where {T,R,D} = range_size(ta.t,size(ta.o)) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
125 # TODO: What else is needed to implement the AbstractArray interface? |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
126 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
127 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
128 # # We need the associativity to be a→b→c = a→(b→c), which is the case for '→' |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
129 Base.:*(args::Union{Mapping{T}, AbstractArray{T}}...) where T = foldr(*,args) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
130 # # Should we overload some other infix binary operator? |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
131 # →(tm::Mapping{T,R,D}, o::AbstractArray{T,D}) where {T,R,D} = Application(tm,o) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
132 # TODO: We need to be really careful about good error messages. |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
133 # For example what happens if you try to multiply Application with a Mapping(wrong order)? |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
134 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
135 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
136 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
137 # struct TensorMappingComposition{T,R,K,D} <: Mapping{T,R,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
138 # t1::Mapping{T,R,K} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
139 # t2::Mapping{T,K,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
140 # end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
141 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
142 # Base.:∘(s::Mapping{T,R,K}, t::Mapping{T,K,D}) where {T,R,K,D} = TensorMappingComposition(s,t) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
143 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
144 # function range_size(tm::TensorMappingComposition{T,R,K,D}, domain_size::NTuple{D,Integer}) where {T,R,K,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
145 # range_size(tm.t1, domain_size(tm.t2, domain_size)) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
146 # end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
147 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
148 # function domain_size(tm::TensorMappingComposition{T,R,K,D}, range_size::NTuple{R,Integer}) where {T,R,K,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
149 # domain_size(tm.t1, domain_size(tm.t2, range_size)) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
150 # end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
151 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
152 # function apply(c::TensorMappingComposition{T,R,K,D}, v::AbstractArray{T,D}, I::Vararg) where {T,R,K,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
153 # apply(c.t1, Application(c.t2,v), I...) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
154 # end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
155 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
156 # function apply_transpose(c::TensorMappingComposition{T,R,K,D}, v::AbstractArray{T,D}, I::Vararg) where {T,R,K,D} |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
157 # apply_transpose(c.t2, Application(c.t1',v), I...) |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
158 # end |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
159 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
160 # # Have i gone too crazy with the type parameters? Maybe they aren't all needed? |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
161 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
162 # export → |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
163 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
164 |
b7397ae8afaf
Move tensor mappings to a package LazyTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
165 end # module |