1 |
NOTE: GLK's approximate ranking of 5 most important tagged with |
NOTE: GLK's approximate ranking of 8 most important tagged with |
2 |
[GLK:1], [GLK:2], ... |
[GLK:1], [GLK:2], ... |
3 |
|
|
4 |
============================== |
======================== |
5 |
other SHORT TERM ============= (including needed for LIC) |
SHORT TERM ============= (*needed* for streamlines & tractography) |
6 |
============================== |
======================== |
|
|
|
|
Add a clamp function, which takes three arguments; either three scalars: |
|
|
clamp(x, minval, maxval) = max(minval, min(maxval, x)) |
|
|
or three vectors of the same size: |
|
|
clamp([x,y], minvec, maxvec) = [max(minvec[0], min(maxvec[0], x)), |
|
|
max(minvec[1], min(maxvec[1], y))] |
|
|
This would be useful in many current Diderot programs. |
|
|
One question: clamp(x, minval, maxval) is the argument order |
|
|
used in OpenCL and other places, but clamp(minval, maxval, x) |
|
|
would be more consistent with lerp(minout, maxout, x). |
|
7 |
|
|
8 |
Level of differentiability in field type should be statement about how |
[GLK:3] Add sequence types (needed for evals & evecs) |
|
much differentiation the program *needs*, rather than what the kernel |
|
|
*provides*. The needed differentiability can be less than or equal to |
|
|
the provided differentiability. |
|
|
|
|
|
[GLK:1] Add sequence types (needed for evals & evecs) |
|
9 |
syntax |
syntax |
10 |
types: ty '{' INT '}' |
types: ty '{' INT '}' |
11 |
value construction: '{' e1 ',' … ',' en '}' |
value construction: '{' e1 ',' … ',' en '}' |
12 |
indexing: e '{' e '}' |
indexing: e '{' e '}' |
13 |
|
|
14 |
IL support for higher-order tensor values (matrices, etc). |
[GLK:4] evals & evecs for symmetric tensor[2,2] and |
15 |
tensor construction [DONE] |
tensor[3,3] (requires sequences) |
|
tensor indexing [DONE] |
|
|
tensor slicing |
|
|
verify that hessians work correctly [DONE] |
|
|
|
|
|
Use ∇⊗ etc. syntax |
|
|
syntax [DONE] |
|
|
typechecking |
|
|
IL and codegen |
|
16 |
|
|
17 |
test/uninit.diderot: |
ability to emit/track/record variables into dynamically re-sized |
18 |
documents need for better compiler error messages when output variables |
runtime buffer |
|
are not initialized; the current messages are very cryptic |
|
19 |
|
|
20 |
determinant ("det") for tensor[3,3] |
tensor fields: convolution on general tensor images |
21 |
|
|
22 |
expand trace in mid to low translation |
======================== |
23 |
|
SHORT-ISH TERM ========= (to make using Diderot less annoying to |
24 |
|
======================== program in, and slow to execute) |
25 |
|
|
26 |
value-numbering optimization |
value-numbering optimization |
27 |
|
|
28 |
Add type aliases for color types |
[GLK:1] Add a clamp function, which takes three arguments; either |
29 |
rgb = real{3} |
three scalars: |
30 |
rgba = real{4} |
clamp(lo, hi, x) = max(lo, min(hi, x)) |
31 |
|
or three vectors of the same size: |
32 |
|
clamp(lo, hi, [x,y]) = [max(lo[0], min(hi[0], x)), |
33 |
|
max(lo[1], min(hi[1], y))] |
34 |
|
This would be useful in many current Diderot programs. |
35 |
|
One question: clamp(x, lo, hi) is the argument order used in OpenCL |
36 |
|
and other places, but clamp(lo, hi, x) is much more consistent with |
37 |
|
lerp(lo, hi, x), hence GLK's preference |
38 |
|
|
39 |
============================== |
[GLK:2] Proper handling of stabilize method |
40 |
MEDIUM TERM ================== (including needed for streamlines & tractography) |
|
41 |
============================== |
allow "*" to represent "modulate": per-component multiplication of |
42 |
|
vectors, and vectors only (not tensors of order 2 or higher). Once |
43 |
|
sequences are implemented this should be removed: the operation is not |
44 |
|
invariant WRT basis so it is not a legit vector computation. |
45 |
|
|
46 |
[GLK:1] evals & evecs for symmetric tensor[3,3] (requires sequences) |
implicit type promotion of integers to reals where reals are |
47 |
|
required (e.g. not exponentiation "^") |
48 |
|
|
49 |
[GLK:2] Save Diderot output to nrrd, instead of "mip.txt" |
[GLK:5] Save Diderot output to nrrd, instead of "mip.txt" |
50 |
For grid of strands, save to similarly-shaped array |
For grid of strands, save to similarly-shaped array |
51 |
For list of strands, save to long 1-D (or 2-D for non-scalar output) list |
For list of strands, save to long 1-D (or 2-D for non-scalar output) list |
52 |
For ragged things (like tractography output), will need to save both |
For ragged things (like tractography output), will need to save both |
53 |
complete list of values, as well as list of start indices and lengths |
complete list of values, as well as list of start indices and lengths |
54 |
to index into complete list |
to index into complete list |
55 |
|
|
56 |
[GLK:3] Use of Teem's "hest" command-line parser for getting |
[GLK:6] Use of Teem's "hest" command-line parser for getting |
57 |
any input variables that are not defined in the source file |
any input variables that are not defined in the source file |
58 |
|
|
59 |
[GLK:4] ability to declare a field so that probe positions are |
[GLK:7] ability to declare a field so that probe positions are |
60 |
*always* "inside"; with various ways of mapping the known image values |
*always* "inside"; with various ways of mapping the known image values |
61 |
to non-existant index locations. One possible syntax emphasizes that |
to non-existant index locations. One possible syntax emphasizes that |
62 |
there is a index mapping function that logically precedes convolution: |
there is a index mapping function that logically precedes convolution: |
65 |
F = bspln3 ⊛ (img ◦ mirror) |
F = bspln3 ⊛ (img ◦ mirror) |
66 |
where "◦" or "∘" is used to indicate function composition |
where "◦" or "∘" is used to indicate function composition |
67 |
|
|
68 |
extend norm (|exp|) to all tensor types [DONE for vectors and matrices] |
Level of differentiability in field type should be statement about how |
69 |
|
much differentiation the program *needs*, rather than what the kernel |
70 |
ability to emit/track/record variables into dynamically re-sized |
*provides*. The needed differentiability can be less than or equal to |
71 |
runtime buffer |
the provided differentiability. |
|
|
|
|
Want: allow X *= Y, X /= Y, X += Y, X -= Y to mean what they do in C, |
|
|
provided that X*Y, X/Y, X+Y, X-Y are already supported. |
|
|
Nearly every Diderot program would be simplified by this. |
|
72 |
|
|
73 |
Want: non-trivial field expressions & functions: |
Use ∇⊗ etc. syntax |
74 |
image(2)[2] Vimg = load(...); |
syntax [DONE] |
75 |
field#0(2)[] Vlen = |Vimg ⊛ bspln3|; |
typechecking |
76 |
to get a scalar field of vector length, or |
IL and codegen |
|
field#2(2)[] F = Fimg ⊛ bspln3; |
|
|
field#0(2)[] Gmag = |∇F|; |
|
|
to get a scalar field of gradient magnitude, or |
|
|
field#2(2)[] F = Fimg ⊛ bspln3; |
|
|
field#0(2)[] Gmsq = ∇F•∇F; |
|
|
to get a scalar field of squared gradient magnitude, which is simpler |
|
|
to differentiate. However, there is value in having these, even if |
|
|
the differentiation of them is not supported (hence the indication |
|
|
of "field#0" for these above) |
|
|
|
|
|
Want: ability to apply "normalize" to a field itself, e.g. |
|
|
field#0(2)[2] V = normalize(Vimg ⊛ ctmr); |
|
|
so that V(x) = normalize((Vimg ⊛ ctmr)(x)). |
|
|
Having this would simplify expression of standard LIC method, and |
|
|
would also help express other vector field expressions that arise |
|
|
in vector field feature exraction. |
|
77 |
|
|
78 |
tensor fields: convolution on general tensor images |
Add type aliases for color types |
79 |
|
rgb = real{3} |
80 |
|
rgba = real{4} |
81 |
|
|
82 |
============================== |
============================== |
83 |
other MEDIUM TERM ============ (needed for particles) |
MEDIUM TERM ================== (*needed* for particles) |
84 |
============================== |
============================== |
85 |
|
|
|
Put small 1-D and 2-D fields, when reconstructed specifically by tent |
|
|
and when differentiation is not needed, into faster texture buffers. |
|
|
test/illust-vr.diderot is good example of program that uses multiple |
|
|
such 1-D fields basically as lookup-table-based function evaluation |
|
|
|
|
86 |
run-time birth of strands |
run-time birth of strands |
87 |
|
|
88 |
"initially" supports lists |
"initially" supports lists |
90 |
"initially" supports lists of positions output from |
"initially" supports lists of positions output from |
91 |
different initalization Diderot program |
different initalization Diderot program |
92 |
|
|
93 |
spatial data structure that permits strands' queries of neighbors |
Communication between strands: they have to be able to learn each |
94 |
|
other's state (at the previous iteration). Early version of this can |
95 |
|
have the network of neighbors be completely static (for running one |
96 |
|
strand/pixel image computations). Later version with strands moving |
97 |
|
through the domain will require some spatial data structure to |
98 |
|
optimize discovery of neighbors. |
99 |
|
|
100 |
|
============================ |
101 |
|
MEDIUM-ISH TERM ============ (to make Diderot more useful/effective) |
102 |
|
============================ |
103 |
|
|
104 |
proper handling of stabilize method |
Python/ctypes interface to run-time |
105 |
|
|
106 |
test/vr-kcomp2.diderot: Add support for code like |
support for Python interop and GUI |
107 |
|
|
108 |
(F1 if x else F2)@pos |
Allow integer exponentiation ("^2") to apply to square matrices, |
109 |
|
to represent repeated matrix multiplication |
110 |
|
|
111 |
This will require duplication of the continuation of the conditional |
Alow X *= Y, X /= Y, X += Y, X -= Y to mean what they do in C, |
112 |
(but we should only duplicate over the live-range of the result of the |
provided that X*Y, X/Y, X+Y, X-Y are already supported. |
113 |
conditional. |
Nearly every Diderot program would be simplified by this. |
114 |
|
|
115 |
|
Put small 1-D and 2-D fields, when reconstructed specifically by tent |
116 |
|
and when differentiation is not needed, into faster texture buffers. |
117 |
|
test/illust-vr.diderot is good example of program that uses multiple |
118 |
|
such 1-D fields basically as lookup-table-based function evaluation |
119 |
|
|
120 |
|
expand trace in mid to low translation |
121 |
|
|
122 |
|
extend norm (|exp|) to all tensor types [DONE for vectors and matrices] |
123 |
|
|
124 |
|
determinant ("det") for tensor[3,3] |
125 |
|
|
126 |
add ":" for tensor dot product (contracts out two indices |
add ":" for tensor dot product (contracts out two indices |
127 |
instead of one like •), valid for all pairs of tensors with |
instead of one like •), valid for all pairs of tensors with |
128 |
at least two indices |
at least two indices |
129 |
|
|
130 |
============================== |
test/uninit.diderot: |
131 |
other MEDIUM TERM ============ |
documents need for better compiler error messages when output variables |
132 |
============================== |
are not initialized; the current messages are very cryptic |
133 |
|
|
134 |
want: warnings when "D" (reserved for differentiation) is declared as |
want: warnings when "D" (reserved for differentiation) is declared as |
135 |
a variable name (get confusing error messages now) |
a variable name (get confusing error messages now) |
136 |
|
|
|
support for Python interop and GUI |
|
|
|
|
|
Python/ctypes interface to run-time |
|
|
|
|
|
============================== |
|
|
LONG TERM ==================== |
|
137 |
============================== |
============================== |
138 |
|
LONG TERM ==================== (make Diderot more interesting/attractive from |
139 |
|
============================== a research standpoint) |
140 |
|
|
141 |
|
IL support for higher-order tensor values (matrices, etc). |
142 |
|
tensor construction [DONE] |
143 |
|
tensor indexing [DONE] |
144 |
|
tensor slicing |
145 |
|
verify that hessians work correctly [DONE] |
146 |
|
|
147 |
Better handling of variables that determines the scope of a variable |
Better handling of variables that determines the scope of a variable |
148 |
based on its actual use, instead of where the user defined it. So, |
based on its actual use, instead of where the user defined it. So, |
150 |
scope. Also prune out useless variables, which should include field |
scope. Also prune out useless variables, which should include field |
151 |
variables after the translation to mid-il. |
variables after the translation to mid-il. |
152 |
|
|
153 |
|
test/vr-kcomp2.diderot: Add support for code like |
154 |
|
(F1 if x else F2)@pos |
155 |
|
This will require duplication of the continuation of the conditional |
156 |
|
(but we should only duplicate over the live-range of the result of the |
157 |
|
conditional. |
158 |
|
|
159 |
|
[GLK:8] Want: non-trivial field expressions & functions. |
160 |
|
scalar fields from scalar fields F and G: |
161 |
|
field#0(2)[] X = (sin(F) + 1.0)/2; |
162 |
|
field#0(2)[] X = F*G; |
163 |
|
scalar field of vector field magnitude: |
164 |
|
image(2)[2] Vimg = load(...); |
165 |
|
field#0(2)[] Vlen = |Vimg ⊛ bspln3|; |
166 |
|
field of normalized vectors (for LIC and vector field feature extraction) |
167 |
|
field#2(2)[2] F = ... |
168 |
|
field#0(2)[2] V = normalize(F); |
169 |
|
scalar field of gradient magnitude (for edge detection)) |
170 |
|
field#2(2)[] F = Fimg ⊛ bspln3; |
171 |
|
field#0(2)[] Gmag = |∇F|; |
172 |
|
scalar field of squared gradient magnitude (simpler to differentiate): |
173 |
|
field#2(2)[] F = Fimg ⊛ bspln3; |
174 |
|
field#0(2)[] Gmsq = ∇F•∇F; |
175 |
|
There is value in having these, even if the differentiation of them is |
176 |
|
not supported (hence the indication of "field#0" for these above) |
177 |
|
|
178 |
co- vs contra- index distinction |
co- vs contra- index distinction |
179 |
|
|
180 |
some indication of tensor symmetry |
Permit field composition: |
181 |
|
field#2(3)[3] warp = bspln3 ⊛ warpData; |
182 |
|
field#2(3)[] F = bspln3 ⊛ img; |
183 |
|
field#2(3)[] Fwarp = F ◦ warp; |
184 |
|
So Fwarp(x) = F(warp(X)). Chain rule can be used for differentation. |
185 |
|
This will be instrumental for expressing non-rigid registration |
186 |
|
methods (but those will require co-vs-contra index distinction) |
187 |
|
|
188 |
|
Allow the convolution to be specified either as a single 1D kernel |
189 |
|
(as we have it now): |
190 |
|
field#2(3)[] F = bspln3 ⊛ img; |
191 |
|
or, as a tensor product of kernels, one for each axis, e.g. |
192 |
|
field#0(3)[] F = (bspln3 ⊗ bspln3 ⊗ tent) ⊛ img; |
193 |
|
This is especially important for things like time-varying data, or |
194 |
|
other multi-dimensional fields where one axis of the domain is very |
195 |
|
different from the rest, and hence must be treated separately when |
196 |
|
it comes to convolution. What is very unclear is how, in such cases, |
197 |
|
we should notate the gradient, when we only want to differentiate with |
198 |
|
respect to some subset of the axes. One ambitious idea would be: |
199 |
|
field#0(3)[] Ft = (bspln3 ⊗ bspln3 ⊗ tent) ⊛ img; // 2D time-varying field |
200 |
|
field#0(2)[] F = lambda([x,y], Ft([x,y,42.0])) // restriction to time=42.0 |
201 |
|
vec2 grad = ∇F([x,y]); // 2D gradient |
202 |
|
|
203 |
|
representation of tensor symmetry |
204 |
(have to identify the group of index permutations that are symmetries) |
(have to identify the group of index permutations that are symmetries) |
205 |
|
|
206 |
dot works on all tensors |
dot works on all tensors |
215 |
BUGS ================= |
BUGS ================= |
216 |
====================== |
====================== |
217 |
|
|
|
test/read2vecs.diderot: |
|
|
// HEY (BUG?) shouldn't it be a type error to load this 2-D array of |
|
|
// 2-vectors into a 2-D *scalar* field? Instead, get: |
|
|
// uncaught exception Fail [Fail: Error in compiling lic.diderot] |
|
|
// raised at driver/main.sml:31.39-31.76 |
|
|
image(2)[] Vimg = load("../data/vorttest.nrrd"); |
|
|
|
|
218 |
test/zslice2.diderot: |
test/zslice2.diderot: |
219 |
// HEY (bug) bspln5 leads to problems ... |
// HEY (bug) bspln5 leads to problems ... |
220 |
// uncaught exception Size [size] |
// uncaught exception Size [size] |