Demo 3.0: Matrix Multiplication Order: Performance is Not Associative¶

This demo notebook shows how the order of matrix multiplications can dramatically affect performance, even though the mathematical result is the same. We use cost-based extraction and e-graphs to find the optimal parenthesization for a chain of matrix multiplications, inspired by this blog post.

The notebook demonstrates:

  • How to use e-graphs and cost models to optimize the order
  • How to extract and visualize the optimized computation

Imports and Setup¶

In [1]:
from typing import Any, TypedDict

import numpy as np
from egglog import (
    EGraph,
    Ruleset,
    function,
    i64,
    i64Like,
    rewrite,
    rule,
    ruleset,
    set_,
    subsume,
    union,
)
from sealir import ase
from sealir.eqsat.py_eqsat import (
    Py_MatMultIO,
)
from sealir.eqsat.rvsdg_convert import egraph_conversion
from sealir.eqsat.rvsdg_eqsat import (
    GraphRoot,
    Term,
)
from sealir.eqsat.rvsdg_extract import (
    egraph_extraction,
)
from sealir.rvsdg import format_rvsdg
from sealir.rvsdg import grammar as rg

from ch01_basic_compiler import pipeline_frontend
from ch04_0_typeinfer_prelude import (
    pipeline_new_extract as _ch04_0_pipeline_new_extract,
)
from ch04_1_typeinfer_ifelse import TypeFloat64
from ch05_typeinfer_array import (
    ArrayDesc,
    Dim,
    ExtendEGraphToRVSDG,
    Grammar,
)
from ch05_typeinfer_array import MyCostModel as _ch05_CostModel
from ch05_typeinfer_array import (
    NbOp_Base,
    TypeVar,
    array_desc_rules,
    base_ruleset,
    setup_argtypes,
)
from utils import Pipeline, Report, display, visualize_expr_tree
In [2]:
SExpr = ase.SExpr

NumPy Example: Two Matrix Multiplications¶

We start by showing that the result of matrix multiplication is associative, but the performance can differ depending on the order of operations.

In [3]:
M = 200
N = 100
K = 200

(M x N) (N x K) (K x N)

In [4]:
if __name__ == "__main__":
    arr0 = np.random.random((M, N))
    arr1 = np.random.random((N, K))
    arr2 = np.random.random((K, N))
    res0 = (arr0 @ arr1) @ arr2
    res1 = arr0 @ (arr1 @ arr2)
    print(res0.shape)
    print(res1.shape)
    np.testing.assert_allclose(res0, res1)
    # unoptimized
    %timeit arr0 @ arr1 @ arr2
    # optimized
    %timeit arr0 @ (arr1 @ arr2)
(200, 100)
(200, 100)
235 μs ± 1.13 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
134 μs ± 446 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

NumPy Example: Five Matrix Multiplications¶

Here we define two different ways to multiply five matrices and compare their results and performance.

In [5]:
f0 = lambda arr0, arr1, arr2, arr3: arr0 @ arr1 @ arr2 @ arr1 @ arr2 @ arr3
In [6]:
def f1(arr0, arr1, arr2, arr3):
    x = arr1 @ arr2
    return arr0 @ (x @ (x @ arr3))
In [7]:
if __name__ == "__main__":
    arr0 = np.random.random((M, N))
    arr1 = np.random.random((N, K))
    arr2 = np.random.random((K, N))
    arr3 = np.random.random((N, 1))
    res0 = f0(arr0, arr1, arr2, arr3)
    res1 = f1(arr0, arr1, arr2, arr3)
    np.testing.assert_allclose(res0, res1)

    report = Report(
        "Expression tree of different versions",
        default_expanded=True,
    )
    report.append("original version", visualize_expr_tree(f0))
    report.append("hand-optimized version", visualize_expr_tree(f1))
    report.display()

    # unoptimized
    %timeit f0(arr0, arr1, arr2, arr3)
    # optimized
    %timeit f1(arr0, arr1, arr2, arr3)

Expression tree of different versions

1. original version ▶
lambda n1 arr0 n6 @ n1->n6 left n2 arr1 n2->n6 right n8 @ n2->n8 right n3 arr2 n7 @ n3->n7 right n9 @ n3->n9 right n4 arr3 n10 @ n4->n10 right n6->n7 left n7->n8 left n8->n9 left n9->n10 left n11 return n10->n11
2. hand-optimized version ▶
f1 n1 arr0 n9 @ n1->n9 left n2 arr1 n6 @ n2->n6 left n3 arr2 n3->n6 right n4 arr3 n7 @ n4->n7 right n6->n7 left n8 @ n6->n8 left n7->n8 right n8->n9 right n10 return n9->n10
490 μs ± 23.9 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
85.8 μs ± 2.93 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

E-Graph Construction for Matrix Multiplication¶

We now build an e-graph to represent all possible ways to parenthesize a chain of matrix multiplications, and encode the associativity rule.

In [8]:
array_0_desc, array_0_infos = array_desc_rules(
    "array_0", shape=(M, N), dtype=TypeFloat64, layout="c"
)
array_1_desc, array_1_infos = array_desc_rules(
    "array_1", shape=(N, K), dtype=TypeFloat64, layout="c"
)
array_2_desc, array_2_infos = array_desc_rules(
    "array_2", shape=(K, N), dtype=TypeFloat64, layout="c"
)
array_3_desc, array_3_infos = array_desc_rules(
    "array_3", shape=(N, 1), dtype=TypeFloat64, layout="c"
)
ruleset_array_facts = ruleset(
    *array_0_infos, *array_1_infos, *array_2_infos, *array_3_infos
)
In [9]:
@function
def MatMul(lhs: Term, rhs: Term) -> Term: ...
In [10]:
@function
def MatMul_KnownShape(
    lhs: Term, rhs: Term, m: i64Like, n: i64Like, k: i64Like
) -> Term: ...
In [11]:
@function
def ArrayDescOp(term: Term) -> ArrayDesc: ...
In [12]:
@ruleset
def ruleset_optimize_matmul(
    ary0: Term,
    ary1: Term,
    ary2: Term,
    ad0: ArrayDesc,
    ad1: ArrayDesc,
    shapeM: i64,
    shapeN: i64,
    shapeK: i64,
):
    # associative
    yield rewrite(MatMul(MatMul(ary0, ary1), ary2)).to(
        MatMul(ary0, MatMul(ary1, ary2))
    )

    yield rule(
        # array desc propagation
        ary2 == MatMul(ary0, ary1),
        ad0.toType() == TypeVar(ary0).getType(),
        ad1.toType() == TypeVar(ary1).getType(),
        ad0.ndim == i64(2),
        ad1.ndim == i64(2),
        m := ad0.dim(0),
        q := ad1.dim(1),
        ad0.dim(1) == ad1.dim(0),
        ad0.dtype == ad1.dtype,
    ).then(
        # set output dims
        ad2 := ArrayDescOp(ary2),
        set_(TypeVar(ary2).getType()).to(ad2.toType()),
        set_(ad2.ndim).to(2),
        set_(ad2.dim(0)).to(m),
        set_(ad2.dim(1)).to(q),
        set_(ad2.dtype).to(ad0.dtype),
    )

    yield rule(
        ary2 == (stmt := MatMul(ary0, ary1)),
        ad0.toType() == TypeVar(ary0).getType(),
        ad1.toType() == TypeVar(ary1).getType(),
        ad0.ndim == i64(2),
        ad1.ndim == i64(2),
        Dim.fixed(shapeM) == ad0.dim(0),
        Dim.fixed(shapeN) == ad0.dim(1),
        Dim.fixed(shapeN) == ad1.dim(0),
        Dim.fixed(shapeK) == ad1.dim(1),
        ad0.dtype == ad1.dtype,
    ).then(
        # Convert to MatMul_KnownShape
        union(ary2).with_(
            MatMul_KnownShape(ary0, ary1, shapeM, shapeN, shapeK)
        ),
    )
In [13]:
@ruleset
def ruleset_matmul_op(io: Term, lhs: Term, rhs: Term, res: Term):
    yield rule(res == Py_MatMultIO(io, lhs, rhs)).then(
        union(res.getPort(1)).with_(MatMul(lhs, rhs)),
        union(res.getPort(0)).with_(io),
    )

Compile E-Graph to Extractable Representation¶

This section defines the pipeline to convert the e-graph into a form suitable for extraction and optimization.

In [14]:
def code_input(ary0, ary1, ary2, ary3):
    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
In [15]:
class EGraphConversionOutput(TypedDict):
    egraph: EGraph
    saturation_steps: list[str] | None
In [16]:
def egraph_saturation(
    egraph: EGraph,
    egraph_root: GraphRoot,
    extra_ruleset: Ruleset,
    argtypes: tuple,
    arg_facts: Ruleset,
    pipeline_report=Report.Sink(),
    pipeline_debug=False,
    animate=False,
) -> EGraphConversionOutput:
    with pipeline_report.nest("Egraph saturation") as report:
        all_rules = (
            setup_argtypes(*argtypes)
            | arg_facts
            | extra_ruleset
            | base_ruleset
        )
        saturation_steps: list[str] | None
        if animate:
            # Manual saturation loop to extract serialized graph
            saturation_steps = []
            while egraph.run(all_rules).updated:
                jsdata = egraph._serialize(
                    n_inline_leaves=0, split_primitive_outputs=False
                ).to_json()
                saturation_steps.append(jsdata)
        else:
            egraph.run(all_rules.saturate())
            saturation_steps = None
        if pipeline_debug:
            report.append("[debug] Saturated egraph", egraph)
        return dict(egraph=egraph, saturation_steps=saturation_steps)
In [17]:
pipeline_middle_end = _ch04_0_pipeline_new_extract.trunc(
    "pipeline_backend"
).replace("egraph_saturation", egraph_saturation)
pipeline_to_egraph = pipeline_middle_end.trunc("pipeline_egraph_extraction")
In [18]:
extra_ruleset = ruleset_matmul_op | ruleset_optimize_matmul
In [19]:
if __name__ == "__main__":
    display(pipeline_to_egraph.visualize())
    report = Report("Pipeline execution report", enable_nested_metadata=True)
    argtypes = (
        array_0_desc.toType(),
        array_1_desc.toType(),
        array_2_desc.toType(),
        array_3_desc.toType(),
    )
    pipeline_to_egraph(
        fn=code_input,
        argtypes=argtypes,
        arg_facts=ruleset_array_facts,
        extra_ruleset=extra_ruleset,
        pipeline_debug=True,
        pipeline_report=report,
    )
    report.display()
Pipeline-egraph_saturation cluster_legend Legend input_arg_facts arg_facts Ruleset stage_3 Stage 3 egraph_saturation → EGraphConversionOutput input_arg_facts->stage_3 arg_facts input_argtypes argtypes tuple input_argtypes->stage_3 argtypes input_extra_ruleset extra_ruleset Ruleset input_extra_ruleset->stage_3 extra_ruleset input_fn fn Any stage_1 Stage 1 pipeline_frontend → FrontendOutput input_fn->stage_1 fn input_animate animate Any = False input_animate->stage_3 animate input_pipeline_debug pipeline_debug Any = False input_pipeline_debug->stage_3 pipeline_debug input_pipeline_report pipeline_report Any = DummyReport() input_pipeline_report->stage_1 pipeline_report stage_2 Stage 2 pipeline_egraph_conversion → EGraphOutput input_pipeline_report->stage_2 pipeline_report input_pipeline_report->stage_3 pipeline_report stage_1->stage_2 rvsdg_expr out_dbginfo dbginfo object stage_1->out_dbginfo dbginfo out_rvsdg_expr rvsdg_expr object stage_1->out_rvsdg_expr rvsdg_expr stage_2->stage_3 egraph stage_2->stage_3 egraph_root out_egraph_root egraph_root GraphRoot stage_2->out_egraph_root egraph_root out_egraph egraph EGraph stage_3->out_egraph egraph out_saturation_steps saturation_steps list[str] | None stage_3->out_saturation_steps saturation_steps legend_input Required Input legend_optional Optional Input legend_input->legend_optional legend_stage Processing Stage legend_optional->legend_stage legend_output Output legend_stage->legend_output

Pipeline execution report

1. Frontend (7.94ms) ▶
Frontend
Debug Info on RVSDG ▶
--------------------------------original source---------------------------------
   1|def code_input(ary0, ary1, ary2, ary3):
   2|    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
----------------------------------inter source----------------------------------
   1|def transformed_code_input(ary0, ary1, ary2, ary3):
   2|    """#file: /tmp/ipykernel_3941/2471768733.py"""
   3|    '#loc: 2:8-2:54'
   4|    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
RVSDG ▶
transformed_code_input = Func (Args (ArgSpec 'ary0' (PyNone)) (ArgSpec 'ary1' (PyNone)) (ArgSpec 'ary2' (PyNone)) (ArgSpec 'ary3' (PyNone)))
$0 = Region[425] <- !io ary0 ary1 ary2 ary3
{
  $1 = PyBinOp @ $0[0] $0[1], $0[2]
  $2 = PyBinOp @ $1[0] $1[1], $0[3]
  $3 = PyBinOp @ $2[0] $2[1], $0[2]
  $4 = PyBinOp @ $3[0] $3[1], $0[3]
  $5 = PyBinOp @ $4[0] $4[1], $0[4]
} [592] -> !io=$5[0] !ret=$5[1]
[metadata] ▶
time elapsed 7.94ms
timing breakdown:
  6.24ms: Debug Info on RVSDG 
  1.70ms: RVSDG               
2. EGraph Conversion (26.72ms) ▶
EGraph Conversion
EGraph ▶
outer_cluster_InPorts-0 cluster_InPorts-0 outer_cluster_Port-21 cluster_Port-21 outer_cluster_Port-23 cluster_Port-23 outer_cluster_PortList-24 cluster_PortList-24 outer_cluster_Region-1 cluster_Region-1 outer_cluster_Term-16 cluster_Term-16 outer_cluster_Term-22 cluster_Term-22 outer_cluster_Term-20 cluster_Term-20 outer_cluster_Term-15 cluster_Term-15 outer_cluster_Term-7 cluster_Term-7 outer_cluster_Term-5 cluster_Term-5 outer_cluster_Term-3 cluster_Term-3 outer_cluster_Term-18 cluster_Term-18 outer_cluster_Term-8 cluster_Term-8 outer_cluster_Term-13 cluster_Term-13 outer_cluster_Term-2 cluster_Term-2 outer_cluster_Term-10 cluster_Term-10 outer_cluster_Term-6 cluster_Term-6 outer_cluster_Term-14 cluster_Term-14 outer_cluster_Term-26 cluster_Term-26 outer_cluster_Term-4 cluster_Term-4 outer_cluster_Term-9 cluster_Term-9 outer_cluster_Term-17 cluster_Term-17 outer_cluster_Term-19 cluster_Term-19 outer_cluster_Term-12 cluster_Term-12 outer_cluster_Term-25 cluster_Term-25 outer_cluster_Term-11 cluster_Term-11 outer_cluster_Term-27 cluster_Term-27 outer_cluster_Vec_Port-0 cluster_Vec_Port-0 outer_cluster_Vec_String-0 cluster_Vec_String-0 function-0-InPorts___init__:s->primitive-Vec_String-0 function-0-Port___init__:s->function-8-Term_getPort function-8-Term_getPort:s->function-4-Py_MatMultIO function-1-Port___init__:s->function-9-Term_getPort function-9-Term_getPort:s->function-4-Py_MatMultIO function-0-PortList___init__:s->primitive-Vec_Port-0 primitive-Vec_Port-0:s->function-0-Port___init__ primitive-Vec_Port-0:s->function-1-Port___init__ function-0-Region___init__:s->function-0-InPorts___init__ function-6-Term_getPort:s->function-3-Py_MatMultIO function-3-Py_MatMultIO:s->function-4-Term_getPort function-3-Py_MatMultIO:s->function-5-Term_getPort function-3-Py_MatMultIO:s->function-1-Region_get function-4-Py_MatMultIO:s->function-6-Term_getPort function-4-Py_MatMultIO:s->function-4-Region_get function-4-Py_MatMultIO:s->function-7-Term_getPort function-4-Term_getPort:s->function-2-Py_MatMultIO function-5-Term_getPort:s->function-2-Py_MatMultIO function-1-Region_get:s->function-0-Region___init__ function-0-Term_getPort:s->function-0-Py_MatMultIO function-0-Py_MatMultIO:s->function-3-Region_get function-0-Py_MatMultIO:s->function-0-Region_get function-0-Py_MatMultIO:s->function-2-Region_get function-3-Region_get:s->function-0-Region___init__ function-4-Region_get:s->function-0-Region___init__ function-1-Term_getPort:s->function-0-Py_MatMultIO function-2-Py_MatMultIO:s->function-0-Region_get function-2-Py_MatMultIO:s->function-2-Term_getPort function-2-Py_MatMultIO:s->function-3-Term_getPort function-0-Region_get:s->function-0-Region___init__ function-2-Term_getPort:s->function-1-Py_MatMultIO function-1-Py_MatMultIO:s->function-1-Region_get function-1-Py_MatMultIO:s->function-0-Term_getPort function-1-Py_MatMultIO:s->function-1-Term_getPort function-2-Region_get:s->function-0-Region___init__ function-0-Term_Func:s->function-0-Term_RegionEnd function-0-Term_RegionEnd:s->function-0-PortList___init__ function-0-Term_RegionEnd:s->function-0-Region___init__ function-7-Term_getPort:s->function-3-Py_MatMultIO function-3-Term_getPort:s->function-1-Py_MatMultIO function-0-GraphRoot:s->function-0-Term_Func function-0-InPorts___init__ InPorts primitive-Vec_String-0 Vec("!io", "ary0", "ary1", "ary2", "ary3") function-0-Port___init__ Port("!io", ·) function-8-Term_getPort ·.getPort(·, 0) function-1-Port___init__ Port("!ret", ·) function-9-Term_getPort ·.getPort(·, 1) function-0-PortList___init__ PortList primitive-Vec_Port-0 Vec function-0-Region___init__ Region("425", ·) function-6-Term_getPort ·.getPort(·, 0) function-3-Py_MatMultIO Py_MatMultIO function-4-Py_MatMultIO Py_MatMultIO function-4-Term_getPort ·.getPort(·, 0) function-5-Term_getPort ·.getPort(·, 1) function-1-Region_get ·.get(·, 3) function-0-Term_getPort ·.getPort(·, 0) function-0-Py_MatMultIO Py_MatMultIO function-3-Region_get ·.get(·, 1) function-4-Region_get ·.get(·, 4) function-1-Term_getPort ·.getPort(·, 1) function-2-Py_MatMultIO Py_MatMultIO function-0-Region_get ·.get(·, 2) function-2-Term_getPort ·.getPort(·, 0) function-1-Py_MatMultIO Py_MatMultIO function-2-Region_get ·.get(·, 0) function-0-Term_Func Term.Func("598", "transformed_code_input", ·) function-0-Term_RegionEnd Term.RegionEnd function-7-Term_getPort ·.getPort(·, 1) function-3-Term_getPort ·.getPort(·, 1) function-0-GraphRoot GraphRoot
[metadata] ▶
time elapsed 26.72ms
timing breakdown:
  26.72ms: EGraph              
