This submodule contains functions for finding upper bounds.
The greedy_map function works by first determining some important initial single atom mappings. E.g. if there are a few number of oxygen atoms, we pick a mapping of these oxygen atoms. Next, we will determine of all the atoms that are connected to the currently mapped atoms on the reactant side, where these can be mapped for a minimal cost, and we map that single atom that has the lowest cost. This grows the mapping, and we again calculate the cost of all the neighbouring atoms, and map the lowest cost atom.
This function solves a Min Cost Perfect Matching of the atoms, where the cost for an atom mapping indicates to what extend the neighbourhoods of these atoms match up.
The quadratic assignment problem is an expensive model where the problem has been formulated in a quadratic programming formulation. It might however not find a proper mapping.