Mercurial > repos > public > sbplib_julia
annotate src/LazyTensors/lazy_tensor_operations.jl @ 1049:3bb94ce74697 feature/variable_derivatives
Merge default
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 23 Mar 2022 12:54:45 +0100 |
parents | df562695b1b5 9e76bf19904c |
children | 5a3281429a48 |
rev | line source |
---|---|
959
e9752c1e92f8
Fix conflict from merge
Jonatan Werpers <jonatan@werpers.com>
parents:
958
diff
changeset
|
1 using Sbplib.RegionIndices |
e9752c1e92f8
Fix conflict from merge
Jonatan Werpers <jonatan@werpers.com>
parents:
958
diff
changeset
|
2 |
196
b3c252280a19
Move LazyArray and make LazyTensorMappingApplication and LazyElementwiseOperation subtypes of it
Jonatan Werpers <jonatan@werpers.com>
parents:
195
diff
changeset
|
3 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
4 TensorApplication{T,R,D} <: LazyArray{T,R} |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 |
995 | 6 Struct for lazy application of a LazyTensor. Created using `*`. |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 |
995 | 8 Allows the result of a `LazyTensor` applied to a vector to be treated as an `AbstractArray`. |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
9 With a mapping `m` and a vector `v` the TensorApplication object can be created by `m*v`. |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 The actual result will be calcualted when indexing into `m*v`. |
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
12 struct TensorApplication{T,R,D, TM<:LazyTensor{<:Any,R,D}, AA<:AbstractArray{<:Any,D}} <: LazyArray{T,R} |
378
946516954c85
Use concrete types in LazyTensorApplication
Jonatan Werpers <jonatan@werpers.com>
parents:
359
diff
changeset
|
13 t::TM |
946516954c85
Use concrete types in LazyTensorApplication
Jonatan Werpers <jonatan@werpers.com>
parents:
359
diff
changeset
|
14 o::AA |
942
7829c09f8137
Add promotion calculation of element type for LazyTensorMappingApplication
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
15 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
16 function TensorApplication(t::LazyTensor{<:Any,R,D}, o::AbstractArray{<:Any,D}) where {R,D} |
1005
becd95ba0fce
Add bounds checking for lazy tensor application and clea up tests a bit
Jonatan Werpers <jonatan@werpers.com>
parents:
1002
diff
changeset
|
17 @boundscheck check_domain_size(t, size(o)) |
977
043d13ef8898
Fix type calculation of LazyTensorMappingApplication element type
Jonatan Werpers <jonatan@werpers.com>
parents:
976
diff
changeset
|
18 I = ntuple(i->1, range_dim(t)) |
043d13ef8898
Fix type calculation of LazyTensorMappingApplication element type
Jonatan Werpers <jonatan@werpers.com>
parents:
976
diff
changeset
|
19 T = typeof(apply(t,o,I...)) |
942
7829c09f8137
Add promotion calculation of element type for LazyTensorMappingApplication
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
20 return new{T,R,D,typeof(t), typeof(o)}(t,o) |
7829c09f8137
Add promotion calculation of element type for LazyTensorMappingApplication
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
21 end |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 end |
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
24 function Base.getindex(ta::TensorApplication{T,R}, I::Vararg{Any,R}) where {T,R} |
1005
becd95ba0fce
Add bounds checking for lazy tensor application and clea up tests a bit
Jonatan Werpers <jonatan@werpers.com>
parents:
1002
diff
changeset
|
25 @boundscheck checkbounds(ta, Int.(I)...) |
1015
4dd3c2312d9e
Fix some @boundscheck @inboudns combos
Jonatan Werpers <jonatan@werpers.com>
parents:
1007
diff
changeset
|
26 return @inbounds apply(ta.t, ta.o, I...) |
1005
becd95ba0fce
Add bounds checking for lazy tensor application and clea up tests a bit
Jonatan Werpers <jonatan@werpers.com>
parents:
1002
diff
changeset
|
27 end |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
28 Base.@propagate_inbounds Base.getindex(ta::TensorApplication{T,1} where T, I::CartesianIndex{1}) = ta[Tuple(I)...] # Would otherwise be caught in the previous method. |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
29 Base.size(ta::TensorApplication) = range_size(ta.t) |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 |
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 |
194
d30d42a11566
Move all Lazy operation into the same module
Jonatan Werpers <jonatan@werpers.com>
parents:
190
diff
changeset
|
32 """ |
1037 | 33 TensorTranspose{T,R,D} <: LazyTensor{T,D,R} |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
34 |
995 | 35 Struct for lazy transpose of a LazyTensor. |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
36 |
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
37 If a mapping implements the the `apply_transpose` method this allows working with |
995 | 38 the transpose of mapping `m` by using `m'`. `m'` will work as a regular LazyTensor lazily calling |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
39 the appropriate methods of `m`. |
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
40 """ |
1037 | 41 struct TensorTranspose{T,R,D, TM<:LazyTensor{T,R,D}} <: LazyTensor{T,D,R} |
438
907b0510699f
Change LazyTensorTranspose to have concrete fields
Jonatan Werpers <jonatan@werpers.com>
parents:
436
diff
changeset
|
42 tm::TM |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
43 end |
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
44 |
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
45 # # TBD: Should this be implemented on a type by type basis or through a trait to provide earlier errors? |
995 | 46 # Jonatan 2020-09-25: Is the problem that you can take the transpose of any LazyTensor even if it doesn't implement `apply_transpose`? |
1037 | 47 Base.adjoint(tm::LazyTensor) = TensorTranspose(tm) |
48 Base.adjoint(tmt::TensorTranspose) = tmt.tm | |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
49 |
1037 | 50 apply(tmt::TensorTranspose{T,R,D}, v::AbstractArray{<:Any,R}, I::Vararg{Any,D}) where {T,R,D} = apply_transpose(tmt.tm, v, I...) |
51 apply_transpose(tmt::TensorTranspose{T,R,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,R}) where {T,R,D} = apply(tmt.tm, v, I...) | |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
52 |
1037 | 53 range_size(tmt::TensorTranspose) = domain_size(tmt.tm) |
54 domain_size(tmt::TensorTranspose) = range_size(tmt.tm) | |
197
a340fa91b1fc
Move transpose def to the bottom of the file
Jonatan Werpers <jonatan@werpers.com>
parents:
196
diff
changeset
|
55 |
1002
271aa6ae1055
Split out a file for tensor types
Jonatan Werpers <jonatan@werpers.com>
parents:
1001
diff
changeset
|
56 |
1037 | 57 struct ElementwiseTensorOperation{Op,T,R,D,T1<:LazyTensor{T,R,D},T2<:LazyTensor{T,R,D}} <: LazyTensor{T,D,R} |
274
11010bb74260
Dispatch getindex for TensorMappingApplication on region indices. Dispatch apply
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
267
diff
changeset
|
58 tm1::T1 |
11010bb74260
Dispatch getindex for TensorMappingApplication on region indices. Dispatch apply
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
267
diff
changeset
|
59 tm2::T2 |
210
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
60 |
1037 | 61 function ElementwiseTensorOperation{Op,T,R,D}(tm1::T1,tm2::T2) where {Op,T,R,D, T1<:LazyTensor{T,R,D},T2<:LazyTensor{T,R,D}} |
1007
f7a718bcb4da
Add checking of sizes to LazyTensorBinaryOperation
Jonatan Werpers <jonatan@werpers.com>
parents:
1006
diff
changeset
|
62 @boundscheck check_domain_size(tm2, domain_size(tm1)) |
f7a718bcb4da
Add checking of sizes to LazyTensorBinaryOperation
Jonatan Werpers <jonatan@werpers.com>
parents:
1006
diff
changeset
|
63 @boundscheck check_range_size(tm2, range_size(tm1)) |
274
11010bb74260
Dispatch getindex for TensorMappingApplication on region indices. Dispatch apply
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
267
diff
changeset
|
64 return new{Op,T,R,D,T1,T2}(tm1,tm2) |
210
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
65 end |
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
66 end |
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
67 |
1037 | 68 ElementwiseTensorOperation{Op}(s,t) where Op = ElementwiseTensorOperation{Op,eltype(s), range_dim(s), domain_dim(s)}(s,t) |
1001
a3df203861d3
Simplify some type parameter usage
Jonatan Werpers <jonatan@werpers.com>
parents:
1000
diff
changeset
|
69 |
1037 | 70 apply(tmBinOp::ElementwiseTensorOperation{:+,T,R,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,R}) where {T,R,D} = apply(tmBinOp.tm1, v, I...) + apply(tmBinOp.tm2, v, I...) |
71 apply(tmBinOp::ElementwiseTensorOperation{:-,T,R,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,R}) where {T,R,D} = apply(tmBinOp.tm1, v, I...) - apply(tmBinOp.tm2, v, I...) | |
210
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
72 |
1037 | 73 range_size(tmBinOp::ElementwiseTensorOperation) = range_size(tmBinOp.tm1) |
74 domain_size(tmBinOp::ElementwiseTensorOperation) = domain_size(tmBinOp.tm1) | |
210
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
75 |
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
76 |
412
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
77 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
78 TensorComposition{T,R,K,D} |
210
2aa33d0eef90
Add ability to add and subtract TensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
209
diff
changeset
|
79 |
995 | 80 Lazily compose two `LazyTensor`s, so that they can be handled as a single `LazyTensor`. |
412
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
81 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
82 struct TensorComposition{T,R,K,D, TM1<:LazyTensor{T,R,K}, TM2<:LazyTensor{T,K,D}} <: LazyTensor{T,R,D} |
412
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
83 t1::TM1 |
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
84 t2::TM2 |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
85 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
86 function TensorComposition(t1::LazyTensor{T,R,K}, t2::LazyTensor{T,K,D}) where {T,R,K,D} |
485
4b49f03bdb98
Switch from DimensionMismatch to SizeMismatch for boundschecks on compositions
Jonatan Werpers <jonatan@werpers.com>
parents:
484
diff
changeset
|
87 @boundscheck check_domain_size(t1, range_size(t2)) |
417
4c6604b7d990
Add dimension checking in the constructor
Jonatan Werpers <jonatan@werpers.com>
parents:
415
diff
changeset
|
88 return new{T,R,K,D, typeof(t1), typeof(t2)}(t1,t2) |
4c6604b7d990
Add dimension checking in the constructor
Jonatan Werpers <jonatan@werpers.com>
parents:
415
diff
changeset
|
89 end |
412
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
90 end |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
91 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
92 range_size(tm::TensorComposition) = range_size(tm.t1) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
93 domain_size(tm::TensorComposition) = domain_size(tm.t2) |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
94 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
95 function apply(c::TensorComposition{T,R,K,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,R}) where {T,R,K,D} |
418
264af2bb646f
Switch to using * instead of calling the constructor
Jonatan Werpers <jonatan@werpers.com>
parents:
417
diff
changeset
|
96 apply(c.t1, c.t2*v, I...) |
412
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
97 end |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
98 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
99 function apply_transpose(c::TensorComposition{T,R,K,D}, v::AbstractArray{<:Any,R}, I::Vararg{Any,D}) where {T,R,K,D} |
418
264af2bb646f
Switch to using * instead of calling the constructor
Jonatan Werpers <jonatan@werpers.com>
parents:
417
diff
changeset
|
100 apply_transpose(c.t2, c.t1'*v, I...) |
412
d94891b8dfca
Start implementing TensorComposition
Jonatan Werpers <jonatan@werpers.com>
parents:
402
diff
changeset
|
101 end |
190
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
102 |
8964b3165097
Break LazyTensors.jl into several files
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
103 |
377
8414c2334393
Start implementing LazyLinearMap
Jonatan Werpers <jonatan@werpers.com>
parents:
359
diff
changeset
|
104 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
105 TensorComposition(tm, tmi::IdentityTensor) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
106 TensorComposition(tmi::IdentityTensor, tm) |
479
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
107 |
995 | 108 Composes a `Tensormapping` `tm` with an `IdentityTensor` `tmi`, by returning `tm` |
479
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
109 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
110 function TensorComposition(tm::LazyTensor{T,R,D}, tmi::IdentityTensor{T,D}) where {T,R,D} |
485
4b49f03bdb98
Switch from DimensionMismatch to SizeMismatch for boundschecks on compositions
Jonatan Werpers <jonatan@werpers.com>
parents:
484
diff
changeset
|
111 @boundscheck check_domain_size(tm, range_size(tmi)) |
479
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
112 return tm |
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
113 end |
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
114 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
115 function TensorComposition(tmi::IdentityTensor{T,R}, tm::LazyTensor{T,R,D}) where {T,R,D} |
485
4b49f03bdb98
Switch from DimensionMismatch to SizeMismatch for boundschecks on compositions
Jonatan Werpers <jonatan@werpers.com>
parents:
484
diff
changeset
|
116 @boundscheck check_domain_size(tmi, range_size(tm)) |
479
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
117 return tm |
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
118 end |
995 | 119 # Specialization for the case where tm is an IdentityTensor. Required to resolve ambiguity. |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
120 function TensorComposition(tm::IdentityTensor{T,D}, tmi::IdentityTensor{T,D}) where {T,D} |
485
4b49f03bdb98
Switch from DimensionMismatch to SizeMismatch for boundschecks on compositions
Jonatan Werpers <jonatan@werpers.com>
parents:
484
diff
changeset
|
121 @boundscheck check_domain_size(tm, range_size(tmi)) |
479
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
122 return tmi |
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
123 end |
95f3b9036801
Specialize composition operator for composing a tensormapping with an identitymapping.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
465
diff
changeset
|
124 |
992
bc384aaade30
Add a bunch of todos and add a ScalingTensor
Jonatan Werpers <jonatan@werpers.com>
parents:
977
diff
changeset
|
125 |
459
11e58c49fb46
Add some documentation
Jonatan Werpers <jonatan@werpers.com>
parents:
458
diff
changeset
|
126 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
127 InflatedTensor{T,R,D} <: LazyTensor{T,R,D} |
459
11e58c49fb46
Add some documentation
Jonatan Werpers <jonatan@werpers.com>
parents:
458
diff
changeset
|
128 |
995 | 129 An inflated `LazyTensor` with dimensions added before and afer its actual dimensions. |
459
11e58c49fb46
Add some documentation
Jonatan Werpers <jonatan@werpers.com>
parents:
458
diff
changeset
|
130 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
131 struct InflatedTensor{T,R,D,D_before,R_middle,D_middle,D_after, TM<:LazyTensor{T,R_middle,D_middle}} <: LazyTensor{T,R,D} |
995 | 132 before::IdentityTensor{T,D_before} |
449
14d60de71b72
Change to concrete fields in the type
Jonatan Werpers <jonatan@werpers.com>
parents:
448
diff
changeset
|
133 tm::TM |
995 | 134 after::IdentityTensor{T,D_after} |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
135 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
136 function InflatedTensor(before, tm::LazyTensor{T}, after) where T |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
137 R_before = range_dim(before) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
138 R_middle = range_dim(tm) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
139 R_after = range_dim(after) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
140 R = R_before+R_middle+R_after |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
141 |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
142 D_before = domain_dim(before) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
143 D_middle = domain_dim(tm) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
144 D_after = domain_dim(after) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
145 D = D_before+D_middle+D_after |
449
14d60de71b72
Change to concrete fields in the type
Jonatan Werpers <jonatan@werpers.com>
parents:
448
diff
changeset
|
146 return new{T,R,D,D_before,R_middle,D_middle,D_after, typeof(tm)}(before, tm, after) |
448
912ae510dec9
Use new name of IdentityMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
447
diff
changeset
|
147 end |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
148 end |
1002
271aa6ae1055
Split out a file for tensor types
Jonatan Werpers <jonatan@werpers.com>
parents:
1001
diff
changeset
|
149 |
461 | 150 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
151 InflatedTensor(before, tm, after) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
152 InflatedTensor(before,tm) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
153 InflatedTensor(tm,after) |
461 | 154 |
995 | 155 The outer product of `before`, `tm` and `after`, where `before` and `after` are `IdentityTensor`s. |
465
f270d82fc9ad
Change documention in an attempt to follow the guidelines
Jonatan Werpers <jonatan@werpers.com>
parents:
464
diff
changeset
|
156 |
995 | 157 If one of `before` or `after` is left out, a 0-dimensional `IdentityTensor` is used as the default value. |
493
df566372bb4f
Implement constructors to avoid creating nested InflatedTensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
487
diff
changeset
|
158 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
159 If `tm` already is an `InflatedTensor`, `before` and `after` will be extended instead of |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
160 creating a nested `InflatedTensor`. |
461 | 161 """ |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
162 InflatedTensor(::IdentityTensor, ::LazyTensor, ::IdentityTensor) |
493
df566372bb4f
Implement constructors to avoid creating nested InflatedTensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
487
diff
changeset
|
163 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
164 function InflatedTensor(before, itm::InflatedTensor, after) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
165 return InflatedTensor( |
995 | 166 IdentityTensor(before.size..., itm.before.size...), |
493
df566372bb4f
Implement constructors to avoid creating nested InflatedTensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
487
diff
changeset
|
167 itm.tm, |
995 | 168 IdentityTensor(itm.after.size..., after.size...), |
493
df566372bb4f
Implement constructors to avoid creating nested InflatedTensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
487
diff
changeset
|
169 ) |
df566372bb4f
Implement constructors to avoid creating nested InflatedTensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
487
diff
changeset
|
170 end |
df566372bb4f
Implement constructors to avoid creating nested InflatedTensorMappings
Jonatan Werpers <jonatan@werpers.com>
parents:
487
diff
changeset
|
171 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
172 InflatedTensor(before::IdentityTensor, tm::LazyTensor{T}) where T = InflatedTensor(before,tm,IdentityTensor{T}()) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
173 InflatedTensor(tm::LazyTensor{T}, after::IdentityTensor) where T = InflatedTensor(IdentityTensor{T}(),tm,after) |
465
f270d82fc9ad
Change documention in an attempt to follow the guidelines
Jonatan Werpers <jonatan@werpers.com>
parents:
464
diff
changeset
|
174 # Resolve ambiguity between the two previous methods |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
175 InflatedTensor(I1::IdentityTensor{T}, I2::IdentityTensor{T}) where T = InflatedTensor(I1,I2,IdentityTensor{T}()) |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
176 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
177 # TODO: Implement some pretty printing in terms of ⊗. E.g InflatedTensor(I(3),B,I(2)) -> I(3)⊗B⊗I(2) |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
178 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
179 function range_size(itm::InflatedTensor) |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
180 return flatten_tuple( |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
181 range_size(itm.before), |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
182 range_size(itm.tm), |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
183 range_size(itm.after), |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
184 ) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
185 end |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
186 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
187 function domain_size(itm::InflatedTensor) |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
188 return flatten_tuple( |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
189 domain_size(itm.before), |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
190 domain_size(itm.tm), |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
191 domain_size(itm.after), |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
192 ) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
193 end |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
194 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
195 function apply(itm::InflatedTensor{T,R,D}, v::AbstractArray{<:Any,D}, I::Vararg{Any,R}) where {T,R,D} |
538
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
196 dim_before = range_dim(itm.before) |
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
197 dim_domain = domain_dim(itm.tm) |
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
198 dim_range = range_dim(itm.tm) |
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
199 dim_after = range_dim(itm.after) |
520
fe86ac896377
Start refactoring split index and apply to accomodate future addition of apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
501
diff
changeset
|
200 |
538
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
201 view_index, inner_index = split_index(Val(dim_before), Val(dim_domain), Val(dim_range), Val(dim_after), I...) |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
202 |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
203 v_inner = view(v, view_index...) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
204 return apply(itm.tm, v_inner, inner_index...) |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
205 end |
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
206 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
207 function apply_transpose(itm::InflatedTensor{T,R,D}, v::AbstractArray{<:Any,R}, I::Vararg{Any,D}) where {T,R,D} |
538
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
208 dim_before = range_dim(itm.before) |
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
209 dim_domain = domain_dim(itm.tm) |
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
210 dim_range = range_dim(itm.tm) |
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
211 dim_after = range_dim(itm.after) |
526
be152486d136
Implement apply_transpose with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
525
diff
changeset
|
212 |
538
848dec405332
Change variable names in apply and apply_transpose
Jonatan Werpers <jonatan@werpers.com>
parents:
537
diff
changeset
|
213 view_index, inner_index = split_index(Val(dim_before), Val(dim_range), Val(dim_domain), Val(dim_after), I...) |
526
be152486d136
Implement apply_transpose with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
525
diff
changeset
|
214 |
be152486d136
Implement apply_transpose with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
525
diff
changeset
|
215 v_inner = view(v, view_index...) |
be152486d136
Implement apply_transpose with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
525
diff
changeset
|
216 return apply_transpose(itm.tm, v_inner, inner_index...) |
be152486d136
Implement apply_transpose with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
525
diff
changeset
|
217 end |
be152486d136
Implement apply_transpose with tests
Jonatan Werpers <jonatan@werpers.com>
parents:
525
diff
changeset
|
218 |
446
904aae1899df
Start implementing InflatedTensorMapping
Jonatan Werpers <jonatan@werpers.com>
parents:
429
diff
changeset
|
219 |
838
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
220 @doc raw""" |
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
221 LazyOuterProduct(tms...) |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
222 |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
223 Creates a `TensorComposition` for the outerproduct of `tms...`. |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
224 This is done by separating the outer product into regular products of outer products involving only identity mappings and one non-identity mapping. |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
225 |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
226 First let |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
227 ```math |
838
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
228 \begin{aligned} |
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
229 A &= A_{I,J} \\ |
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
230 B &= B_{M,N} \\ |
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
231 C &= C_{P,Q} \\ |
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
232 \end{aligned} |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
233 ``` |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
234 |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
235 where ``I``, ``M``, ``P`` are multi-indexes for the ranges of ``A``, ``B``, ``C``, and ``J``, ``N``, ``Q`` are multi-indexes of the domains. |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
236 |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
237 We use ``⊗`` to denote the outer product |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
238 ```math |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
239 (A⊗B)_{IM,JN} = A_{I,J}B_{M,N} |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
240 ``` |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
241 |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
242 We note that |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
243 ```math |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
244 A⊗B⊗C = (A⊗B⊗C)_{IMP,JNQ} = A_{I,J}B_{M,N}C_{P,Q} |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
245 ``` |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
246 And that |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
247 ```math |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
248 A⊗B⊗C = (A⊗I_{|M|}⊗I_{|P|})(I_{|J|}⊗B⊗I_{|P|})(I_{|J|}⊗I_{|N|}⊗C) |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
249 ``` |
838
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
250 where ``|⋅|`` of a multi-index is a vector of sizes for each dimension. ``I_v`` denotes the identity tensor of size ``v[i]`` in each direction |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
251 To apply ``A⊗B⊗C`` we evaluate |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
252 |
838
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
253 ```math |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
254 (A⊗B⊗C)v = [(A⊗I_{|M|}⊗I_{|P|}) [(I_{|J|}⊗B⊗I_{|P|}) [(I_{|J|}⊗I_{|N|}⊗C)v]]] |
838
76e5682d0e52
Fix a bunch of docstring mistakes
Jonatan Werpers <jonatan@werpers.com>
parents:
625
diff
changeset
|
255 ``` |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
256 """ |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
257 function LazyOuterProduct end |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
258 |
995 | 259 function LazyOuterProduct(tm1::LazyTensor{T}, tm2::LazyTensor{T}) where T |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
260 itm1 = InflatedTensor(tm1, IdentityTensor{T}(range_size(tm2))) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
261 itm2 = InflatedTensor(IdentityTensor{T}(domain_size(tm1)),tm2) |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
262 |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
263 return itm1∘itm2 |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
264 end |
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
265 |
995 | 266 LazyOuterProduct(t1::IdentityTensor{T}, t2::IdentityTensor{T}) where T = IdentityTensor{T}(t1.size...,t2.size...) |
1017
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
267 LazyOuterProduct(t1::LazyTensor, t2::IdentityTensor) = InflatedTensor(t1, t2) |
6abbb2c6c3e4
Remove the Lazy prefix on some types
Jonatan Werpers <jonatan@werpers.com>
parents:
1016
diff
changeset
|
268 LazyOuterProduct(t1::IdentityTensor, t2::LazyTensor) = InflatedTensor(t1, t2) |
491
2dc2eac27f75
Add special methods for Identity mappings
Jonatan Werpers <jonatan@werpers.com>
parents:
475
diff
changeset
|
269 |
995 | 270 LazyOuterProduct(tms::Vararg{LazyTensor}) = foldl(LazyOuterProduct, tms) |
468
a52f38e72258
Start implementing function for outer products
Jonatan Werpers <jonatan@werpers.com>
parents:
461
diff
changeset
|
271 |
498 | 272 |
995 | 273 function check_domain_size(tm::LazyTensor, sz) |
487
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
274 if domain_size(tm) != sz |
1006
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
275 throw(DomainSizeMismatch(tm,sz)) |
487
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
276 end |
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
277 end |
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
278 |
1006
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
279 function check_range_size(tm::LazyTensor, sz) |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
280 if range_size(tm) != sz |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
281 throw(RangeSizeMismatch(tm,sz)) |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
282 end |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
283 end |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
284 |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
285 struct DomainSizeMismatch <: Exception |
995 | 286 tm::LazyTensor |
487
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
287 sz |
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
288 end |
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
289 |
1006
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
290 function Base.showerror(io::IO, err::DomainSizeMismatch) |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
291 print(io, "DomainSizeMismatch: ") |
995 | 292 print(io, "domain size $(domain_size(err.tm)) of LazyTensor not matching size $(err.sz)") |
487
6a6b7eaf9edf
Move exception handling to end of file and update error message.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
485
diff
changeset
|
293 end |
1006
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
294 |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
295 struct RangeSizeMismatch <: Exception |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
296 tm::LazyTensor |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
297 sz |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
298 end |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
299 |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
300 function Base.showerror(io::IO, err::RangeSizeMismatch) |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
301 print(io, "RangeSizeMismatch: ") |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
302 print(io, "range size $(range_size(err.tm)) of LazyTensor not matching size $(err.sz)") |
d9476fede83d
Add check methods for range size
Jonatan Werpers <jonatan@werpers.com>
parents:
1005
diff
changeset
|
303 end |
1049 | 304 |
305 | |
919
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
306 function apply_with_region(op, v, boundary_width::Integer, dim_size::Integer, i) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
307 if 0 < i <= boundary_width |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
308 return LazyTensors.apply(op,v,Index(i,Lower)) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
309 elseif boundary_width < i <= dim_size-boundary_width |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
310 return LazyTensors.apply(op,v,Index(i,Interior)) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
311 elseif dim_size-boundary_width < i <= dim_size |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
312 return LazyTensors.apply(op,v,Index(i,Upper)) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
313 else |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
314 error("Bounds error") # TODO: Make this more standard |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
315 end |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
316 end |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
317 # TBD: Can these methods be merge by having a function as an arguement instead? |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
318 # TODO: Add inference test that show where things break and how this rewrite fixes it. |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
319 function apply_transpose_with_region(op, v, boundary_width::Integer, dim_size::Integer, i) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
320 if 0 < i <= boundary_width |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
321 return LazyTensors.apply_transpose(op,v,Index(i,Lower)) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
322 elseif boundary_width < i <= dim_size-boundary_width |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
323 return LazyTensors.apply_transpose(op,v,Index(i,Interior)) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
324 elseif dim_size-boundary_width < i <= dim_size |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
325 return LazyTensors.apply_transpose(op,v,Index(i,Upper)) |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
326 else |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
327 error("Bounds error") # TODO: Make this more standard |
b41180efb6c2
Start refactor to improve type stability for apply(op,::TensorApplication,...)
Jonatan Werpers <jonatan@werpers.com>
parents:
838
diff
changeset
|
328 end |
1049 | 329 end |