3. Egraph saturation (188.05ms) ▶
Egraph saturation
[debug] Saturated egraph ▶
outer_cluster_ArrayDesc-36 cluster_ArrayDesc-36 outer_cluster_ArrayDesc-136 cluster_ArrayDesc-136 outer_cluster_ArrayDesc-33 cluster_ArrayDesc-33 outer_cluster_ArrayDesc-188 cluster_ArrayDesc-188 outer_cluster_ArrayDesc-90 cluster_ArrayDesc-90 outer_cluster_ArrayDesc-163 cluster_ArrayDesc-163 outer_cluster_ArrayDesc-139 cluster_ArrayDesc-139 outer_cluster_ArrayDesc-151 cluster_ArrayDesc-151 outer_cluster_ArrayDesc-157 cluster_ArrayDesc-157 outer_cluster_ArrayDesc-200 cluster_ArrayDesc-200 outer_cluster_ArrayDesc-39 cluster_ArrayDesc-39 outer_cluster_ArrayDesc-84 cluster_ArrayDesc-84 outer_cluster_ArrayDesc-87 cluster_ArrayDesc-87 outer_cluster_ArrayDesc-93 cluster_ArrayDesc-93 outer_cluster_ArrayDesc-160 cluster_ArrayDesc-160 outer_cluster_ArrayDesc-142 cluster_ArrayDesc-142 outer_cluster_ArrayDesc-30 cluster_ArrayDesc-30 outer_cluster_ArrayDesc-194 cluster_ArrayDesc-194 outer_cluster_DataLayout-51 cluster_DataLayout-51 outer_cluster_Dim-53 cluster_Dim-53 outer_cluster_Dim-49 cluster_Dim-49 outer_cluster_Dim-50 cluster_Dim-50 outer_cluster_InPorts-0 cluster_InPorts-0 outer_cluster_Port-177 cluster_Port-177 outer_cluster_Port-100 cluster_Port-100 outer_cluster_PortList-24 cluster_PortList-24 outer_cluster_Region-1 cluster_Region-1 outer_cluster_String-10 cluster_String-10 outer_cluster_String-2684354580 cluster_String-2684354580 outer_cluster_Term-61 cluster_Term-61 outer_cluster_Term-8 cluster_Term-8 outer_cluster_Term-25 cluster_Term-25 outer_cluster_Term-227 cluster_Term-227 outer_cluster_Term-26 cluster_Term-26 outer_cluster_Term-14 cluster_Term-14 outer_cluster_Term-54 cluster_Term-54 outer_cluster_Term-18 cluster_Term-18 outer_cluster_Term-3 cluster_Term-3 outer_cluster_Term-19 cluster_Term-19 outer_cluster_Term-72 cluster_Term-72 outer_cluster_Term-27 cluster_Term-27 outer_cluster_Term-185 cluster_Term-185 outer_cluster_Term-102 cluster_Term-102 outer_cluster_Term-118 cluster_Term-118 outer_cluster_Term-59 cluster_Term-59 outer_cluster_Term-6 cluster_Term-6 outer_cluster_Term-12 cluster_Term-12 outer_cluster_Term-11 cluster_Term-11 outer_cluster_Term-17 cluster_Term-17 outer_cluster_Term-5 cluster_Term-5 outer_cluster_Term-57 cluster_Term-57 outer_cluster_Term-68 cluster_Term-68 outer_cluster_Term-74 cluster_Term-74 outer_cluster_Term-211 cluster_Term-211 outer_cluster_Term-9 cluster_Term-9 outer_cluster_Term-15 cluster_Term-15 outer_cluster_Term-108 cluster_Term-108 outer_cluster_Term-2 cluster_Term-2 outer_cluster_Type-37 cluster_Type-37 outer_cluster_Type-159 cluster_Type-159 outer_cluster_Type-52 cluster_Type-52 outer_cluster_Type-183 cluster_Type-183 outer_cluster_Type-40 cluster_Type-40 outer_cluster_Type-92 cluster_Type-92 outer_cluster_Type-202 cluster_Type-202 outer_cluster_Type-153 cluster_Type-153 outer_cluster_Type-86 cluster_Type-86 outer_cluster_Type-95 cluster_Type-95 outer_cluster_Type-89 cluster_Type-89 outer_cluster_Type-165 cluster_Type-165 outer_cluster_Type-196 cluster_Type-196 outer_cluster_Type-212 cluster_Type-212 outer_cluster_Type-31 cluster_Type-31 outer_cluster_Type-182 cluster_Type-182 outer_cluster_Type-162 cluster_Type-162 outer_cluster_Type-181 cluster_Type-181 outer_cluster_Type-34 cluster_Type-34 outer_cluster_TypeVar-143 cluster_TypeVar-143 outer_cluster_TypeVar-179 cluster_TypeVar-179 outer_cluster_TypeVar-152 cluster_TypeVar-152 outer_cluster_TypeVar-88 cluster_TypeVar-88 outer_cluster_TypeVar-189 cluster_TypeVar-189 outer_cluster_TypeVar-137 cluster_TypeVar-137 outer_cluster_TypeVar-67 cluster_TypeVar-67 outer_cluster_TypeVar-158 cluster_TypeVar-158 outer_cluster_TypeVar-106 cluster_TypeVar-106 outer_cluster_TypeVar-64 cluster_TypeVar-64 outer_cluster_TypeVar-195 cluster_TypeVar-195 outer_cluster_TypeVar-66 cluster_TypeVar-66 outer_cluster_TypeVar-164 cluster_TypeVar-164 outer_cluster_TypeVar-85 cluster_TypeVar-85 outer_cluster_TypeVar-140 cluster_TypeVar-140 outer_cluster_TypeVar-65 cluster_TypeVar-65 outer_cluster_TypeVar-91 cluster_TypeVar-91 outer_cluster_TypeVar-94 cluster_TypeVar-94 outer_cluster_TypeVar-161 cluster_TypeVar-161 outer_cluster_TypedIns-28 cluster_TypedIns-28 outer_cluster_TypedOuts-105 cluster_TypedOuts-105 outer_cluster_Vec_Port-2 cluster_Vec_Port-2 outer_cluster_Vec_String-0 cluster_Vec_String-0 outer_cluster_split-14-primitive-i64-2 cluster_split-14-primitive-i64-2 outer_cluster_split-16-primitive-i64-2 cluster_split-16-primitive-i64-2 outer_cluster_split-4-primitive-i64-2 cluster_split-4-primitive-i64-2 outer_cluster_split-0-primitive-i64-2 cluster_split-0-primitive-i64-2 outer_cluster_split-13-primitive-i64-2 cluster_split-13-primitive-i64-2 outer_cluster_split-6-primitive-i64-2 cluster_split-6-primitive-i64-2 outer_cluster_split-9-primitive-i64-2 cluster_split-9-primitive-i64-2 outer_cluster_split-15-primitive-i64-2 cluster_split-15-primitive-i64-2 outer_cluster_i64-2 cluster_i64-2 outer_cluster_split-10-primitive-i64-2 cluster_split-10-primitive-i64-2 outer_cluster_split-12-primitive-i64-2 cluster_split-12-primitive-i64-2 outer_cluster_split-3-primitive-i64-2 cluster_split-3-primitive-i64-2 outer_cluster_split-5-primitive-i64-2 cluster_split-5-primitive-i64-2 outer_cluster_split-2-primitive-i64-2 cluster_split-2-primitive-i64-2 outer_cluster_split-7-primitive-i64-2 cluster_split-7-primitive-i64-2 outer_cluster_split-8-primitive-i64-2 cluster_split-8-primitive-i64-2 outer_cluster_split-1-primitive-i64-2 cluster_split-1-primitive-i64-2 outer_cluster_split-11-primitive-i64-2 cluster_split-11-primitive-i64-2 function-4-ArrayDescOp:s->function-4-MatMul_KnownShape function-4-MatMul_KnownShape:s->function-0-Region_get function-4-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-22-ArrayDescOp:s->function-36-MatMul_KnownShape function-36-MatMul_KnownShape:s->function-4-MatMul_KnownShape function-36-MatMul_KnownShape:s->function-7-MatMul function-2-ArrayDescOp:s->function-7-MatMul function-7-MatMul:s->function-1-Region_get function-7-MatMul:s->function-4-Region_get function-13-ArrayDescOp:s->function-1-MatMul function-1-MatMul:s->function-10-MatMul_KnownShape function-1-MatMul:s->function-0-Region_get function-5-ArrayDescOp:s->function-5-MatMul_KnownShape function-5-MatMul_KnownShape:s->function-0-MatMul_KnownShape function-5-MatMul_KnownShape:s->function-1-Region_get function-20-ArrayDescOp:s->function-22-MatMul function-22-MatMul:s->function-1-Region_get function-22-MatMul:s->function-7-MatMul_KnownShape function-21-ArrayDescOp:s->function-25-MatMul function-25-MatMul:s->function-4-Region_get function-25-MatMul:s->function-8-MatMul_KnownShape function-23-ArrayDescOp:s->function-35-MatMul_KnownShape function-35-MatMul_KnownShape:s->function-4-Region_get function-35-MatMul_KnownShape:s->function-31-MatMul function-0-ArrayDescOp:s->function-6-MatMul function-6-MatMul:s->function-0-Region_get function-6-MatMul:s->function-1-Region_get function-1-ArrayDescOp:s->function-5-MatMul function-5-MatMul:s->function-0-Region_get function-5-MatMul:s->function-1-Region_get function-3-ArrayDescOp:s->function-3-MatMul_KnownShape function-3-MatMul_KnownShape:s->function-3-Region_get function-3-MatMul_KnownShape:s->function-0-Region_get function-12-ArrayDescOp:s->function-10-MatMul_KnownShape function-10-MatMul_KnownShape:s->function-3-MatMul_KnownShape function-10-MatMul_KnownShape:s->function-1-Region_get function-6-ArrayDescOp:s->function-6-MatMul_KnownShape function-6-MatMul_KnownShape:s->function-5-MatMul function-6-MatMul_KnownShape:s->function-4-Region_get function-17-ArrayDescOp:s->function-44-MatMul_KnownShape function-44-MatMul_KnownShape:s->function-3-MatMul_KnownShape function-44-MatMul_KnownShape:s->function-15-MatMul function-0-ArrayDesc_dataLayout:s->function-0-ArrayDesc___init__ function-1-ArrayDesc_dataLayout:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_dataLayout:s->function-2-ArrayDesc___init__ function-3-ArrayDesc_dataLayout:s->function-3-ArrayDesc___init__ function-7-ArrayDesc_dim:s->function-3-ArrayDesc___init__ function-13-ArrayDesc_dim:s->function-2-ArrayDescOp function-21-ArrayDesc_dim:s->function-6-ArrayDescOp function-31-ArrayDesc_dim:s->function-21-ArrayDescOp function-37-ArrayDesc_dim:s->function-22-ArrayDescOp function-43-ArrayDesc_dim:s->function-23-ArrayDescOp function-0-ArrayDesc_dim:s->function-0-ArrayDesc___init__ function-3-ArrayDesc_dim:s->function-1-ArrayDesc___init__ function-4-ArrayDesc_dim:s->function-2-ArrayDesc___init__ function-8-ArrayDesc_dim:s->function-0-ArrayDescOp function-9-ArrayDesc_dim:s->function-0-ArrayDescOp function-12-ArrayDesc_dim:s->function-2-ArrayDescOp function-14-ArrayDesc_dim:s->function-3-ArrayDescOp function-15-ArrayDesc_dim:s->function-3-ArrayDescOp function-17-ArrayDesc_dim:s->function-4-ArrayDescOp function-18-ArrayDesc_dim:s->function-5-ArrayDescOp function-30-ArrayDesc_dim:s->function-21-ArrayDescOp function-32-ArrayDesc_dim:s->function-12-ArrayDescOp function-34-ArrayDesc_dim:s->function-13-ArrayDescOp function-35-ArrayDesc_dim:s->function-13-ArrayDescOp function-38-ArrayDesc_dim:s->function-17-ArrayDescOp function-42-ArrayDesc_dim:s->function-23-ArrayDescOp function-1-ArrayDesc_dim:s->function-0-ArrayDesc___init__ function-2-ArrayDesc_dim:s->function-1-ArrayDesc___init__ function-5-ArrayDesc_dim:s->function-2-ArrayDesc___init__ function-6-ArrayDesc_dim:s->function-3-ArrayDesc___init__ function-10-ArrayDesc_dim:s->function-1-ArrayDescOp function-11-ArrayDesc_dim:s->function-1-ArrayDescOp function-16-ArrayDesc_dim:s->function-4-ArrayDescOp function-19-ArrayDesc_dim:s->function-5-ArrayDescOp function-20-ArrayDesc_dim:s->function-6-ArrayDescOp function-26-ArrayDesc_dim:s->function-20-ArrayDescOp function-27-ArrayDesc_dim:s->function-20-ArrayDescOp function-33-ArrayDesc_dim:s->function-12-ArrayDescOp function-36-ArrayDesc_dim:s->function-22-ArrayDescOp function-39-ArrayDesc_dim:s->function-17-ArrayDescOp function-0-InPorts___init__:s->primitive-Vec_String-0 function-1-Port___init__:s->function-58-MatMul function-58-MatMul:s->function-4-Region_get function-58-MatMul:s->function-21-MatMul_KnownShape function-1-PortList___getitem__:s->function-0-PortList___init__ function-0-PortList___init__:s->primitive-Vec_Port-2 function-0-Port___init__:s->function-10-Term_getPort function-10-Term_getPort:s->function-3-Py_MatMultIO function-0-PortList___getitem__:s->function-0-PortList___init__ primitive-Vec_Port-2:s->function-1-PortList___getitem__ primitive-Vec_Port-2:s->function-0-PortList___getitem__ function-0-Region___init__:s->function-0-InPorts___init__ function-2-Port_name:s->function-0-PortList___getitem__ function-3-Port_name:s->function-1-PortList___getitem__ function-6-Region_get:s->function-0-Region___init__ function-7-Term_getPort:s->function-0-Py_MatMultIO function-0-Py_MatMultIO:s->function-8-Term_getPort function-0-Py_MatMultIO:s->function-3-Region_get function-0-Py_MatMultIO:s->function-0-Region_get function-8-Term_getPort:s->function-1-Py_MatMultIO function-1-Py_MatMultIO:s->function-9-Term_getPort function-1-Py_MatMultIO:s->function-0-MatMul function-1-Py_MatMultIO:s->function-1-Region_get function-9-Term_getPort:s->function-2-Py_MatMultIO function-2-Py_MatMultIO:s->function-10-Term_getPort function-2-Py_MatMultIO:s->function-0-Region_get function-2-Py_MatMultIO:s->function-2-MatMul function-3-Py_MatMultIO:s->function-1-MatMul function-3-Py_MatMultIO:s->function-11-Term_getPort function-3-Py_MatMultIO:s->function-1-Region_get function-11-Term_getPort:s->function-4-Py_MatMultIO function-4-Py_MatMultIO:s->function-0-Port_value function-4-Py_MatMultIO:s->function-4-Region_get function-4-Py_MatMultIO:s->function-3-MatMul function-0-Port_value:s->function-0-Port___init__ function-0-PortList_getValue:s->function-0-PortList___init__ function-0-Term_getPort:s->function-0-Py_MatMultIO function-0-MatMul:s->function-3-Region_get function-0-MatMul:s->function-0-Region_get function-3-Region_get:s->function-0-Region___init__ function-0-Region_get:s->function-0-Region___init__ function-0-Term_RegionEnd:s->function-0-PortList___init__ function-0-Term_RegionEnd:s->function-0-Region___init__ function-14-Term_getPort:s->function-0-Term_RegionEnd function-0-Term_Func:s->function-0-Term_RegionEnd function-2-Term_getPort:s->function-2-Py_MatMultIO function-10-MatMul:s->function-6-MatMul function-10-MatMul:s->function-3-MatMul_KnownShape function-17-MatMul:s->function-4-MatMul_KnownShape function-17-MatMul:s->function-3-Region_get function-11-MatMul_KnownShape:s->function-0-Term_getPort function-11-MatMul_KnownShape:s->function-0-MatMul_KnownShape function-0-MatMul_KnownShape:s->function-0-Region_get function-0-MatMul_KnownShape:s->function-1-Region_get function-19-MatMul_KnownShape:s->function-0-Region_get function-19-MatMul_KnownShape:s->function-8-MatMul function-8-MatMul:s->function-5-MatMul function-8-MatMul:s->function-3-Region_get function-43-MatMul_KnownShape:s->function-3-Region_get function-43-MatMul_KnownShape:s->function-12-MatMul function-12-MatMul:s->function-5-MatMul function-12-MatMul:s->function-0-Region_get function-1-Region_get:s->function-0-Region___init__ function-1-MatMul_KnownShape:s->function-0-Region_get function-1-MatMul_KnownShape:s->function-1-Region_get function-4-Region_get:s->function-0-Region___init__ function-3-MatMul:s->function-11-MatMul_KnownShape function-3-MatMul:s->function-1-Region_get function-14-MatMul:s->function-1-MatMul_KnownShape function-14-MatMul:s->function-4-Region_get function-39-MatMul:s->function-7-MatMul function-39-MatMul:s->function-0-Region_get function-9-MatMul_KnownShape:s->function-0-Region_get function-9-MatMul_KnownShape:s->function-2-MatMul_KnownShape function-2-MatMul_KnownShape:s->function-1-Region_get function-2-MatMul_KnownShape:s->function-4-Region_get function-0-GraphRoot:s->function-0-Term_Func function-46-MatMul:s->function-4-Region_get function-46-MatMul:s->function-17-MatMul_KnownShape function-17-MatMul_KnownShape:s->function-5-MatMul function-17-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-50-MatMul:s->function-0-Region_get function-50-MatMul:s->function-55-MatMul function-55-MatMul:s->function-0-MatMul_KnownShape function-55-MatMul:s->function-2-MatMul_KnownShape function-51-MatMul:s->function-1-MatMul_KnownShape function-51-MatMul:s->function-9-MatMul_KnownShape function-56-MatMul:s->function-7-MatMul function-56-MatMul:s->function-38-MatMul function-38-MatMul:s->function-6-MatMul function-38-MatMul:s->function-0-Region_get function-13-MatMul_KnownShape:s->function-4-Region_get function-13-MatMul_KnownShape:s->function-53-MatMul function-53-MatMul:s->function-5-MatMul function-53-MatMul:s->function-1-MatMul_KnownShape function-15-MatMul_KnownShape:s->function-0-Region_get function-15-MatMul_KnownShape:s->function-55-MatMul function-39-MatMul_KnownShape:s->function-5-MatMul function-39-MatMul_KnownShape:s->function-9-MatMul_KnownShape function-12-Term_getPort:s->function-4-Py_MatMultIO function-57-MatMul:s->function-3-Region_get function-57-MatMul:s->function-15-MatMul_KnownShape function-21-MatMul_KnownShape:s->function-19-MatMul_KnownShape function-21-MatMul_KnownShape:s->function-1-Region_get function-59-MatMul:s->function-2-Term_getPort function-59-MatMul:s->function-2-MatMul_KnownShape function-60-MatMul:s->function-8-MatMul function-60-MatMul:s->function-39-MatMul function-61-MatMul:s->function-0-MatMul function-61-MatMul:s->function-42-MatMul_KnownShape function-42-MatMul_KnownShape:s->function-4-Region_get function-42-MatMul_KnownShape:s->function-8-MatMul_KnownShape function-23-MatMul_KnownShape:s->function-0-MatMul function-23-MatMul_KnownShape:s->function-38-MatMul_KnownShape function-38-MatMul_KnownShape:s->function-6-MatMul_KnownShape function-38-MatMul_KnownShape:s->function-1-Region_get function-24-MatMul_KnownShape:s->function-43-MatMul_KnownShape function-24-MatMul_KnownShape:s->function-2-MatMul_KnownShape function-31-MatMul:s->function-3-Region_get function-31-MatMul:s->function-53-MatMul function-40-MatMul_KnownShape:s->function-14-MatMul function-40-MatMul_KnownShape:s->function-12-MatMul_KnownShape function-12-MatMul_KnownShape:s->function-5-MatMul function-12-MatMul_KnownShape:s->function-3-Region_get function-46-MatMul_KnownShape:s->function-3-Region_get function-46-MatMul_KnownShape:s->function-13-MatMul_KnownShape function-1-Port_value:s->function-1-Port___init__ function-1-PortList_getValue:s->function-0-PortList___init__ function-8-MatMul_KnownShape:s->function-1-Region_get function-8-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-54-MatMul:s->function-1-Region_get function-54-MatMul:s->function-14-MatMul function-18-MatMul_KnownShape:s->function-7-MatMul function-18-MatMul_KnownShape:s->function-6-MatMul function-2-MatMul:s->function-0-MatMul function-2-MatMul:s->function-1-Region_get function-1-Term_getPort:s->function-1-Py_MatMultIO function-3-Term_getPort:s->function-3-Py_MatMultIO function-9-MatMul:s->function-1-MatMul_KnownShape function-9-MatMul:s->function-2-MatMul function-20-MatMul:s->function-5-MatMul_KnownShape function-20-MatMul:s->function-0-Term_getPort function-14-MatMul_KnownShape:s->function-3-Region_get function-14-MatMul_KnownShape:s->function-17-MatMul_KnownShape function-20-MatMul_KnownShape:s->function-10-MatMul_KnownShape function-20-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-15-MatMul:s->function-0-MatMul_KnownShape function-15-MatMul:s->function-1-Region_get function-7-MatMul_KnownShape:s->function-6-MatMul function-7-MatMul_KnownShape:s->function-0-Region_get function-40-MatMul:s->function-5-MatMul function-40-MatMul:s->function-1-Region_get function-13-Term_getPort:s->function-0-Term_RegionEnd function-52-MatMul:s->function-0-Region_get function-52-MatMul:s->function-40-MatMul function-37-MatMul_KnownShape:s->function-5-MatMul_KnownShape function-37-MatMul_KnownShape:s->function-0-Region_get function-41-MatMul_KnownShape:s->function-1-Region_get function-41-MatMul_KnownShape:s->function-7-MatMul_KnownShape function-2-TypeVar_getType:s->function-2-TypeVar___init__ function-2-TypeVar___init__:s->function-1-Region_get function-2-ArrayDesc_toType:s->function-2-ArrayDesc___init__ function-9-TypeVar_getType:s->function-29-TypeVar___init__ function-29-TypeVar___init__:s->function-54-MatMul function-15-ArrayDesc_toType:s->function-21-ArrayDescOp function-0-ArrayDesc_dtype:s->function-0-ArrayDesc___init__ function-1-ArrayDesc_dtype:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_dtype:s->function-2-ArrayDesc___init__ function-3-ArrayDesc_dtype:s->function-3-ArrayDesc___init__ function-4-ArrayDesc_dtype:s->function-0-ArrayDescOp function-5-ArrayDesc_dtype:s->function-1-ArrayDescOp function-6-ArrayDesc_dtype:s->function-2-ArrayDescOp function-7-ArrayDesc_dtype:s->function-3-ArrayDescOp function-8-ArrayDesc_dtype:s->function-4-ArrayDescOp function-9-ArrayDesc_dtype:s->function-5-ArrayDescOp function-10-ArrayDesc_dtype:s->function-6-ArrayDescOp function-13-ArrayDesc_dtype:s->function-20-ArrayDescOp function-15-ArrayDesc_dtype:s->function-21-ArrayDescOp function-16-ArrayDesc_dtype:s->function-12-ArrayDescOp function-17-ArrayDesc_dtype:s->function-13-ArrayDescOp function-18-ArrayDesc_dtype:s->function-22-ArrayDescOp function-19-ArrayDesc_dtype:s->function-17-ArrayDescOp function-21-ArrayDesc_dtype:s->function-23-ArrayDescOp function-2-Type___or__:s->function-2-Type___or__ function-2-Type___or__:s->function-24-ArrayDesc_toType function-24-ArrayDesc_toType:s->function-6-ArrayDescOp function-15-TypeVar_getType:s->function-12-TypeVar___init__ function-12-TypeVar___init__:s->function-9-MatMul_KnownShape function-3-TypeVar_getType:s->function-3-TypeVar___init__ function-3-TypeVar___init__:s->function-4-Region_get function-3-ArrayDesc_toType:s->function-3-ArrayDesc___init__ function-6-TypeVar_getType:s->function-6-TypeVar___init__ function-6-TypeVar___init__:s->function-2-MatMul_KnownShape function-6-ArrayDesc_toType:s->function-2-ArrayDescOp function-17-TypeVar_getType:s->function-1-TypedOuts_at function-1-TypedOuts_at:s->function-0-TypedOuts___init__ function-21-ArrayDesc_toType:s->function-23-ArrayDescOp function-8-TypeVar_getType:s->function-28-TypeVar___init__ function-28-TypeVar___init__:s->function-52-MatMul function-13-ArrayDesc_toType:s->function-20-ArrayDescOp function-4-TypeVar_getType:s->function-4-TypeVar___init__ function-4-TypeVar___init__:s->function-0-MatMul_KnownShape function-4-ArrayDesc_toType:s->function-0-ArrayDescOp function-7-TypeVar_getType:s->function-7-TypeVar___init__ function-7-TypeVar___init__:s->function-0-Term_getPort function-7-ArrayDesc_toType:s->function-3-ArrayDescOp function-5-TypeVar_getType:s->function-5-TypeVar___init__ function-5-TypeVar___init__:s->function-1-MatMul_KnownShape function-5-ArrayDesc_toType:s->function-1-ArrayDescOp function-11-TypeVar_getType:s->function-19-TypeVar___init__ function-19-TypeVar___init__:s->function-10-MatMul function-17-ArrayDesc_toType:s->function-13-ArrayDescOp function-12-TypeVar_getType:s->function-25-TypeVar___init__ function-25-TypeVar___init__:s->function-3-Term_getPort function-19-ArrayDesc_toType:s->function-17-ArrayDescOp function-3-Type___or__:s->function-3-Type___or__ function-3-Type___or__:s->function-25-ArrayDesc_toType function-25-ArrayDesc_toType:s->function-22-ArrayDescOp function-22-TypeVar_getType:s->function-30-TypeVar___init__ function-30-TypeVar___init__:s->function-39-MatMul_KnownShape function-0-TypeVar_getType:s->function-0-TypeVar___init__ function-0-TypeVar___init__:s->function-3-Region_get function-0-ArrayDesc_toType:s->function-0-ArrayDesc___init__ function-1-Type___or__:s->function-1-Type___or__ function-1-Type___or__:s->function-23-ArrayDesc_toType function-23-ArrayDesc_toType:s->function-5-ArrayDescOp function-14-TypeVar_getType:s->function-11-TypeVar___init__ function-11-TypeVar___init__:s->function-8-MatMul_KnownShape function-10-TypeVar_getType:s->function-18-TypeVar___init__ function-18-TypeVar___init__:s->function-12-MatMul_KnownShape function-16-ArrayDesc_toType:s->function-12-ArrayDescOp function-0-Type___or__:s->function-0-Type___or__ function-0-Type___or__:s->function-22-ArrayDesc_toType function-22-ArrayDesc_toType:s->function-4-ArrayDescOp function-13-TypeVar_getType:s->function-10-TypeVar___init__ function-10-TypeVar___init__:s->function-7-MatMul_KnownShape function-1-TypeVar_getType:s->function-1-TypeVar___init__ function-1-TypeVar___init__:s->function-0-Region_get function-1-ArrayDesc_toType:s->function-1-ArrayDesc___init__ function-23-TypeVar___init__:s->function-40-MatMul_KnownShape function-0-TypedOuts___init__:s->function-0-Region___init__ function-7-TypedIns_arg:s->function-0-TypedIns___init__ function-0-TypedIns___init__:s->function-0-Region___init__ function-9-TypeVar___init__:s->function-11-Term_getPort function-0-TypedOuts_at:s->function-0-TypedOuts___init__ function-4-TypedIns_arg:s->function-0-TypedIns___init__ function-6-TypedIns_arg:s->function-0-TypedIns___init__ function-5-TypedIns_arg:s->function-0-TypedIns___init__ function-18-ArrayDesc_ndim:s->function-22-ArrayDescOp function-21-ArrayDesc_ndim:s->function-23-ArrayDescOp function-5-ArrayDesc_ndim:s->function-1-ArrayDescOp function-1-ArrayDesc_ndim:s->function-1-ArrayDesc___init__ function-17-ArrayDesc_ndim:s->function-13-ArrayDescOp function-7-ArrayDesc_ndim:s->function-3-ArrayDescOp function-10-ArrayDesc_ndim:s->function-6-ArrayDescOp function-19-ArrayDesc_ndim:s->function-17-ArrayDescOp function-0-ArrayDesc_ndim:s->function-0-ArrayDesc___init__ function-13-ArrayDesc_ndim:s->function-20-ArrayDescOp function-16-ArrayDesc_ndim:s->function-12-ArrayDescOp function-4-ArrayDesc_ndim:s->function-0-ArrayDescOp function-6-ArrayDesc_ndim:s->function-2-ArrayDescOp function-3-ArrayDesc_ndim:s->function-3-ArrayDesc___init__ function-8-ArrayDesc_ndim:s->function-4-ArrayDescOp function-9-ArrayDesc_ndim:s->function-5-ArrayDescOp function-2-ArrayDesc_ndim:s->function-2-ArrayDesc___init__ function-15-ArrayDesc_ndim:s->function-21-ArrayDescOp function-2-ArrayDesc___init__ ArrayDesc("array_2") function-4-ArrayDescOp ArrayDescOp function-4-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 200) function-1-ArrayDesc___init__ ArrayDesc("array_1") function-22-ArrayDescOp ArrayDescOp function-36-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-2-ArrayDescOp ArrayDescOp function-7-MatMul MatMul function-13-ArrayDescOp ArrayDescOp function-1-MatMul MatMul function-5-ArrayDescOp ArrayDescOp function-5-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-20-ArrayDescOp ArrayDescOp function-22-MatMul MatMul function-21-ArrayDescOp ArrayDescOp function-25-MatMul MatMul function-23-ArrayDescOp ArrayDescOp function-35-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-3-ArrayDesc___init__ ArrayDesc("array_3") function-0-ArrayDescOp ArrayDescOp function-6-MatMul MatMul function-1-ArrayDescOp ArrayDescOp function-5-MatMul MatMul function-3-ArrayDescOp ArrayDescOp function-3-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-12-ArrayDescOp ArrayDescOp function-10-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-6-ArrayDescOp ArrayDescOp function-6-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-0-ArrayDesc___init__ ArrayDesc("array_0") function-17-ArrayDescOp ArrayDescOp function-44-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-0-ArrayDesc_dataLayout ·.dataLayout function-1-ArrayDesc_dataLayout ·.dataLayout function-2-ArrayDesc_dataLayout ·.dataLayout function-3-ArrayDesc_dataLayout ·.dataLayout function-0-DataLayout_c_contiguous DataLayout.c_contiguous function-7-ArrayDesc_dim ·.dim(·, 1) function-13-ArrayDesc_dim ·.dim(·, 1) function-21-ArrayDesc_dim ·.dim(·, 1) function-31-ArrayDesc_dim ·.dim(·, 1) function-37-ArrayDesc_dim ·.dim(·, 1) function-43-ArrayDesc_dim ·.dim(·, 1) function-2-Dim_fixed Dim.fixed(1) function-0-ArrayDesc_dim ·.dim(·, 0) function-3-ArrayDesc_dim ·.dim(·, 1) function-4-ArrayDesc_dim ·.dim(·, 0) function-8-ArrayDesc_dim ·.dim(·, 0) function-9-ArrayDesc_dim ·.dim(·, 1) function-12-ArrayDesc_dim ·.dim(·, 0) function-14-ArrayDesc_dim ·.dim(·, 0) function-15-ArrayDesc_dim ·.dim(·, 1) function-17-ArrayDesc_dim ·.dim(·, 1) function-18-ArrayDesc_dim ·.dim(·, 0) function-30-ArrayDesc_dim ·.dim(·, 0) function-32-ArrayDesc_dim ·.dim(·, 0) function-34-ArrayDesc_dim ·.dim(·, 0) function-35-ArrayDesc_dim ·.dim(·, 1) function-38-ArrayDesc_dim ·.dim(·, 0) function-42-ArrayDesc_dim ·.dim(·, 0) function-0-Dim_fixed Dim.fixed(200) function-1-ArrayDesc_dim ·.dim(·, 1) function-2-ArrayDesc_dim ·.dim(·, 0) function-5-ArrayDesc_dim ·.dim(·, 1) function-6-ArrayDesc_dim ·.dim(·, 0) function-10-ArrayDesc_dim ·.dim(·, 0) function-11-ArrayDesc_dim ·.dim(·, 1) function-16-ArrayDesc_dim ·.dim(·, 0) function-19-ArrayDesc_dim ·.dim(·, 1) function-20-ArrayDesc_dim ·.dim(·, 0) function-26-ArrayDesc_dim ·.dim(·, 0) function-27-ArrayDesc_dim ·.dim(·, 1) function-33-ArrayDesc_dim ·.dim(·, 1) function-36-ArrayDesc_dim ·.dim(·, 0) function-39-ArrayDesc_dim ·.dim(·, 1) function-1-Dim_fixed Dim.fixed(100) function-0-InPorts___init__ InPorts primitive-Vec_String-0 Vec("!io", "ary0", "ary1", "ary2", "ary3") function-1-Port___init__ Port("!ret", ·) function-58-MatMul MatMul function-1-PortList___getitem__ ·[1] function-0-PortList___init__ PortList function-0-Port___init__ Port("!io", ·) function-10-Term_getPort ·.getPort(·, 0) function-0-PortList___getitem__ ·[0] primitive-Vec_Port-2 Vec function-0-Region___init__ Region("425", ·) function-2-Port_name ·.name primitive-String-10 "!io" function-3-Port_name ·.name primitive-String-2684354580 "!ret" function-6-Region_get ·.get(·, 0) function-7-Term_getPort ·.getPort(·, 0) function-0-Py_MatMultIO Py_MatMultIO function-8-Term_getPort ·.getPort(·, 0) function-1-Py_MatMultIO Py_MatMultIO function-9-Term_getPort ·.getPort(·, 0) function-2-Py_MatMultIO Py_MatMultIO function-3-Py_MatMultIO Py_MatMultIO function-11-Term_getPort ·.getPort(·, 0) function-4-Py_MatMultIO Py_MatMultIO function-0-Port_value ·.value function-0-PortList_getValue ·.getValue(·, 0) function-0-Term_getPort ·.getPort(·, 1) function-0-MatMul MatMul function-3-Region_get ·.get(·, 1) function-0-Region_get ·.get(·, 2) function-0-Term_RegionEnd Term.RegionEnd function-14-Term_getPort ·.getPort(·, 1) function-0-Term_Func Term.Func("598", "transformed_code_input", ·) function-2-Term_getPort ·.getPort(·, 1) function-10-MatMul MatMul function-17-MatMul MatMul function-11-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 200) function-0-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-19-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-8-MatMul MatMul function-43-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-12-MatMul MatMul function-1-Region_get ·.get(·, 3) function-1-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-4-Region_get ·.get(·, 4) function-3-MatMul MatMul function-14-MatMul MatMul function-39-MatMul MatMul function-9-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-2-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-0-GraphRoot GraphRoot function-46-MatMul MatMul function-17-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 100) function-50-MatMul MatMul function-55-MatMul MatMul function-51-MatMul MatMul function-56-MatMul MatMul function-38-MatMul MatMul function-13-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-53-MatMul MatMul function-15-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-39-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-12-Term_getPort ·.getPort(·, 1) function-57-MatMul MatMul function-21-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-59-MatMul MatMul function-60-MatMul MatMul function-61-MatMul MatMul function-42-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-23-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-38-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-24-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-31-MatMul MatMul function-40-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-12-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-46-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-1-Port_value ·.value function-1-PortList_getValue ·.getValue(·, 1) function-8-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-54-MatMul MatMul function-18-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-2-MatMul MatMul function-1-Term_getPort ·.getPort(·, 1) function-3-Term_getPort ·.getPort(·, 1) function-9-MatMul MatMul function-20-MatMul MatMul function-14-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-20-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-15-MatMul MatMul function-7-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 200) function-40-MatMul MatMul function-13-Term_getPort ·.getPort(·, 0) function-52-MatMul MatMul function-37-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-41-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-2-TypeVar_getType ·.getType function-2-TypeVar___init__ TypeVar function-2-ArrayDesc_toType ·.toType function-9-TypeVar_getType ·.getType function-29-TypeVar___init__ TypeVar function-15-ArrayDesc_toType ·.toType function-0-ArrayDesc_dtype ·.dtype function-1-ArrayDesc_dtype ·.dtype function-2-ArrayDesc_dtype ·.dtype function-3-ArrayDesc_dtype ·.dtype function-4-ArrayDesc_dtype ·.dtype function-5-ArrayDesc_dtype ·.dtype function-6-ArrayDesc_dtype ·.dtype function-7-ArrayDesc_dtype ·.dtype function-8-ArrayDesc_dtype ·.dtype function-9-ArrayDesc_dtype ·.dtype function-10-ArrayDesc_dtype ·.dtype function-13-ArrayDesc_dtype ·.dtype function-15-ArrayDesc_dtype ·.dtype function-16-ArrayDesc_dtype ·.dtype function-17-ArrayDesc_dtype ·.dtype function-18-ArrayDesc_dtype ·.dtype function-19-ArrayDesc_dtype ·.dtype function-21-ArrayDesc_dtype ·.dtype function-0-Type_simple Type.simple("Float64") function-2-Type___or__ · | · function-24-ArrayDesc_toType ·.toType function-15-TypeVar_getType ·.getType function-12-TypeVar___init__ TypeVar function-3-TypeVar_getType ·.getType function-3-TypeVar___init__ TypeVar function-3-ArrayDesc_toType ·.toType function-6-TypeVar_getType ·.getType function-6-TypeVar___init__ TypeVar function-6-ArrayDesc_toType ·.toType function-17-TypeVar_getType ·.getType function-1-TypedOuts_at ·.at(·, 1) function-21-ArrayDesc_toType ·.toType function-8-TypeVar_getType ·.getType function-28-TypeVar___init__ TypeVar function-13-ArrayDesc_toType ·.toType function-4-TypeVar_getType ·.getType function-4-TypeVar___init__ TypeVar function-4-ArrayDesc_toType ·.toType function-7-TypeVar_getType ·.getType function-7-TypeVar___init__ TypeVar function-7-ArrayDesc_toType ·.toType function-5-TypeVar_getType ·.getType function-5-TypeVar___init__ TypeVar function-5-ArrayDesc_toType ·.toType function-11-TypeVar_getType ·.getType function-19-TypeVar___init__ TypeVar function-17-ArrayDesc_toType ·.toType function-12-TypeVar_getType ·.getType function-25-TypeVar___init__ TypeVar function-19-ArrayDesc_toType ·.toType function-3-Type___or__ · | · function-25-ArrayDesc_toType ·.toType function-22-TypeVar_getType ·.getType function-30-TypeVar___init__ TypeVar function-0-TypeVar_getType ·.getType function-0-TypeVar___init__ TypeVar function-0-ArrayDesc_toType ·.toType function-1-Type___or__ · | · function-23-ArrayDesc_toType ·.toType function-14-TypeVar_getType ·.getType function-11-TypeVar___init__ TypeVar function-10-TypeVar_getType ·.getType function-18-TypeVar___init__ TypeVar function-16-ArrayDesc_toType ·.toType function-0-Type___or__ · | · function-22-ArrayDesc_toType ·.toType function-13-TypeVar_getType ·.getType function-10-TypeVar___init__ TypeVar function-1-TypeVar_getType ·.getType function-1-TypeVar___init__ TypeVar function-1-ArrayDesc_toType ·.toType function-23-TypeVar___init__ TypeVar function-0-TypedOuts___init__ TypedOuts function-7-TypedIns_arg ·.arg(·, 4) function-0-TypedIns___init__ TypedIns function-9-TypeVar___init__ TypeVar function-0-TypedOuts_at ·.at(·, 0) function-4-TypedIns_arg ·.arg(·, 1) function-6-TypedIns_arg ·.arg(·, 3) function-5-TypedIns_arg ·.arg(·, 2) function-18-ArrayDesc_ndim ·.ndim split-14-primitive-i64-2 2 function-21-ArrayDesc_ndim ·.ndim split-16-primitive-i64-2 2 function-5-ArrayDesc_ndim ·.ndim split-4-primitive-i64-2 2 function-1-ArrayDesc_ndim ·.ndim split-0-primitive-i64-2 2 function-17-ArrayDesc_ndim ·.ndim split-13-primitive-i64-2 2 function-7-ArrayDesc_ndim ·.ndim split-6-primitive-i64-2 2 function-10-ArrayDesc_ndim ·.ndim split-9-primitive-i64-2 2 function-19-ArrayDesc_ndim ·.ndim split-15-primitive-i64-2 2 function-0-ArrayDesc_ndim ·.ndim primitive-i64-2 2 function-13-ArrayDesc_ndim ·.ndim split-10-primitive-i64-2 2 function-16-ArrayDesc_ndim ·.ndim split-12-primitive-i64-2 2 function-4-ArrayDesc_ndim ·.ndim split-3-primitive-i64-2 2 function-6-ArrayDesc_ndim ·.ndim split-5-primitive-i64-2 2 function-3-ArrayDesc_ndim ·.ndim split-2-primitive-i64-2 2 function-8-ArrayDesc_ndim ·.ndim split-7-primitive-i64-2 2 function-9-ArrayDesc_ndim ·.ndim split-8-primitive-i64-2 2 function-2-ArrayDesc_ndim ·.ndim split-1-primitive-i64-2 2 function-15-ArrayDesc_ndim ·.ndim split-11-primitive-i64-2 2
[metadata] ▶
time elapsed 188.05ms
timing breakdown:
  188.05ms: [debug] Saturated egraph

