lib/compiler/optimize/optimize.js
function optimize(graph, Juttle) {
    var reads = _.where(graph.get_roots(), {type: 'ReadProc'});
    _.each(reads, function(node) {optimize_read(node, graph, Juttle);});
}
function optimize(graph, Juttle) {
    var reads = _.where(graph.get_roots(), {type: 'ReadProc'});
    _.each(reads, function(node) {optimize_read(node, graph, Juttle);});
}
function optimize ( graph , Juttle ) { var reads = _ . where ( graph . get_roots ( ) , { type : 'ReadProc' } ) ; _ . each ( reads , function ( node ) { optimize_read ( node , graph , Juttle ) ; } ) ; }
The flowgraph processor that is the main entry point for optimization.  For each read proc in the graph, there are various optimizations that can be performed depending on what the adapter supports and the specific program structure.  To implement this support, traverse the flowgraph and check for the various patterns that are candidates for optimization. For each pattern, call into the adapter to determine whether that pattern is something the adapter can optimize, and if so, stash the relevant optimization info in the flowgraph so it will be passed to the read invocation.
The flowgraph processor that is the main entry point for optimization . For each read proc in the graph there are various optimizations that can be performed depending on what the adapter supports and the specific program structure . To implement this support traverse the flowgraph and check for the various patterns that are candidates for optimization . For each pattern call into the adapter to determine whether that pattern is something the adapter can optimize and if so stash the relevant optimization info in the flowgraph so it will be passed to the read invocation .