in packages/@aws-c2a/engine/lib/model-diffing/entity-matchers/entities-matcher.ts [67:102]
function findMatchesDecreasingSimilarity<T extends ValidEntity, K>(
entitiesA: T[],
entitiesB: T[],
similarityEvaluator: SimilarityEvaluator<T, K>,
similarityThreshold: number,
): EntityMatch<T,K>[] {
if(similarityThreshold < 0 || similarityThreshold > 1)
throw Error('Similarity threshold must be a value between 0 and 1');
const matches: [number, EntityMatch<T,K>][] =
flatMap(entitiesA, entityA =>
entitiesB.map((entityB): [number, EntityMatch<T,K>] | undefined => {
const transition = new CompleteTransition({v1: entityA, v2: entityB});
const similarityCalcResult = similarityEvaluator(transition);
if(!similarityCalcResult)
return;
const [similarity, metadata] = similarityCalcResult;
if(similarity < 0 || similarity > 1)
throw Error('Similarity does not have a value in the range [0, 1]');
if(similarity > similarityThreshold)
return [similarity, {transition, metadata}];
return;
}),
).filter(isDefined);
return matches
.sort((m1, m2) => {
if (m1[0] > m2[0]) return -1;
return (m1[0] === m2[0] && +m1[1].transition.nodeData._id < +m2[1].transition.nodeData._id) ? -1 : 1;
})
.map(([, entityMatch]) => entityMatch);
}