/
readModelCatalog.go
155 lines (134 loc) · 4.51 KB
/
readModelCatalog.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// Copyright (c) 2016 OpenM++
// This code is licensed under the MIT license (see LICENSE.txt for details)
package main
import (
"golang.org/x/text/language"
)
// get "public" configuration of model catalog
func (mc *ModelCatalog) toPublicConfig() ModelCatalogConfig {
// lock run catalog and return results
mc.theLock.Lock()
defer mc.theLock.Unlock()
return ModelCatalogConfig{
ModelDir: mc.modelDir,
ModelLogDir: mc.modelLogDir,
IsLogDirEnabled: mc.isLogDirEnabled,
LastTimeStamp: mc.lastTimeStamp,
}
}
// getModelDir return model directory
func (mc *ModelCatalog) getModelDir() (string, bool) {
mc.theLock.Lock()
defer mc.theLock.Unlock()
return mc.modelDir, mc.isDirEnabled
}
// getModelLogDir return default model directory and true if that directory exist
func (mc *ModelCatalog) getModelLogDir() (string, bool) {
mc.theLock.Lock()
defer mc.theLock.Unlock()
return mc.modelLogDir, mc.isLogDirEnabled
}
// indexByDigest return index of model by digest.
// It can be used only inside of lock.
func (mc *ModelCatalog) indexByDigest(digest string) (int, bool) {
for k := range mc.modelLst {
if mc.modelLst[k].meta.Model.Digest == digest {
return k, true
}
}
return 0, false
}
// indexByDigestOrName return index of model by digest or by name.
// It can be used only inside of lock.
// If digest exist in model list then return index by digest else first index of name.
// If not found then return false flag.
func (mc *ModelCatalog) indexByDigestOrName(dn string) (int, bool) {
n := -1
for k := range mc.modelLst {
if mc.modelLst[k].meta.Model.Digest == dn {
return k, true // return: digest found
}
if n < 0 && mc.modelLst[k].meta.Model.Name == dn {
n = k
}
}
if n >= 0 {
return n, true // return: name found
}
return 0, false // not found
}
// languageMatch return model language matched to request language, e.g. EN from en-CA.
// if there is no such match then return is empty "" language code.
// It can be used only inside of lock.
func (mc *ModelCatalog) languageMatch(modelIdx int, langCode string) string {
if modelIdx >= 0 && modelIdx < len(mc.modelLst) && langCode != "" {
_, np, _ := mc.modelLst[modelIdx].matcher.Match(language.Make(langCode))
if np >= 0 && np < len(mc.modelLst[modelIdx].langCodes) {
return mc.modelLst[modelIdx].langCodes[np]
}
}
return ""
}
// allModelDigests return digests for all models.
func (mc *ModelCatalog) allModelDigests() []string {
mc.theLock.Lock()
defer mc.theLock.Unlock()
ds := make([]string, len(mc.modelLst))
for idx := range mc.modelLst {
ds[idx] = mc.modelLst[idx].meta.Model.Digest
}
return ds
}
// modelBasicByDigest return basic info from catalog about model by digest.
func (mc *ModelCatalog) modelBasicByDigest(digest string) (modelBasic, bool) {
return mc.findModelBasic(true, digest)
}
// modelBasicByDigest return basic info from catalog about model by digest.
func (mc *ModelCatalog) modelBasicByDigestOrName(dn string) (modelBasic, bool) {
return mc.findModelBasic(false, dn)
}
// modelBasicByDigest return basic info from catalog about model by digest.
func (mc *ModelCatalog) findModelBasic(isByDigestOnly bool, dn string) (modelBasic, bool) {
mc.theLock.Lock()
defer mc.theLock.Unlock()
idx := 0
ok := false
if isByDigestOnly {
idx, ok = mc.indexByDigest(dn)
} else {
idx, ok = mc.indexByDigestOrName(dn)
}
if !ok {
return modelBasic{}, false // model not found, empty result
}
return modelBasic{
name: mc.modelLst[idx].meta.Model.Name,
digest: mc.modelLst[idx].meta.Model.Digest,
binDir: mc.modelLst[idx].binDir,
logDir: mc.modelLst[idx].logDir,
isLogDir: mc.modelLst[idx].isLogDir,
dbPath: mc.modelLst[idx].dbPath,
relDir: mc.modelLst[idx].relDir,
extra: mc.modelLst[idx].extra,
},
true
}
// allModels return basic info from catalog about all models: name, digest, files location.
func (mc *ModelCatalog) allModels() []modelBasic {
mc.theLock.Lock()
defer mc.theLock.Unlock()
mbs := make([]modelBasic, len(mc.modelLst))
for idx := range mc.modelLst {
mbs[idx] = modelBasic{
name: mc.modelLst[idx].meta.Model.Name,
digest: mc.modelLst[idx].meta.Model.Digest,
binDir: mc.modelLst[idx].binDir,
logDir: mc.modelLst[idx].logDir,
isLogDir: mc.modelLst[idx].isLogDir,
dbPath: mc.modelLst[idx].dbPath,
relDir: mc.modelLst[idx].relDir,
extra: mc.modelLst[idx].extra,
}
}
return mbs
}