`type mt_node````=`

`|` `Leaf of Node.id * BasicCost.astate`
`|` `Min of mt_node list`
`|` `Plus of mt_node list`

``
`val add_leaf : mt_node ‑> Node.id ‑> BasicCost.astate ‑> mt_node`
`val plus_seq : (InferStdlib.Pp.F.formatter ‑> 'a ‑> unit) ‑> InferStdlib.Pp.F.formatter ‑> 'a list ‑> unit`
`val pp : F.formatter ‑> mt_node ‑> unit`
`val add_child : mt_node ‑> mt_node ‑> mt_node`
`val evaluate_tree : mt_node ‑> BasicCost.astate`
`val evaluate_operator : (BasicCost.astate ‑> BasicCost.astate ‑> BasicCost.astate) ‑> mt_node list ‑> BasicCost.astate`
`val is_well_formed_plus_node : mt_node ‑> bool`
`module SetOfSetsOfNodes : sig ... end`
`module BuiltTreeMap : sig ... end`
`val minimum_propagation : BoundMap.t ‑> StructuralConstraints.t Node.IdMap.t ‑> ((Node.IdSet.elt * Node.IdSet.t) ‑> mt_node) ‑> (Node.id * Node.IdSet.t) ‑> mt_node`
`val with_cache : ((BuiltTreeMap.key ‑> mt_node) ‑> BuiltTreeMap.key ‑> mt_node) ‑> (BuiltTreeMap.key ‑> mt_node) InferStdlib.IStd.Staged.t`
`val compute_trees_from_contraints : BoundMap.t ‑> NodeCFG.t ‑> StructuralConstraints.t Node.IdMap.t ‑> (Node.id * mt_node) list`