multiResLocalLookup: aCRFeature symmetric: aBoolean result: aCRLookupResult alreadyIncludedRes: aCollection | maxNormDist resolutions weights weightsSum dist t minRelevance startEndRelevance angleRelevance acuteAngleRelevance shapeRelevance timeRelevance sizeRelevance strokeRelevance constDist defaultFeature defaultNewFeature totalDist resFeature resNewFeature | maxNormDist _ CRFeature maxNormDistance. resolutions _ CRMultiResStrokeFeature heuristicResolutions. weights _ CRMultiResStrokeFeature heuristicWeights. weightsSum _ CRMultiResStrokeFeature heuristicWeightsSum. minRelevance _ 10. startEndRelevance _ self parameters relevancePromilleForPrimary: self parameters startEndRelevance. angleRelevance _ self parameters relevancePromilleForPrimary: self parameters angleRelevance. acuteAngleRelevance _ self parameters relevancePromilleForPrimary: self parameters acuteAngleRelevance. shapeRelevance _ self parameters relevancePromilleForPrimary: self parameters shapeRelevance. timeRelevance _ self parameters relevancePromilleForSecondary: self parameters timeRelevance. sizeRelevance _ self parameters relevancePromilleForSecondary: self parameters sizeRelevance. strokeRelevance _ self parameters relevancePromilleForPrimary: self parameters strokeRelevance. aCRLookupResult do: [:item | | feature | feature _ item feature. (self includesFeature: feature) ifTrue: [ constDist _ 0. defaultFeature _ feature defaultFeature. defaultNewFeature _ aCRFeature defaultFeature. startEndRelevance >= minRelevance ifTrue: [ t _ defaultNewFeature startEndDistance: defaultFeature maxNormDist: maxNormDist. constDist _ constDist + (t * startEndRelevance). ]. shapeRelevance >= minRelevance ifTrue: [ t _ defaultNewFeature shapeDistance: defaultFeature maxNormDist: maxNormDist. constDist _ constDist + (t * shapeRelevance). ]. timeRelevance >= minRelevance ifTrue: [ t _ defaultNewFeature timeDistance: defaultFeature maxNormDist: maxNormDist. constDist _ constDist + (t * timeRelevance). ]. sizeRelevance >= minRelevance ifTrue: [ t _ defaultNewFeature sizeDistance: defaultFeature maxNormDist: maxNormDist. constDist _ constDist + (t * sizeRelevance). ]. totalDist _ 0. resolutions with: weights do: [:res :weight | (aCollection includes: res) ifTrue: [ dist _ item distance * 1000. ] ifFalse: [ dist _ constDist. resFeature _ feature featureForResolution: res. resNewFeature _ aCRFeature featureForResolution: res. angleRelevance >= minRelevance ifTrue: [ t _ resNewFeature angleDistance: resFeature maxNormDist: maxNormDist. dist _ dist + (t * angleRelevance). ]. acuteAngleRelevance >= minRelevance ifTrue: [ t _ resNewFeature acuteAngleDistance: resFeature maxNormDist: maxNormDist. dist _ dist + (t * acuteAngleRelevance). ]. strokeRelevance >= minRelevance ifTrue: [ t _ aBoolean ifTrue: [resNewFeature symmetricStrokeDistance: resFeature maxNormDist: maxNormDist] ifFalse: [resNewFeature strokeDistance: resFeature maxNormDist: maxNormDist]. dist _ dist + (t * strokeRelevance). ]. ]. totalDist _ totalDist + (dist * weight). ]. totalDist _ totalDist // weightsSum. item distance: totalDist // 1000. ]. ]. aCRLookupResult reSort.