Cost Model for Matrix Multiplication¶

We define a cost model that estimates the computational cost of each matrix multiplication node, based on the classic formula 2 * m * n * k.

In [20]:
class MyCostModel(_ch05_CostModel):
    def get_cost_function(self, nodename, op, ty, cost, children):
        match op, tuple(children):
            case "MatMul_KnownShape", (_lhs, _rhs, m, n, k):
                return self.get_equation(
                    lambda lhs, rhs, *_, m, n, k: 2 * m * n * k,
                    constants=dict(m=m, n=n, k=k),
                )
            case "MatMul", _:
                return self.get_simple(float("inf"))
        return super().get_cost_function(nodename, op, ty, cost, children)
In [21]:
class NbOp_MatMulKnownShape(NbOp_Base):
    lhs: SExpr
    rhs: SExpr

    m: int
    n: int
    k: int

Custom converter to handle the MatMul_KnownShape node when converting from EGraph to RVSDG. This ensures that matrix multiplication nodes with known shapes are represented as NbOp_MatMulKnownShape in the RVSDG, preserving shape information for cost modeling and further analysis.

In [22]:
class MyEGraphToRVSDG(ExtendEGraphToRVSDG):

    def handle_Term(self, op: str, children: dict | list, grm: Grammar):
        match op, children:
            case "MatMul_KnownShape", {
                "lhs": lhs,
                "rhs": rhs,
                "m": m,
                "n": n,
                "k": k,
            }:
                return grm.write(
                    NbOp_MatMulKnownShape(lhs=lhs, rhs=rhs, m=m, n=n, k=k)
                )
        return super().handle_Term(op, children, grm)
In [23]:
if __name__ == "__main__":
    display(pipeline_middle_end.visualize())
    report = Report("Pipeline execution report", enable_nested_metadata=True)
    pipeline_middle_end(
        fn=code_input,
        argtypes=argtypes,
        arg_facts=ruleset_array_facts,
        extra_ruleset=extra_ruleset,
        cost_model=MyCostModel(),
        converter_class=MyEGraphToRVSDG,
        pipeline_report=report,
        pipeline_debug=True,
    )
    report.display()
Pipeline-pipeline_egraph_extraction cluster_legend Legend input_arg_facts arg_facts Ruleset stage_3 Stage 3 egraph_saturation → EGraphConversionOutput input_arg_facts->stage_3 arg_facts input_argtypes argtypes tuple input_argtypes->stage_3 argtypes input_converter_class converter_class Any stage_4 Stage 4 pipeline_egraph_extraction → EGraphExtractionOutput input_converter_class->stage_4 converter_class input_cost_model cost_model Any input_cost_model->stage_4 cost_model input_extra_ruleset extra_ruleset Ruleset input_extra_ruleset->stage_3 extra_ruleset input_fn fn Any stage_1 Stage 1 pipeline_frontend → FrontendOutput input_fn->stage_1 fn input_animate animate Any = False input_animate->stage_3 animate input_pipeline_debug pipeline_debug Any = False input_pipeline_debug->stage_3 pipeline_debug input_pipeline_report pipeline_report Any = DummyReport() input_pipeline_report->stage_1 pipeline_report stage_2 Stage 2 pipeline_egraph_conversion → EGraphOutput input_pipeline_report->stage_2 pipeline_report input_pipeline_report->stage_3 pipeline_report input_pipeline_report->stage_4 pipeline_report stage_1->stage_2 rvsdg_expr stage_1->stage_4 rvsdg_expr out_dbginfo dbginfo object stage_1->out_dbginfo dbginfo out_rvsdg_expr rvsdg_expr object stage_1->out_rvsdg_expr rvsdg_expr stage_2->stage_3 egraph stage_2->stage_3 egraph_root out_egraph_root egraph_root GraphRoot stage_2->out_egraph_root egraph_root stage_3->stage_4 egraph out_egraph egraph EGraph stage_3->out_egraph egraph out_saturation_steps saturation_steps list[str] | None stage_3->out_saturation_steps saturation_steps out_cost cost float stage_4->out_cost cost out_extracted extracted Any stage_4->out_extracted extracted legend_input Required Input legend_optional Optional Input legend_input->legend_optional legend_stage Processing Stage legend_optional->legend_stage legend_output Output legend_stage->legend_output

