# specification of operators for MidIL version of the IR. Each line (other than comments) # specifies an operator using five fields, which are separated by ":". The fields are # name # argument type (optional) # result arity # arity # comment (optional) # # type-indexed arithmetic operations Add : ty : 1 : 2 : Sub : ty : 1 : 2 : Mul : ty : 1 : 2 : Div : ty : 1 : 2 : Neg : ty : 1 : 1 : Abs : ty : 1 : 1 : LT : ty : 1 : 2 : LTE : ty : 1 : 2 : EQ : ty : 1 : 2 : NEQ : ty : 1 : 2 : GT : ty : 1 : 2 : GTE : ty : 1 : 2 : Not : : 1 : 1 : boolean negation Max : : 1 : 2 : Min : : 1 : 2 : # Clamp(lo, hi, x) -- clamps x to the range lo..hi Clamp : ty : 1 : 3 : clamp argument to range # Lerp(a, b, t) -- computes a + t*(b-a) Lerp : ty : 1 : 3 : linear interpolation between 0 and 1 # ### vector operations # Dot(u, v) -- computes dot product of u and v; n specifies u and v's arity Dot : int : 1 : 2 : # MulVecMat(v, M) -- computes v*M, where M is an mxn-matrix and v is an m-vector MulVecMat : int * int : 1 : 2 : vector times matrix multiplication # MulMatVec(M, v) -- computes M*v, where M is an mxn-matrix and v is a n-vector MulMatVec : int * int : 1 : 2 : matrix times vector multiplication (type is matrix type) # MulMatMat(M, N) -- computes M*N, where M is an mxn-matrix and N is an nxp-matrix MulMatMat : int * int * int : 1 : 2 : matrix times matrix multiplication # MulVecTen3(v, T) -- computes v*T, where T is an mxnxp-tensor and v is an m-vector MulVecTen3 : int * int * int : 1 : 2 : vector times 3rd-order tensor multiplication # MulTen3Vec(v, T) -- computes T*v, where T is an mxnxp-tensor and v is a p-vector MulTen3Vec : int * int * int : 1 : 2 : 3rd-order tensor times vector multiplication # Cross(u, v) -- computes cross product of u and v Cross : : 1 : 2 : # Norm(x) -- returns the norm of the tensor x, which has type ty Norm : ty : 1 : 1 : # Normalize(v) -- returns the unit vector in direction u; n is the length ov u Normalize : int : 1 : 1 : # Scale(s,u) -- multiply scalar s time tensor u; ty specifies u's type Scale : ty : 1 : 2 : scalar*tensor multiplication PrincipleEvec : ty : 1 : 2 : principle eigenvector; ty is result vector type EigenVecs2x2 : : 1 : 1 : Eigen vectors and values for 2x2 matrix EigenVecs3x3 : : 1 : 1 : Eigen vectors and values for 3x3 matrix EigenVals2x2 : : 1 : 1 : Eigen values for 2x2 matrix EigenVals3x3 : : 1 : 1 : Eigen values for 3x3 matrix # Identity() -- nxn identity matrix Identity : int : 1 : 0 : identity matrix # Zero() -- zero tensor Zero : ty : 1 : 0 : identity matrix # Trace(m) -- computes trace of nxn matrix m Trace : int : 1 : 1 : compute trace of matrix # # operations on sequences # Select(u) -- select ith element of tuple; ty is tuple type Select : ty * int : 1 : 1 : # Index(u) -- select ith element of sequence; ty is sequence type Index : ty * int : 1 : 1 : # Subscript(u,i) -- select ith element of sequence; ty is type of sequence Subscript : ty : 1 : 2 : # MkDynamic -- make a sequence with type ty{n} into a dynamic sequence MkDynamic : ty * int : 1 : 1 : make a fixed-length sequence dynamic Append : ty : 2 : 1 : append an element onto a dynamic sequence Prepend : ty : 2 : 1 : prepend an element onto a dynamic sequence Concat : ty : 2 : 1 : concatenate two dynamic sequences # Length -- return the length of a sequence with type ty{} Length : ty : 1 : 1 : return the length of a dynamic sequence # # compute integral parts of reals Ceiling : int : 1 : 1 : compute real ceiling of a vector Floor : int : 1 : 1 : compute real floor of a vector Round : int : 1 : 1 : compute real rounding to nearest integral real of a vector Trunc : int : 1 : 1 : compute real truncation to integral real of a vector # ### conversions; the real to int forms are vector ops IntToReal : : 1 : 1 : RealToInt : int : 1 : 1 : cast real vector to int vector # ### image/kernel operations # VoxelAddress(V, i, j, ...) -- compute the address of the voxel data indexed by i, j, ... # for non-scalar images, the offset specifies which sample and I specifies the stride. VoxelAddress : ImageInfo.info * int : 1 : * : compute the address of a voxel # LoadVoxels(a) -- load a vector of n voxels from the address a LoadVoxels : ImageInfo.info * int : 1 : 1 : load a vector of voxel values from an address # PosToImgSpace(V,u) -- transforms the world-space position u into the image-space specified by V. PosToImgSpace : ImageInfo.info : 1 : 2 : transform a world-space position to image-space # TensorToWorldSpace(V,u) -- transforms the image-space tensor u to from V's image space to world space TensorToWorldSpace : ImageInfo.info * ty : 1 : 2 : transform an image-space gradient to world-space # EvalKernel(u) -- computes (D^k h)(u), where i is the size of vector u. EvalKernel : int * Kernel.kernel * int : 1 : 1 : apply a kernel function to a scalar or vector of arguments LoadImage : ImageInfo.info : 1 : 1 : image-file loading # Inside(u,V) -- tests to see if image-space position u is inside the volume # occupied by the image V. I is the image info and s is the border width Inside : ImageInfo.info * int : 1 : 2 : # # inputs Input : ty * string * string : 1 : 0 : InputWithDefault : ty * string * string : 1 : 1 : # # printing support for debugging Print : tys : 0 : * : print strings
Click to toggle
does not end with </html> tag
does not end with </body> tag
The output has ended thus: * string * string : 1 : 1 : # # printing support for debugging Print : tys : 0 : * : print strings