LMs // Use frozen structs on all subLMs.
This commit is contained in:
parent
25f1a85e9e
commit
d0425f78c5
|
@ -31,8 +31,8 @@ import Foundation
|
||||||
|
|
||||||
// 簡體中文模式與繁體中文模式共用全字庫擴展模組,故單獨處理。
|
// 簡體中文模式與繁體中文模式共用全字庫擴展模組,故單獨處理。
|
||||||
// 塞在 LMInstantiator 內的話,每個模式都會讀入一份全字庫,會多佔用 100MB 記憶體。
|
// 塞在 LMInstantiator 內的話,每個模式都會讀入一份全字庫,會多佔用 100MB 記憶體。
|
||||||
private let lmCNS = vChewing.LMLite(consolidate: false)
|
private var lmCNS = vChewing.LMLite(consolidate: false)
|
||||||
private let lmSymbols = vChewing.LMCore(reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: true)
|
private var lmSymbols = vChewing.LMCore(reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: true)
|
||||||
|
|
||||||
extension vChewing {
|
extension vChewing {
|
||||||
/// LMInstantiator is a facade for managing a set of models including
|
/// LMInstantiator is a facade for managing a set of models including
|
||||||
|
@ -69,22 +69,21 @@ extension vChewing {
|
||||||
/// 至於像全字庫這樣所有記錄都使用同一權重數值的模組,可以用 LMLite 以節省記憶體佔用。
|
/// 至於像全字庫這樣所有記錄都使用同一權重數值的模組,可以用 LMLite 以節省記憶體佔用。
|
||||||
/// LMLite 的辭典內不會存儲權重資料,只會在每次讀取記錄時施加您給定的權重數值。
|
/// LMLite 的辭典內不會存儲權重資料,只會在每次讀取記錄時施加您給定的權重數值。
|
||||||
/// LMLite 與 LMCore 都會用到多執行緒、以加速載入(不然的話,全部資料載入會耗費八秒左右)。
|
/// LMLite 與 LMCore 都會用到多執行緒、以加速載入(不然的話,全部資料載入會耗費八秒左右)。
|
||||||
/// 然而,對於使用者語彙模型檔案而言,多執行緒可能會出現意料之外的問題,所以有了 LMLiteMono。
|
|
||||||
/// LMReplacements 與 LMAssociates 均為特種模組,分別擔當語彙置換表資料與使用者聯想詞的資料承載工作。
|
/// LMReplacements 與 LMAssociates 均為特種模組,分別擔當語彙置換表資料與使用者聯想詞的資料承載工作。
|
||||||
|
|
||||||
// 聲明原廠語言模組
|
// 聲明原廠語言模組
|
||||||
/// Reverse 的話,第一欄是注音,第二欄是對應的漢字,第三欄是可能的權重。
|
/// Reverse 的話,第一欄是注音,第二欄是對應的漢字,第三欄是可能的權重。
|
||||||
/// 不 Reverse 的話,第一欄是漢字,第二欄是對應的注音,第三欄是可能的權重。
|
/// 不 Reverse 的話,第一欄是漢字,第二欄是對應的注音,第三欄是可能的權重。
|
||||||
let lmCore = LMCore(reverse: false, consolidate: false, defaultScore: -9.5, forceDefaultScore: false)
|
var lmCore = LMCore(reverse: false, consolidate: false, defaultScore: -9.5, forceDefaultScore: false)
|
||||||
let lmMisc = LMCore(reverse: true, consolidate: false, defaultScore: -1, forceDefaultScore: false)
|
var lmMisc = LMCore(reverse: true, consolidate: false, defaultScore: -1, forceDefaultScore: false)
|
||||||
|
|
||||||
// 聲明使用者語言模組。
|
// 聲明使用者語言模組。
|
||||||
// 使用者語言模組使用多執行緒的話,可能會導致一些問題。有時間再仔細排查看看。
|
// 使用者語言模組使用多執行緒的話,可能會導致一些問題。有時間再仔細排查看看。
|
||||||
let lmUserPhrases = LMLiteMono(consolidate: true)
|
var lmUserPhrases = LMLite(consolidate: true)
|
||||||
let lmFiltered = LMLiteMono(consolidate: true)
|
var lmFiltered = LMLite(consolidate: true)
|
||||||
let lmUserSymbols = LMLiteMono(consolidate: true)
|
var lmUserSymbols = LMLite(consolidate: true)
|
||||||
let lmReplacements = LMReplacments()
|
var lmReplacements = LMReplacments()
|
||||||
let lmAssociates = LMAssociates()
|
var lmAssociates = LMAssociates()
|
||||||
|
|
||||||
// 初期化的函數先保留
|
// 初期化的函數先保留
|
||||||
override init() {}
|
override init() {}
|
||||||
|
|
|
@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension vChewing {
|
extension vChewing {
|
||||||
public class LMAssociates {
|
@frozen public struct LMAssociates {
|
||||||
var keyValueMap: [String: [Megrez.KeyValuePair]] = [:]
|
var keyValueMap: [String: [Megrez.KeyValuePair]] = [:]
|
||||||
var theData: String = ""
|
var theData: String = ""
|
||||||
|
|
||||||
|
@ -36,17 +36,11 @@ extension vChewing {
|
||||||
theData = ""
|
theData = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
if isLoaded() {
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func isLoaded() -> Bool {
|
public func isLoaded() -> Bool {
|
||||||
!keyValueMap.isEmpty
|
!keyValueMap.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
@discardableResult public func open(_ path: String) -> Bool {
|
@discardableResult mutating public func open(_ path: String) -> Bool {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -98,7 +92,7 @@ extension vChewing {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
public func close() {
|
mutating public func close() {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
keyValueMap.removeAll()
|
keyValueMap.removeAll()
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension vChewing {
|
extension vChewing {
|
||||||
public class LMCore {
|
@frozen public struct LMCore {
|
||||||
var keyValueScoreMap: [String: [Megrez.Unigram]] = [:]
|
var keyValueScoreMap: [String: [Megrez.Unigram]] = [:]
|
||||||
var theData: String = ""
|
var theData: String = ""
|
||||||
var shouldReverse: Bool = false
|
var shouldReverse: Bool = false
|
||||||
|
@ -47,17 +47,11 @@ extension vChewing {
|
||||||
shouldForceDefaultScore = forceDefaultScore
|
shouldForceDefaultScore = forceDefaultScore
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
if isLoaded() {
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func isLoaded() -> Bool {
|
public func isLoaded() -> Bool {
|
||||||
!keyValueScoreMap.isEmpty
|
!keyValueScoreMap.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
@discardableResult public func open(_ path: String) -> Bool {
|
@discardableResult mutating public func open(_ path: String) -> Bool {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -132,7 +126,7 @@ extension vChewing {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
public func close() {
|
mutating public func close() {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
keyValueScoreMap.removeAll()
|
keyValueScoreMap.removeAll()
|
||||||
}
|
}
|
||||||
|
@ -152,17 +146,17 @@ extension vChewing {
|
||||||
IME.prtDebugIntel(strDump)
|
IME.prtDebugIntel(strDump)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func bigramsForKeys(precedingKey: String, key: String) -> [Megrez.Bigram] {
|
public func bigramsForKeys(precedingKey: String, key: String) -> [Megrez.Bigram] {
|
||||||
// 這裡用了點廢話處理,不然函數構建體會被 Swift 格式整理工具給毀掉。
|
// 這裡用了點廢話處理,不然函數構建體會被 Swift 格式整理工具給毀掉。
|
||||||
// 其實只要一句「[Megrez.Bigram]()」就夠了。
|
// 其實只要一句「[Megrez.Bigram]()」就夠了。
|
||||||
precedingKey == key ? [Megrez.Bigram]() : [Megrez.Bigram]()
|
precedingKey == key ? [Megrez.Bigram]() : [Megrez.Bigram]()
|
||||||
}
|
}
|
||||||
|
|
||||||
open func unigramsFor(key: String) -> [Megrez.Unigram] {
|
public func unigramsFor(key: String) -> [Megrez.Unigram] {
|
||||||
keyValueScoreMap[key] ?? [Megrez.Unigram]()
|
keyValueScoreMap[key] ?? [Megrez.Unigram]()
|
||||||
}
|
}
|
||||||
|
|
||||||
open func hasUnigramsFor(key: String) -> Bool {
|
public func hasUnigramsFor(key: String) -> Bool {
|
||||||
keyValueScoreMap[key] != nil
|
keyValueScoreMap[key] != nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension vChewing {
|
extension vChewing {
|
||||||
public class LMLite {
|
@frozen public struct LMLite {
|
||||||
var keyValueMap: [String: [Megrez.KeyValuePair]] = [:]
|
var keyValueMap: [String: [Megrez.KeyValuePair]] = [:]
|
||||||
var theData: String = ""
|
var theData: String = ""
|
||||||
var allowConsolidation = false
|
var allowConsolidation = false
|
||||||
|
@ -38,17 +38,11 @@ extension vChewing {
|
||||||
allowConsolidation = consolidate
|
allowConsolidation = consolidate
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
if isLoaded() {
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func isLoaded() -> Bool {
|
public func isLoaded() -> Bool {
|
||||||
!keyValueMap.isEmpty
|
!keyValueMap.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
@discardableResult public func open(_ path: String) -> Bool {
|
@discardableResult mutating public func open(_ path: String) -> Bool {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -105,7 +99,7 @@ extension vChewing {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
public func close() {
|
mutating public func close() {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
keyValueMap.removeAll()
|
keyValueMap.removeAll()
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension vChewing {
|
extension vChewing {
|
||||||
public class LMReplacments {
|
@frozen public struct LMReplacments {
|
||||||
var keyValueMap: [String: String] = [:]
|
var keyValueMap: [String: String] = [:]
|
||||||
var theData: String = ""
|
var theData: String = ""
|
||||||
|
|
||||||
|
@ -36,17 +36,11 @@ extension vChewing {
|
||||||
theData = ""
|
theData = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
if isLoaded() {
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func isLoaded() -> Bool {
|
public func isLoaded() -> Bool {
|
||||||
!keyValueMap.isEmpty
|
!keyValueMap.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
@discardableResult public func open(_ path: String) -> Bool {
|
@discardableResult mutating public func open(_ path: String) -> Bool {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -98,7 +92,7 @@ extension vChewing {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
public func close() {
|
mutating public func close() {
|
||||||
if isLoaded() {
|
if isLoaded() {
|
||||||
keyValueMap.removeAll()
|
keyValueMap.removeAll()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue