This avoids duplicating the factor reduction (or "propagation") code in every
analysis module. Instead, analysis modules return synchronization factors for
every pair of traces and reduction is performed separately from the analysis.
If a trace pair doesn't have factors but the inverse pair does (ie. no factors
to convert the time from trace 1 to 0 but there are factors to convert the
time from trace 0 to 1), the factors from the inverted pair are used (after
being inverted themselves).
Signed-off-by: Benjamin Poirier <benjamin.poirier@polymtl.ca>