Skip to content

Commit 3765e5c

Browse files
committed
Node // Simplify OverrideType enum.
1 parent 22edba7 commit 3765e5c

4 files changed

Lines changed: 43 additions & 52 deletions

File tree

Sources/Megrez/3_KeyValuePaired.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ extension Megrez.Compositor {
175175
@discardableResult
176176
public func overrideCandidate(
177177
_ candidate: Megrez.KeyValuePaired, at location: Int,
178-
overrideType: Megrez.Node.OverrideType = .withHighScore,
178+
overrideType: Megrez.Node.OverrideType = .withSpecified,
179179
enforceRetokenization: Bool = false,
180180
perceptionHandler: ((Megrez.PerceptionIntel) -> ())? = nil
181181
)
@@ -203,7 +203,7 @@ extension Megrez.Compositor {
203203
@discardableResult
204204
public func overrideCandidateLiteral(
205205
_ candidate: String,
206-
at location: Int, overrideType: Megrez.Node.OverrideType = .withHighScore,
206+
at location: Int, overrideType: Megrez.Node.OverrideType = .withSpecified,
207207
enforceRetokenization: Bool = false,
208208
perceptionHandler: ((Megrez.PerceptionIntel) -> ())? = nil
209209
)
@@ -316,7 +316,7 @@ extension Megrez.Compositor {
316316
}
317317
anchor.node.overrideStatus = .init(
318318
overridingScore: demotionScore,
319-
currentOverrideType: .withHighScore,
319+
currentOverrideType: .withSpecified,
320320
currentUnigramIndex: anchor.node.currentUnigramIndex
321321
)
322322
}

Sources/Megrez/5_Node.swift

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ extension Megrez {
3131
self.keyArray = keyArray
3232
self.segLength = max(segLength, 0)
3333
self.unigrams = unigrams
34-
self.currentOverrideType = .withNoOverrides
34+
self.currentOverrideType = nil
3535
}
3636

3737
/// 通過複製現有節點來建立新副本。
@@ -50,19 +50,13 @@ extension Megrez {
5050

5151
// MARK: Public
5252

53-
/// 三種不同的針對一個節點的覆寫行為。
54-
/// - withNoOverrides: 無覆寫行為。
55-
/// - withTopUnigramScore: 使用指定的單元圖資料值來覆寫該節點,但卻使用
56-
/// 當前狀態下權重最高的單元圖的權重數值。打比方說,如果該節點內的單元圖陣列是
57-
/// [("a", -114), ("b", -514), ("c", -1919)] 的話,指定該覆寫行為則會導致該節
58-
/// 點返回的結果為 ("c", -114)。該覆寫行為多用於諸如使用者半衰記憶模組的建議
59-
/// 行為。被覆寫的這個節點的狀態可能不會再被組句行為擅自改回。該覆寫行為無法
60-
/// 防止其它節點被組句函式所支配。這種情況下就需要用到 overridingScore。
61-
/// - withHighScore: 將該節點權重覆寫為 overridingScore,使其被組句函式所青睞。
53+
/// 針對節點可能套用的覆寫行為種類。
54+
/// - withTopGramScore: 專用於雙元圖的自動選取功能,但效力低於 withSpecified 模式。
55+
/// 該覆寫行為無法防止其它節點被組句函式所支配。這種情況下就需要用到 overridingScore。
56+
/// - withSpecified: 將該節點權重覆寫為 overridingScore,使其被組句函式所青睞。
6257
public enum OverrideType: Int, Codable {
63-
case withNoOverrides = 0
64-
case withTopUnigramScore = 1
65-
case withHighScore = 2
58+
case withTopGramScore = 1
59+
case withSpecified = 2
6660
}
6761

6862
/// 節點的唯一識別符。
@@ -83,8 +77,8 @@ extension Megrez {
8377
public private(set) var segLength: Int
8478
/// 單元圖陣列。
8579
public private(set) var unigrams: [Megrez.Unigram]
86-
/// 該節點目前的覆寫狀態種類。
87-
public private(set) var currentOverrideType: Node.OverrideType
80+
/// 該節點目前的覆寫狀態種類。為 `nil` 時表示無覆寫行為。
81+
public private(set) var currentOverrideType: Node.OverrideType?
8882

8983
/// 當前該節點所指向的(單元圖陣列內的)單元圖索引位置。
9084
public private(set) var currentUnigramIndex: Int = 0 {
@@ -103,7 +97,7 @@ extension Megrez {
10397
/// 檢查當前節點是否「讀音字長與候選字字長不一致」。
10498
public var isReadingMismatched: Bool { keyArray.count != value.count }
10599
/// 該節點是否處於被覆寫的狀態。
106-
public var isOverridden: Bool { currentOverrideType != .withNoOverrides }
100+
public var isOverridden: Bool { currentOverrideType != nil }
107101

108102
/// 給出該節點內部單元圖陣列內目前被索引位置所指向的單元圖。
109103
public var currentUnigram: Megrez.Unigram {
@@ -116,10 +110,10 @@ extension Megrez {
116110
/// 給出目前的最高權重單元圖當中的權重值。該結果可能會受節點覆寫狀態所影響。
117111
public var score: Double {
118112
guard !unigrams.isEmpty else { return 0 }
119-
switch currentOverrideType {
120-
case .withHighScore: return overridingScore
121-
case .withTopUnigramScore: return unigrams[0].score
122-
default: return currentUnigram.score
113+
guard let overrideType = currentOverrideType else { return currentUnigram.score }
114+
switch overrideType {
115+
case .withSpecified: return overridingScore
116+
case .withTopGramScore: return unigrams[0].score
123117
}
124118
}
125119

@@ -169,7 +163,7 @@ extension Megrez {
169163
/// 重設該節點的覆寫狀態、及其內部的單元圖索引位置指向。
170164
public func reset() {
171165
currentUnigramIndex = 0
172-
currentOverrideType = .withNoOverrides
166+
currentOverrideType = nil
173167
}
174168

175169
/// 將索引鍵按照給定的分隔符銜接成一個字串。
@@ -197,9 +191,6 @@ extension Megrez {
197191
/// - type: 覆寫行為種類。
198192
/// - Returns: 操作是否順利完成。
199193
public func selectOverrideUnigram(value: String, type: Node.OverrideType) -> Bool {
200-
guard type != .withNoOverrides else {
201-
return false
202-
}
203194
for (i, gram) in unigrams.enumerated() {
204195
if value != gram.value { continue }
205196
currentUnigramIndex = i
@@ -225,7 +216,7 @@ public struct NodeOverrideStatus: Codable, Hashable {
225216
/// - currentUnigramIndex: 當前單元圖索引位置
226217
public init(
227218
overridingScore: Double = 114_514,
228-
currentOverrideType: Megrez.Node.OverrideType = .withNoOverrides,
219+
currentOverrideType: Megrez.Node.OverrideType? = nil,
229220
currentUnigramIndex: Int = 0
230221
) {
231222
self.overridingScore = overridingScore
@@ -238,7 +229,7 @@ public struct NodeOverrideStatus: Codable, Hashable {
238229
/// 覆寫權重數值
239230
public var overridingScore: Double
240231
/// 當前覆寫狀態種類
241-
public var currentOverrideType: Megrez.Node.OverrideType
232+
public var currentOverrideType: Megrez.Node.OverrideType?
242233
/// 當前單元圖索引位置
243234
public var currentUnigramIndex: Int
244235
}

Tests/MegrezTests/MegrezTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -489,21 +489,21 @@ final class MegrezTestsAdvanced: XCTestCase {
489489
compositor.overrideCandidate(
490490
.init((["liu2"], "")),
491491
at: 3,
492-
overrideType: .withHighScore
492+
overrideType: .withSpecified
493493
)
494494
// 測試覆寫「一縷」以打斷「留意」與「呂方」。
495495
compositor.overrideCandidate(
496496
.init((["yi4", "lv3"], "一縷")),
497497
at: 4,
498-
overrideType: .withHighScore
498+
overrideType: .withSpecified
499499
)
500500
assembledSentence = compositor.assemble().map(\.value)
501501
XCTAssertEqual(assembledSentence, ["幽蝶", "", "", "一縷", ""])
502502
// 對位置 7 這個最前方的座標位置使用節點覆寫。會在此過程中自動糾正成對位置 6 的覆寫。
503503
compositor.overrideCandidate(
504504
.init((["fang1"], "")),
505505
at: 7,
506-
overrideType: .withHighScore
506+
overrideType: .withSpecified
507507
)
508508
assembledSentence = compositor.assemble().map(\.value)
509509
XCTAssert(assembledSentence == ["幽蝶", "", "", "一縷", ""])
@@ -679,7 +679,7 @@ final class MegrezTestsAdvanced: XCTestCase {
679679
_ = compositor.overrideCandidate(
680680
.init(keyArray: ["shi4"], value: ""),
681681
at: cursorShi,
682-
overrideType: .withHighScore,
682+
overrideType: .withSpecified,
683683
enforceRetokenization: true,
684684
perceptionHandler: { obsCaptured = $0 }
685685
)
@@ -693,7 +693,7 @@ final class MegrezTestsAdvanced: XCTestCase {
693693
let overrideSucceeded = compositor.overrideCandidate(
694694
.init(keyArray: ["shi4", "de5"], value: "是的"),
695695
at: cursorShiDe,
696-
overrideType: .withHighScore,
696+
overrideType: .withSpecified,
697697
enforceRetokenization: true,
698698
perceptionHandler: { obsCaptured = $0 }
699699
)
@@ -730,7 +730,7 @@ final class MegrezTestsAdvanced: XCTestCase {
730730
compositor.overrideCandidate(
731731
pomSuggestedCandidate,
732732
at: pomSuggestedCandidateOverrideCursor,
733-
overrideType: .withTopUnigramScore,
733+
overrideType: .withTopGramScore,
734734
enforceRetokenization: true
735735
)
736736
compositor.assemble()

Tests/MegrezTests/NodeOverrideStatusTests.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ final class NodeOverrideStatusTests: XCTestCase {
3838
func testNodeOverrideStatus() throws {
3939
let status = NodeOverrideStatus(
4040
overridingScore: 100.0,
41-
currentOverrideType: .withHighScore,
41+
currentOverrideType: .withSpecified,
4242
currentUnigramIndex: 2
4343
)
4444

4545
XCTAssertEqual(status.overridingScore, 100.0)
46-
XCTAssertEqual(status.currentOverrideType, .withHighScore)
46+
XCTAssertEqual(status.currentOverrideType, .withSpecified)
4747
XCTAssertEqual(status.currentUnigramIndex, 2)
4848

4949
// 測試 Codable
@@ -74,29 +74,29 @@ final class NodeOverrideStatusTests: XCTestCase {
7474
// 測試初始狀態
7575
let initialStatus = node1.overrideStatus
7676
XCTAssertEqual(initialStatus.overridingScore, 114_514)
77-
XCTAssertEqual(initialStatus.currentOverrideType, .withNoOverrides)
77+
XCTAssertNil(initialStatus.currentOverrideType)
7878
XCTAssertEqual(initialStatus.currentUnigramIndex, 0)
7979

8080
// 修改節點狀態
8181
node1.overridingScore = 200.0
82-
_ = node1.selectOverrideUnigram(value: node1.unigrams[0].value, type: .withHighScore)
82+
_ = node1.selectOverrideUnigram(value: node1.unigrams[0].value, type: .withSpecified)
8383

8484
// 驗證通過 overrideStatus 能正確讀取
8585
let modifiedStatus = node1.overrideStatus
8686
XCTAssertEqual(modifiedStatus.overridingScore, 200.0)
87-
XCTAssertEqual(modifiedStatus.currentOverrideType, .withHighScore)
87+
XCTAssertEqual(modifiedStatus.currentOverrideType, .withSpecified)
8888
XCTAssertEqual(modifiedStatus.currentUnigramIndex, 0)
8989

9090
// 測試通過 overrideStatus 設定狀態
9191
let newStatus = NodeOverrideStatus(
9292
overridingScore: 300.0,
93-
currentOverrideType: .withTopUnigramScore,
93+
currentOverrideType: .withTopGramScore,
9494
currentUnigramIndex: 0
9595
)
9696
node1.overrideStatus = newStatus
9797

9898
XCTAssertEqual(node1.overridingScore, 300.0)
99-
XCTAssertEqual(node1.currentOverrideType, .withTopUnigramScore)
99+
XCTAssertEqual(node1.currentOverrideType, .withTopGramScore)
100100
XCTAssertEqual(node1.currentUnigramIndex, 0)
101101
}
102102

@@ -112,14 +112,14 @@ final class NodeOverrideStatusTests: XCTestCase {
112112
// 嘗試設定溢出的索引
113113
let overflowStatus = NodeOverrideStatus(
114114
overridingScore: 100.0,
115-
currentOverrideType: .withHighScore,
115+
currentOverrideType: .withSpecified,
116116
currentUnigramIndex: 999 // 遠超出 unigrams 陣列範圍
117117
)
118118

119119
node.overrideStatus = overflowStatus
120120

121121
// 應該觸發重設,狀態回到初始值
122-
XCTAssertEqual(node.currentOverrideType, .withNoOverrides)
122+
XCTAssertNil(node.currentOverrideType)
123123
XCTAssertEqual(node.currentUnigramIndex, 0)
124124
}
125125

@@ -138,12 +138,12 @@ final class NodeOverrideStatusTests: XCTestCase {
138138
// 修改一些節點的狀態
139139
if let node = compositor.segments[0][1] {
140140
node.overridingScore = 500.0
141-
_ = node.selectOverrideUnigram(value: node.unigrams[0].value, type: .withHighScore)
141+
_ = node.selectOverrideUnigram(value: node.unigrams[0].value, type: .withSpecified)
142142
}
143143

144144
if let node = compositor.segments[1][2] {
145145
node.overridingScore = 600.0
146-
_ = node.selectOverrideUnigram(value: node.unigrams[0].value, type: .withTopUnigramScore)
146+
_ = node.selectOverrideUnigram(value: node.unigrams[0].value, type: .withTopGramScore)
147147
}
148148

149149
// 創建鏡照
@@ -159,7 +159,7 @@ final class NodeOverrideStatusTests: XCTestCase {
159159

160160
// 驗證狀態確實被重設
161161
if let node = compositor.segments[0][1] {
162-
XCTAssertEqual(node.currentOverrideType, .withNoOverrides)
162+
XCTAssertNil(node.currentOverrideType)
163163
XCTAssertEqual(node.currentUnigramIndex, 0)
164164
}
165165

@@ -169,12 +169,12 @@ final class NodeOverrideStatusTests: XCTestCase {
169169
// 驗證狀態被正確恢復
170170
if let node = compositor.segments[0][1] {
171171
XCTAssertEqual(node.overridingScore, 500.0)
172-
XCTAssertEqual(node.currentOverrideType, .withHighScore)
172+
XCTAssertEqual(node.currentOverrideType, .withSpecified)
173173
}
174174

175175
if let node = compositor.segments[1][2] {
176176
XCTAssertEqual(node.overridingScore, 600.0)
177-
XCTAssertEqual(node.currentOverrideType, .withTopUnigramScore)
177+
XCTAssertEqual(node.currentOverrideType, .withTopGramScore)
178178
}
179179
}
180180

@@ -192,7 +192,7 @@ final class NodeOverrideStatusTests: XCTestCase {
192192
compositor.segments.forEach { segment in
193193
segment.values.forEach { node in
194194
node.overridingScore = Double.random(in: 100 ... 1_000)
195-
_ = node.selectOverrideUnigram(value: node.unigrams[0].value, type: .withHighScore)
195+
_ = node.selectOverrideUnigram(value: node.unigrams[0].value, type: .withSpecified)
196196
modifiedNodes += 1
197197
}
198198
}
@@ -209,7 +209,7 @@ final class NodeOverrideStatusTests: XCTestCase {
209209

210210
// 鏡照應該包含所有修改的狀態
211211
for (_, status) in mirror {
212-
XCTAssertEqual(status.currentOverrideType, .withHighScore)
212+
XCTAssertEqual(status.currentOverrideType, .withSpecified)
213213
XCTAssertTrue(status.overridingScore >= 100 && status.overridingScore <= 1_000)
214214
}
215215

@@ -227,7 +227,7 @@ final class NodeOverrideStatusTests: XCTestCase {
227227
var restoredNodes = 0
228228
compositor.segments.forEach { segment in
229229
segment.values.forEach { node in
230-
if node.currentOverrideType == .withHighScore {
230+
if node.currentOverrideType == .withSpecified {
231231
restoredNodes += 1
232232
}
233233
}

0 commit comments

Comments
 (0)