Pipeline execution report

1. Frontend (5.13ms) ▶
Frontend
Debug Info on RVSDG ▶
--------------------------------original source---------------------------------
   1|def code_input(ary0, ary1, ary2, ary3):
   2|    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
----------------------------------inter source----------------------------------
   1|def transformed_code_input(ary0, ary1, ary2, ary3):
   2|    """#file: /tmp/ipykernel_3941/2471768733.py"""
   3|    '#loc: 2:8-2:54'
   4|    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
RVSDG ▶
transformed_code_input = Func (Args (ArgSpec 'ary0' (PyNone)) (ArgSpec 'ary1' (PyNone)) (ArgSpec 'ary2' (PyNone)) (ArgSpec 'ary3' (PyNone)))
$0 = Region[425] <- !io ary0 ary1 ary2 ary3
{
  $1 = PyBinOp @ $0[0] $0[1], $0[2]
  $2 = PyBinOp @ $1[0] $1[1], $0[3]
  $3 = PyBinOp @ $2[0] $2[1], $0[2]
  $4 = PyBinOp @ $3[0] $3[1], $0[3]
  $5 = PyBinOp @ $4[0] $4[1], $0[4]
} [592] -> !io=$5[0] !ret=$5[1]
[metadata] ▶
time elapsed 5.13ms
timing breakdown:
  3.85ms: Debug Info on RVSDG 
  1.29ms: RVSDG               
2. EGraph Conversion (23.95ms) ▶
EGraph Conversion
EGraph ▶
outer_cluster_InPorts-0 cluster_InPorts-0 outer_cluster_Port-21 cluster_Port-21 outer_cluster_Port-23 cluster_Port-23 outer_cluster_PortList-24 cluster_PortList-24 outer_cluster_Region-1 cluster_Region-1 outer_cluster_Term-7 cluster_Term-7 outer_cluster_Term-15 cluster_Term-15 outer_cluster_Term-3 cluster_Term-3 outer_cluster_Term-20 cluster_Term-20 outer_cluster_Term-4 cluster_Term-4 outer_cluster_Term-8 cluster_Term-8 outer_cluster_Term-26 cluster_Term-26 outer_cluster_Term-16 cluster_Term-16 outer_cluster_Term-2 cluster_Term-2 outer_cluster_Term-6 cluster_Term-6 outer_cluster_Term-12 cluster_Term-12 outer_cluster_Term-22 cluster_Term-22 outer_cluster_Term-25 cluster_Term-25 outer_cluster_Term-10 cluster_Term-10 outer_cluster_Term-27 cluster_Term-27 outer_cluster_Term-5 cluster_Term-5 outer_cluster_Term-17 cluster_Term-17 outer_cluster_Term-13 cluster_Term-13 outer_cluster_Term-14 cluster_Term-14 outer_cluster_Term-18 cluster_Term-18 outer_cluster_Term-9 cluster_Term-9 outer_cluster_Term-19 cluster_Term-19 outer_cluster_Term-11 cluster_Term-11 outer_cluster_Vec_Port-0 cluster_Vec_Port-0 outer_cluster_Vec_String-0 cluster_Vec_String-0 function-0-InPorts___init__:s->primitive-Vec_String-0 function-0-Port___init__:s->function-8-Term_getPort function-8-Term_getPort:s->function-4-Py_MatMultIO function-1-Port___init__:s->function-9-Term_getPort function-9-Term_getPort:s->function-4-Py_MatMultIO function-0-PortList___init__:s->primitive-Vec_Port-0 primitive-Vec_Port-0:s->function-0-Port___init__ primitive-Vec_Port-0:s->function-1-Port___init__ function-0-Region___init__:s->function-0-InPorts___init__ function-0-Term_getPort:s->function-0-Py_MatMultIO function-0-Py_MatMultIO:s->function-2-Region_get function-0-Py_MatMultIO:s->function-0-Region_get function-0-Py_MatMultIO:s->function-3-Region_get function-3-Py_MatMultIO:s->function-4-Term_getPort function-3-Py_MatMultIO:s->function-5-Term_getPort function-3-Py_MatMultIO:s->function-1-Region_get function-4-Term_getPort:s->function-2-Py_MatMultIO function-5-Term_getPort:s->function-2-Py_MatMultIO function-1-Region_get:s->function-0-Region___init__ function-4-Py_MatMultIO:s->function-6-Term_getPort function-4-Py_MatMultIO:s->function-7-Term_getPort function-4-Py_MatMultIO:s->function-4-Region_get function-2-Region_get:s->function-0-Region___init__ function-1-Term_getPort:s->function-0-Py_MatMultIO function-0-Term_Func:s->function-0-Term_RegionEnd function-0-Term_RegionEnd:s->function-0-PortList___init__ function-0-Term_RegionEnd:s->function-0-Region___init__ function-6-Term_getPort:s->function-3-Py_MatMultIO function-0-Region_get:s->function-0-Region___init__ function-3-Region_get:s->function-0-Region___init__ function-2-Py_MatMultIO:s->function-0-Region_get function-2-Py_MatMultIO:s->function-2-Term_getPort function-2-Py_MatMultIO:s->function-3-Term_getPort function-2-Term_getPort:s->function-1-Py_MatMultIO function-3-Term_getPort:s->function-1-Py_MatMultIO function-1-Py_MatMultIO:s->function-0-Term_getPort function-1-Py_MatMultIO:s->function-1-Region_get function-1-Py_MatMultIO:s->function-1-Term_getPort function-0-GraphRoot:s->function-0-Term_Func function-7-Term_getPort:s->function-3-Py_MatMultIO function-4-Region_get:s->function-0-Region___init__ function-0-InPorts___init__ InPorts primitive-Vec_String-0 Vec("!io", "ary0", "ary1", "ary2", "ary3") function-0-Port___init__ Port("!io", ·) function-8-Term_getPort ·.getPort(·, 0) function-1-Port___init__ Port("!ret", ·) function-9-Term_getPort ·.getPort(·, 1) function-0-PortList___init__ PortList primitive-Vec_Port-0 Vec function-0-Region___init__ Region("425", ·) function-0-Term_getPort ·.getPort(·, 0) function-0-Py_MatMultIO Py_MatMultIO function-3-Py_MatMultIO Py_MatMultIO function-4-Term_getPort ·.getPort(·, 0) function-5-Term_getPort ·.getPort(·, 1) function-1-Region_get ·.get(·, 3) function-4-Py_MatMultIO Py_MatMultIO function-2-Region_get ·.get(·, 0) function-1-Term_getPort ·.getPort(·, 1) function-0-Term_Func Term.Func("598", "transformed_code_input", ·) function-0-Term_RegionEnd Term.RegionEnd function-6-Term_getPort ·.getPort(·, 0) function-0-Region_get ·.get(·, 2) function-3-Region_get ·.get(·, 1) function-2-Py_MatMultIO Py_MatMultIO function-2-Term_getPort ·.getPort(·, 0) function-3-Term_getPort ·.getPort(·, 1) function-1-Py_MatMultIO Py_MatMultIO function-0-GraphRoot GraphRoot function-7-Term_getPort ·.getPort(·, 1) function-4-Region_get ·.get(·, 4)
[metadata] ▶
time elapsed 23.95ms
timing breakdown:
  23.95ms: EGraph              
