Finch Logic (High-Level IR)
Finch Logic is an internal high-level intermediate representation (IR) that allows us to fuse and optimize successive calls to array operations such as map
, reduce
, and broadcast
. It is reminiscent to database query notation, representing the a sequence of tensor expressions bound to variables. Values in the program are tensors, with named indices. The order of indices is semantically meaningful.
The nodes are as follows:
Finch.FinchLogic.immediate
— Constantimmediate(val)
Logical AST expression for the literal value val
.
Finch.FinchLogic.deferred
— Constantdeferred(ex, [type])
Logical AST expression for an expression ex
of type type
, yet to be evaluated.
Finch.FinchLogic.field
— Constantfield(name)
Logical AST expression for an field named name
.
Finch.FinchLogic.alias
— Constantalias(name)
Logical AST expression for an alias named name
.
Finch.FinchLogic.table
— Constanttable(tns, idxs...)
Logical AST expression for a tensor object tns
, indexed by fields idxs...
.
Finch.FinchLogic.mapjoin
— Constantmapjoin(op, args...)
Logical AST expression for mapping the function op
across args...
. The order of fields in the mapjoin is unique(vcat(map(getfields, args)...))
Finch.FinchLogic.aggregate
— Constantaggregate(op, init, arg, idxs...)
Logical AST statement that reduces arg
using op
, starting with init
. idxs
are the dimensions to reduce. May happen in any order.
Finch.FinchLogic.reorder
— Constantreorder(arg, idxs...)
Logical AST statement that reorders the dimensions of arg
to be idxs...
. Dimensions known to be length 1 may be dropped. Dimensions that do not exist in arg
may be added. Dimensions added in this way are known as "extruded" dimensions. These dimensions have length 1, but may be broadcasted along dimensions which are not 1 in a mapjoin.
Finch.FinchLogic.relabel
— Constantrelabel(arg, idxs...)
Logical AST statement that relabels the dimensions of arg
to be idxs...
Finch.FinchLogic.reformat
— Constantreformat(tns, arg)
Logical AST statement that reformats arg
into the tensor tns
.
Finch.FinchLogic.subquery
— Constantsubquery(lhs, arg)
Logical AST statement that evaluates arg
, binding the result to lhs
, and returns arg
.
Finch.FinchLogic.query
— Constantquery(lhs, rhs)
Logical AST statement that evaluates rhs
, binding the result to lhs
.
Finch.FinchLogic.produces
— Constantproduces(args...)
Logical AST statement that returns args...
from the current plan. Halts execution of the program.
Finch.FinchLogic.plan
— Constantplan(bodies...)
Logical AST statement that executes a sequence of statements bodies...
.
Finch Logic Internals
Finch.FinchLogic.LogicNode
— TypeLogicNode
A Finch Logic IR node. Finch uses a variant of Concrete Field Notation as an intermediate representation.
The LogicNode struct represents many different Finch IR nodes. The nodes are differentiated by a FinchLogic.LogicNodeKind
enum.
Finch.FinchLogic.logic_leaf
— Functionlogic_leaf(x)
Return a terminal finch node wrapper around x
. A convenience function to determine whether x
should be understood by default as a immediate or value.
Finch.FinchLogic.isimmediate
— Functionisimmediate(node)
Returns true if the node is a finch immediate
Finch.FinchLogic.isdeferred
— Functionisdeferred(node)
Returns true if the node is a finch immediate
Finch.FinchLogic.isalias
— Functionisalias(node)
Returns true if the node is a finch alias
Finch.FinchLogic.isfield
— Functionisfield(node)
Returns true if the node is a finch field