5 
SHORT TERM ============= (*needed* for streamlines & tractography) 
SHORT TERM ============= (*needed* for streamlines & tractography) 
6 
======================== 
======================== 
7 


8 
Remove CL from compiler 
[GLK:2] Add sequence types (needed for evals & evecs) 




[GLK:3] 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 
[GLK:4] evals & evecs for symmetric tensor[2,2] and 
[GLK:3] evals & evecs for symmetric tensor[2,2] and 
15 
tensor[3,3] (requires sequences) 
tensor[3,3] (requires sequences) 
16 


17 
ability to emit/track/record variables into dynamically resized 
ability to emit/track/record variables into dynamically resized 
18 
runtime buffer 
runtime output buffer 
19 


20 
tensor fields: convolution on general tensor images 
tensor fields: convolution on general tensor images (order > 1) 
21 


22 
======================== 
======================== 
23 
SHORTISH TERM ========= (to make using Diderot less annoying to 
SHORTISH TERM ========= (to make using Diderot less annoying to 
24 
======================== program in, and slow to execute) 
======================== program in, and slow to execute) 
25 



valuenumbering optimization [DONE] 




26 
Allow ".ddro" file extensions in addition to ".diderot" 
Allow ".ddro" file extensions in addition to ".diderot" 
27 


28 
Be able to output values of type tensor[2,2] and tensor[3,3]; 
Be able to output values of type tensor[2,2] and tensor[3,3]; 
29 
(currently only scalars & vectors). Want to add some regression tests 
(currently only scalars & vectors). Want to add some regression tests 
30 
based on this and currently can't 
based on this and currently can't 
31 


32 
[GLK:1] Add a clamp function, which takes three arguments; either 
[GLK:1] Proper handling of stabilize method 

three scalars: 


clamp(lo, hi, x) = max(lo, min(hi, x)) 


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 


[DONE] 





[GLK:2] Proper handling of stabilize method 

33 


34 
allow "*" to represent "modulate": percomponent multiplication of 
allow "*" to represent "modulate": percomponent multiplication of 
35 
vectors, and vectors only (not tensors of order 2 or higher). Once 
vectors, and vectors only (not tensors of order 2 or higher). Once 
39 
implicit type promotion of integers to reals where reals are 
implicit type promotion of integers to reals where reals are 
40 
required (e.g. not exponentiation "^") 
required (e.g. not exponentiation "^") 
41 


42 
[GLK:5] Save Diderot output to nrrd, instead of "mip.txt" 
[GLK:4] Save Diderot output to nrrd, instead of "mip.txt" 
43 
For grid of strands, save to similarlyshaped array 
For grid of strands, save to similarlyshaped array 
44 
For list of strands, save to long 1D (or 2D for nonscalar output) list 
For list of strands, save to long 1D (or 2D for nonscalar output) list 
45 
For ragged things (like tractography output), will need to save both 
For ragged things (like tractography output), will need to save both 
46 
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 
47 
to index into complete list 
to index into complete list 
48 


49 
[GLK:6] Use of Teem's "hest" commandline parser for getting 
[GLK:5] ability to declare a field so that probe positions are 

any "input" variables that are not defined in the source file. 





[GLK:7] ability to declare a field so that probe positions are 

50 
*always* "inside"; with various ways of mapping the known image values 
*always* "inside"; with various ways of mapping the known image values 
51 
to nonexistant index locations. One possible syntax emphasizes that 
to nonexistant index locations. One possible syntax emphasizes that 
52 
there is a index mapping function that logically precedes convolution: 
there is a index mapping function that logically precedes convolution: 
69 
rgb = real{3} 
rgb = real{3} 
70 
rgba = real{4} 
rgba = real{4} 
71 


72 

Revisit how images are created within the language. 
73 

The "load" operator should probably go away, and its strangs 
74 

that strings are there only as a way to refer to nrrd filenames 
75 


76 
============================== 
============================== 
77 
MEDIUM TERM ================== (*needed* for particles) 
MEDIUM TERM ================== (*needed* for particles) 
78 
============================== 
============================== 
104 
Allow integer exponentiation ("^2") to apply to square matrices, 
Allow integer exponentiation ("^2") to apply to square matrices, 
105 
to represent repeated matrix multiplication 
to represent repeated matrix multiplication 
106 



Alow X *= Y, X /= Y, X += Y, X = Y to mean what they do in C, 


provided that X*Y, X/Y, X+Y, XY are already supported. 


Nearly every Diderot program would be simplified by this. 




107 
Put small 1D and 2D fields, when reconstructed specifically by tent 
Put small 1D and 2D fields, when reconstructed specifically by tent 
108 
and when differentiation is not needed, into faster texture buffers. 
and when differentiation is not needed, into faster texture buffers. 
109 
test/illustvr.diderot is good example of program that uses multiple 
test/illustvr.diderot is good example of program that uses multiple 
110 
such 1D fields basically as lookuptablebased function evaluation 
such 1D fields basically as lookuptablebased function evaluation 
111 



expand trace in mid to low translation 




112 
extend norm (exp) to all tensor types [DONE for vectors and matrices] 
extend norm (exp) to all tensor types [DONE for vectors and matrices] 
113 


114 
determinant ("det") for tensor[3,3] 
determinant ("det") for tensor[3,3] 
128 
LONG TERM ==================== (make Diderot more interesting/attractive from 
LONG TERM ==================== (make Diderot more interesting/attractive from 
129 
============================== a research standpoint) 
============================== a research standpoint) 
130 


131 

[GLK:6] Want codegeneration working for tensors of order three. 
132 

Order three matters for edge detection in scalar fields (to get 
133 

second derivatives of gradient magnitude), second derivatives 
134 

of vector fields (for some feature extraction), and first 
135 

derivatives of diffusion tensor fields. 
136 


137 
IL support for higherorder tensor values (matrices, etc). 
IL support for higherorder tensor values (matrices, etc). 
138 
tensor construction [DONE] 
tensor construction [DONE] 
139 
tensor indexing [DONE] 
tensor indexing [DONE] 
140 
tensor slicing 
tensor slicing 

verify that hessians work correctly [DONE] 

141 


142 
Better handling of variables that determines the scope of a variable 
Better handling of variables that determines the scope of a variable 
143 
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, 
151 
(but we should only duplicate over the liverange of the result of the 
(but we should only duplicate over the liverange of the result of the 
152 
conditional. 
conditional. 
153 


154 
[GLK:8] Want: nontrivial field expressions & functions. 
[GLK:7] Want: nontrivial 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; 
253 
// uncaught exception Size [size] 
// uncaught exception Size [size] 
254 
// raised at ctarget/ctarget.sml:47.1547.19 
// raised at ctarget/ctarget.sml:47.1547.19 
255 
//field#4(3)[] F = img ⊛ bspln5; 
//field#4(3)[] F = img ⊛ bspln5; 
256 

