From 7620d06d6e74721113f1b2a79ce2d4686fa45c6e Mon Sep 17 00:00:00 2001 From: ened Date: Sun, 6 Aug 2023 18:41:06 +0900 Subject: [PATCH] Apply top score scaling algorithm --- KissMeIndex/Sources/KissIndex+0002.swift | 10 ++++++++-- KissMeIndex/Sources/KissIndex+0003.swift | 6 ++++-- KissMeIndex/Sources/KissIndex+0004.swift | 10 ++++++++-- KissMeIndex/Sources/KissIndex+0005.swift | 5 ++++- KissMeIndex/Sources/KissIndex.swift | 18 ++++++++++++++++-- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/KissMeIndex/Sources/KissIndex+0002.swift b/KissMeIndex/Sources/KissIndex+0002.swift index 8583048..357bcd7 100644 --- a/KissMeIndex/Sources/KissIndex+0002.swift +++ b/KissMeIndex/Sources/KissIndex+0002.swift @@ -104,7 +104,10 @@ extension KissIndex { } } - normalizeAndWrite(scoreMap: scoreMap, includeName: true, kmi: kmi) + if let maxScore = scoreMap.max(by: { abs($0.value) < abs($1.value) }) { + let output = normalizeByScale(scoreMap: scoreMap, includeName: true, scale: abs(maxScore.value)) + writeOutput(output, kmi: kmi) + } } @@ -162,6 +165,9 @@ extension KissIndex { } } - normalizeAndWrite(scoreMap: scoreMap, includeName: true, kmi: kmi) + if let maxScore = scoreMap.max(by: { abs($0.value) < abs($1.value) }) { + let output = normalizeByScale(scoreMap: scoreMap, includeName: true, scale: abs(maxScore.value)) + writeOutput(output, kmi: kmi) + } } } diff --git a/KissMeIndex/Sources/KissIndex+0003.swift b/KissMeIndex/Sources/KissIndex+0003.swift index 3142104..c72d631 100644 --- a/KissMeIndex/Sources/KissIndex+0003.swift +++ b/KissMeIndex/Sources/KissIndex+0003.swift @@ -47,8 +47,10 @@ extension KissIndex { } } - normalizeAndWrite(scoreMap: scoreMap, includeName: true, kmi: kmi) - + if let maxScore = scoreMap.max(by: { abs($0.value) < abs($1.value) }) { + let output = normalizeByScale(scoreMap: scoreMap, includeName: true, scale: abs(maxScore.value)) + writeOutput(output, kmi: kmi) + } } catch { writeError(error, kmi: kmi) } diff --git a/KissMeIndex/Sources/KissIndex+0004.swift b/KissMeIndex/Sources/KissIndex+0004.swift index 4e15f3a..e10543f 100644 --- a/KissMeIndex/Sources/KissIndex+0004.swift +++ b/KissMeIndex/Sources/KissIndex+0004.swift @@ -127,7 +127,10 @@ extension KissIndex { } } - normalizeAndWrite(scoreMap: scoreMap, includeName: true, kmi: kmi) + if let maxScore = scoreMap.max(by: { abs($0.value) < abs($1.value) }) { + let output = normalizeByScale(scoreMap: scoreMap, includeName: true, scale: abs(maxScore.value)) + writeOutput(output, kmi: kmi) + } } @@ -190,6 +193,9 @@ extension KissIndex { } } - normalizeAndWrite(scoreMap: scoreMap, includeName: true, kmi: kmi) + if let maxScore = scoreMap.max(by: { abs($0.value) < abs($1.value) }) { + let output = normalizeByScale(scoreMap: scoreMap, includeName: true, scale: abs(maxScore.value)) + writeOutput(output, kmi: kmi) + } } } diff --git a/KissMeIndex/Sources/KissIndex+0005.swift b/KissMeIndex/Sources/KissIndex+0005.swift index 7e1c355..8a4b36c 100644 --- a/KissMeIndex/Sources/KissIndex+0005.swift +++ b/KissMeIndex/Sources/KissIndex+0005.swift @@ -36,7 +36,10 @@ extension KissIndex { } } - normalizeAndWrite(scoreMap: scoreMap, includeName: true, kmi: kmi) + if let maxScore = scoreMap.max(by: { abs($0.value) < abs($1.value) }) { + let output = normalizeByScale(scoreMap: scoreMap, includeName: true, scale: abs(maxScore.value)) + writeOutput(output, kmi: kmi) + } } catch { writeError(error, kmi: kmi) diff --git a/KissMeIndex/Sources/KissIndex.swift b/KissMeIndex/Sources/KissIndex.swift index ec0ae18..d44d009 100644 --- a/KissMeIndex/Sources/KissIndex.swift +++ b/KissMeIndex/Sources/KissIndex.swift @@ -345,7 +345,7 @@ extension KissIndex { extension KissIndex { - func normalizeAndWrite(scoreMap: [String: Double], includeName: Bool = false, kmi: KissIndexType) { + func normalizeByTotal(scoreMap: [String: Double], includeName: Bool = false) -> [KissIndexResult.Output] { let positiveTotalScores = scoreMap.reduce(0, { $0 + ($1.value > 0 ? $1.value: 0) }) let negativeTotalScores = abs(scoreMap.reduce(0, { $0 + ($1.value < 0 ? $1.value: 0) })) @@ -363,7 +363,21 @@ extension KissIndex { outputs.append(output) } - writeOutput(outputs, kmi: kmi) + return outputs + } + + func normalizeByScale(scoreMap: [String: Double], includeName: Bool = false, scale: Double) -> [KissIndexResult.Output] { + let scoreArray = scoreMap.map { ($0.key, $0.value) }.sorted(by: { $0.1 > $1.1 }) + + var outputs = [KissIndexResult.Output]() + for array in scoreArray { + let weight = min(scale, Double(array.1)) / scale + let name: String? = (includeName ? getProduct(shortCode: array.0)?.itemName: nil) + let output = KissIndexResult.Output(shortCode: array.0, productName: name, weight: weight) + outputs.append(output) + } + + return outputs } }