Mercurial > repos > public > sbplib_julia
annotate src/LazyTensors/tuple_manipulation.jl @ 1229:8f4259fbd39c refactor/LazyTensors/tuple_manipulation
Simplify split_index
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sun, 19 Feb 2023 11:43:29 +0100 |
parents | 73f262a0a384 |
children | 723a583cef96 |
rev | line source |
---|---|
997
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 """ |
1229
8f4259fbd39c
Simplify split_index
Jonatan Werpers <jonatan@werpers.com>
parents:
1228
diff
changeset
|
2 split_index(dim_before, dim_view, dim_index, dim_after, I...) |
997
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 ``` |
1229
8f4259fbd39c
Simplify split_index
Jonatan Werpers <jonatan@werpers.com>
parents:
1228
diff
changeset
|
8 split_index(1, 3, 2, 1, (1,2,3,4)) -> (1,:,:,:,4), (2,3) |
997
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 """ |
1229
8f4259fbd39c
Simplify split_index
Jonatan Werpers <jonatan@werpers.com>
parents:
1228
diff
changeset
|
21 function split_index(dim_before, dim_view, dim_index, dim_after, I...) |
8f4259fbd39c
Simplify split_index
Jonatan Werpers <jonatan@werpers.com>
parents:
1228
diff
changeset
|
22 @inline |
8f4259fbd39c
Simplify split_index
Jonatan Werpers <jonatan@werpers.com>
parents:
1228
diff
changeset
|
23 I_before, I_middle, I_after = 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
|
24 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 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
|
26 |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 return view_index, I_middle |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 end |
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 |
1223
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 """ |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
32 split_tuple(t, szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
33 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
34 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
|
35 `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
|
36 |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
37 E.g |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
38 ```julia |
ea5b4fca85e0
Add an example in the docstring to split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1225
diff
changeset
|
39 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
|
40 ``` |
1223
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
41 """ |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
42 function split_tuple(t, szs) |
1228
73f262a0a384
Add @inline to definition of split_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1227
diff
changeset
|
43 @inline |
1223
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
44 if length(t) != sum(szs; init=0) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
45 throw(ArgumentError("length(t) must equal sum(szs)")) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
46 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
47 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
48 rs = sizes_to_ranges(szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
49 return map(r->t[r], rs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
50 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
51 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
52 function sizes_to_ranges(szs) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
53 cum_szs = cumsum((0, szs...)) |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
54 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
|
55 end |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
56 |
5bfb182e24dc
Start adding simpler code
Jonatan Werpers <jonatan@werpers.com>
parents:
1215
diff
changeset
|
57 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
|
58 concatenate_tuples(t::Tuple) = t |
997
20c376dffe84
Move tuple functions to their own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
60 |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
61 """ |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
62 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
|
63 |
1215
07c213167f7c
Fix typos in docstrings
Jonatan Werpers <jonatan@werpers.com>
parents:
1094
diff
changeset
|
64 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
|
65 """ |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
66 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
|
67 if N < length(t) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
68 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
|
69 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
70 |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
71 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
|
72 return (padding..., t...) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
73 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
74 |
1094
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
75 """ |
672610322206
Add docs for left_pad_tuple and right_pad_tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
1087
diff
changeset
|
76 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
|
77 |
1215
07c213167f7c
Fix typos in docstrings
Jonatan Werpers <jonatan@werpers.com>
parents:
1094
diff
changeset
|
78 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
|
79 """ |
1031
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
80 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
|
81 if N < length(t) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
82 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
|
83 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
84 |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
85 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
|
86 return (t..., padding...) |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
87 end |
0905cec43d2e
Add left and right pad functions for tuple
Jonatan Werpers <jonatan@werpers.com>
parents:
997
diff
changeset
|
88 |