3. Egraph saturation (138.68ms) ▶
Egraph saturation
[debug] Saturated egraph ▶
outer_cluster_ArrayDesc-87 cluster_ArrayDesc-87 outer_cluster_ArrayDesc-157 cluster_ArrayDesc-157 outer_cluster_ArrayDesc-188 cluster_ArrayDesc-188 outer_cluster_ArrayDesc-151 cluster_ArrayDesc-151 outer_cluster_ArrayDesc-84 cluster_ArrayDesc-84 outer_cluster_ArrayDesc-93 cluster_ArrayDesc-93 outer_cluster_ArrayDesc-200 cluster_ArrayDesc-200 outer_cluster_ArrayDesc-194 cluster_ArrayDesc-194 outer_cluster_ArrayDesc-142 cluster_ArrayDesc-142 outer_cluster_ArrayDesc-163 cluster_ArrayDesc-163 outer_cluster_ArrayDesc-136 cluster_ArrayDesc-136 outer_cluster_ArrayDesc-36 cluster_ArrayDesc-36 outer_cluster_ArrayDesc-39 cluster_ArrayDesc-39 outer_cluster_ArrayDesc-30 cluster_ArrayDesc-30 outer_cluster_ArrayDesc-90 cluster_ArrayDesc-90 outer_cluster_ArrayDesc-33 cluster_ArrayDesc-33 outer_cluster_ArrayDesc-160 cluster_ArrayDesc-160 outer_cluster_ArrayDesc-139 cluster_ArrayDesc-139 outer_cluster_DataLayout-51 cluster_DataLayout-51 outer_cluster_Dim-49 cluster_Dim-49 outer_cluster_Dim-50 cluster_Dim-50 outer_cluster_Dim-53 cluster_Dim-53 outer_cluster_InPorts-0 cluster_InPorts-0 outer_cluster_Port-177 cluster_Port-177 outer_cluster_Port-100 cluster_Port-100 outer_cluster_PortList-24 cluster_PortList-24 outer_cluster_Region-1 cluster_Region-1 outer_cluster_String-10 cluster_String-10 outer_cluster_String-2684354580 cluster_String-2684354580 outer_cluster_Term-25 cluster_Term-25 outer_cluster_Term-27 cluster_Term-27 outer_cluster_Term-11 cluster_Term-11 outer_cluster_Term-26 cluster_Term-26 outer_cluster_Term-59 cluster_Term-59 outer_cluster_Term-18 cluster_Term-18 outer_cluster_Term-6 cluster_Term-6 outer_cluster_Term-14 cluster_Term-14 outer_cluster_Term-74 cluster_Term-74 outer_cluster_Term-108 cluster_Term-108 outer_cluster_Term-9 cluster_Term-9 outer_cluster_Term-5 cluster_Term-5 outer_cluster_Term-3 cluster_Term-3 outer_cluster_Term-2 cluster_Term-2 outer_cluster_Term-211 cluster_Term-211 outer_cluster_Term-57 cluster_Term-57 outer_cluster_Term-8 cluster_Term-8 outer_cluster_Term-15 cluster_Term-15 outer_cluster_Term-185 cluster_Term-185 outer_cluster_Term-54 cluster_Term-54 outer_cluster_Term-102 cluster_Term-102 outer_cluster_Term-17 cluster_Term-17 outer_cluster_Term-227 cluster_Term-227 outer_cluster_Term-12 cluster_Term-12 outer_cluster_Term-19 cluster_Term-19 outer_cluster_Term-118 cluster_Term-118 outer_cluster_Term-72 cluster_Term-72 outer_cluster_Term-61 cluster_Term-61 outer_cluster_Term-68 cluster_Term-68 outer_cluster_Type-52 cluster_Type-52 outer_cluster_Type-37 cluster_Type-37 outer_cluster_Type-40 cluster_Type-40 outer_cluster_Type-153 cluster_Type-153 outer_cluster_Type-159 cluster_Type-159 outer_cluster_Type-182 cluster_Type-182 outer_cluster_Type-181 cluster_Type-181 outer_cluster_Type-183 cluster_Type-183 outer_cluster_Type-34 cluster_Type-34 outer_cluster_Type-89 cluster_Type-89 outer_cluster_Type-95 cluster_Type-95 outer_cluster_Type-165 cluster_Type-165 outer_cluster_Type-196 cluster_Type-196 outer_cluster_Type-31 cluster_Type-31 outer_cluster_Type-86 cluster_Type-86 outer_cluster_Type-92 cluster_Type-92 outer_cluster_Type-212 cluster_Type-212 outer_cluster_Type-162 cluster_Type-162 outer_cluster_Type-202 cluster_Type-202 outer_cluster_TypeVar-158 cluster_TypeVar-158 outer_cluster_TypeVar-143 cluster_TypeVar-143 outer_cluster_TypeVar-189 cluster_TypeVar-189 outer_cluster_TypeVar-64 cluster_TypeVar-64 outer_cluster_TypeVar-94 cluster_TypeVar-94 outer_cluster_TypeVar-152 cluster_TypeVar-152 outer_cluster_TypeVar-195 cluster_TypeVar-195 outer_cluster_TypeVar-164 cluster_TypeVar-164 outer_cluster_TypeVar-161 cluster_TypeVar-161 outer_cluster_TypeVar-67 cluster_TypeVar-67 outer_cluster_TypeVar-85 cluster_TypeVar-85 outer_cluster_TypeVar-140 cluster_TypeVar-140 outer_cluster_TypeVar-91 cluster_TypeVar-91 outer_cluster_TypeVar-65 cluster_TypeVar-65 outer_cluster_TypeVar-106 cluster_TypeVar-106 outer_cluster_TypeVar-88 cluster_TypeVar-88 outer_cluster_TypeVar-137 cluster_TypeVar-137 outer_cluster_TypeVar-179 cluster_TypeVar-179 outer_cluster_TypeVar-66 cluster_TypeVar-66 outer_cluster_TypedIns-28 cluster_TypedIns-28 outer_cluster_TypedOuts-105 cluster_TypedOuts-105 outer_cluster_Vec_Port-2 cluster_Vec_Port-2 outer_cluster_Vec_String-0 cluster_Vec_String-0 outer_cluster_split-15-primitive-i64-2 cluster_split-15-primitive-i64-2 outer_cluster_split-14-primitive-i64-2 cluster_split-14-primitive-i64-2 outer_cluster_i64-2 cluster_i64-2 outer_cluster_split-13-primitive-i64-2 cluster_split-13-primitive-i64-2 outer_cluster_split-4-primitive-i64-2 cluster_split-4-primitive-i64-2 outer_cluster_split-10-primitive-i64-2 cluster_split-10-primitive-i64-2 outer_cluster_split-0-primitive-i64-2 cluster_split-0-primitive-i64-2 outer_cluster_split-1-primitive-i64-2 cluster_split-1-primitive-i64-2 outer_cluster_split-7-primitive-i64-2 cluster_split-7-primitive-i64-2 outer_cluster_split-12-primitive-i64-2 cluster_split-12-primitive-i64-2 outer_cluster_split-11-primitive-i64-2 cluster_split-11-primitive-i64-2 outer_cluster_split-2-primitive-i64-2 cluster_split-2-primitive-i64-2 outer_cluster_split-5-primitive-i64-2 cluster_split-5-primitive-i64-2 outer_cluster_split-16-primitive-i64-2 cluster_split-16-primitive-i64-2 outer_cluster_split-8-primitive-i64-2 cluster_split-8-primitive-i64-2 outer_cluster_split-3-primitive-i64-2 cluster_split-3-primitive-i64-2 outer_cluster_split-9-primitive-i64-2 cluster_split-9-primitive-i64-2 outer_cluster_split-6-primitive-i64-2 cluster_split-6-primitive-i64-2 function-1-ArrayDescOp:s->function-5-MatMul function-5-MatMul:s->function-1-Region_get function-5-MatMul:s->function-0-Region_get function-21-ArrayDescOp:s->function-25-MatMul function-25-MatMul:s->function-4-Region_get function-25-MatMul:s->function-8-MatMul_KnownShape function-22-ArrayDescOp:s->function-36-MatMul_KnownShape function-36-MatMul_KnownShape:s->function-4-MatMul_KnownShape function-36-MatMul_KnownShape:s->function-7-MatMul function-20-ArrayDescOp:s->function-22-MatMul function-22-MatMul:s->function-1-Region_get function-22-MatMul:s->function-7-MatMul_KnownShape function-0-ArrayDescOp:s->function-6-MatMul function-6-MatMul:s->function-1-Region_get function-6-MatMul:s->function-0-Region_get function-3-ArrayDescOp:s->function-3-MatMul_KnownShape function-3-MatMul_KnownShape:s->function-3-Region_get function-3-MatMul_KnownShape:s->function-0-Region_get function-23-ArrayDescOp:s->function-35-MatMul_KnownShape function-35-MatMul_KnownShape:s->function-4-Region_get function-35-MatMul_KnownShape:s->function-31-MatMul function-17-ArrayDescOp:s->function-44-MatMul_KnownShape function-44-MatMul_KnownShape:s->function-3-MatMul_KnownShape function-44-MatMul_KnownShape:s->function-15-MatMul function-6-ArrayDescOp:s->function-6-MatMul_KnownShape function-6-MatMul_KnownShape:s->function-5-MatMul function-6-MatMul_KnownShape:s->function-4-Region_get function-13-ArrayDescOp:s->function-1-MatMul function-1-MatMul:s->function-10-MatMul_KnownShape function-1-MatMul:s->function-0-Region_get function-4-ArrayDescOp:s->function-4-MatMul_KnownShape function-4-MatMul_KnownShape:s->function-0-Region_get function-4-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-2-ArrayDescOp:s->function-7-MatMul function-7-MatMul:s->function-1-Region_get function-7-MatMul:s->function-4-Region_get function-12-ArrayDescOp:s->function-10-MatMul_KnownShape function-10-MatMul_KnownShape:s->function-3-MatMul_KnownShape function-10-MatMul_KnownShape:s->function-1-Region_get function-5-ArrayDescOp:s->function-5-MatMul_KnownShape function-5-MatMul_KnownShape:s->function-1-Region_get function-5-MatMul_KnownShape:s->function-0-MatMul_KnownShape function-0-ArrayDesc_dataLayout:s->function-0-ArrayDesc___init__ function-1-ArrayDesc_dataLayout:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_dataLayout:s->function-2-ArrayDesc___init__ function-3-ArrayDesc_dataLayout:s->function-3-ArrayDesc___init__ function-0-ArrayDesc_dim:s->function-0-ArrayDesc___init__ function-3-ArrayDesc_dim:s->function-1-ArrayDesc___init__ function-4-ArrayDesc_dim:s->function-2-ArrayDesc___init__ function-8-ArrayDesc_dim:s->function-0-ArrayDescOp function-9-ArrayDesc_dim:s->function-0-ArrayDescOp function-12-ArrayDesc_dim:s->function-2-ArrayDescOp function-14-ArrayDesc_dim:s->function-3-ArrayDescOp function-15-ArrayDesc_dim:s->function-3-ArrayDescOp function-17-ArrayDesc_dim:s->function-4-ArrayDescOp function-18-ArrayDesc_dim:s->function-5-ArrayDescOp function-30-ArrayDesc_dim:s->function-21-ArrayDescOp function-32-ArrayDesc_dim:s->function-12-ArrayDescOp function-34-ArrayDesc_dim:s->function-13-ArrayDescOp function-35-ArrayDesc_dim:s->function-13-ArrayDescOp function-38-ArrayDesc_dim:s->function-17-ArrayDescOp function-42-ArrayDesc_dim:s->function-23-ArrayDescOp function-1-ArrayDesc_dim:s->function-0-ArrayDesc___init__ function-2-ArrayDesc_dim:s->function-1-ArrayDesc___init__ function-5-ArrayDesc_dim:s->function-2-ArrayDesc___init__ function-6-ArrayDesc_dim:s->function-3-ArrayDesc___init__ function-10-ArrayDesc_dim:s->function-1-ArrayDescOp function-11-ArrayDesc_dim:s->function-1-ArrayDescOp function-16-ArrayDesc_dim:s->function-4-ArrayDescOp function-19-ArrayDesc_dim:s->function-5-ArrayDescOp function-20-ArrayDesc_dim:s->function-6-ArrayDescOp function-26-ArrayDesc_dim:s->function-20-ArrayDescOp function-27-ArrayDesc_dim:s->function-20-ArrayDescOp function-33-ArrayDesc_dim:s->function-12-ArrayDescOp function-36-ArrayDesc_dim:s->function-22-ArrayDescOp function-39-ArrayDesc_dim:s->function-17-ArrayDescOp function-7-ArrayDesc_dim:s->function-3-ArrayDesc___init__ function-13-ArrayDesc_dim:s->function-2-ArrayDescOp function-21-ArrayDesc_dim:s->function-6-ArrayDescOp function-31-ArrayDesc_dim:s->function-21-ArrayDescOp function-37-ArrayDesc_dim:s->function-22-ArrayDescOp function-43-ArrayDesc_dim:s->function-23-ArrayDescOp function-0-InPorts___init__:s->primitive-Vec_String-0 function-1-Port___init__:s->function-58-MatMul function-58-MatMul:s->function-4-Region_get function-58-MatMul:s->function-21-MatMul_KnownShape function-1-PortList___getitem__:s->function-0-PortList___init__ function-0-PortList___init__:s->primitive-Vec_Port-2 function-0-Port___init__:s->function-10-Term_getPort function-10-Term_getPort:s->function-3-Py_MatMultIO function-0-PortList___getitem__:s->function-0-PortList___init__ primitive-Vec_Port-2:s->function-1-PortList___getitem__ primitive-Vec_Port-2:s->function-0-PortList___getitem__ function-0-Region___init__:s->function-0-InPorts___init__ function-2-Port_name:s->function-0-PortList___getitem__ function-3-Port_name:s->function-1-PortList___getitem__ function-0-Term_RegionEnd:s->function-0-PortList___init__ function-0-Term_RegionEnd:s->function-0-Region___init__ function-0-GraphRoot:s->function-0-Term_Func function-0-Term_Func:s->function-0-Term_RegionEnd function-1-Term_getPort:s->function-1-Py_MatMultIO function-1-Py_MatMultIO:s->function-0-MatMul function-1-Py_MatMultIO:s->function-1-Region_get function-1-Py_MatMultIO:s->function-9-Term_getPort function-2-MatMul:s->function-0-MatMul function-2-MatMul:s->function-1-Region_get function-0-MatMul:s->function-3-Region_get function-0-MatMul:s->function-0-Region_get function-1-Region_get:s->function-0-Region___init__ function-8-MatMul:s->function-5-MatMul function-8-MatMul:s->function-3-Region_get function-3-Region_get:s->function-0-Region___init__ function-12-MatMul_KnownShape:s->function-5-MatMul function-12-MatMul_KnownShape:s->function-3-Region_get function-4-Region_get:s->function-0-Region___init__ function-2-MatMul_KnownShape:s->function-1-Region_get function-2-MatMul_KnownShape:s->function-4-Region_get function-0-Py_MatMultIO:s->function-3-Region_get function-0-Py_MatMultIO:s->function-8-Term_getPort function-0-Py_MatMultIO:s->function-0-Region_get function-8-Term_getPort:s->function-1-Py_MatMultIO function-0-Region_get:s->function-0-Region___init__ function-2-Term_getPort:s->function-2-Py_MatMultIO function-2-Py_MatMultIO:s->function-10-Term_getPort function-2-Py_MatMultIO:s->function-2-MatMul function-2-Py_MatMultIO:s->function-0-Region_get function-10-MatMul:s->function-6-MatMul function-10-MatMul:s->function-3-MatMul_KnownShape function-17-MatMul:s->function-4-MatMul_KnownShape function-17-MatMul:s->function-3-Region_get function-11-MatMul_KnownShape:s->function-0-Term_getPort function-11-MatMul_KnownShape:s->function-0-MatMul_KnownShape function-0-Term_getPort:s->function-0-Py_MatMultIO function-0-MatMul_KnownShape:s->function-1-Region_get function-0-MatMul_KnownShape:s->function-0-Region_get function-19-MatMul_KnownShape:s->function-8-MatMul function-19-MatMul_KnownShape:s->function-0-Region_get function-43-MatMul_KnownShape:s->function-3-Region_get function-43-MatMul_KnownShape:s->function-12-MatMul function-12-MatMul:s->function-5-MatMul function-12-MatMul:s->function-0-Region_get function-15-MatMul:s->function-1-Region_get function-15-MatMul:s->function-0-MatMul_KnownShape function-40-MatMul:s->function-5-MatMul function-40-MatMul:s->function-1-Region_get function-8-MatMul_KnownShape:s->function-1-Region_get function-8-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-1-MatMul_KnownShape:s->function-1-Region_get function-1-MatMul_KnownShape:s->function-0-Region_get function-7-MatMul_KnownShape:s->function-6-MatMul function-7-MatMul_KnownShape:s->function-0-Region_get function-52-MatMul:s->function-0-Region_get function-52-MatMul:s->function-40-MatMul function-53-MatMul:s->function-5-MatMul function-53-MatMul:s->function-1-MatMul_KnownShape function-17-MatMul_KnownShape:s->function-5-MatMul function-17-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-37-MatMul_KnownShape:s->function-5-MatMul_KnownShape function-37-MatMul_KnownShape:s->function-0-Region_get function-41-MatMul_KnownShape:s->function-1-Region_get function-41-MatMul_KnownShape:s->function-7-MatMul_KnownShape function-9-Term_getPort:s->function-2-Py_MatMultIO function-13-Term_getPort:s->function-0-Term_RegionEnd function-3-Py_MatMultIO:s->function-1-MatMul function-3-Py_MatMultIO:s->function-1-Region_get function-3-Py_MatMultIO:s->function-11-Term_getPort function-11-Term_getPort:s->function-4-Py_MatMultIO function-46-MatMul:s->function-4-Region_get function-46-MatMul:s->function-17-MatMul_KnownShape function-50-MatMul:s->function-0-Region_get function-50-MatMul:s->function-55-MatMul function-55-MatMul:s->function-2-MatMul_KnownShape function-55-MatMul:s->function-0-MatMul_KnownShape function-51-MatMul:s->function-1-MatMul_KnownShape function-51-MatMul:s->function-9-MatMul_KnownShape function-9-MatMul_KnownShape:s->function-2-MatMul_KnownShape function-9-MatMul_KnownShape:s->function-0-Region_get function-56-MatMul:s->function-7-MatMul function-56-MatMul:s->function-38-MatMul function-38-MatMul:s->function-6-MatMul function-38-MatMul:s->function-0-Region_get function-13-MatMul_KnownShape:s->function-4-Region_get function-13-MatMul_KnownShape:s->function-53-MatMul function-15-MatMul_KnownShape:s->function-0-Region_get function-15-MatMul_KnownShape:s->function-55-MatMul function-39-MatMul_KnownShape:s->function-5-MatMul function-39-MatMul_KnownShape:s->function-9-MatMul_KnownShape function-12-Term_getPort:s->function-4-Py_MatMultIO function-4-Py_MatMultIO:s->function-4-Region_get function-4-Py_MatMultIO:s->function-3-MatMul function-4-Py_MatMultIO:s->function-0-Port_value function-57-MatMul:s->function-3-Region_get function-57-MatMul:s->function-15-MatMul_KnownShape function-21-MatMul_KnownShape:s->function-1-Region_get function-21-MatMul_KnownShape:s->function-19-MatMul_KnownShape function-59-MatMul:s->function-2-MatMul_KnownShape function-59-MatMul:s->function-2-Term_getPort function-60-MatMul:s->function-8-MatMul function-60-MatMul:s->function-39-MatMul function-39-MatMul:s->function-7-MatMul function-39-MatMul:s->function-0-Region_get function-61-MatMul:s->function-0-MatMul function-61-MatMul:s->function-42-MatMul_KnownShape function-42-MatMul_KnownShape:s->function-4-Region_get function-42-MatMul_KnownShape:s->function-8-MatMul_KnownShape function-23-MatMul_KnownShape:s->function-0-MatMul function-23-MatMul_KnownShape:s->function-38-MatMul_KnownShape function-38-MatMul_KnownShape:s->function-6-MatMul_KnownShape function-38-MatMul_KnownShape:s->function-1-Region_get function-24-MatMul_KnownShape:s->function-2-MatMul_KnownShape function-24-MatMul_KnownShape:s->function-43-MatMul_KnownShape function-31-MatMul:s->function-3-Region_get function-31-MatMul:s->function-53-MatMul function-40-MatMul_KnownShape:s->function-12-MatMul_KnownShape function-40-MatMul_KnownShape:s->function-14-MatMul function-14-MatMul:s->function-4-Region_get function-14-MatMul:s->function-1-MatMul_KnownShape function-46-MatMul_KnownShape:s->function-3-Region_get function-46-MatMul_KnownShape:s->function-13-MatMul_KnownShape function-1-Port_value:s->function-1-Port___init__ function-1-PortList_getValue:s->function-0-PortList___init__ function-3-Term_getPort:s->function-3-Py_MatMultIO function-3-MatMul:s->function-1-Region_get function-3-MatMul:s->function-11-MatMul_KnownShape function-9-MatMul:s->function-2-MatMul function-9-MatMul:s->function-1-MatMul_KnownShape function-20-MatMul:s->function-5-MatMul_KnownShape function-20-MatMul:s->function-0-Term_getPort function-14-MatMul_KnownShape:s->function-3-Region_get function-14-MatMul_KnownShape:s->function-17-MatMul_KnownShape function-20-MatMul_KnownShape:s->function-10-MatMul_KnownShape function-20-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-14-Term_getPort:s->function-0-Term_RegionEnd function-0-Port_value:s->function-0-Port___init__ function-54-MatMul:s->function-1-Region_get function-54-MatMul:s->function-14-MatMul function-18-MatMul_KnownShape:s->function-6-MatMul function-18-MatMul_KnownShape:s->function-7-MatMul function-6-Region_get:s->function-0-Region___init__ function-7-Term_getPort:s->function-0-Py_MatMultIO function-0-PortList_getValue:s->function-0-PortList___init__ function-0-ArrayDesc_dtype:s->function-0-ArrayDesc___init__ function-1-ArrayDesc_dtype:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_dtype:s->function-2-ArrayDesc___init__ function-3-ArrayDesc_dtype:s->function-3-ArrayDesc___init__ function-4-ArrayDesc_dtype:s->function-0-ArrayDescOp function-5-ArrayDesc_dtype:s->function-1-ArrayDescOp function-6-ArrayDesc_dtype:s->function-2-ArrayDescOp function-7-ArrayDesc_dtype:s->function-3-ArrayDescOp function-8-ArrayDesc_dtype:s->function-4-ArrayDescOp function-9-ArrayDesc_dtype:s->function-5-ArrayDescOp function-10-ArrayDesc_dtype:s->function-6-ArrayDescOp function-13-ArrayDesc_dtype:s->function-20-ArrayDescOp function-15-ArrayDesc_dtype:s->function-21-ArrayDescOp function-16-ArrayDesc_dtype:s->function-12-ArrayDescOp function-17-ArrayDesc_dtype:s->function-13-ArrayDescOp function-18-ArrayDesc_dtype:s->function-22-ArrayDescOp function-19-ArrayDesc_dtype:s->function-17-ArrayDescOp function-21-ArrayDesc_dtype:s->function-23-ArrayDescOp function-2-TypeVar_getType:s->function-2-TypeVar___init__ function-2-TypeVar___init__:s->function-1-Region_get function-2-ArrayDesc_toType:s->function-2-ArrayDesc___init__ function-3-TypeVar_getType:s->function-3-TypeVar___init__ function-3-TypeVar___init__:s->function-4-Region_get function-3-ArrayDesc_toType:s->function-3-ArrayDesc___init__ function-8-TypeVar_getType:s->function-28-TypeVar___init__ function-28-TypeVar___init__:s->function-52-MatMul function-13-ArrayDesc_toType:s->function-20-ArrayDescOp function-9-TypeVar_getType:s->function-29-TypeVar___init__ function-29-TypeVar___init__:s->function-54-MatMul function-15-ArrayDesc_toType:s->function-21-ArrayDescOp function-1-Type___or__:s->function-1-Type___or__ function-1-Type___or__:s->function-23-ArrayDesc_toType function-23-ArrayDesc_toType:s->function-5-ArrayDescOp function-14-TypeVar_getType:s->function-11-TypeVar___init__ function-11-TypeVar___init__:s->function-8-MatMul_KnownShape function-0-Type___or__:s->function-0-Type___or__ function-0-Type___or__:s->function-22-ArrayDesc_toType function-22-ArrayDesc_toType:s->function-4-ArrayDescOp function-13-TypeVar_getType:s->function-10-TypeVar___init__ function-10-TypeVar___init__:s->function-7-MatMul_KnownShape function-2-Type___or__:s->function-2-Type___or__ function-2-Type___or__:s->function-24-ArrayDesc_toType function-24-ArrayDesc_toType:s->function-6-ArrayDescOp function-15-TypeVar_getType:s->function-12-TypeVar___init__ function-12-TypeVar___init__:s->function-9-MatMul_KnownShape function-1-TypeVar_getType:s->function-1-TypeVar___init__ function-1-TypeVar___init__:s->function-0-Region_get function-1-ArrayDesc_toType:s->function-1-ArrayDesc___init__ function-5-TypeVar_getType:s->function-5-TypeVar___init__ function-5-TypeVar___init__:s->function-1-MatMul_KnownShape function-5-ArrayDesc_toType:s->function-1-ArrayDescOp function-7-TypeVar_getType:s->function-7-TypeVar___init__ function-7-TypeVar___init__:s->function-0-Term_getPort function-7-ArrayDesc_toType:s->function-3-ArrayDescOp function-11-TypeVar_getType:s->function-19-TypeVar___init__ function-19-TypeVar___init__:s->function-10-MatMul function-17-ArrayDesc_toType:s->function-13-ArrayDescOp function-12-TypeVar_getType:s->function-25-TypeVar___init__ function-25-TypeVar___init__:s->function-3-Term_getPort function-19-ArrayDesc_toType:s->function-17-ArrayDescOp function-0-TypeVar_getType:s->function-0-TypeVar___init__ function-0-TypeVar___init__:s->function-3-Region_get function-0-ArrayDesc_toType:s->function-0-ArrayDesc___init__ function-4-TypeVar_getType:s->function-4-TypeVar___init__ function-4-TypeVar___init__:s->function-0-MatMul_KnownShape function-4-ArrayDesc_toType:s->function-0-ArrayDescOp function-6-TypeVar_getType:s->function-6-TypeVar___init__ function-6-TypeVar___init__:s->function-2-MatMul_KnownShape function-6-ArrayDesc_toType:s->function-2-ArrayDescOp function-3-Type___or__:s->function-3-Type___or__ function-3-Type___or__:s->function-25-ArrayDesc_toType function-25-ArrayDesc_toType:s->function-22-ArrayDescOp function-22-TypeVar_getType:s->function-30-TypeVar___init__ function-30-TypeVar___init__:s->function-39-MatMul_KnownShape function-10-TypeVar_getType:s->function-18-TypeVar___init__ function-18-TypeVar___init__:s->function-12-MatMul_KnownShape function-16-ArrayDesc_toType:s->function-12-ArrayDescOp function-17-TypeVar_getType:s->function-1-TypedOuts_at function-1-TypedOuts_at:s->function-0-TypedOuts___init__ function-21-ArrayDesc_toType:s->function-23-ArrayDescOp function-4-TypedIns_arg:s->function-0-TypedIns___init__ function-0-TypedIns___init__:s->function-0-Region___init__ function-7-TypedIns_arg:s->function-0-TypedIns___init__ function-5-TypedIns_arg:s->function-0-TypedIns___init__ function-9-TypeVar___init__:s->function-11-Term_getPort function-0-TypedOuts_at:s->function-0-TypedOuts___init__ function-0-TypedOuts___init__:s->function-0-Region___init__ function-23-TypeVar___init__:s->function-40-MatMul_KnownShape function-6-TypedIns_arg:s->function-0-TypedIns___init__ function-19-ArrayDesc_ndim:s->function-17-ArrayDescOp function-18-ArrayDesc_ndim:s->function-22-ArrayDescOp function-0-ArrayDesc_ndim:s->function-0-ArrayDesc___init__ function-17-ArrayDesc_ndim:s->function-13-ArrayDescOp function-5-ArrayDesc_ndim:s->function-1-ArrayDescOp function-13-ArrayDesc_ndim:s->function-20-ArrayDescOp function-1-ArrayDesc_ndim:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_ndim:s->function-2-ArrayDesc___init__ function-8-ArrayDesc_ndim:s->function-4-ArrayDescOp function-16-ArrayDesc_ndim:s->function-12-ArrayDescOp function-15-ArrayDesc_ndim:s->function-21-ArrayDescOp function-3-ArrayDesc_ndim:s->function-3-ArrayDesc___init__ function-6-ArrayDesc_ndim:s->function-2-ArrayDescOp function-21-ArrayDesc_ndim:s->function-23-ArrayDescOp function-9-ArrayDesc_ndim:s->function-5-ArrayDescOp function-4-ArrayDesc_ndim:s->function-0-ArrayDescOp function-10-ArrayDesc_ndim:s->function-6-ArrayDescOp function-7-ArrayDesc_ndim:s->function-3-ArrayDescOp function-1-ArrayDescOp ArrayDescOp function-5-MatMul MatMul function-21-ArrayDescOp ArrayDescOp function-25-MatMul MatMul function-22-ArrayDescOp ArrayDescOp function-36-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-20-ArrayDescOp ArrayDescOp function-22-MatMul MatMul function-0-ArrayDescOp ArrayDescOp function-6-MatMul MatMul function-3-ArrayDescOp ArrayDescOp function-3-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-23-ArrayDescOp ArrayDescOp function-35-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-17-ArrayDescOp ArrayDescOp function-44-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-6-ArrayDescOp ArrayDescOp function-6-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-13-ArrayDescOp ArrayDescOp function-1-MatMul MatMul function-4-ArrayDescOp ArrayDescOp function-4-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 200) function-2-ArrayDesc___init__ ArrayDesc("array_2") function-3-ArrayDesc___init__ ArrayDesc("array_3") function-0-ArrayDesc___init__ ArrayDesc("array_0") function-2-ArrayDescOp ArrayDescOp function-7-MatMul MatMul function-1-ArrayDesc___init__ ArrayDesc("array_1") function-12-ArrayDescOp ArrayDescOp function-10-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-5-ArrayDescOp ArrayDescOp function-5-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-0-ArrayDesc_dataLayout ·.dataLayout function-1-ArrayDesc_dataLayout ·.dataLayout function-2-ArrayDesc_dataLayout ·.dataLayout function-3-ArrayDesc_dataLayout ·.dataLayout function-0-DataLayout_c_contiguous DataLayout.c_contiguous function-0-ArrayDesc_dim ·.dim(·, 0) function-3-ArrayDesc_dim ·.dim(·, 1) function-4-ArrayDesc_dim ·.dim(·, 0) function-8-ArrayDesc_dim ·.dim(·, 0) function-9-ArrayDesc_dim ·.dim(·, 1) function-12-ArrayDesc_dim ·.dim(·, 0) function-14-ArrayDesc_dim ·.dim(·, 0) function-15-ArrayDesc_dim ·.dim(·, 1) function-17-ArrayDesc_dim ·.dim(·, 1) function-18-ArrayDesc_dim ·.dim(·, 0) function-30-ArrayDesc_dim ·.dim(·, 0) function-32-ArrayDesc_dim ·.dim(·, 0) function-34-ArrayDesc_dim ·.dim(·, 0) function-35-ArrayDesc_dim ·.dim(·, 1) function-38-ArrayDesc_dim ·.dim(·, 0) function-42-ArrayDesc_dim ·.dim(·, 0) function-0-Dim_fixed Dim.fixed(200) function-1-ArrayDesc_dim ·.dim(·, 1) function-2-ArrayDesc_dim ·.dim(·, 0) function-5-ArrayDesc_dim ·.dim(·, 1) function-6-ArrayDesc_dim ·.dim(·, 0) function-10-ArrayDesc_dim ·.dim(·, 0) function-11-ArrayDesc_dim ·.dim(·, 1) function-16-ArrayDesc_dim ·.dim(·, 0) function-19-ArrayDesc_dim ·.dim(·, 1) function-20-ArrayDesc_dim ·.dim(·, 0) function-26-ArrayDesc_dim ·.dim(·, 0) function-27-ArrayDesc_dim ·.dim(·, 1) function-33-ArrayDesc_dim ·.dim(·, 1) function-36-ArrayDesc_dim ·.dim(·, 0) function-39-ArrayDesc_dim ·.dim(·, 1) function-1-Dim_fixed Dim.fixed(100) function-7-ArrayDesc_dim ·.dim(·, 1) function-13-ArrayDesc_dim ·.dim(·, 1) function-21-ArrayDesc_dim ·.dim(·, 1) function-31-ArrayDesc_dim ·.dim(·, 1) function-37-ArrayDesc_dim ·.dim(·, 1) function-43-ArrayDesc_dim ·.dim(·, 1) function-2-Dim_fixed Dim.fixed(1) function-0-InPorts___init__ InPorts primitive-Vec_String-0 Vec("!io", "ary0", "ary1", "ary2", "ary3") function-1-Port___init__ Port("!ret", ·) function-58-MatMul MatMul function-1-PortList___getitem__ ·[1] function-0-PortList___init__ PortList function-0-Port___init__ Port("!io", ·) function-10-Term_getPort ·.getPort(·, 0) function-0-PortList___getitem__ ·[0] primitive-Vec_Port-2 Vec function-0-Region___init__ Region("425", ·) function-2-Port_name ·.name primitive-String-10 "!io" function-3-Port_name ·.name primitive-String-2684354580 "!ret" function-0-Term_RegionEnd Term.RegionEnd function-0-GraphRoot GraphRoot function-0-Term_Func Term.Func("598", "transformed_code_input", ·) function-1-Term_getPort ·.getPort(·, 1) function-1-Py_MatMultIO Py_MatMultIO function-2-MatMul MatMul function-0-MatMul MatMul function-1-Region_get ·.get(·, 3) function-8-MatMul MatMul function-3-Region_get ·.get(·, 1) function-12-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-4-Region_get ·.get(·, 4) function-2-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-0-Py_MatMultIO Py_MatMultIO function-8-Term_getPort ·.getPort(·, 0) function-0-Region_get ·.get(·, 2) function-2-Term_getPort ·.getPort(·, 1) function-2-Py_MatMultIO Py_MatMultIO function-10-MatMul MatMul function-17-MatMul MatMul function-11-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 200) function-0-Term_getPort ·.getPort(·, 1) function-0-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-19-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-43-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-12-MatMul MatMul function-15-MatMul MatMul function-40-MatMul MatMul function-8-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-1-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-7-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 200) function-52-MatMul MatMul function-53-MatMul MatMul function-17-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 100) function-37-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-41-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-9-Term_getPort ·.getPort(·, 0) function-13-Term_getPort ·.getPort(·, 0) function-3-Py_MatMultIO Py_MatMultIO function-11-Term_getPort ·.getPort(·, 0) function-46-MatMul MatMul function-50-MatMul MatMul function-55-MatMul MatMul function-51-MatMul MatMul function-9-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-56-MatMul MatMul function-38-MatMul MatMul function-13-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-15-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-39-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-12-Term_getPort ·.getPort(·, 1) function-4-Py_MatMultIO Py_MatMultIO function-57-MatMul MatMul function-21-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-59-MatMul MatMul function-60-MatMul MatMul function-39-MatMul MatMul function-61-MatMul MatMul function-42-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-23-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-38-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-24-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-31-MatMul MatMul function-40-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-14-MatMul MatMul function-46-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-1-Port_value ·.value function-1-PortList_getValue ·.getValue(·, 1) function-3-Term_getPort ·.getPort(·, 1) function-3-MatMul MatMul function-9-MatMul MatMul function-20-MatMul MatMul function-14-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-20-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-14-Term_getPort ·.getPort(·, 1) function-0-Port_value ·.value function-54-MatMul MatMul function-18-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-6-Region_get ·.get(·, 0) function-7-Term_getPort ·.getPort(·, 0) function-0-PortList_getValue ·.getValue(·, 0) function-0-ArrayDesc_dtype ·.dtype function-1-ArrayDesc_dtype ·.dtype function-2-ArrayDesc_dtype ·.dtype function-3-ArrayDesc_dtype ·.dtype function-4-ArrayDesc_dtype ·.dtype function-5-ArrayDesc_dtype ·.dtype function-6-ArrayDesc_dtype ·.dtype function-7-ArrayDesc_dtype ·.dtype function-8-ArrayDesc_dtype ·.dtype function-9-ArrayDesc_dtype ·.dtype function-10-ArrayDesc_dtype ·.dtype function-13-ArrayDesc_dtype ·.dtype function-15-ArrayDesc_dtype ·.dtype function-16-ArrayDesc_dtype ·.dtype function-17-ArrayDesc_dtype ·.dtype function-18-ArrayDesc_dtype ·.dtype function-19-ArrayDesc_dtype ·.dtype function-21-ArrayDesc_dtype ·.dtype function-0-Type_simple Type.simple("Float64") function-2-TypeVar_getType ·.getType function-2-TypeVar___init__ TypeVar function-2-ArrayDesc_toType ·.toType function-3-TypeVar_getType ·.getType function-3-TypeVar___init__ TypeVar function-3-ArrayDesc_toType ·.toType function-8-TypeVar_getType ·.getType function-28-TypeVar___init__ TypeVar function-13-ArrayDesc_toType ·.toType function-9-TypeVar_getType ·.getType function-29-TypeVar___init__ TypeVar function-15-ArrayDesc_toType ·.toType function-1-Type___or__ · | · function-23-ArrayDesc_toType ·.toType function-14-TypeVar_getType ·.getType function-11-TypeVar___init__ TypeVar function-0-Type___or__ · | · function-22-ArrayDesc_toType ·.toType function-13-TypeVar_getType ·.getType function-10-TypeVar___init__ TypeVar function-2-Type___or__ · | · function-24-ArrayDesc_toType ·.toType function-15-TypeVar_getType ·.getType function-12-TypeVar___init__ TypeVar function-1-TypeVar_getType ·.getType function-1-TypeVar___init__ TypeVar function-1-ArrayDesc_toType ·.toType function-5-TypeVar_getType ·.getType function-5-TypeVar___init__ TypeVar function-5-ArrayDesc_toType ·.toType function-7-TypeVar_getType ·.getType function-7-TypeVar___init__ TypeVar function-7-ArrayDesc_toType ·.toType function-11-TypeVar_getType ·.getType function-19-TypeVar___init__ TypeVar function-17-ArrayDesc_toType ·.toType function-12-TypeVar_getType ·.getType function-25-TypeVar___init__ TypeVar function-19-ArrayDesc_toType ·.toType function-0-TypeVar_getType ·.getType function-0-TypeVar___init__ TypeVar function-0-ArrayDesc_toType ·.toType function-4-TypeVar_getType ·.getType function-4-TypeVar___init__ TypeVar function-4-ArrayDesc_toType ·.toType function-6-TypeVar_getType ·.getType function-6-TypeVar___init__ TypeVar function-6-ArrayDesc_toType ·.toType function-3-Type___or__ · | · function-25-ArrayDesc_toType ·.toType function-22-TypeVar_getType ·.getType function-30-TypeVar___init__ TypeVar function-10-TypeVar_getType ·.getType function-18-TypeVar___init__ TypeVar function-16-ArrayDesc_toType ·.toType function-17-TypeVar_getType ·.getType function-1-TypedOuts_at ·.at(·, 1) function-21-ArrayDesc_toType ·.toType function-4-TypedIns_arg ·.arg(·, 1) function-0-TypedIns___init__ TypedIns function-7-TypedIns_arg ·.arg(·, 4) function-5-TypedIns_arg ·.arg(·, 2) function-9-TypeVar___init__ TypeVar function-0-TypedOuts_at ·.at(·, 0) function-0-TypedOuts___init__ TypedOuts function-23-TypeVar___init__ TypeVar function-6-TypedIns_arg ·.arg(·, 3) function-19-ArrayDesc_ndim ·.ndim split-15-primitive-i64-2 2 function-18-ArrayDesc_ndim ·.ndim split-14-primitive-i64-2 2 function-0-ArrayDesc_ndim ·.ndim primitive-i64-2 2 function-17-ArrayDesc_ndim ·.ndim split-13-primitive-i64-2 2 function-5-ArrayDesc_ndim ·.ndim split-4-primitive-i64-2 2 function-13-ArrayDesc_ndim ·.ndim split-10-primitive-i64-2 2 function-1-ArrayDesc_ndim ·.ndim split-0-primitive-i64-2 2 function-2-ArrayDesc_ndim ·.ndim split-1-primitive-i64-2 2 function-8-ArrayDesc_ndim ·.ndim split-7-primitive-i64-2 2 function-16-ArrayDesc_ndim ·.ndim split-12-primitive-i64-2 2 function-15-ArrayDesc_ndim ·.ndim split-11-primitive-i64-2 2 function-3-ArrayDesc_ndim ·.ndim split-2-primitive-i64-2 2 function-6-ArrayDesc_ndim ·.ndim split-5-primitive-i64-2 2 function-21-ArrayDesc_ndim ·.ndim split-16-primitive-i64-2 2 function-9-ArrayDesc_ndim ·.ndim split-8-primitive-i64-2 2 function-4-ArrayDesc_ndim ·.ndim split-3-primitive-i64-2 2 function-10-ArrayDesc_ndim ·.ndim split-9-primitive-i64-2 2 function-7-ArrayDesc_ndim ·.ndim split-6-primitive-i64-2 2
[metadata] ▶
time elapsed 138.68ms
timing breakdown:
  138.68ms: [debug] Saturated egraph
