Mercurial > repos > public > sbplib_julia
annotate src/LazyTensors/tuple_manipulation.jl @ 1227:06b983f0d236 refactor/LazyTensors/tuple_manipulation
Delete complicated versions of split_tuple and slice_tuple
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sat, 18 Feb 2023 21:56:29 +0100 |
parents | ea5b4fca85e0 |
children | 73f262a0a384 |
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) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
42 if length(t) != sum(szs; init=0) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
43 throw(ArgumentError("length(t) must equal sum(szs)")) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
44 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
45 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
46 rs = sizes_to_ranges(szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
47 return map(r->t[r], rs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
48 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
49 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
50 function sizes_to_ranges(szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
51 cum_szs = cumsum((0, szs...)) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
52 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
|
53 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
54 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
55 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
|
56 concatenate_tuples(t::Tuple) = t |
997
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
58 |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
59 """ |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
60 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
|
61 |
1215
07c213167f7c
Fix typos in docstrings
Jonatan Werpers <jonatan@werpers.com>
parents:
1094
diff
changeset
|
62 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
|
63 """ |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
64 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
|
65 if N < length(t) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
66 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
|
67 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
68 |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
69 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
|
70 return (padding..., t...) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
71 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
72 |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
73 """ |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
74 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
|
75 |
1215
07c213167f7c
Fix typos in docstrings
Jonatan Werpers <jonatan@werpers.com>
parents:
1094
diff
changeset
|
76 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
|
77 """ |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
78 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
|
79 if N < length(t) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
80 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
|
81 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
82 |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
83 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
|
84 return (t..., padding...) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
85 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
86 |