+# Matrice computers
+
+abstract class TypingBMizer[E: Object]
+
+ var mmodule: MModule
+
+ init(mmodule: MModule) do
+ self.mmodule = mmodule
+ end
+
+ # Compute mtypes ids and position using BM
+ fun build_layout(elements: Set[E]): Layout[E] do
+ var result = new Layout[E]
+ var ids = new HashMap[E, Int]
+ var lin = self.reverse_linearize(elements)
+ for element in lin do
+ ids[element] = ids.length
+ end
+ result.ids = ids
+ result.pos = ids
+ return result
+ end
+
+ private fun reverse_linearize(elements: Set[E]): Array[E] is abstract
+end
+
+class MTypeBMizer
+ super TypingBMizer[MType]
+
+ init(mmodule: MModule) do super(mmodule)
+
+ redef fun reverse_linearize(elements) do
+ return self.mmodule.reverse_linearize_mtypes(elements)
+ end
+end
+
+class MClassBMizer
+ super TypingBMizer[MClass]
+
+ init(mmodule: MModule) do super(mmodule)
+
+ redef fun reverse_linearize(elements) do
+ return self.mmodule.reverse_linearize_mclasses(elements)
+ end
+end
+