4. EGraph Extraction (14.28ms) ▶
EGraph Extraction
Cost ▶
12822651.0
Extracted ▶
transformed_code_input = Func (Args (ArgSpec 'ary0' (PyNone)) (ArgSpec 'ary1' (PyNone)) (ArgSpec 'ary2' (PyNone)) (ArgSpec 'ary3' (PyNone)))
$0 = Region[751] <- !io ary0 ary1 ary2 ary3
{
  $1 = NbOp_MatMulKnownShape $0[3] $0[4] 200 100 1
  $2 = NbOp_MatMulKnownShape $0[2] $1 100 200 1
  $3 = NbOp_MatMulKnownShape $0[3] $2 200 100 1
  $4 = NbOp_MatMulKnownShape $0[2] $3 100 200 1
  $5 = NbOp_MatMulKnownShape $0[1] $4 200 100 1
} [835] -> !io=$0[0] !ret=$5
[metadata] ▶
time elapsed 14.28ms
timing breakdown:
  13.09ms: Cost                
  1.19ms: Extracted           

Extract Python Source from Optimized Expression¶

This section shows how to turn the optimized computation into executable Python code, and compare it to the original and hand-optimized versions.

In [24]:
class SourceMaker(ase.TreeVisitor):
    def __init__(self):
        super().__init__()
        self.memo = {}
        self.out = []

    def visit(self, expr: SExpr):
        memo = self.memo
        buf = self.out
        match expr:
            case rg.Attrs():
                return None
            case rg.RegionBegin(attrs=attrs, inports=inports):
                memo[expr] = [f"arg{i}" for i, v in enumerate(inports)]
                self.nargs = len(inports) - 1
            case rg.Unpack(val=val, idx=idx):
                val = memo[val]
                memo[expr] = val[idx]
            case NbOp_MatMulKnownShape(lhs=lhs, rhs=rhs, m=m, n=n, k=k):
                lhs, rhs = memo[lhs], memo[rhs]
                memo[expr] = ref = f"v{len(memo)}"
                buf.append(f"{ref} = ({lhs} @ {rhs})")
            case _:
                raise ValueError(expr)

    def get_source(self):
        source = "; ".join(self.out)
        args = [f"arg{i}" for i in range(1, self.nargs + 1)]
        last = f"v{len(self.memo) - 1}"
        template = f"""
def func({', '.join(args)}):
    {source}
    return {last}
"""
        return template

    def get_function(self, global_ns={}):
        source_code = self.get_source()
        exec(source_code, global_ns)
        return global_ns["func"]
In [25]:
def extract_py_source(extracted, sourcemaker_class=SourceMaker, global_ns={}):
    visitor = sourcemaker_class()
    outports = extracted.body.ports
    [out_equ] = [p.value for p in outports if p.name == "!ret"]
    ase.apply_bottomup(out_equ, visitor)
    return visitor.get_function(global_ns=global_ns), visitor.get_source()
In [26]:
class ExtractedOutput(TypedDict):
    extracted: Any
    source: str
In [27]:
@pipeline_middle_end.extend
def compiler(
    extracted,
    sourcemaker_class,
    global_ns=None,
    pipeline_report=Report.Sink(),
    pipeline_debug=False,
) -> ExtractedOutput:
    extracted, source = extract_py_source(
        extracted,
        sourcemaker_class=sourcemaker_class,
        global_ns=global_ns or {},
    )
    pipeline_report.append("Extracted source", source)
    return dict(extracted=extracted, source=source)
In [28]:
if __name__ == "__main__":
    display(compiler.visualize())
Pipeline-compiler cluster_legend Legend input_arg_facts arg_facts Ruleset stage_3 Stage 3 egraph_saturation → EGraphConversionOutput input_arg_facts->stage_3 arg_facts input_argtypes argtypes tuple input_argtypes->stage_3 argtypes input_converter_class converter_class Any stage_4 Stage 4 pipeline_egraph_extraction → EGraphExtractionOutput input_converter_class->stage_4 converter_class input_cost_model cost_model Any input_cost_model->stage_4 cost_model input_extra_ruleset extra_ruleset Ruleset input_extra_ruleset->stage_3 extra_ruleset input_fn fn Any stage_1 Stage 1 pipeline_frontend → FrontendOutput input_fn->stage_1 fn input_sourcemaker_class sourcemaker_class Any stage_5 Stage 5 compiler → ExtractedOutput input_sourcemaker_class->stage_5 sourcemaker_class input_animate animate Any = False input_animate->stage_3 animate input_global_ns global_ns Any = None input_global_ns->stage_5 global_ns input_pipeline_debug pipeline_debug Any = False input_pipeline_debug->stage_3 pipeline_debug input_pipeline_debug->stage_5 pipeline_debug input_pipeline_report pipeline_report Any = DummyReport() input_pipeline_report->stage_1 pipeline_report stage_2 Stage 2 pipeline_egraph_conversion → EGraphOutput input_pipeline_report->stage_2 pipeline_report input_pipeline_report->stage_3 pipeline_report input_pipeline_report->stage_4 pipeline_report input_pipeline_report->stage_5 pipeline_report stage_1->stage_2 rvsdg_expr stage_1->stage_4 rvsdg_expr out_dbginfo dbginfo object stage_1->out_dbginfo dbginfo out_rvsdg_expr rvsdg_expr object stage_1->out_rvsdg_expr rvsdg_expr stage_2->stage_3 egraph stage_2->stage_3 egraph_root out_egraph_root egraph_root GraphRoot stage_2->out_egraph_root egraph_root stage_3->stage_4 egraph out_egraph egraph EGraph stage_3->out_egraph egraph out_saturation_steps saturation_steps list[str] | None stage_3->out_saturation_steps saturation_steps stage_4->stage_5 extracted out_cost cost float stage_4->out_cost cost out_extracted extracted Any stage_5->out_extracted extracted out_source source str stage_5->out_source source legend_input Required Input legend_optional Optional Input legend_input->legend_optional legend_stage Processing Stage legend_optional->legend_stage legend_output Output legend_stage->legend_output
In [29]:
if __name__ == "__main__":
    report = Report("Pipeline execution report", enable_nested_metadata=True)
    cres = compiler(
        fn=code_input,
        argtypes=argtypes,
        extra_ruleset=extra_ruleset,
        arg_facts=ruleset_array_facts,
        cost_model=MyCostModel(),
        converter_class=MyEGraphToRVSDG,
        sourcemaker_class=SourceMaker,
        pipeline_report=report,
        pipeline_debug=True,
    )
    report.display()
    extracted = cres.extracted
    res1 = extracted(arr0, arr1, arr2, arr3)
    res0 = f1(arr0, arr1, arr2, arr3)
    np.testing.assert_allclose(res0, res1)

    report = Report(
        "Expression tree of different versions",
        default_expanded=True,
    )
    report.append("original version", visualize_expr_tree(f0))
    report.append("hand-optimized version", visualize_expr_tree(f1))
    report.append(
        "superoptimized version", visualize_expr_tree(cres.extracted)
    )
    report.display()

    # original
    %timeit f0(arr0, arr1, arr2, arr3)

    # manual optimized
    %timeit f1(arr0, arr1, arr2, arr3)

    # cost-based extraction
    %timeit extracted(arr0, arr1, arr2, arr3)

Pipeline execution report

1. Frontend (4.99ms) ▶
Frontend
Debug Info on RVSDG ▶
--------------------------------original source---------------------------------
   1|def code_input(ary0, ary1, ary2, ary3):
   2|    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
----------------------------------inter source----------------------------------
   1|def transformed_code_input(ary0, ary1, ary2, ary3):
   2|    """#file: /tmp/ipykernel_3941/2471768733.py"""
   3|    '#loc: 2:8-2:54'
   4|    return ary0 @ ary1 @ ary2 @ ary1 @ ary2 @ ary3
RVSDG ▶
transformed_code_input = Func (Args (ArgSpec 'ary0' (PyNone)) (ArgSpec 'ary1' (PyNone)) (ArgSpec 'ary2' (PyNone)) (ArgSpec 'ary3' (PyNone)))
$0 = Region[425] <- !io ary0 ary1 ary2 ary3
{
  $1 = PyBinOp @ $0[0] $0[1], $0[2]
  $2 = PyBinOp @ $1[0] $1[1], $0[3]
  $3 = PyBinOp @ $2[0] $2[1], $0[2]
  $4 = PyBinOp @ $3[0] $3[1], $0[3]
  $5 = PyBinOp @ $4[0] $4[1], $0[4]
} [592] -> !io=$5[0] !ret=$5[1]
[metadata] ▶
time elapsed 4.99ms
timing breakdown:
  3.71ms: Debug Info on RVSDG 
  1.28ms: RVSDG               
2. EGraph Conversion (24.31ms) ▶
EGraph Conversion
EGraph ▶
outer_cluster_InPorts-0 cluster_InPorts-0 outer_cluster_Port-21 cluster_Port-21 outer_cluster_Port-23 cluster_Port-23 outer_cluster_PortList-24 cluster_PortList-24 outer_cluster_Region-1 cluster_Region-1 outer_cluster_Term-20 cluster_Term-20 outer_cluster_Term-4 cluster_Term-4 outer_cluster_Term-2 cluster_Term-2 outer_cluster_Term-7 cluster_Term-7 outer_cluster_Term-5 cluster_Term-5 outer_cluster_Term-12 cluster_Term-12 outer_cluster_Term-11 cluster_Term-11 outer_cluster_Term-16 cluster_Term-16 outer_cluster_Term-15 cluster_Term-15 outer_cluster_Term-14 cluster_Term-14 outer_cluster_Term-22 cluster_Term-22 outer_cluster_Term-6 cluster_Term-6 outer_cluster_Term-25 cluster_Term-25 outer_cluster_Term-3 cluster_Term-3 outer_cluster_Term-10 cluster_Term-10 outer_cluster_Term-9 cluster_Term-9 outer_cluster_Term-13 cluster_Term-13 outer_cluster_Term-17 cluster_Term-17 outer_cluster_Term-18 cluster_Term-18 outer_cluster_Term-19 cluster_Term-19 outer_cluster_Term-26 cluster_Term-26 outer_cluster_Term-27 cluster_Term-27 outer_cluster_Term-8 cluster_Term-8 outer_cluster_Vec_Port-0 cluster_Vec_Port-0 outer_cluster_Vec_String-0 cluster_Vec_String-0 function-0-InPorts___init__:s->primitive-Vec_String-0 function-0-Port___init__:s->function-8-Term_getPort function-8-Term_getPort:s->function-4-Py_MatMultIO function-1-Port___init__:s->function-9-Term_getPort function-9-Term_getPort:s->function-4-Py_MatMultIO function-0-PortList___init__:s->primitive-Vec_Port-0 primitive-Vec_Port-0:s->function-0-Port___init__ primitive-Vec_Port-0:s->function-1-Port___init__ function-0-Region___init__:s->function-0-InPorts___init__ function-4-Py_MatMultIO:s->function-6-Term_getPort function-4-Py_MatMultIO:s->function-7-Term_getPort function-4-Py_MatMultIO:s->function-4-Region_get function-2-Region_get:s->function-0-Region___init__ function-0-Region_get:s->function-0-Region___init__ function-0-Term_getPort:s->function-0-Py_MatMultIO function-0-Py_MatMultIO:s->function-2-Region_get function-0-Py_MatMultIO:s->function-0-Region_get function-0-Py_MatMultIO:s->function-3-Region_get function-3-Region_get:s->function-0-Region___init__ function-2-Py_MatMultIO:s->function-0-Region_get function-2-Py_MatMultIO:s->function-2-Term_getPort function-2-Py_MatMultIO:s->function-3-Term_getPort function-2-Term_getPort:s->function-1-Py_MatMultIO function-3-Term_getPort:s->function-1-Py_MatMultIO function-1-Py_MatMultIO:s->function-0-Term_getPort function-1-Py_MatMultIO:s->function-1-Region_get function-1-Py_MatMultIO:s->function-1-Term_getPort function-6-Term_getPort:s->function-3-Py_MatMultIO function-3-Py_MatMultIO:s->function-4-Term_getPort function-3-Py_MatMultIO:s->function-5-Term_getPort function-3-Py_MatMultIO:s->function-1-Region_get function-4-Term_getPort:s->function-2-Py_MatMultIO function-5-Term_getPort:s->function-2-Py_MatMultIO function-1-Region_get:s->function-0-Region___init__ function-0-Term_RegionEnd:s->function-0-PortList___init__ function-0-Term_RegionEnd:s->function-0-Region___init__ function-1-Term_getPort:s->function-0-Py_MatMultIO function-7-Term_getPort:s->function-3-Py_MatMultIO function-4-Region_get:s->function-0-Region___init__ function-0-Term_Func:s->function-0-Term_RegionEnd function-0-GraphRoot:s->function-0-Term_Func function-0-InPorts___init__ InPorts primitive-Vec_String-0 Vec("!io", "ary0", "ary1", "ary2", "ary3") function-0-Port___init__ Port("!io", ·) function-8-Term_getPort ·.getPort(·, 0) function-1-Port___init__ Port("!ret", ·) function-9-Term_getPort ·.getPort(·, 1) function-0-PortList___init__ PortList primitive-Vec_Port-0 Vec function-0-Region___init__ Region("425", ·) function-4-Py_MatMultIO Py_MatMultIO function-2-Region_get ·.get(·, 0) function-0-Region_get ·.get(·, 2) function-0-Term_getPort ·.getPort(·, 0) function-0-Py_MatMultIO Py_MatMultIO function-3-Region_get ·.get(·, 1) function-2-Py_MatMultIO Py_MatMultIO function-2-Term_getPort ·.getPort(·, 0) function-3-Term_getPort ·.getPort(·, 1) function-1-Py_MatMultIO Py_MatMultIO function-6-Term_getPort ·.getPort(·, 0) function-3-Py_MatMultIO Py_MatMultIO function-4-Term_getPort ·.getPort(·, 0) function-5-Term_getPort ·.getPort(·, 1) function-1-Region_get ·.get(·, 3) function-0-Term_RegionEnd Term.RegionEnd function-1-Term_getPort ·.getPort(·, 1) function-7-Term_getPort ·.getPort(·, 1) function-4-Region_get ·.get(·, 4) function-0-Term_Func Term.Func("598", "transformed_code_input", ·) function-0-GraphRoot GraphRoot
[metadata] ▶
time elapsed 24.31ms
timing breakdown:
  24.31ms: EGraph              
