perf_einsum

Inputs

Einsum String:
Tensor Sizes:
Contraction Path:

Contraction Path:


    

Initial Einsum Tree


    

Reordered Einsum tree

syntax for leading M:
    A: mb-kb-cb-bk-bm-bc
    B: kb-nb-cb-bk-bn-bc
syntax for leading C:
    A: cb-mb-kb-bk-bm-bc
    B: cb-kb-nb-bk-bn-bc


    
      packages = [ "opt_einsum",
                   "numpy",
                   "binarytree",
                   "matplotlib" ]

      [[fetch]]
      from = "https://scalable.uni-jena.de/opt/perf_einsum/perf_einsum"
      files = ["analysis.py"]
      to_folder = "perf_einsum"

      [[fetch]]
      from = "https://scalable.uni-jena.de/opt/perf_einsum/perf_einsum"
      files = ["tree.py"]
      to_folder = "perf_einsum"
    

    
      import opt_einsum
      import numpy
      import perf_einsum.tree
      import ast

      def update_einsum():
        l_string = Element("in_einsum_string").element.value
        l_sizes = Element("in_einsum_tensor_sizes").element.value
        l_path = Element("in_einsum_contraction_path").element.value

        # ignore empty values
        if l_string == None:
          return
        if l_sizes == None:
          return

        l_sizes = ast.literal_eval( l_sizes )

        # determine contraction path through opt_einsum if not provided
        if( l_path == '' ):
          l_tensors = []
          for l_te in l_sizes:
            l_tensors.append( numpy.random.rand( *l_te ) )

          l_path = opt_einsum.contract_path( l_string,
                                            *l_tensors )[0]
        else:
          l_path = ast.literal_eval( l_path )

        # set contraction path
        l_out_path = Element("out_einsum_contraction_path")
        l_out_path.element.innerHTML = str(l_path)

        l_tree = perf_einsum.tree.Tree( l_string,
                                        l_path,
                                        l_sizes )

        l_out_tree_initial = Element("out_einsum_tree_initial")
        l_out_tree_initial.element.innerHTML = str(l_tree)

        l_tree.reorder()

        l_out_tree_reordered = Element("out_einsum_tree_reordered")
        l_out_tree_reordered.element.innerHTML = str(l_tree)
    
      # initialize
      update_einsum()