Mercurial > repos > public > sbplib_julia
annotate src/LazyTensors/tuple_manipulation.jl @ 1228:73f262a0a384 refactor/LazyTensors/tuple_manipulation
Add @inline to definition of split_tuple
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sun, 19 Feb 2023 11:41:40 +0100 |
parents | 06b983f0d236 |
children | 8f4259fbd39c |
rev | line source |
---|---|
997
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 """ |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 split_index(::Val{dim_before}, ::Val{dim_view}, ::Val{dim_index}, ::Val{dim_after}, I...) |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 Splits the multi-index `I` into two parts. One part which is expected to be |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 used as a view, and one which is expected to be used as an index. |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 Eg. |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 ``` |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 split_index(Val(1),Val(3),Val(2),Val(1),(1,2,3,4)) -> (1,:,:,:,4), (2,3) |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 ``` |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 `dim_view` controls how many colons are in the view, and `dim_index` controls |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 how many elements are extracted from the middle. |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 `dim_before` and `dim_after` decides the length of the index parts before and after the colons in the view index. |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 Arguments should satisfy `length(I) == dim_before+B_domain+dim_after`. |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 The returned values satisfy |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 * `length(view_index) == dim_before + dim_view + dim_after` |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 * `length(I_middle) == dim_index` |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 """ |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 function split_index(::Val{dim_before}, ::Val{dim_view}, ::Val{dim_index}, ::Val{dim_after}, I...) where {dim_before,dim_view, dim_index,dim_after} |
1227
06b983f0d236
Delete complicated versions of split_tuple and slice_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1226
diff
changeset
|
22 I_before, I_middle, I_after = @inline split_tuple(I, (dim_before, dim_index, dim_after)) |
997
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 view_index = (I_before..., ntuple((i)->:, dim_view)..., I_after...) |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 return view_index, I_middle |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 end |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 |
1223
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
29 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
30 """ |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
31 split_tuple(t, szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
32 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
33 Split the tuple `t` into a set of tuples of the sizes given in `szs`. |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
34 `sum(szs)` should equal `lenght(t)`. |
1226
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
35 |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
36 E.g |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
37 ```julia |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
38 split_tuple((1,2,3,4,5,6), (3,1,2)) -> (1,2,3),(4,),(5,6) |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
39 ``` |
1223
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
40 """ |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
41 function split_tuple(t, szs) |
1228
73f262a0a384
Add @inline to definition of split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1227
diff
changeset
|
42 @inline |
1223
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
43 if length(t) != sum(szs; init=0) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
44 throw(ArgumentError("length(t) must equal sum(szs)")) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
45 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
46 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
47 rs = sizes_to_ranges(szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
48 return map(r->t[r], rs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
49 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
50 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
51 function sizes_to_ranges(szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
52 cum_szs = cumsum((0, szs...)) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
53 return ntuple(i->cum_szs[i]+1:cum_szs[i+1], length(szs)) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
54 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
55 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
56 concatenate_tuples(t::Tuple,ts::Vararg{Tuple}) = (t..., concatenate_tuples(ts...)...) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
57 concatenate_tuples(t::Tuple) = t |
997
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
59 |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
60 """ |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
61 left_pad_tuple(t, val, N) |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
62 |
1215
07c213167f7c
Fix typos in docstrings
Jonatan Werpers <jonatan@werpers.com>
parents:
1094
diff
changeset
|
63 Left pad the tuple `t` to length `N` using the value `val`. |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
64 """ |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
65 function left_pad_tuple(t, val, N) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
66 if N < length(t) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
67 throw(DomainError(N, "Can't pad tuple of length $(length(t)) to $N elements")) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
68 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
69 |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
70 padding = ntuple(i->val, N-length(t)) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
71 return (padding..., t...) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
72 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
73 |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
74 """ |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
75 right_pad_tuple(t, val, N) |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
76 |
1215
07c213167f7c
Fix typos in docstrings
Jonatan Werpers <jonatan@werpers.com>
parents:
1094
diff
changeset
|
77 Right pad the tuple `t` to length `N` using the value `val`. |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
78 """ |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
79 function right_pad_tuple(t, val, N) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
80 if N < length(t) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
81 throw(DomainError(N, "Can't pad tuple of length $(length(t)) to $N elements")) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
82 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
83 |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
84 padding = ntuple(i->val, N-length(t)) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
85 return (t..., padding...) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
86 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
87 |