3. Egraph saturation (139.26ms) ▶
Egraph saturation
[debug] Saturated egraph ▶
outer_cluster_ArrayDesc-160 cluster_ArrayDesc-160 outer_cluster_ArrayDesc-90 cluster_ArrayDesc-90 outer_cluster_ArrayDesc-142 cluster_ArrayDesc-142 outer_cluster_ArrayDesc-157 cluster_ArrayDesc-157 outer_cluster_ArrayDesc-200 cluster_ArrayDesc-200 outer_cluster_ArrayDesc-188 cluster_ArrayDesc-188 outer_cluster_ArrayDesc-139 cluster_ArrayDesc-139 outer_cluster_ArrayDesc-84 cluster_ArrayDesc-84 outer_cluster_ArrayDesc-30 cluster_ArrayDesc-30 outer_cluster_ArrayDesc-33 cluster_ArrayDesc-33 outer_cluster_ArrayDesc-136 cluster_ArrayDesc-136 outer_cluster_ArrayDesc-39 cluster_ArrayDesc-39 outer_cluster_ArrayDesc-36 cluster_ArrayDesc-36 outer_cluster_ArrayDesc-163 cluster_ArrayDesc-163 outer_cluster_ArrayDesc-87 cluster_ArrayDesc-87 outer_cluster_ArrayDesc-93 cluster_ArrayDesc-93 outer_cluster_ArrayDesc-151 cluster_ArrayDesc-151 outer_cluster_ArrayDesc-194 cluster_ArrayDesc-194 outer_cluster_DataLayout-51 cluster_DataLayout-51 outer_cluster_Dim-50 cluster_Dim-50 outer_cluster_Dim-49 cluster_Dim-49 outer_cluster_Dim-53 cluster_Dim-53 outer_cluster_InPorts-0 cluster_InPorts-0 outer_cluster_Port-100 cluster_Port-100 outer_cluster_Port-177 cluster_Port-177 outer_cluster_PortList-24 cluster_PortList-24 outer_cluster_Region-1 cluster_Region-1 outer_cluster_String-10 cluster_String-10 outer_cluster_String-2684354580 cluster_String-2684354580 outer_cluster_Term-54 cluster_Term-54 outer_cluster_Term-118 cluster_Term-118 outer_cluster_Term-25 cluster_Term-25 outer_cluster_Term-19 cluster_Term-19 outer_cluster_Term-108 cluster_Term-108 outer_cluster_Term-5 cluster_Term-5 outer_cluster_Term-61 cluster_Term-61 outer_cluster_Term-211 cluster_Term-211 outer_cluster_Term-57 cluster_Term-57 outer_cluster_Term-6 cluster_Term-6 outer_cluster_Term-2 cluster_Term-2 outer_cluster_Term-102 cluster_Term-102 outer_cluster_Term-12 cluster_Term-12 outer_cluster_Term-72 cluster_Term-72 outer_cluster_Term-185 cluster_Term-185 outer_cluster_Term-227 cluster_Term-227 outer_cluster_Term-17 cluster_Term-17 outer_cluster_Term-68 cluster_Term-68 outer_cluster_Term-11 cluster_Term-11 outer_cluster_Term-18 cluster_Term-18 outer_cluster_Term-8 cluster_Term-8 outer_cluster_Term-9 cluster_Term-9 outer_cluster_Term-74 cluster_Term-74 outer_cluster_Term-14 cluster_Term-14 outer_cluster_Term-27 cluster_Term-27 outer_cluster_Term-15 cluster_Term-15 outer_cluster_Term-26 cluster_Term-26 outer_cluster_Term-59 cluster_Term-59 outer_cluster_Term-3 cluster_Term-3 outer_cluster_Type-162 cluster_Type-162 outer_cluster_Type-202 cluster_Type-202 outer_cluster_Type-182 cluster_Type-182 outer_cluster_Type-196 cluster_Type-196 outer_cluster_Type-52 cluster_Type-52 outer_cluster_Type-86 cluster_Type-86 outer_cluster_Type-89 cluster_Type-89 outer_cluster_Type-92 cluster_Type-92 outer_cluster_Type-159 cluster_Type-159 outer_cluster_Type-165 cluster_Type-165 outer_cluster_Type-181 cluster_Type-181 outer_cluster_Type-153 cluster_Type-153 outer_cluster_Type-40 cluster_Type-40 outer_cluster_Type-37 cluster_Type-37 outer_cluster_Type-212 cluster_Type-212 outer_cluster_Type-95 cluster_Type-95 outer_cluster_Type-183 cluster_Type-183 outer_cluster_Type-31 cluster_Type-31 outer_cluster_Type-34 cluster_Type-34 outer_cluster_TypeVar-94 cluster_TypeVar-94 outer_cluster_TypeVar-137 cluster_TypeVar-137 outer_cluster_TypeVar-179 cluster_TypeVar-179 outer_cluster_TypeVar-64 cluster_TypeVar-64 outer_cluster_TypeVar-106 cluster_TypeVar-106 outer_cluster_TypeVar-164 cluster_TypeVar-164 outer_cluster_TypeVar-91 cluster_TypeVar-91 outer_cluster_TypeVar-195 cluster_TypeVar-195 outer_cluster_TypeVar-88 cluster_TypeVar-88 outer_cluster_TypeVar-66 cluster_TypeVar-66 outer_cluster_TypeVar-143 cluster_TypeVar-143 outer_cluster_TypeVar-161 cluster_TypeVar-161 outer_cluster_TypeVar-65 cluster_TypeVar-65 outer_cluster_TypeVar-152 cluster_TypeVar-152 outer_cluster_TypeVar-140 cluster_TypeVar-140 outer_cluster_TypeVar-189 cluster_TypeVar-189 outer_cluster_TypeVar-67 cluster_TypeVar-67 outer_cluster_TypeVar-85 cluster_TypeVar-85 outer_cluster_TypeVar-158 cluster_TypeVar-158 outer_cluster_TypedIns-28 cluster_TypedIns-28 outer_cluster_TypedOuts-105 cluster_TypedOuts-105 outer_cluster_Vec_Port-2 cluster_Vec_Port-2 outer_cluster_Vec_String-0 cluster_Vec_String-0 outer_cluster_split-10-primitive-i64-2 cluster_split-10-primitive-i64-2 outer_cluster_split-5-primitive-i64-2 cluster_split-5-primitive-i64-2 outer_cluster_split-1-primitive-i64-2 cluster_split-1-primitive-i64-2 outer_cluster_split-9-primitive-i64-2 cluster_split-9-primitive-i64-2 outer_cluster_split-7-primitive-i64-2 cluster_split-7-primitive-i64-2 outer_cluster_split-8-primitive-i64-2 cluster_split-8-primitive-i64-2 outer_cluster_split-11-primitive-i64-2 cluster_split-11-primitive-i64-2 outer_cluster_split-6-primitive-i64-2 cluster_split-6-primitive-i64-2 outer_cluster_split-4-primitive-i64-2 cluster_split-4-primitive-i64-2 outer_cluster_split-2-primitive-i64-2 cluster_split-2-primitive-i64-2 outer_cluster_split-12-primitive-i64-2 cluster_split-12-primitive-i64-2 outer_cluster_i64-2 cluster_i64-2 outer_cluster_split-13-primitive-i64-2 cluster_split-13-primitive-i64-2 outer_cluster_split-14-primitive-i64-2 cluster_split-14-primitive-i64-2 outer_cluster_split-0-primitive-i64-2 cluster_split-0-primitive-i64-2 outer_cluster_split-3-primitive-i64-2 cluster_split-3-primitive-i64-2 outer_cluster_split-15-primitive-i64-2 cluster_split-15-primitive-i64-2 outer_cluster_split-16-primitive-i64-2 cluster_split-16-primitive-i64-2 function-12-ArrayDescOp:s->function-10-MatMul_KnownShape function-10-MatMul_KnownShape:s->function-3-MatMul_KnownShape function-10-MatMul_KnownShape:s->function-1-Region_get function-2-ArrayDescOp:s->function-7-MatMul function-7-MatMul:s->function-1-Region_get function-7-MatMul:s->function-4-Region_get function-6-ArrayDescOp:s->function-6-MatMul_KnownShape function-6-MatMul_KnownShape:s->function-5-MatMul function-6-MatMul_KnownShape:s->function-4-Region_get function-21-ArrayDescOp:s->function-25-MatMul function-25-MatMul:s->function-8-MatMul_KnownShape function-25-MatMul:s->function-4-Region_get function-23-ArrayDescOp:s->function-35-MatMul_KnownShape function-35-MatMul_KnownShape:s->function-4-Region_get function-35-MatMul_KnownShape:s->function-31-MatMul function-22-ArrayDescOp:s->function-36-MatMul_KnownShape function-36-MatMul_KnownShape:s->function-7-MatMul function-36-MatMul_KnownShape:s->function-4-MatMul_KnownShape function-5-ArrayDescOp:s->function-5-MatMul_KnownShape function-5-MatMul_KnownShape:s->function-1-Region_get function-5-MatMul_KnownShape:s->function-0-MatMul_KnownShape function-0-ArrayDescOp:s->function-6-MatMul function-6-MatMul:s->function-0-Region_get function-6-MatMul:s->function-1-Region_get function-4-ArrayDescOp:s->function-4-MatMul_KnownShape function-4-MatMul_KnownShape:s->function-0-Region_get function-4-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-13-ArrayDescOp:s->function-1-MatMul function-1-MatMul:s->function-10-MatMul_KnownShape function-1-MatMul:s->function-0-Region_get function-1-ArrayDescOp:s->function-5-MatMul function-5-MatMul:s->function-0-Region_get function-5-MatMul:s->function-1-Region_get function-3-ArrayDescOp:s->function-3-MatMul_KnownShape function-3-MatMul_KnownShape:s->function-0-Region_get function-3-MatMul_KnownShape:s->function-3-Region_get function-20-ArrayDescOp:s->function-22-MatMul function-22-MatMul:s->function-1-Region_get function-22-MatMul:s->function-7-MatMul_KnownShape function-17-ArrayDescOp:s->function-44-MatMul_KnownShape function-44-MatMul_KnownShape:s->function-3-MatMul_KnownShape function-44-MatMul_KnownShape:s->function-15-MatMul function-0-ArrayDesc_dataLayout:s->function-0-ArrayDesc___init__ function-1-ArrayDesc_dataLayout:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_dataLayout:s->function-2-ArrayDesc___init__ function-3-ArrayDesc_dataLayout:s->function-3-ArrayDesc___init__ function-1-ArrayDesc_dim:s->function-0-ArrayDesc___init__ function-2-ArrayDesc_dim:s->function-1-ArrayDesc___init__ function-5-ArrayDesc_dim:s->function-2-ArrayDesc___init__ function-6-ArrayDesc_dim:s->function-3-ArrayDesc___init__ function-10-ArrayDesc_dim:s->function-1-ArrayDescOp function-11-ArrayDesc_dim:s->function-1-ArrayDescOp function-16-ArrayDesc_dim:s->function-4-ArrayDescOp function-19-ArrayDesc_dim:s->function-5-ArrayDescOp function-20-ArrayDesc_dim:s->function-6-ArrayDescOp function-26-ArrayDesc_dim:s->function-20-ArrayDescOp function-27-ArrayDesc_dim:s->function-20-ArrayDescOp function-33-ArrayDesc_dim:s->function-12-ArrayDescOp function-36-ArrayDesc_dim:s->function-22-ArrayDescOp function-39-ArrayDesc_dim:s->function-17-ArrayDescOp function-0-ArrayDesc_dim:s->function-0-ArrayDesc___init__ function-3-ArrayDesc_dim:s->function-1-ArrayDesc___init__ function-4-ArrayDesc_dim:s->function-2-ArrayDesc___init__ function-8-ArrayDesc_dim:s->function-0-ArrayDescOp function-9-ArrayDesc_dim:s->function-0-ArrayDescOp function-12-ArrayDesc_dim:s->function-2-ArrayDescOp function-14-ArrayDesc_dim:s->function-3-ArrayDescOp function-15-ArrayDesc_dim:s->function-3-ArrayDescOp function-17-ArrayDesc_dim:s->function-4-ArrayDescOp function-18-ArrayDesc_dim:s->function-5-ArrayDescOp function-30-ArrayDesc_dim:s->function-21-ArrayDescOp function-32-ArrayDesc_dim:s->function-12-ArrayDescOp function-34-ArrayDesc_dim:s->function-13-ArrayDescOp function-35-ArrayDesc_dim:s->function-13-ArrayDescOp function-38-ArrayDesc_dim:s->function-17-ArrayDescOp function-42-ArrayDesc_dim:s->function-23-ArrayDescOp function-7-ArrayDesc_dim:s->function-3-ArrayDesc___init__ function-13-ArrayDesc_dim:s->function-2-ArrayDescOp function-21-ArrayDesc_dim:s->function-6-ArrayDescOp function-31-ArrayDesc_dim:s->function-21-ArrayDescOp function-37-ArrayDesc_dim:s->function-22-ArrayDescOp function-43-ArrayDesc_dim:s->function-23-ArrayDescOp function-0-InPorts___init__:s->primitive-Vec_String-0 function-0-Port___init__:s->function-10-Term_getPort function-10-Term_getPort:s->function-3-Py_MatMultIO function-0-PortList___getitem__:s->function-0-PortList___init__ function-0-PortList___init__:s->primitive-Vec_Port-2 function-1-Port___init__:s->function-58-MatMul function-58-MatMul:s->function-4-Region_get function-58-MatMul:s->function-21-MatMul_KnownShape function-1-PortList___getitem__:s->function-0-PortList___init__ primitive-Vec_Port-2:s->function-0-PortList___getitem__ primitive-Vec_Port-2:s->function-1-PortList___getitem__ function-0-Region___init__:s->function-0-InPorts___init__ function-2-Port_name:s->function-0-PortList___getitem__ function-3-Port_name:s->function-1-PortList___getitem__ function-0-Region_get:s->function-0-Region___init__ function-1-Region_get:s->function-0-Region___init__ function-1-MatMul_KnownShape:s->function-0-Region_get function-1-MatMul_KnownShape:s->function-1-Region_get function-8-MatMul_KnownShape:s->function-1-Region_get function-8-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-4-Region_get:s->function-0-Region___init__ function-54-MatMul:s->function-1-Region_get function-54-MatMul:s->function-14-MatMul function-14-MatMul:s->function-1-MatMul_KnownShape function-14-MatMul:s->function-4-Region_get function-55-MatMul:s->function-0-MatMul_KnownShape function-55-MatMul:s->function-2-MatMul_KnownShape function-0-MatMul_KnownShape:s->function-0-Region_get function-0-MatMul_KnownShape:s->function-1-Region_get function-2-MatMul_KnownShape:s->function-1-Region_get function-2-MatMul_KnownShape:s->function-4-Region_get function-18-MatMul_KnownShape:s->function-7-MatMul function-18-MatMul_KnownShape:s->function-6-MatMul function-38-MatMul_KnownShape:s->function-6-MatMul_KnownShape function-38-MatMul_KnownShape:s->function-1-Region_get function-42-MatMul_KnownShape:s->function-8-MatMul_KnownShape function-42-MatMul_KnownShape:s->function-4-Region_get function-0-Term_RegionEnd:s->function-0-PortList___init__ function-0-Term_RegionEnd:s->function-0-Region___init__ function-4-Py_MatMultIO:s->function-4-Region_get function-4-Py_MatMultIO:s->function-0-Port_value function-4-Py_MatMultIO:s->function-3-MatMul function-0-Port_value:s->function-0-Port___init__ function-3-MatMul:s->function-1-Region_get function-3-MatMul:s->function-11-MatMul_KnownShape function-7-MatMul_KnownShape:s->function-6-MatMul function-7-MatMul_KnownShape:s->function-0-Region_get function-52-MatMul:s->function-0-Region_get function-52-MatMul:s->function-40-MatMul function-40-MatMul:s->function-5-MatMul function-40-MatMul:s->function-1-Region_get function-53-MatMul:s->function-5-MatMul function-53-MatMul:s->function-1-MatMul_KnownShape function-17-MatMul_KnownShape:s->function-5-MatMul function-17-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-37-MatMul_KnownShape:s->function-5-MatMul_KnownShape function-37-MatMul_KnownShape:s->function-0-Region_get function-41-MatMul_KnownShape:s->function-1-Region_get function-41-MatMul_KnownShape:s->function-7-MatMul_KnownShape function-3-Region_get:s->function-0-Region___init__ function-6-Region_get:s->function-0-Region___init__ function-7-Term_getPort:s->function-0-Py_MatMultIO function-0-Py_MatMultIO:s->function-0-Region_get function-0-Py_MatMultIO:s->function-3-Region_get function-0-Py_MatMultIO:s->function-8-Term_getPort function-8-Term_getPort:s->function-1-Py_MatMultIO function-1-Py_MatMultIO:s->function-1-Region_get function-1-Py_MatMultIO:s->function-9-Term_getPort function-1-Py_MatMultIO:s->function-0-MatMul function-9-Term_getPort:s->function-2-Py_MatMultIO function-2-Py_MatMultIO:s->function-10-Term_getPort function-2-Py_MatMultIO:s->function-0-Region_get function-2-Py_MatMultIO:s->function-2-MatMul function-3-Py_MatMultIO:s->function-1-MatMul function-3-Py_MatMultIO:s->function-1-Region_get function-3-Py_MatMultIO:s->function-11-Term_getPort function-11-Term_getPort:s->function-4-Py_MatMultIO function-0-PortList_getValue:s->function-0-PortList___init__ function-13-Term_getPort:s->function-0-Term_RegionEnd function-12-Term_getPort:s->function-4-Py_MatMultIO function-57-MatMul:s->function-3-Region_get function-57-MatMul:s->function-15-MatMul_KnownShape function-15-MatMul_KnownShape:s->function-0-Region_get function-15-MatMul_KnownShape:s->function-55-MatMul function-21-MatMul_KnownShape:s->function-1-Region_get function-21-MatMul_KnownShape:s->function-19-MatMul_KnownShape function-59-MatMul:s->function-2-MatMul_KnownShape function-59-MatMul:s->function-2-Term_getPort function-2-Term_getPort:s->function-2-Py_MatMultIO function-60-MatMul:s->function-8-MatMul function-60-MatMul:s->function-39-MatMul function-8-MatMul:s->function-5-MatMul function-8-MatMul:s->function-3-Region_get function-39-MatMul:s->function-7-MatMul function-39-MatMul:s->function-0-Region_get function-61-MatMul:s->function-42-MatMul_KnownShape function-61-MatMul:s->function-0-MatMul function-0-MatMul:s->function-0-Region_get function-0-MatMul:s->function-3-Region_get function-23-MatMul_KnownShape:s->function-38-MatMul_KnownShape function-23-MatMul_KnownShape:s->function-0-MatMul function-24-MatMul_KnownShape:s->function-2-MatMul_KnownShape function-24-MatMul_KnownShape:s->function-43-MatMul_KnownShape function-43-MatMul_KnownShape:s->function-3-Region_get function-43-MatMul_KnownShape:s->function-12-MatMul function-31-MatMul:s->function-53-MatMul function-31-MatMul:s->function-3-Region_get function-40-MatMul_KnownShape:s->function-14-MatMul function-40-MatMul_KnownShape:s->function-12-MatMul_KnownShape function-12-MatMul_KnownShape:s->function-5-MatMul function-12-MatMul_KnownShape:s->function-3-Region_get function-46-MatMul_KnownShape:s->function-3-Region_get function-46-MatMul_KnownShape:s->function-13-MatMul_KnownShape function-13-MatMul_KnownShape:s->function-4-Region_get function-13-MatMul_KnownShape:s->function-53-MatMul function-1-Port_value:s->function-1-Port___init__ function-1-PortList_getValue:s->function-0-PortList___init__ function-2-MatMul:s->function-1-Region_get function-2-MatMul:s->function-0-MatMul function-9-MatMul_KnownShape:s->function-0-Region_get function-9-MatMul_KnownShape:s->function-2-MatMul_KnownShape function-46-MatMul:s->function-4-Region_get function-46-MatMul:s->function-17-MatMul_KnownShape function-50-MatMul:s->function-0-Region_get function-50-MatMul:s->function-55-MatMul function-51-MatMul:s->function-1-MatMul_KnownShape function-51-MatMul:s->function-9-MatMul_KnownShape function-56-MatMul:s->function-7-MatMul function-56-MatMul:s->function-38-MatMul function-38-MatMul:s->function-6-MatMul function-38-MatMul:s->function-0-Region_get function-39-MatMul_KnownShape:s->function-5-MatMul function-39-MatMul_KnownShape:s->function-9-MatMul_KnownShape function-14-Term_getPort:s->function-0-Term_RegionEnd function-3-Term_getPort:s->function-3-Py_MatMultIO function-11-MatMul_KnownShape:s->function-0-MatMul_KnownShape function-11-MatMul_KnownShape:s->function-0-Term_getPort function-9-MatMul:s->function-1-MatMul_KnownShape function-9-MatMul:s->function-2-MatMul function-20-MatMul:s->function-5-MatMul_KnownShape function-20-MatMul:s->function-0-Term_getPort function-0-Term_getPort:s->function-0-Py_MatMultIO function-14-MatMul_KnownShape:s->function-17-MatMul_KnownShape function-14-MatMul_KnownShape:s->function-3-Region_get function-20-MatMul_KnownShape:s->function-10-MatMul_KnownShape function-20-MatMul_KnownShape:s->function-1-MatMul_KnownShape function-19-MatMul_KnownShape:s->function-0-Region_get function-19-MatMul_KnownShape:s->function-8-MatMul function-15-MatMul:s->function-1-Region_get function-15-MatMul:s->function-0-MatMul_KnownShape function-12-MatMul:s->function-5-MatMul function-12-MatMul:s->function-0-Region_get function-1-Term_getPort:s->function-1-Py_MatMultIO function-10-MatMul:s->function-6-MatMul function-10-MatMul:s->function-3-MatMul_KnownShape function-17-MatMul:s->function-4-MatMul_KnownShape function-17-MatMul:s->function-3-Region_get function-0-GraphRoot:s->function-0-Term_Func function-0-Term_Func:s->function-0-Term_RegionEnd function-10-TypeVar_getType:s->function-18-TypeVar___init__ function-18-TypeVar___init__:s->function-12-MatMul_KnownShape function-16-ArrayDesc_toType:s->function-12-ArrayDescOp function-17-TypeVar_getType:s->function-1-TypedOuts_at function-1-TypedOuts_at:s->function-0-TypedOuts___init__ function-21-ArrayDesc_toType:s->function-23-ArrayDescOp function-1-Type___or__:s->function-1-Type___or__ function-1-Type___or__:s->function-23-ArrayDesc_toType function-23-ArrayDesc_toType:s->function-5-ArrayDescOp function-14-TypeVar_getType:s->function-11-TypeVar___init__ function-11-TypeVar___init__:s->function-8-MatMul_KnownShape function-12-TypeVar_getType:s->function-25-TypeVar___init__ function-25-TypeVar___init__:s->function-3-Term_getPort function-19-ArrayDesc_toType:s->function-17-ArrayDescOp function-0-ArrayDesc_dtype:s->function-0-ArrayDesc___init__ function-1-ArrayDesc_dtype:s->function-1-ArrayDesc___init__ function-2-ArrayDesc_dtype:s->function-2-ArrayDesc___init__ function-3-ArrayDesc_dtype:s->function-3-ArrayDesc___init__ function-4-ArrayDesc_dtype:s->function-0-ArrayDescOp function-5-ArrayDesc_dtype:s->function-1-ArrayDescOp function-6-ArrayDesc_dtype:s->function-2-ArrayDescOp function-7-ArrayDesc_dtype:s->function-3-ArrayDescOp function-8-ArrayDesc_dtype:s->function-4-ArrayDescOp function-9-ArrayDesc_dtype:s->function-5-ArrayDescOp function-10-ArrayDesc_dtype:s->function-6-ArrayDescOp function-13-ArrayDesc_dtype:s->function-20-ArrayDescOp function-15-ArrayDesc_dtype:s->function-21-ArrayDescOp function-16-ArrayDesc_dtype:s->function-12-ArrayDescOp function-17-ArrayDesc_dtype:s->function-13-ArrayDescOp function-18-ArrayDesc_dtype:s->function-22-ArrayDescOp function-19-ArrayDesc_dtype:s->function-17-ArrayDescOp function-21-ArrayDesc_dtype:s->function-23-ArrayDescOp function-4-TypeVar_getType:s->function-4-TypeVar___init__ function-4-TypeVar___init__:s->function-0-MatMul_KnownShape function-4-ArrayDesc_toType:s->function-0-ArrayDescOp function-5-TypeVar_getType:s->function-5-TypeVar___init__ function-5-TypeVar___init__:s->function-1-MatMul_KnownShape function-5-ArrayDesc_toType:s->function-1-ArrayDescOp function-6-TypeVar_getType:s->function-6-TypeVar___init__ function-6-TypeVar___init__:s->function-2-MatMul_KnownShape function-6-ArrayDesc_toType:s->function-2-ArrayDescOp function-9-TypeVar_getType:s->function-29-TypeVar___init__ function-29-TypeVar___init__:s->function-54-MatMul function-15-ArrayDesc_toType:s->function-21-ArrayDescOp function-11-TypeVar_getType:s->function-19-TypeVar___init__ function-19-TypeVar___init__:s->function-10-MatMul function-17-ArrayDesc_toType:s->function-13-ArrayDescOp function-0-Type___or__:s->function-0-Type___or__ function-0-Type___or__:s->function-22-ArrayDesc_toType function-22-ArrayDesc_toType:s->function-4-ArrayDescOp function-13-TypeVar_getType:s->function-10-TypeVar___init__ function-10-TypeVar___init__:s->function-7-MatMul_KnownShape function-8-TypeVar_getType:s->function-28-TypeVar___init__ function-28-TypeVar___init__:s->function-52-MatMul function-13-ArrayDesc_toType:s->function-20-ArrayDescOp function-3-TypeVar_getType:s->function-3-TypeVar___init__ function-3-TypeVar___init__:s->function-4-Region_get function-3-ArrayDesc_toType:s->function-3-ArrayDesc___init__ function-2-TypeVar_getType:s->function-2-TypeVar___init__ function-2-TypeVar___init__:s->function-1-Region_get function-2-ArrayDesc_toType:s->function-2-ArrayDesc___init__ function-3-Type___or__:s->function-3-Type___or__ function-3-Type___or__:s->function-25-ArrayDesc_toType function-25-ArrayDesc_toType:s->function-22-ArrayDescOp function-22-TypeVar_getType:s->function-30-TypeVar___init__ function-30-TypeVar___init__:s->function-39-MatMul_KnownShape function-7-TypeVar_getType:s->function-7-TypeVar___init__ function-7-TypeVar___init__:s->function-0-Term_getPort function-7-ArrayDesc_toType:s->function-3-ArrayDescOp function-2-Type___or__:s->function-2-Type___or__ function-2-Type___or__:s->function-24-ArrayDesc_toType function-24-ArrayDesc_toType:s->function-6-ArrayDescOp function-15-TypeVar_getType:s->function-12-TypeVar___init__ function-12-TypeVar___init__:s->function-9-MatMul_KnownShape function-0-TypeVar_getType:s->function-0-TypeVar___init__ function-0-TypeVar___init__:s->function-3-Region_get function-0-ArrayDesc_toType:s->function-0-ArrayDesc___init__ function-1-TypeVar_getType:s->function-1-TypeVar___init__ function-1-TypeVar___init__:s->function-0-Region_get function-1-ArrayDesc_toType:s->function-1-ArrayDesc___init__ function-23-TypeVar___init__:s->function-40-MatMul_KnownShape function-0-TypedOuts___init__:s->function-0-Region___init__ function-4-TypedIns_arg:s->function-0-TypedIns___init__ function-0-TypedIns___init__:s->function-0-Region___init__ function-9-TypeVar___init__:s->function-11-Term_getPort function-0-TypedOuts_at:s->function-0-TypedOuts___init__ function-6-TypedIns_arg:s->function-0-TypedIns___init__ function-5-TypedIns_arg:s->function-0-TypedIns___init__ function-7-TypedIns_arg:s->function-0-TypedIns___init__ function-13-ArrayDesc_ndim:s->function-20-ArrayDescOp function-6-ArrayDesc_ndim:s->function-2-ArrayDescOp function-2-ArrayDesc_ndim:s->function-2-ArrayDesc___init__ function-10-ArrayDesc_ndim:s->function-6-ArrayDescOp function-8-ArrayDesc_ndim:s->function-4-ArrayDescOp function-9-ArrayDesc_ndim:s->function-5-ArrayDescOp function-15-ArrayDesc_ndim:s->function-21-ArrayDescOp function-7-ArrayDesc_ndim:s->function-3-ArrayDescOp function-5-ArrayDesc_ndim:s->function-1-ArrayDescOp function-3-ArrayDesc_ndim:s->function-3-ArrayDesc___init__ function-16-ArrayDesc_ndim:s->function-12-ArrayDescOp function-0-ArrayDesc_ndim:s->function-0-ArrayDesc___init__ function-17-ArrayDesc_ndim:s->function-13-ArrayDescOp function-18-ArrayDesc_ndim:s->function-22-ArrayDescOp function-1-ArrayDesc_ndim:s->function-1-ArrayDesc___init__ function-4-ArrayDesc_ndim:s->function-0-ArrayDescOp function-19-ArrayDesc_ndim:s->function-17-ArrayDescOp function-21-ArrayDesc_ndim:s->function-23-ArrayDescOp function-12-ArrayDescOp ArrayDescOp function-10-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-2-ArrayDescOp ArrayDescOp function-7-MatMul MatMul function-6-ArrayDescOp ArrayDescOp function-6-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-21-ArrayDescOp ArrayDescOp function-25-MatMul MatMul function-23-ArrayDescOp ArrayDescOp function-35-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-22-ArrayDescOp ArrayDescOp function-36-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-5-ArrayDescOp ArrayDescOp function-5-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-0-ArrayDescOp ArrayDescOp function-6-MatMul MatMul function-0-ArrayDesc___init__ ArrayDesc("array_0") function-1-ArrayDesc___init__ ArrayDesc("array_1") function-4-ArrayDescOp ArrayDescOp function-4-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 200) function-3-ArrayDesc___init__ ArrayDesc("array_3") function-2-ArrayDesc___init__ ArrayDesc("array_2") function-13-ArrayDescOp ArrayDescOp function-1-MatMul MatMul function-1-ArrayDescOp ArrayDescOp function-5-MatMul MatMul function-3-ArrayDescOp ArrayDescOp function-3-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-20-ArrayDescOp ArrayDescOp function-22-MatMul MatMul function-17-ArrayDescOp ArrayDescOp function-44-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-0-ArrayDesc_dataLayout ·.dataLayout function-1-ArrayDesc_dataLayout ·.dataLayout function-2-ArrayDesc_dataLayout ·.dataLayout function-3-ArrayDesc_dataLayout ·.dataLayout function-0-DataLayout_c_contiguous DataLayout.c_contiguous function-1-ArrayDesc_dim ·.dim(·, 1) function-2-ArrayDesc_dim ·.dim(·, 0) function-5-ArrayDesc_dim ·.dim(·, 1) function-6-ArrayDesc_dim ·.dim(·, 0) function-10-ArrayDesc_dim ·.dim(·, 0) function-11-ArrayDesc_dim ·.dim(·, 1) function-16-ArrayDesc_dim ·.dim(·, 0) function-19-ArrayDesc_dim ·.dim(·, 1) function-20-ArrayDesc_dim ·.dim(·, 0) function-26-ArrayDesc_dim ·.dim(·, 0) function-27-ArrayDesc_dim ·.dim(·, 1) function-33-ArrayDesc_dim ·.dim(·, 1) function-36-ArrayDesc_dim ·.dim(·, 0) function-39-ArrayDesc_dim ·.dim(·, 1) function-1-Dim_fixed Dim.fixed(100) function-0-ArrayDesc_dim ·.dim(·, 0) function-3-ArrayDesc_dim ·.dim(·, 1) function-4-ArrayDesc_dim ·.dim(·, 0) function-8-ArrayDesc_dim ·.dim(·, 0) function-9-ArrayDesc_dim ·.dim(·, 1) function-12-ArrayDesc_dim ·.dim(·, 0) function-14-ArrayDesc_dim ·.dim(·, 0) function-15-ArrayDesc_dim ·.dim(·, 1) function-17-ArrayDesc_dim ·.dim(·, 1) function-18-ArrayDesc_dim ·.dim(·, 0) function-30-ArrayDesc_dim ·.dim(·, 0) function-32-ArrayDesc_dim ·.dim(·, 0) function-34-ArrayDesc_dim ·.dim(·, 0) function-35-ArrayDesc_dim ·.dim(·, 1) function-38-ArrayDesc_dim ·.dim(·, 0) function-42-ArrayDesc_dim ·.dim(·, 0) function-0-Dim_fixed Dim.fixed(200) function-7-ArrayDesc_dim ·.dim(·, 1) function-13-ArrayDesc_dim ·.dim(·, 1) function-21-ArrayDesc_dim ·.dim(·, 1) function-31-ArrayDesc_dim ·.dim(·, 1) function-37-ArrayDesc_dim ·.dim(·, 1) function-43-ArrayDesc_dim ·.dim(·, 1) function-2-Dim_fixed Dim.fixed(1) function-0-InPorts___init__ InPorts primitive-Vec_String-0 Vec("!io", "ary0", "ary1", "ary2", "ary3") function-0-Port___init__ Port("!io", ·) function-10-Term_getPort ·.getPort(·, 0) function-0-PortList___getitem__ ·[0] function-0-PortList___init__ PortList function-1-Port___init__ Port("!ret", ·) function-58-MatMul MatMul function-1-PortList___getitem__ ·[1] primitive-Vec_Port-2 Vec function-0-Region___init__ Region("425", ·) function-2-Port_name ·.name primitive-String-10 "!io" function-3-Port_name ·.name primitive-String-2684354580 "!ret" function-0-Region_get ·.get(·, 2) function-1-Region_get ·.get(·, 3) function-1-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-8-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-4-Region_get ·.get(·, 4) function-54-MatMul MatMul function-14-MatMul MatMul function-55-MatMul MatMul function-0-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-2-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-18-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-38-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-42-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-0-Term_RegionEnd Term.RegionEnd function-4-Py_MatMultIO Py_MatMultIO function-0-Port_value ·.value function-3-MatMul MatMul function-7-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 200) function-52-MatMul MatMul function-40-MatMul MatMul function-53-MatMul MatMul function-17-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 100) function-37-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-41-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 100) function-3-Region_get ·.get(·, 1) function-6-Region_get ·.get(·, 0) function-7-Term_getPort ·.getPort(·, 0) function-0-Py_MatMultIO Py_MatMultIO function-8-Term_getPort ·.getPort(·, 0) function-1-Py_MatMultIO Py_MatMultIO function-9-Term_getPort ·.getPort(·, 0) function-2-Py_MatMultIO Py_MatMultIO function-3-Py_MatMultIO Py_MatMultIO function-11-Term_getPort ·.getPort(·, 0) function-0-PortList_getValue ·.getValue(·, 0) function-13-Term_getPort ·.getPort(·, 0) function-12-Term_getPort ·.getPort(·, 1) function-57-MatMul MatMul function-15-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-21-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 100) function-59-MatMul MatMul function-2-Term_getPort ·.getPort(·, 1) function-60-MatMul MatMul function-8-MatMul MatMul function-39-MatMul MatMul function-61-MatMul MatMul function-0-MatMul MatMul function-23-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-24-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 1) function-43-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-31-MatMul MatMul function-40-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-12-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-46-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 1) function-13-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-1-Port_value ·.value function-1-PortList_getValue ·.getValue(·, 1) function-2-MatMul MatMul function-9-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 200, 1) function-46-MatMul MatMul function-50-MatMul MatMul function-51-MatMul MatMul function-56-MatMul MatMul function-38-MatMul MatMul function-39-MatMul_KnownShape MatMul_KnownShape(·, ·, 100, 100, 1) function-14-Term_getPort ·.getPort(·, 1) function-3-Term_getPort ·.getPort(·, 1) function-11-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 200, 200) function-9-MatMul MatMul function-20-MatMul MatMul function-0-Term_getPort ·.getPort(·, 1) function-14-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-20-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 100) function-19-MatMul_KnownShape MatMul_KnownShape(·, ·, 200, 100, 200) function-15-MatMul MatMul function-12-MatMul MatMul function-1-Term_getPort ·.getPort(·, 1) function-10-MatMul MatMul function-17-MatMul MatMul function-0-GraphRoot GraphRoot function-0-Term_Func Term.Func("598", "transformed_code_input", ·) function-10-TypeVar_getType ·.getType function-18-TypeVar___init__ TypeVar function-16-ArrayDesc_toType ·.toType function-17-TypeVar_getType ·.getType function-1-TypedOuts_at ·.at(·, 1) function-21-ArrayDesc_toType ·.toType function-1-Type___or__ · | · function-23-ArrayDesc_toType ·.toType function-14-TypeVar_getType ·.getType function-11-TypeVar___init__ TypeVar function-12-TypeVar_getType ·.getType function-25-TypeVar___init__ TypeVar function-19-ArrayDesc_toType ·.toType function-0-ArrayDesc_dtype ·.dtype function-1-ArrayDesc_dtype ·.dtype function-2-ArrayDesc_dtype ·.dtype function-3-ArrayDesc_dtype ·.dtype function-4-ArrayDesc_dtype ·.dtype function-5-ArrayDesc_dtype ·.dtype function-6-ArrayDesc_dtype ·.dtype function-7-ArrayDesc_dtype ·.dtype function-8-ArrayDesc_dtype ·.dtype function-9-ArrayDesc_dtype ·.dtype function-10-ArrayDesc_dtype ·.dtype function-13-ArrayDesc_dtype ·.dtype function-15-ArrayDesc_dtype ·.dtype function-16-ArrayDesc_dtype ·.dtype function-17-ArrayDesc_dtype ·.dtype function-18-ArrayDesc_dtype ·.dtype function-19-ArrayDesc_dtype ·.dtype function-21-ArrayDesc_dtype ·.dtype function-0-Type_simple Type.simple("Float64") function-4-TypeVar_getType ·.getType function-4-TypeVar___init__ TypeVar function-4-ArrayDesc_toType ·.toType function-5-TypeVar_getType ·.getType function-5-TypeVar___init__ TypeVar function-5-ArrayDesc_toType ·.toType function-6-TypeVar_getType ·.getType function-6-TypeVar___init__ TypeVar function-6-ArrayDesc_toType ·.toType function-9-TypeVar_getType ·.getType function-29-TypeVar___init__ TypeVar function-15-ArrayDesc_toType ·.toType function-11-TypeVar_getType ·.getType function-19-TypeVar___init__ TypeVar function-17-ArrayDesc_toType ·.toType function-0-Type___or__ · | · function-22-ArrayDesc_toType ·.toType function-13-TypeVar_getType ·.getType function-10-TypeVar___init__ TypeVar function-8-TypeVar_getType ·.getType function-28-TypeVar___init__ TypeVar function-13-ArrayDesc_toType ·.toType function-3-TypeVar_getType ·.getType function-3-TypeVar___init__ TypeVar function-3-ArrayDesc_toType ·.toType function-2-TypeVar_getType ·.getType function-2-TypeVar___init__ TypeVar function-2-ArrayDesc_toType ·.toType function-3-Type___or__ · | · function-25-ArrayDesc_toType ·.toType function-22-TypeVar_getType ·.getType function-30-TypeVar___init__ TypeVar function-7-TypeVar_getType ·.getType function-7-TypeVar___init__ TypeVar function-7-ArrayDesc_toType ·.toType function-2-Type___or__ · | · function-24-ArrayDesc_toType ·.toType function-15-TypeVar_getType ·.getType function-12-TypeVar___init__ TypeVar function-0-TypeVar_getType ·.getType function-0-TypeVar___init__ TypeVar function-0-ArrayDesc_toType ·.toType function-1-TypeVar_getType ·.getType function-1-TypeVar___init__ TypeVar function-1-ArrayDesc_toType ·.toType function-23-TypeVar___init__ TypeVar function-0-TypedOuts___init__ TypedOuts function-4-TypedIns_arg ·.arg(·, 1) function-0-TypedIns___init__ TypedIns function-9-TypeVar___init__ TypeVar function-0-TypedOuts_at ·.at(·, 0) function-6-TypedIns_arg ·.arg(·, 3) function-5-TypedIns_arg ·.arg(·, 2) function-7-TypedIns_arg ·.arg(·, 4) function-13-ArrayDesc_ndim ·.ndim split-10-primitive-i64-2 2 function-6-ArrayDesc_ndim ·.ndim split-5-primitive-i64-2 2 function-2-ArrayDesc_ndim ·.ndim split-1-primitive-i64-2 2 function-10-ArrayDesc_ndim ·.ndim split-9-primitive-i64-2 2 function-8-ArrayDesc_ndim ·.ndim split-7-primitive-i64-2 2 function-9-ArrayDesc_ndim ·.ndim split-8-primitive-i64-2 2 function-15-ArrayDesc_ndim ·.ndim split-11-primitive-i64-2 2 function-7-ArrayDesc_ndim ·.ndim split-6-primitive-i64-2 2 function-5-ArrayDesc_ndim ·.ndim split-4-primitive-i64-2 2 function-3-ArrayDesc_ndim ·.ndim split-2-primitive-i64-2 2 function-16-ArrayDesc_ndim ·.ndim split-12-primitive-i64-2 2 function-0-ArrayDesc_ndim ·.ndim primitive-i64-2 2 function-17-ArrayDesc_ndim ·.ndim split-13-primitive-i64-2 2 function-18-ArrayDesc_ndim ·.ndim split-14-primitive-i64-2 2 function-1-ArrayDesc_ndim ·.ndim split-0-primitive-i64-2 2 function-4-ArrayDesc_ndim ·.ndim split-3-primitive-i64-2 2 function-19-ArrayDesc_ndim ·.ndim split-15-primitive-i64-2 2 function-21-ArrayDesc_ndim ·.ndim split-16-primitive-i64-2 2
[metadata] ▶
time elapsed 139.26ms
timing breakdown:
  139.26ms: [debug] Saturated egraph
