5 |
SHORT TERM ============= (*needed* for streamlines & tractography) |
SHORT TERM ============= (*needed* for streamlines & tractography) |
6 |
======================== |
======================== |
7 |
|
|
8 |
[GLK:3] Add sequence types (needed for evals & evecs) |
Remove CL from compiler [DONE] |
9 |
|
|
10 |
|
[GLK:2] Add sequence types (needed for evals & evecs) |
11 |
syntax |
syntax |
12 |
types: ty '{' INT '}' |
types: ty '{' INT '}' |
13 |
value construction: '{' e1 ',' … ',' en '}' |
value construction: '{' e1 ',' … ',' en '}' |
14 |
indexing: e '{' e '}' |
indexing: e '{' e '}' |
15 |
|
|
16 |
[GLK:4] evals & evecs for symmetric tensor[2,2] and |
[GLK:3] evals & evecs for symmetric tensor[2,2] and |
17 |
tensor[3,3] (requires sequences) |
tensor[3,3] (requires sequences) |
18 |
|
|
19 |
ability to emit/track/record variables into dynamically re-sized |
ability to emit/track/record variables into dynamically re-sized |
20 |
runtime buffer |
runtime buffer |
21 |
|
|
22 |
tensor fields: convolution on general tensor images |
tensor fields: convolution on general tensor images (order > 1) |
23 |
|
|
24 |
======================== |
======================== |
25 |
SHORT-ISH TERM ========= (to make using Diderot less annoying to |
SHORT-ISH TERM ========= (to make using Diderot less annoying to |
26 |
======================== program in, and slow to execute) |
======================== program in, and slow to execute) |
27 |
|
|
28 |
value-numbering optimization |
value-numbering optimization [DONE] |
29 |
|
|
30 |
|
Allow ".ddro" file extensions in addition to ".diderot" |
31 |
|
|
32 |
[GLK:1] Add a clamp function, which takes three arguments; either |
Be able to output values of type tensor[2,2] and tensor[3,3]; |
33 |
three scalars: |
(currently only scalars & vectors). Want to add some regression tests |
34 |
clamp(lo, hi, x) = max(lo, min(hi, x)) |
based on this and currently can't |
|
or three vectors of the same size: |
|
|
clamp(lo, hi, [x,y]) = [max(lo[0], min(hi[0], x)), |
|
|
max(lo[1], min(hi[1], y))] |
|
|
This would be useful in many current Diderot programs. |
|
|
One question: clamp(x, lo, hi) is the argument order used in OpenCL |
|
|
and other places, but clamp(lo, hi, x) is much more consistent with |
|
|
lerp(lo, hi, x), hence GLK's preference |
|
35 |
|
|
36 |
[GLK:2] Proper handling of stabilize method |
[GLK:1] Proper handling of stabilize method |
37 |
|
|
38 |
allow "*" to represent "modulate": per-component multiplication of |
allow "*" to represent "modulate": per-component multiplication of |
39 |
vectors, and vectors only (not tensors of order 2 or higher). Once |
vectors, and vectors only (not tensors of order 2 or higher). Once |
43 |
implicit type promotion of integers to reals where reals are |
implicit type promotion of integers to reals where reals are |
44 |
required (e.g. not exponentiation "^") |
required (e.g. not exponentiation "^") |
45 |
|
|
46 |
[GLK:5] Save Diderot output to nrrd, instead of "mip.txt" |
[GLK:4] Save Diderot output to nrrd, instead of "mip.txt" |
47 |
For grid of strands, save to similarly-shaped array |
For grid of strands, save to similarly-shaped array |
48 |
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 |
49 |
For ragged things (like tractography output), will need to save both |
For ragged things (like tractography output), will need to save both |
50 |
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 |
51 |
to index into complete list |
to index into complete list |
52 |
|
|
53 |
[GLK:6] Use of Teem's "hest" command-line parser for getting |
[GLK:5] Use of Teem's "hest" command-line parser for getting |
54 |
any input variables that are not defined in the source file |
any "input" variables that are not defined in the source file. [DONE] |
55 |
|
|
56 |
[GLK:7] ability to declare a field so that probe positions are |
[GLK:6] ability to declare a field so that probe positions are |
57 |
*always* "inside"; with various ways of mapping the known image values |
*always* "inside"; with various ways of mapping the known image values |
58 |
to non-existant index locations. One possible syntax emphasizes that |
to non-existant index locations. One possible syntax emphasizes that |
59 |
there is a index mapping function that logically precedes convolution: |
there is a index mapping function that logically precedes convolution: |
84 |
|
|
85 |
"initially" supports lists |
"initially" supports lists |
86 |
|
|
87 |
"initially" supports lists of positions output from |
"initially" supports lists of positions output from different |
88 |
different initalization Diderot program |
initalization Diderot program (or output from the same program; |
89 |
|
e.g. using output of iso2d.diderot for one isovalue to seed the input |
90 |
|
to another invocation of the same program) |
91 |
|
|
92 |
Communication between strands: they have to be able to learn each |
Communication between strands: they have to be able to learn each |
93 |
other's state (at the previous iteration). Early version of this can |
other's state (at the previous iteration). Early version of this can |
107 |
Allow integer exponentiation ("^2") to apply to square matrices, |
Allow integer exponentiation ("^2") to apply to square matrices, |
108 |
to represent repeated matrix multiplication |
to represent repeated matrix multiplication |
109 |
|
|
|
Alow 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. |
|
|
|
|
110 |
Put small 1-D and 2-D fields, when reconstructed specifically by tent |
Put small 1-D and 2-D fields, when reconstructed specifically by tent |
111 |
and when differentiation is not needed, into faster texture buffers. |
and when differentiation is not needed, into faster texture buffers. |
112 |
test/illust-vr.diderot is good example of program that uses multiple |
test/illust-vr.diderot is good example of program that uses multiple |
113 |
such 1-D fields basically as lookup-table-based function evaluation |
such 1-D fields basically as lookup-table-based function evaluation |
114 |
|
|
115 |
expand trace in mid to low translation |
expand trace in mid to low translation [DONE] |
116 |
|
|
117 |
extend norm (|exp|) to all tensor types [DONE for vectors and matrices] |
extend norm (|exp|) to all tensor types [DONE for vectors and matrices] |
118 |
|
|
151 |
(but we should only duplicate over the live-range of the result of the |
(but we should only duplicate over the live-range of the result of the |
152 |
conditional. |
conditional. |
153 |
|
|
154 |
[GLK:8] Want: non-trivial field expressions & functions. |
[GLK:7] Want: non-trivial field expressions & functions. |
155 |
scalar fields from scalar fields F and G: |
scalar fields from scalar fields F and G: |
156 |
field#0(2)[] X = (sin(F) + 1.0)/2; |
field#0(2)[] X = (sin(F) + 1.0)/2; |
157 |
field#0(2)[] X = F*G; |
field#0(2)[] X = F*G; |
170 |
There is value in having these, even if the differentiation of them is |
There is value in having these, even if the differentiation of them is |
171 |
not supported (hence the indication of "field#0" for these above) |
not supported (hence the indication of "field#0" for these above) |
172 |
|
|
173 |
|
Introduce region types (syntax region(d), where d is the dimension of the |
174 |
|
region. One useful operator would be |
175 |
|
dom : field#k(d)[s] -> region(d) |
176 |
|
Then the inside test could be written as |
177 |
|
pos ∈ dom(F) |
178 |
|
We could further extend this approach to allow geometric definitions of |
179 |
|
regions. It might also be useful to do inside tests in world space, |
180 |
|
instead of image space. |
181 |
|
|
182 |
co- vs contra- index distinction |
co- vs contra- index distinction |
183 |
|
|
184 |
Permit field composition: |
Permit field composition: |
194 |
field#2(3)[] F = bspln3 ⊛ img; |
field#2(3)[] F = bspln3 ⊛ img; |
195 |
or, as a tensor product of kernels, one for each axis, e.g. |
or, as a tensor product of kernels, one for each axis, e.g. |
196 |
field#0(3)[] F = (bspln3 ⊗ bspln3 ⊗ tent) ⊛ img; |
field#0(3)[] F = (bspln3 ⊗ bspln3 ⊗ tent) ⊛ img; |
197 |
This is especially important for things like time-varying data, or |
This is especially important for things like time-varying fields |
198 |
other multi-dimensional fields where one axis of the domain is very |
and the use of scale-space in field visualization: one axis of the |
199 |
different from the rest, and hence must be treated separately when |
must be convolved with a different kernel during probing. |
200 |
it comes to convolution. What is very unclear is how, in such cases, |
What is very unclear is how, in such cases, we should notate the |
201 |
we should notate the gradient, when we only want to differentiate with |
gradient, when we only want to differentiate with respect to some |
202 |
respect to some subset of the axes. One ambitious idea would be: |
subset of the axes. One ambitious idea would be: |
203 |
field#0(3)[] Ft = (bspln3 ⊗ bspln3 ⊗ tent) ⊛ img; // 2D time-varying field |
field#0(3)[] Ft = (bspln3 ⊗ bspln3 ⊗ tent) ⊛ img; // 2D time-varying field |
204 |
field#0(2)[] F = lambda([x,y], Ft([x,y,42.0])) // restriction to time=42.0 |
field#0(2)[] F = lambda([x,y], Ft([x,y,42.0])) // restriction to time=42.0 |
205 |
vec2 grad = ∇F([x,y]); // 2D gradient |
vec2 grad = ∇F([x,y]); // 2D gradient |
206 |
|
|
207 |
|
Tensors of order 3 (e.g. gradients of diffusion tensor fields, or |
208 |
|
hessians of vector fields) and order 4 (e.g. Hessians of diffusion |
209 |
|
tensor fields). |
210 |
|
|
211 |
representation of tensor symmetry |
representation of tensor symmetry |
212 |
(have to identify the group of index permutations that are symmetries) |
(have to identify the group of index permutations that are symmetries) |
213 |
|
|
215 |
|
|
216 |
outer works on all tensors |
outer works on all tensors |
217 |
|
|
218 |
|
Help for debugging Diderot programs: need to be able to uniquely |
219 |
|
identify strands, and for particular strands that are known to behave |
220 |
|
badly, do something like printf or other logging of their computations |
221 |
|
and updates. |
222 |
|
|
223 |
|
Permit writing dimensionally general code: Have some statement of the |
224 |
|
dimension of the world "W" (or have it be learned from one particular |
225 |
|
field of interest), and then able to write "vec" instead of |
226 |
|
"vec2/vec3", and perhaps "tensor[W,W]" instead of |
227 |
|
"tensor[2,2]/tensor[3,3]" |
228 |
|
|
229 |
|
Traits: all things things that have boilerplate code (especially |
230 |
|
volume rendering) should be expressed in terms of the unique |
231 |
|
computational core. Different kinds of streamline/tractography |
232 |
|
computation will be another example, as well as particle systems. |
233 |
|
|
234 |
Einstein summation notation |
Einstein summation notation |
235 |
|
|
236 |
"tensor comprehension" (like list comprehension) |
"tensor comprehension" (like list comprehension) |
237 |
|
|
238 |
|
Fields coming from different sources of data: |
239 |
|
* triangular or tetrahedral meshes over 2D or 3D domains (of the |
240 |
|
source produced by finite-element codes; these will come with their |
241 |
|
own specialized kinds of reconstruction kernels, called "basis |
242 |
|
functions" in this context) |
243 |
|
* Large point clouds, with some radial basis function around each point, |
244 |
|
which will be tuned by parameters of the point (at least one parameter |
245 |
|
giving some notion of radius) |
246 |
|
|
247 |
====================== |
====================== |
248 |
BUGS ================= |
BUGS ================= |
249 |
====================== |
====================== |
253 |
// uncaught exception Size [size] |
// uncaught exception Size [size] |
254 |
// raised at c-target/c-target.sml:47.15-47.19 |
// raised at c-target/c-target.sml:47.15-47.19 |
255 |
//field#4(3)[] F = img ⊛ bspln5; |
//field#4(3)[] F = img ⊛ bspln5; |
256 |
|
|