class_docstr: High level graph layer
  
  This abstract class establish a protocol for high level graph layers.
  
  The main motivation of a layer is to represent a collection of tasks
  symbolically in order to speedup a series of operations significantly.
  Ideally, a layer should stay in this symbolic state until execution
  but in practice some operations will force the layer to generate all
  its internal tasks. We say that the layer has been materialized.
  
  Most of the default implementations in this class will materialize the
  layer. It is up to derived classes to implement non-materializing
  implementations.
class_docstr_tok: ["High","level","graph","layer","This","abstract","class","establish","a","protocol","for","high","level","graph","layers",".","The","main","motivation","of","a","layer","is","to","represent","a","collection","of","tasks","symbolically","in","order","to","speedup","a","series","of","operations","significantly",".","Ideally",",","a","layer","should","stay","in","this","symbolic","state","until","execution","but","in","practice","some","operations","will","force","the","layer","to","generate","all","its","internal","tasks",".","We","say","that","the","layer","has","been","materialized",".","Most","of","the","default","implementations","in","this","class","will","materialize","the","layer",".","It","is","up","to","derived","classes","to","implement","non-materializing","implementations","."]
code: def layer_info_dict(self):
      info = {
          "layer_type": type(self).__name__,
          "is_materialized": self.is_materialized(),
          "number of outputs": f"{len(self.get_output_keys())}",
      }
      if self.annotations is not None:
          for key, val in self.annotations.items():
              info[key] = html.escape(str(val))
      if self.collection_annotations is not None:
          for key, val in self.collection_annotations.items():
              # Hide verbose chunk details from the HTML table
              if key != "chunks":
                  info[key] = html.escape(str(val))
      return info
  
imports: from __future__ import annotations
  import abc
  import copy
  import html
  from collections.abc import Collection, Hashable, ItemsView, Iterable, Iterator, KeysView, Mapping, Sequence, Set, ValuesView
  from typing import Any
  import tlz
  import dask
  from dask import config
  from dask.base import clone_key, flatten, is_dask_collection
  from dask.core import keys_in_tasks, reverse_dict
  from dask.typing import DaskCollection, Graph, Key
  from dask.utils import ensure_dict, import_required, key_split
  from dask.widgets import get_template
label_desc: Use image node_id 9 for calling the Layer obj's underlying member method code with example usage: obj.layer_info_dict() and returns: info