4. EGraph Extraction (13.25ms) ▶
EGraph Extraction
Cost ▶
12822651.0
Extracted ▶
transformed_code_input = Func (Args (ArgSpec 'ary0' (PyNone)) (ArgSpec 'ary1' (PyNone)) (ArgSpec 'ary2' (PyNone)) (ArgSpec 'ary3' (PyNone)))
$0 = Region[751] <- !io ary0 ary1 ary2 ary3
{
  $1 = NbOp_MatMulKnownShape $0[3] $0[4] 200 100 1
  $2 = NbOp_MatMulKnownShape $0[2] $1 100 200 1
  $3 = NbOp_MatMulKnownShape $0[3] $2 200 100 1
  $4 = NbOp_MatMulKnownShape $0[2] $3 100 200 1
  $5 = NbOp_MatMulKnownShape $0[1] $4 200 100 1
} [835] -> !io=$0[0] !ret=$5
[metadata] ▶
time elapsed 13.25ms
timing breakdown:
  12.00ms: Cost                
  1.25ms: Extracted           
5. Extracted source ▶
def func(arg1, arg2, arg3, arg4):
    v5 = (arg3 @ arg4); v6 = (arg2 @ v5); v7 = (arg3 @ v6); v8 = (arg2 @ v7); v9 = (arg1 @ v8)
    return v9

Expression tree of different versions

1. original version ▶
lambda n1 arr0 n6 @ n1->n6 left n2 arr1 n2->n6 right n8 @ n2->n8 right n3 arr2 n7 @ n3->n7 right n9 @ n3->n9 right n4 arr3 n10 @ n4->n10 right n6->n7 left n7->n8 left n8->n9 left n9->n10 left n11 return n10->n11
2. hand-optimized version ▶
f1 n1 arr0 n9 @ n1->n9 left n2 arr1 n6 @ n2->n6 left n3 arr2 n3->n6 right n4 arr3 n7 @ n4->n7 right n6->n7 left n8 @ n6->n8 left n7->n8 right n8->n9 right n10 return n9->n10
3. superoptimized version ▶
func n1 arg1 n10 @ n1->n10 left n2 arg2 n7 @ n2->n7 left n9 @ n2->n9 left n3 arg3 n6 @ n3->n6 left n8 @ n3->n8 left n4 arg4 n4->n6 right n6->n7 right n7->n8 right n8->n9 right n9->n10 right n11 return n10->n11
483 μs ± 34.4 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
81.5 μs ± 344 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
17.3 μs ± 51.6 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)