From fb87ef67a3998d4063d480256433da5fd52c361b Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Sun, 16 Jul 2023 16:27:23 +0800 Subject: [PATCH] Rename vector to factor --- README.md | 2 +- controllers/{vectorset.go => factorset.go} | 42 +++--- object/adapter.go | 2 +- object/{vector.go => factor.go} | 6 +- object/{vectorset.go => factorset.go} | 62 ++++---- .../{vectorset_tsne.go => factorset_tsne.go} | 16 +-- ...et_tsne_test.go => factorset_tsne_test.go} | 22 +-- ...ectorset_upload.go => factorset_upload.go} | 44 +++--- ...pload_test.go => factorset_upload_test.go} | 10 +- object/kmeans.go | 26 ++-- object/kmeans_test.go | 4 +- object/wordset.go | 4 +- object/wordset_graph.go | 48 +++---- object/wordset_match.go | 14 +- object/wordset_upload.go | 16 +-- object/wordset_upload_test.go | 4 +- routers/router.go | 12 +- util/file.go | 6 +- web/src/App.js | 18 +-- web/src/{VectorTable.js => FactorTable.js} | 6 +- ...torsetEditPage.js => FactorsetEditPage.js} | 134 +++++++++--------- ...torsetListPage.js => FactorsetListPage.js} | 120 ++++++++-------- web/src/FileTable.js | 6 +- web/src/FileTree.js | 4 +- web/src/Setting.js | 60 ++++---- web/src/VideoListPage.js | 30 ++-- web/src/WordsetEditPage.js | 60 ++++---- web/src/WordsetListPage.js | 74 ++++------ ...ectorsetBackend.js => FactorsetBackend.js} | 68 ++++----- web/src/locales/en/data.json | 10 +- web/src/locales/zh/data.json | 10 +- 31 files changed, 460 insertions(+), 480 deletions(-) rename controllers/{vectorset.go => factorset.go} (61%) rename object/{vector.go => factor.go} (91%) rename object/{vectorset.go => factorset.go} (55%) rename object/{vectorset_tsne.go => factorset_tsne.go} (80%) rename object/{vectorset_tsne_test.go => factorset_tsne_test.go} (60%) rename object/{vectorset_upload.go => factorset_upload.go} (54%) rename object/{vectorset_upload_test.go => factorset_upload_test.go} (73%) rename web/src/{VectorTable.js => FactorTable.js} (97%) rename web/src/{VectorsetEditPage.js => FactorsetEditPage.js} (58%) rename web/src/{VectorsetListPage.js => FactorsetListPage.js} (65%) rename web/src/backend/{VectorsetBackend.js => FactorsetBackend.js} (56%) diff --git a/README.md b/README.md index 7c19955..f4ce616 100644 --- a/README.md +++ b/README.md @@ -159,4 +159,4 @@ http://localhost:13001 ![9-Preview-casibase-stores](assets/9-Preview-casibase-stores.png) -The **casibase** demo is shown above, and in the future users can upload various **knowledge** files, **wordsets**, and **vectorsets** to achieve a **customized domain knowledge base**. \ No newline at end of file +The **casibase** demo is shown above, and in the future users can upload various **knowledge** files, **wordsets**, and **factorsets** to achieve a **customized domain knowledge base**. \ No newline at end of file diff --git a/controllers/vectorset.go b/controllers/factorset.go similarity index 61% rename from controllers/vectorset.go rename to controllers/factorset.go index 61252b3..18caabf 100644 --- a/controllers/vectorset.go +++ b/controllers/factorset.go @@ -20,51 +20,51 @@ import ( "github.com/casbin/casibase/object" ) -func (c *ApiController) GetGlobalVectorsets() { - vectorsets, err := object.GetGlobalVectorsets() +func (c *ApiController) GetGlobalFactorsets() { + factorsets, err := object.GetGlobalFactorsets() if err != nil { c.ResponseError(err.Error()) return } - c.ResponseOk(vectorsets) + c.ResponseOk(factorsets) } -func (c *ApiController) GetVectorsets() { +func (c *ApiController) GetFactorsets() { owner := c.Input().Get("owner") - vectorsets, err := object.GetVectorsets(owner) + factorsets, err := object.GetFactorsets(owner) if err != nil { c.ResponseError(err.Error()) return } - c.ResponseOk(vectorsets) + c.ResponseOk(factorsets) } -func (c *ApiController) GetVectorset() { +func (c *ApiController) GetFactorset() { id := c.Input().Get("id") - vectorset, err := object.GetVectorset(id) + factorset, err := object.GetFactorset(id) if err != nil { c.ResponseError(err.Error()) return } - c.ResponseOk(vectorset) + c.ResponseOk(factorset) } -func (c *ApiController) UpdateVectorset() { +func (c *ApiController) UpdateFactorset() { id := c.Input().Get("id") - var vectorset object.Vectorset - err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) + var factorset object.Factorset + err := json.Unmarshal(c.Ctx.Input.RequestBody, &factorset) if err != nil { c.ResponseError(err.Error()) return } - success, err := object.UpdateVectorset(id, &vectorset) + success, err := object.UpdateFactorset(id, &factorset) if err != nil { c.ResponseError(err.Error()) return @@ -73,15 +73,15 @@ func (c *ApiController) UpdateVectorset() { c.ResponseOk(success) } -func (c *ApiController) AddVectorset() { - var vectorset object.Vectorset - err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) +func (c *ApiController) AddFactorset() { + var factorset object.Factorset + err := json.Unmarshal(c.Ctx.Input.RequestBody, &factorset) if err != nil { c.ResponseError(err.Error()) return } - success, err := object.AddVectorset(&vectorset) + success, err := object.AddFactorset(&factorset) if err != nil { c.ResponseError(err.Error()) return @@ -90,15 +90,15 @@ func (c *ApiController) AddVectorset() { c.ResponseOk(success) } -func (c *ApiController) DeleteVectorset() { - var vectorset object.Vectorset - err := json.Unmarshal(c.Ctx.Input.RequestBody, &vectorset) +func (c *ApiController) DeleteFactorset() { + var factorset object.Factorset + err := json.Unmarshal(c.Ctx.Input.RequestBody, &factorset) if err != nil { c.ResponseError(err.Error()) return } - success, err := object.DeleteVectorset(&vectorset) + success, err := object.DeleteFactorset(&factorset) if err != nil { c.ResponseError(err.Error()) return diff --git a/object/adapter.go b/object/adapter.go index c67ff86..95066fa 100644 --- a/object/adapter.go +++ b/object/adapter.go @@ -108,7 +108,7 @@ func (a *Adapter) createTable() { panic(err) } - err = a.engine.Sync2(new(Vectorset)) + err = a.engine.Sync2(new(Factorset)) if err != nil { panic(err) } diff --git a/object/vector.go b/object/factor.go similarity index 91% rename from object/vector.go rename to object/factor.go index e521cee..beebe56 100644 --- a/object/vector.go +++ b/object/factor.go @@ -19,16 +19,16 @@ import ( "strings" ) -type Vector struct { +type Factor struct { Name string `xorm:"varchar(100)" json:"name"` Category string `xorm:"varchar(100)" json:"category"` Color string `xorm:"varchar(100)" json:"color"` Data []float64 `xorm:"varchar(1000)" json:"data"` } -func (vector *Vector) GetDataKey() string { +func (factor *Factor) GetDataKey() string { sData := []string{} - for _, f := range vector.Data { + for _, f := range factor.Data { sData = append(sData, fmt.Sprintf("%f", f)) } return strings.Join(sData, "|") diff --git a/object/vectorset.go b/object/factorset.go similarity index 55% rename from object/vectorset.go rename to object/factorset.go index 130f333..d47210c 100644 --- a/object/vectorset.go +++ b/object/factorset.go @@ -21,7 +21,7 @@ import ( "xorm.io/core" ) -type Vectorset struct { +type Factorset struct { Owner string `xorm:"varchar(100) notnull pk" json:"owner"` Name string `xorm:"varchar(100) notnull pk" json:"name"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"` @@ -33,61 +33,61 @@ type Vectorset struct { Dimension int `json:"dimension"` Count int `json:"count"` - Vectors []*Vector `xorm:"mediumtext" json:"vectors"` - AllVectors []*Vector `xorm:"-" json:"allVectors"` - VectorMap map[string]*Vector `xorm:"-" json:"vectorMap"` + Factors []*Factor `xorm:"mediumtext" json:"factors"` + AllFactors []*Factor `xorm:"-" json:"allFactors"` + FactorMap map[string]*Factor `xorm:"-" json:"factorMap"` } -func GetGlobalVectorsets() ([]*Vectorset, error) { - vectorsets := []*Vectorset{} - err := adapter.engine.Asc("owner").Desc("created_time").Find(&vectorsets) +func GetGlobalFactorsets() ([]*Factorset, error) { + factorsets := []*Factorset{} + err := adapter.engine.Asc("owner").Desc("created_time").Find(&factorsets) if err != nil { - return vectorsets, err + return factorsets, err } - return vectorsets, nil + return factorsets, nil } -func GetVectorsets(owner string) ([]*Vectorset, error) { - vectorsets := []*Vectorset{} - err := adapter.engine.Desc("created_time").Find(&vectorsets, &Vectorset{Owner: owner}) +func GetFactorsets(owner string) ([]*Factorset, error) { + factorsets := []*Factorset{} + err := adapter.engine.Desc("created_time").Find(&factorsets, &Factorset{Owner: owner}) if err != nil { - return vectorsets, err + return factorsets, err } - return vectorsets, nil + return factorsets, nil } -func getVectorset(owner string, name string) (*Vectorset, error) { - vectorset := Vectorset{Owner: owner, Name: name} - existed, err := adapter.engine.Get(&vectorset) +func getFactorset(owner string, name string) (*Factorset, error) { + factorset := Factorset{Owner: owner, Name: name} + existed, err := adapter.engine.Get(&factorset) if err != nil { - return &vectorset, err + return &factorset, err } if existed { - return &vectorset, nil + return &factorset, nil } else { return nil, nil } } -func GetVectorset(id string) (*Vectorset, error) { +func GetFactorset(id string) (*Factorset, error) { owner, name := util.GetOwnerAndNameFromId(id) - return getVectorset(owner, name) + return getFactorset(owner, name) } -func UpdateVectorset(id string, vectorset *Vectorset) (bool, error) { +func UpdateFactorset(id string, factorset *Factorset) (bool, error) { owner, name := util.GetOwnerAndNameFromId(id) - _, err := getVectorset(owner, name) + _, err := getFactorset(owner, name) if err != nil { return false, err } - if vectorset == nil { + if factorset == nil { return false, nil } - _, err = adapter.engine.ID(core.PK{owner, name}).AllCols().Update(vectorset) + _, err = adapter.engine.ID(core.PK{owner, name}).AllCols().Update(factorset) if err != nil { return false, err } @@ -96,8 +96,8 @@ func UpdateVectorset(id string, vectorset *Vectorset) (bool, error) { return true, nil } -func AddVectorset(vectorset *Vectorset) (bool, error) { - affected, err := adapter.engine.Insert(vectorset) +func AddFactorset(factorset *Factorset) (bool, error) { + affected, err := adapter.engine.Insert(factorset) if err != nil { return false, err } @@ -105,8 +105,8 @@ func AddVectorset(vectorset *Vectorset) (bool, error) { return affected != 0, nil } -func DeleteVectorset(vectorset *Vectorset) (bool, error) { - affected, err := adapter.engine.ID(core.PK{vectorset.Owner, vectorset.Name}).Delete(&Vectorset{}) +func DeleteFactorset(factorset *Factorset) (bool, error) { + affected, err := adapter.engine.ID(core.PK{factorset.Owner, factorset.Name}).Delete(&Factorset{}) if err != nil { return false, err } @@ -114,6 +114,6 @@ func DeleteVectorset(vectorset *Vectorset) (bool, error) { return affected != 0, nil } -func (vectorset *Vectorset) GetId() string { - return fmt.Sprintf("%s/%s", vectorset.Owner, vectorset.Name) +func (factorset *Factorset) GetId() string { + return fmt.Sprintf("%s/%s", factorset.Owner, factorset.Name) } diff --git a/object/vectorset_tsne.go b/object/factorset_tsne.go similarity index 80% rename from object/vectorset_tsne.go rename to object/factorset_tsne.go index 1d91662..8eefe1f 100644 --- a/object/vectorset_tsne.go +++ b/object/factorset_tsne.go @@ -40,13 +40,13 @@ func testTsne() { println(Y) } -func (vectorset *Vectorset) DoTsne(dimension int) { +func (factorset *Factorset) DoTsne(dimension int) { floatArray := []float64{} - for _, vector := range vectorset.AllVectors { - floatArray = append(floatArray, vector.Data...) + for _, factor := range factorset.AllFactors { + floatArray = append(floatArray, factor.Data...) } - X := mat.NewDense(len(vectorset.AllVectors), vectorset.Dimension, floatArray) + X := mat.NewDense(len(factorset.AllFactors), factorset.Dimension, floatArray) t := tsne.NewTSNE(dimension, 300, 100, 300, true) @@ -56,18 +56,18 @@ func (vectorset *Vectorset) DoTsne(dimension int) { }) rowCount, columnCount := Y.Dims() - if rowCount != len(vectorset.AllVectors) { - panic("rowCount != len(vectorset.AllVectors)") + if rowCount != len(factorset.AllFactors) { + panic("rowCount != len(factorset.AllFactors)") } if columnCount != dimension { panic("columnCount != dimension") } - for i, vector := range vectorset.AllVectors { + for i, factor := range factorset.AllFactors { arr := []float64{} for j := 0; j < dimension; j++ { arr = append(arr, Y.At(i, j)) } - vector.Data = arr + factor.Data = arr } } diff --git a/object/vectorset_tsne_test.go b/object/factorset_tsne_test.go similarity index 60% rename from object/vectorset_tsne_test.go rename to object/factorset_tsne_test.go index 7e2b424..6ac968f 100644 --- a/object/vectorset_tsne_test.go +++ b/object/factorset_tsne_test.go @@ -19,20 +19,20 @@ import ( "testing" ) -func TestDoVectorsetTsne(t *testing.T) { +func TestDoFactorsetTsne(t *testing.T) { InitConfig() dimension := 50 - //vectorset := getVectorset("admin", "wikipedia") - vectorset, _ := getVectorset("admin", "wordVector_utf-8") - vectorset.LoadVectors("../../tmpFiles/") - vectorset.DoTsne(dimension) + //factorset := getFactorset("admin", "wikipedia") + factorset, _ := getFactorset("admin", "wordFactor_utf-8") + factorset.LoadFactors("../../tmpFiles/") + factorset.DoTsne(dimension) - vectorset.Name = fmt.Sprintf("%s_Dim_%d", vectorset.Name, dimension) - vectorset.FileName = fmt.Sprintf("%s_Dim_%d.csv", vectorset.FileName, dimension) - vectorset.FileSize = "" - vectorset.Dimension = dimension - vectorset.WriteVectors("../../tmpFiles/") - AddVectorset(vectorset) + factorset.Name = fmt.Sprintf("%s_Dim_%d", factorset.Name, dimension) + factorset.FileName = fmt.Sprintf("%s_Dim_%d.csv", factorset.FileName, dimension) + factorset.FileSize = "" + factorset.Dimension = dimension + factorset.WriteFactors("../../tmpFiles/") + AddFactorset(factorset) } diff --git a/object/vectorset_upload.go b/object/factorset_upload.go similarity index 54% rename from object/vectorset_upload.go rename to object/factorset_upload.go index 62df85e..723d39e 100644 --- a/object/vectorset_upload.go +++ b/object/factorset_upload.go @@ -21,49 +21,49 @@ import ( "github.com/casbin/casibase/util" ) -func (vectorset *Vectorset) LoadVectors(pathPrefix string) { - path := util.GetUploadFilePath(fmt.Sprintf("%s%s", pathPrefix, vectorset.FileName)) +func (factorset *Factorset) LoadFactors(pathPrefix string) { + path := util.GetUploadFilePath(fmt.Sprintf("%s%s", pathPrefix, factorset.FileName)) var nameArray []string var dataArray [][]float64 - if strings.HasSuffix(vectorset.FileName, ".csv") { - if strings.Contains(vectorset.FileName, "_Dim_") { - nameArray, dataArray = util.LoadVectorFileByCsv2(path) + if strings.HasSuffix(factorset.FileName, ".csv") { + if strings.Contains(factorset.FileName, "_Dim_") { + nameArray, dataArray = util.LoadFactorFileByCsv2(path) } else { - nameArray, dataArray = util.LoadVectorFileByCsv(path) + nameArray, dataArray = util.LoadFactorFileByCsv(path) } } else { - nameArray, dataArray = util.LoadVectorFileBySpace(path) + nameArray, dataArray = util.LoadFactorFileBySpace(path) } - exampleVectors := []*Vector{} - vectors := []*Vector{} - vectorMap := map[string]*Vector{} + exampleFactors := []*Factor{} + factors := []*Factor{} + factorMap := map[string]*Factor{} for i := 0; i < len(nameArray); i++ { - vector := &Vector{ + factor := &Factor{ Name: nameArray[i], Data: dataArray[i], } if i < 100 { - exampleVectors = append(exampleVectors, vector) + exampleFactors = append(exampleFactors, factor) } - vectors = append(vectors, vector) - vectorMap[vector.Name] = vector + factors = append(factors, factor) + factorMap[factor.Name] = factor } - vectorset.Vectors = exampleVectors - vectorset.AllVectors = vectors - vectorset.VectorMap = vectorMap + factorset.Factors = exampleFactors + factorset.AllFactors = factors + factorset.FactorMap = factorMap } -func (vectorset *Vectorset) WriteVectors(pathPrefix string) { - path := util.GetUploadFilePath(fmt.Sprintf("%s%s", pathPrefix, vectorset.FileName)) +func (factorset *Factorset) WriteFactors(pathPrefix string) { + path := util.GetUploadFilePath(fmt.Sprintf("%s%s", pathPrefix, factorset.FileName)) rows := [][]string{} - for _, vector := range vectorset.AllVectors { - row := util.FloatsToStrings(vector.Data) - row = append([]string{vector.Name}, row...) + for _, factor := range factorset.AllFactors { + row := util.FloatsToStrings(factor.Data) + row = append([]string{factor.Name}, row...) rows = append(rows, row) } diff --git a/object/vectorset_upload_test.go b/object/factorset_upload_test.go similarity index 73% rename from object/vectorset_upload_test.go rename to object/factorset_upload_test.go index f8fd1ad..aaecb1c 100644 --- a/object/vectorset_upload_test.go +++ b/object/factorset_upload_test.go @@ -16,11 +16,11 @@ package object import "testing" -func TestUpdateVectorsetVectors(t *testing.T) { +func TestUpdateFactorsetFactors(t *testing.T) { InitConfig() - //vectorset := getVectorset("admin", "wikipedia") - vectorset, _ := getVectorset("admin", "wordVector_utf-8") - vectorset.LoadVectors("../../tmpFiles/") - UpdateVectorset(vectorset.GetId(), vectorset) + //factorset := getFactorset("admin", "wikipedia") + factorset, _ := getFactorset("admin", "wordFactor_utf-8") + factorset.LoadFactors("../../tmpFiles/") + UpdateFactorset(factorset.GetId(), factorset) } diff --git a/object/kmeans.go b/object/kmeans.go index 8677440..24fe482 100644 --- a/object/kmeans.go +++ b/object/kmeans.go @@ -32,19 +32,19 @@ func fa2Str(floatArray []float64) string { return strings.Join(sData, "|") } -func runKmeans(vectors []*Vector, clusterNumber int) { - vectorMap := map[string]*Vector{} +func runKmeans(factors []*Factor, clusterNumber int) { + factorMap := map[string]*Factor{} var d clusters.Observations - for _, vector := range vectors { - if len(vector.Data) == 0 { + for _, factor := range factors { + if len(factor.Data) == 0 { continue } - dataKey := vector.GetDataKey() - vectorMap[dataKey] = vector + dataKey := factor.GetDataKey() + factorMap[dataKey] = factor - d = append(d, clusters.Coordinates(vector.Data)) + d = append(d, clusters.Coordinates(factor.Data)) } km := kmeans.New() @@ -62,20 +62,20 @@ func runKmeans(vectors []*Vector, clusterNumber int) { floatArray := observation.Coordinates() dataKey := fa2Str(floatArray) - vector, ok := vectorMap[dataKey] + factor, ok := factorMap[dataKey] if !ok { - panic(fmt.Errorf("vectorMap vector not found, dataKey = %s", dataKey)) + panic(fmt.Errorf("factorMap factor not found, dataKey = %s", dataKey)) } - vector.Category = strconv.Itoa(i) - vector.Color = color + factor.Category = strconv.Itoa(i) + factor.Color = color } } } -func updateWordsetVectorCategories(owner string, wordsetName string) { +func updateWordsetFactorCategories(owner string, wordsetName string) { wordset, _ := getWordset(owner, wordsetName) - runKmeans(wordset.Vectors, 100) + runKmeans(wordset.Factors, 100) UpdateWordset(wordset.GetId(), wordset) } diff --git a/object/kmeans_test.go b/object/kmeans_test.go index 86dde5d..fa64c24 100644 --- a/object/kmeans_test.go +++ b/object/kmeans_test.go @@ -16,8 +16,8 @@ package object import "testing" -func TestUpdateWordsetVectorCategories(t *testing.T) { +func TestUpdateWordsetFactorCategories(t *testing.T) { InitConfig() - updateWordsetVectorCategories("admin", "word") + updateWordsetFactorCategories("admin", "word") } diff --git a/object/wordset.go b/object/wordset.go index 4688876..c172ff6 100644 --- a/object/wordset.go +++ b/object/wordset.go @@ -28,9 +28,9 @@ type Wordset struct { DisplayName string `xorm:"varchar(100)" json:"displayName"` DistanceLimit int `json:"distanceLimit"` - Vectorset string `xorm:"varchar(100)" json:"vectorset"` + Factorset string `xorm:"varchar(100)" json:"factorset"` - Vectors []*Vector `xorm:"mediumtext" json:"vectors"` + Factors []*Factor `xorm:"mediumtext" json:"factors"` } func GetGlobalWordsets() ([]*Wordset, error) { diff --git a/object/wordset_graph.go b/object/wordset_graph.go index e8c959e..0177da5 100644 --- a/object/wordset_graph.go +++ b/object/wordset_graph.go @@ -45,13 +45,13 @@ func GetWordsetGraph(id string, clusterNumber int, distanceLimit int) (*Graph, e return nil, nil } - if len(wordset.Vectors) == 0 { + if len(wordset.Factors) == 0 { return nil, nil } allZero := true - for _, vector := range wordset.Vectors { - if len(vector.Data) != 0 { + for _, factor := range wordset.Factors { + if len(factor.Data) != 0 { allZero = false break } @@ -60,14 +60,14 @@ func GetWordsetGraph(id string, clusterNumber int, distanceLimit int) (*Graph, e return nil, nil } - runKmeans(wordset.Vectors, clusterNumber) + runKmeans(wordset.Factors, clusterNumber) - g = generateGraph(wordset.Vectors, distanceLimit) + g = generateGraph(wordset.Factors, distanceLimit) //graphCache[cacheId] = g return g, nil } -func getDistance(v1 *Vector, v2 *Vector) float64 { +func getDistance(v1 *Factor, v2 *Factor) float64 { res := 0.0 for i := range v1.Data { res += (v1.Data[i] - v2.Data[i]) * (v1.Data[i] - v2.Data[i]) @@ -75,11 +75,11 @@ func getDistance(v1 *Vector, v2 *Vector) float64 { return math.Sqrt(res) } -func refineVectors(vectors []*Vector) []*Vector { - res := []*Vector{} - for _, vector := range vectors { - if len(vector.Data) > 0 { - res = append(res, vector) +func refineFactors(factors []*Factor) []*Factor { + res := []*Factor{} + for _, factor := range factors { + if len(factor.Data) > 0 { + res = append(res, factor) } } return res @@ -97,19 +97,19 @@ func getNodeColor(weight int) string { return fmt.Sprintf("rgb(%d,%d,%d)", myColor.R, myColor.G, myColor.B) } -func generateGraph(vectors []*Vector, distanceLimit int) *Graph { - vectors = refineVectors(vectors) - //vectors = vectors[:100] +func generateGraph(factors []*Factor, distanceLimit int) *Graph { + factors = refineFactors(factors) + //factors = factors[:100] g := newGraph() g.Nodes = []*Node{} g.Links = []*Link{} nodeWeightMap := map[string]int{} - for i := 0; i < len(vectors); i++ { - for j := i + 1; j < len(vectors); j++ { - v1 := vectors[i] - v2 := vectors[j] + for i := 0; i < len(factors); i++ { + for j := i + 1; j < len(factors); j++ { + v1 := factors[i] + v2 := factors[j] distance := int(getDistance(v1, v2)) if distance >= distanceLimit { continue @@ -134,17 +134,17 @@ func generateGraph(vectors []*Vector, distanceLimit int) *Graph { } } - for _, vector := range vectors { + for _, factor := range factors { //value := 5 - value := int(math.Sqrt(float64(nodeWeightMap[vector.Name]))) + 3 - weight := nodeWeightMap[vector.Name] + value := int(math.Sqrt(float64(nodeWeightMap[factor.Name]))) + 3 + weight := nodeWeightMap[factor.Name] //nodeColor := "rgb(232,67,62)" //nodeColor := getNodeColor(value) - nodeColor := vector.Color + nodeColor := factor.Color - fmt.Printf("Node [%s]: weight = %d, nodeValue = %d\n", vector.Name, nodeWeightMap[vector.Name], value) - g.addNode(vector.Name, vector.Name, value, nodeColor, vector.Category, weight) + fmt.Printf("Node [%s]: weight = %d, nodeValue = %d\n", factor.Name, nodeWeightMap[factor.Name], value) + g.addNode(factor.Name, factor.Name, value, nodeColor, factor.Category, weight) } return g diff --git a/object/wordset_match.go b/object/wordset_match.go index 0754586..e6419ca 100644 --- a/object/wordset_match.go +++ b/object/wordset_match.go @@ -23,21 +23,21 @@ func GetWordsetMatch(id string) (*Wordset, error) { return nil, nil } - vectorset, err := getVectorset(wordset.Owner, wordset.Vectorset) + factorset, err := getFactorset(wordset.Owner, wordset.Factorset) if err != nil { return nil, err } - if vectorset == nil { + if factorset == nil { return nil, nil } - vectorset.LoadVectors("") + factorset.LoadFactors("") - for _, vector := range wordset.Vectors { - if trueVector, ok := vectorset.VectorMap[vector.Name]; ok { - vector.Data = trueVector.Data + for _, factor := range wordset.Factors { + if trueFactor, ok := factorset.FactorMap[factor.Name]; ok { + factor.Data = trueFactor.Data } else { - vector.Data = []float64{} + factor.Data = []float64{} } } diff --git a/object/wordset_upload.go b/object/wordset_upload.go index b08f134..b23d8bf 100644 --- a/object/wordset_upload.go +++ b/object/wordset_upload.go @@ -19,23 +19,23 @@ import ( "github.com/casbin/casibase/xlsx" ) -func uploadVectorNames(owner string, fileId string) (bool, error) { +func uploadFactorNames(owner string, fileId string) (bool, error) { table := xlsx.ReadXlsxFile(fileId) - vectorMap := map[string]int{} - vectors := []*Vector{} + factorMap := map[string]int{} + factors := []*Factor{} for _, line := range table { - if _, ok := vectorMap[line[0]]; ok { + if _, ok := factorMap[line[0]]; ok { continue } else { - vectorMap[line[0]] = 1 + factorMap[line[0]] = 1 } - vector := &Vector{ + factor := &Factor{ Name: line[0], Data: []float64{}, } - vectors = append(vectors, vector) + factors = append(factors, factor) } wordset := &Wordset{ @@ -44,7 +44,7 @@ func uploadVectorNames(owner string, fileId string) (bool, error) { CreatedTime: util.GetCurrentTime(), DisplayName: "word", DistanceLimit: 14, - Vectors: vectors, + Factors: factors, } return AddWordset(wordset) } diff --git a/object/wordset_upload_test.go b/object/wordset_upload_test.go index c3393fe..f21d681 100644 --- a/object/wordset_upload_test.go +++ b/object/wordset_upload_test.go @@ -16,8 +16,8 @@ package object import "testing" -func TestUploadVectorNames(t *testing.T) { +func TestUploadFactorNames(t *testing.T) { InitConfig() - uploadVectorNames("admin", "../../tmpFiles/filename") + uploadFactorNames("admin", "../../tmpFiles/filename") } diff --git a/routers/router.go b/routers/router.go index 346d378..f8a3f57 100644 --- a/routers/router.go +++ b/routers/router.go @@ -45,12 +45,12 @@ func initAPI() { beego.Router("/api/add-wordset", &controllers.ApiController{}, "POST:AddWordset") beego.Router("/api/delete-wordset", &controllers.ApiController{}, "POST:DeleteWordset") - beego.Router("/api/get-global-vectorsets", &controllers.ApiController{}, "GET:GetGlobalVectorsets") - beego.Router("/api/get-vectorsets", &controllers.ApiController{}, "GET:GetVectorsets") - beego.Router("/api/get-vectorset", &controllers.ApiController{}, "GET:GetVectorset") - beego.Router("/api/update-vectorset", &controllers.ApiController{}, "POST:UpdateVectorset") - beego.Router("/api/add-vectorset", &controllers.ApiController{}, "POST:AddVectorset") - beego.Router("/api/delete-vectorset", &controllers.ApiController{}, "POST:DeleteVectorset") + beego.Router("/api/get-global-factorsets", &controllers.ApiController{}, "GET:GetGlobalFactorsets") + beego.Router("/api/get-factorsets", &controllers.ApiController{}, "GET:GetFactorsets") + beego.Router("/api/get-factorset", &controllers.ApiController{}, "GET:GetFactorset") + beego.Router("/api/update-factorset", &controllers.ApiController{}, "POST:UpdateFactorset") + beego.Router("/api/add-factorset", &controllers.ApiController{}, "POST:AddFactorset") + beego.Router("/api/delete-factorset", &controllers.ApiController{}, "POST:DeleteFactorset") beego.Router("/api/get-global-videos", &controllers.ApiController{}, "GET:GetGlobalVideos") beego.Router("/api/get-videos", &controllers.ApiController{}, "GET:GetVideos") diff --git a/util/file.go b/util/file.go index d4527f0..5d28408 100644 --- a/util/file.go +++ b/util/file.go @@ -38,7 +38,7 @@ func parseJsonToFloats(s string) []float64 { return res } -func LoadVectorFileByCsv(path string) ([]string, [][]float64) { +func LoadFactorFileByCsv(path string) ([]string, [][]float64) { nameArray := []string{} dataArray := [][]float64{} @@ -63,7 +63,7 @@ func LoadVectorFileByCsv(path string) ([]string, [][]float64) { return nameArray, dataArray } -func LoadVectorFileByCsv2(path string) ([]string, [][]float64) { +func LoadFactorFileByCsv2(path string) ([]string, [][]float64) { nameArray := []string{} dataArray := [][]float64{} @@ -84,7 +84,7 @@ func LoadVectorFileByCsv2(path string) ([]string, [][]float64) { return nameArray, dataArray } -func LoadVectorFileBySpace(path string) ([]string, [][]float64) { +func LoadFactorFileBySpace(path string) ([]string, [][]float64) { nameArray := []string{} dataArray := [][]float64{} diff --git a/web/src/App.js b/web/src/App.js index 4687589..97634c4 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -29,8 +29,8 @@ import FileTreePage from "./FileTreePage"; import WordsetListPage from "./WordsetListPage"; import WordsetEditPage from "./WordsetEditPage"; import WordsetGraphPage from "./WordsetGraphPage"; -import VectorsetListPage from "./VectorsetListPage"; -import VectorsetEditPage from "./VectorsetEditPage"; +import FactorsetListPage from "./FactorsetListPage"; +import FactorsetEditPage from "./FactorsetEditPage"; import VideoListPage from "./VideoListPage"; import VideoEditPage from "./VideoEditPage"; import ProviderListPage from "./ProviderListPage"; @@ -84,8 +84,8 @@ class App extends Component { this.setState({selectedMenuKey: "/clustering"}); } else if (uri.includes("/wordsets")) { this.setState({selectedMenuKey: "/wordsets"}); - } else if (uri.includes("/vectorsets")) { - this.setState({selectedMenuKey: "/vectorsets"}); + } else if (uri.includes("/factorsets")) { + this.setState({selectedMenuKey: "/factorsets"}); } else if (uri.includes("/videos")) { this.setState({selectedMenuKey: "/videos"}); } else if (uri.includes("/providers")) { @@ -298,9 +298,9 @@ class App extends Component { ); res.push( - - - {i18next.t("general:Vectorsets")} + + + {i18next.t("general:Factorsets")} ); @@ -395,8 +395,8 @@ class App extends Component { this.renderSigninIfNotSignedIn()} /> this.renderSigninIfNotSignedIn()} /> this.renderSigninIfNotSignedIn()} /> - this.renderSigninIfNotSignedIn()} /> - this.renderSigninIfNotSignedIn()} /> + this.renderSigninIfNotSignedIn()} /> + this.renderSigninIfNotSignedIn()} /> this.renderSigninIfNotSignedIn()} /> this.renderSigninIfNotSignedIn()} /> this.renderSigninIfNotSignedIn()} /> diff --git a/web/src/VectorTable.js b/web/src/FactorTable.js similarity index 97% rename from web/src/VectorTable.js rename to web/src/FactorTable.js index 68ee574..fee284c 100644 --- a/web/src/VectorTable.js +++ b/web/src/FactorTable.js @@ -18,7 +18,7 @@ import {Button, Col, Input, Row, Table, Tooltip} from "antd"; import * as Setting from "./Setting"; import i18next from "i18next"; -class VectorTable extends React.Component { +class FactorTable extends React.Component { constructor(props) { super(props); this.state = { @@ -50,7 +50,7 @@ class VectorTable extends React.Component { } addRow(table) { - const row = {no: table.length, name: `New Vector - ${table.length}`, data: []}; + const row = {no: table.length, name: `New Factor - ${table.length}`, data: []}; if (table === undefined) { table = []; } @@ -164,4 +164,4 @@ class VectorTable extends React.Component { } } -export default VectorTable; +export default FactorTable; diff --git a/web/src/VectorsetEditPage.js b/web/src/FactorsetEditPage.js similarity index 58% rename from web/src/VectorsetEditPage.js rename to web/src/FactorsetEditPage.js index 5869b6b..fc95b15 100644 --- a/web/src/VectorsetEditPage.js +++ b/web/src/FactorsetEditPage.js @@ -1,75 +1,75 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import React from "react"; import {Button, Card, Col, Input, InputNumber, Row} from "antd"; -import * as VectorsetBackend from "./backend/VectorsetBackend"; +import * as FactorsetBackend from "./backend/FactorsetBackend"; import * as Setting from "./Setting"; import i18next from "i18next"; -import VectorTable from "./VectorTable"; +import FactorTable from "./FactorTable"; import {LinkOutlined} from "@ant-design/icons"; -class VectorsetEditPage extends React.Component { +class FactorsetEditPage extends React.Component { constructor(props) { super(props); this.state = { classes: props, - vectorsetName: props.match.params.vectorsetName, - vectorset: null, + factorsetName: props.match.params.factorsetName, + factorset: null, }; } UNSAFE_componentWillMount() { - this.getVectorset(); + this.getFactorset(); } - getVectorset() { - VectorsetBackend.getVectorset(this.props.account.name, this.state.vectorsetName) - .then((vectorset) => { - if (vectorset.status === "ok") { + getFactorset() { + FactorsetBackend.getFactorset(this.props.account.name, this.state.factorsetName) + .then((factorset) => { + if (factorset.status === "ok") { this.setState({ - vectorset: vectorset.data, + factorset: factorset.data, }); } else { - Setting.showMessage("error", `Failed to get vectorset: ${vectorset.msg}`); + Setting.showMessage("error", `Failed to get factorset: ${factorset.msg}`); } }); } - parseVectorsetField(key, value) { + parseFactorsetField(key, value) { if (["score"].includes(key)) { value = Setting.myParseInt(value); } return value; } - updateVectorsetField(key, value) { - value = this.parseVectorsetField(key, value); + updateFactorsetField(key, value) { + value = this.parseFactorsetField(key, value); - const vectorset = this.state.vectorset; - vectorset[key] = value; + const factorset = this.state.factorset; + factorset[key] = value; this.setState({ - vectorset: vectorset, + factorset: factorset, }); } - renderVectorset() { + renderFactorset() { return ( - {i18next.t("vectorset:Edit Vectorset")}     - + {i18next.t("factorset:Edit Factorset")}     + } style={{marginLeft: "5px"}} type="inner"> @@ -77,8 +77,8 @@ class VectorsetEditPage extends React.Component { {i18next.t("general:Name")}: - { - this.updateVectorsetField("name", e.target.value); + { + this.updateFactorsetField("name", e.target.value); }} /> @@ -87,8 +87,8 @@ class VectorsetEditPage extends React.Component { {i18next.t("general:Display name")}: - { - this.updateVectorsetField("displayName", e.target.value); + { + this.updateFactorsetField("displayName", e.target.value); }} /> @@ -97,60 +97,60 @@ class VectorsetEditPage extends React.Component { {i18next.t("general:URL")}: - } value={this.state.vectorset.url} onChange={e => { - this.updateVectorsetField("url", e.target.value); + } value={this.state.factorset.url} onChange={e => { + this.updateFactorsetField("url", e.target.value); }} /> - {i18next.t("vectorset:File name")}: + {i18next.t("factorset:File name")}: - { - this.updateVectorsetField("fileName", e.target.value); + { + this.updateFactorsetField("fileName", e.target.value); }} /> - {i18next.t("vectorset:File size")}: + {i18next.t("factorset:File size")}: - { - this.updateVectorsetField("fileSize", e.target.value); + { + this.updateFactorsetField("fileSize", e.target.value); }} /> - {i18next.t("vectorset:Dimension")}: + {i18next.t("factorset:Dimension")}: - { - this.updateVectorsetField("dimension", value); + { + this.updateFactorsetField("dimension", value); }} /> - {i18next.t("vectorset:Count")}: + {i18next.t("factorset:Count")}: - { - this.updateVectorsetField("count", value); + { + this.updateFactorsetField("count", value); }} /> - {i18next.t("vectorset:Example vectors")}: + {i18next.t("factorset:Example factors")}: - {this.updateVectorsetField("vectors", value);}} + {this.updateFactorsetField("factors", value);}} /> @@ -158,20 +158,20 @@ class VectorsetEditPage extends React.Component { ); } - submitVectorsetEdit() { - const vectorset = Setting.deepCopy(this.state.vectorset); - VectorsetBackend.updateVectorset(this.state.vectorset.owner, this.state.vectorsetName, vectorset) + submitFactorsetEdit() { + const factorset = Setting.deepCopy(this.state.factorset); + FactorsetBackend.updateFactorset(this.state.factorset.owner, this.state.factorsetName, factorset) .then((res) => { if (res.status === "ok") { if (res.data) { Setting.showMessage("success", "Successfully saved"); this.setState({ - vectorsetName: this.state.vectorset.name, + factorsetName: this.state.factorset.name, }); - this.props.history.push(`/vectorsets/${this.state.vectorset.name}`); + this.props.history.push(`/factorsets/${this.state.factorset.name}`); } else { Setting.showMessage("error", "failed to save: server side failure"); - this.updateVectorsetField("name", this.state.vectorsetName); + this.updateFactorsetField("name", this.state.factorsetName); } } else { Setting.showMessage("error", `failed to save: ${res.msg}`); @@ -190,7 +190,7 @@ class VectorsetEditPage extends React.Component { { - this.state.vectorset !== null ? this.renderVectorset() : null + this.state.factorset !== null ? this.renderFactorset() : null } @@ -200,7 +200,7 @@ class VectorsetEditPage extends React.Component { - + @@ -208,4 +208,4 @@ class VectorsetEditPage extends React.Component { } } -export default VectorsetEditPage; +export default FactorsetEditPage; diff --git a/web/src/VectorsetListPage.js b/web/src/FactorsetListPage.js similarity index 65% rename from web/src/VectorsetListPage.js rename to web/src/FactorsetListPage.js index 6f9f210..c987b02 100644 --- a/web/src/VectorsetListPage.js +++ b/web/src/FactorsetListPage.js @@ -1,103 +1,103 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import React from "react"; import {Link} from "react-router-dom"; import {Button, Col, Popconfirm, Row, Table} from "antd"; import moment from "moment"; import * as Setting from "./Setting"; -import * as VectorsetBackend from "./backend/VectorsetBackend"; +import * as FactorsetBackend from "./backend/FactorsetBackend"; import i18next from "i18next"; -class VectorsetListPage extends React.Component { +class FactorsetListPage extends React.Component { constructor(props) { super(props); this.state = { classes: props, - vectorsets: null, + factorsets: null, }; } UNSAFE_componentWillMount() { - this.getVectorsets(); + this.getFactorsets(); } - getVectorsets() { - VectorsetBackend.getVectorsets(this.props.account.name) + getFactorsets() { + FactorsetBackend.getFactorsets(this.props.account.name) .then((res) => { if (res.status === "ok") { this.setState({ - vectorsets: res.data, + factorsets: res.data, }); } else { - Setting.showMessage("error", `Failed to get vectorsets: ${res.msg}`); + Setting.showMessage("error", `Failed to get factorsets: ${res.msg}`); } }); } - newVectorset() { + newFactorset() { const randomName = Setting.getRandomName(); return { owner: this.props.account.name, - name: `vectorset_${randomName}`, + name: `factorset_${randomName}`, createdTime: moment().format(), - displayName: `New Vectorset - ${randomName}`, - url: "https://github.com/Embedding/Chinese-Word-Vectors", + displayName: `New Factorset - ${randomName}`, + url: "https://github.com/Embedding/Chinese-Word-Factors", fileName: "sgns.target.word-word.dynwin5.thr10.neg5.dim300.iter5", fileSize: "1.69 GB", dimension: 128, count: 10000, - vectors: [], + factors: [], }; } - addVectorset() { - const newVectorset = this.newVectorset(); - VectorsetBackend.addVectorset(newVectorset) + addFactorset() { + const newFactorset = this.newFactorset(); + FactorsetBackend.addFactorset(newFactorset) .then((res) => { if (res.status === "ok") { - Setting.showMessage("success", "Vectorset added successfully"); + Setting.showMessage("success", "Factorset added successfully"); this.setState({ - vectorsets: Setting.prependRow(this.state.vectorsets, newVectorset), + factorsets: Setting.prependRow(this.state.factorsets, newFactorset), }); } else { - Setting.showMessage("error", `Failed to add vectorset: ${res.msg}`); + Setting.showMessage("error", `Failed to add factorset: ${res.msg}`); } }) .catch(error => { - Setting.showMessage("error", `Vectorset failed to add: ${error}`); + Setting.showMessage("error", `Factorset failed to add: ${error}`); }); } - deleteVectorset(i) { - VectorsetBackend.deleteVectorset(this.state.vectorsets[i]) + deleteFactorset(i) { + FactorsetBackend.deleteFactorset(this.state.factorsets[i]) .then((res) => { if (res.status === "ok") { - Setting.showMessage("success", "Vectorset deleted successfully"); + Setting.showMessage("success", "Factorset deleted successfully"); this.setState({ - vectorsets: Setting.deleteRow(this.state.vectorsets, i), + factorsets: Setting.deleteRow(this.state.factorsets, i), }); } else { - Setting.showMessage("error", `Vectorset failed to delete: ${res.msg}`); + Setting.showMessage("error", `Factorset failed to delete: ${res.msg}`); } }) .catch(error => { - Setting.showMessage("error", `Vectorset failed to delete: ${error}`); + Setting.showMessage("error", `Factorset failed to delete: ${error}`); }); } - renderTable(vectorsets) { + renderTable(factorsets) { const columns = [ { title: i18next.t("general:Name"), @@ -107,7 +107,7 @@ class VectorsetListPage extends React.Component { sorter: (a, b) => a.name.localeCompare(b.name), render: (text, record, index) => { return ( - + {text} ); @@ -137,38 +137,38 @@ class VectorsetListPage extends React.Component { }, }, { - title: i18next.t("vectorset:File name"), + title: i18next.t("factorset:File name"), dataIndex: "fileName", key: "fileName", width: "200px", sorter: (a, b) => a.fileName.localeCompare(b.fileName), }, { - title: i18next.t("vectorset:File size"), + title: i18next.t("factorset:File size"), dataIndex: "fileSize", key: "fileSize", width: "120px", sorter: (a, b) => a.fileSize.localeCompare(b.fileSize), }, { - title: i18next.t("vectorset:Dimension"), + title: i18next.t("factorset:Dimension"), dataIndex: "dimension", key: "dimension", width: "110px", sorter: (a, b) => a.dimension - b.dimension, }, { - title: i18next.t("vectorset:Example vectors"), - dataIndex: "vectors", - key: "vectors", + title: i18next.t("factorset:Example factors"), + dataIndex: "factors", + key: "factors", // width: '120px', - sorter: (a, b) => a.vectors.localeCompare(b.vectors), + sorter: (a, b) => a.factors.localeCompare(b.factors), render: (text, record, index) => { - return Setting.getTags(text, "vectors"); + return Setting.getTags(text, "factors"); }, }, { - title: i18next.t("vectorset:Count"), + title: i18next.t("factorset:Count"), dataIndex: "count", key: "count", width: "110px", @@ -182,10 +182,10 @@ class VectorsetListPage extends React.Component { render: (text, record, index) => { return (
- + this.deleteVectorset(index)} + title={`Sure to delete factorset: ${record.name} ?`} + onConfirm={() => this.deleteFactorset(index)} okText="OK" cancelText="Cancel" > @@ -199,14 +199,14 @@ class VectorsetListPage extends React.Component { return (
- (
- {i18next.t("general:Vectorsets")}     - + {i18next.t("general:Factorsets")}     +
)} - loading={vectorsets === null} + loading={factorsets === null} /> ); @@ -220,7 +220,7 @@ class VectorsetListPage extends React.Component { { - this.renderTable(this.state.vectorsets) + this.renderTable(this.state.factorsets) } @@ -231,4 +231,4 @@ class VectorsetListPage extends React.Component { } } -export default VectorsetListPage; +export default FactorsetListPage; diff --git a/web/src/FileTable.js b/web/src/FileTable.js index fceda07..5153a83 100644 --- a/web/src/FileTable.js +++ b/web/src/FileTable.js @@ -52,7 +52,7 @@ class FileTable extends React.Component { } addRow(table) { - const row = {no: table.length, name: `New Vector - ${table.length}`, data: []}; + const row = {no: table.length, name: `New Factor - ${table.length}`, data: []}; if (table === undefined) { table = []; } @@ -98,7 +98,7 @@ class FileTable extends React.Component { renderTable(table) { const columns = [ { - title: i18next.t("vectorset:File name"), + title: i18next.t("factorset:File name"), dataIndex: "title", key: "title", // width: '200px', @@ -139,7 +139,7 @@ class FileTable extends React.Component { }, }, { - title: i18next.t("vectorset:File size"), + title: i18next.t("factorset:File size"), dataIndex: "size", key: "size", width: "120px", diff --git a/web/src/FileTree.js b/web/src/FileTree.js index eaaa5d7..d7f553e 100644 --- a/web/src/FileTree.js +++ b/web/src/FileTree.js @@ -808,13 +808,13 @@ class FileTree extends React.Component { size="small" // extra={} > - + {file.title} {Setting.getExtFromFile(file)} - + {Setting.getFriendlyFileSize(file.size)} diff --git a/web/src/Setting.js b/web/src/Setting.js index 547ff12..3268d2a 100644 --- a/web/src/Setting.js +++ b/web/src/Setting.js @@ -1,17 +1,17 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import {Tag, Tooltip, message} from "antd"; import {SyncOutlined} from "@ant-design/icons"; import {isMobile as isMobileDevice} from "react-device-detect"; @@ -289,33 +289,33 @@ export function getTag(text, type, state) { } } -export function getTags(vectors, type) { - if (!vectors) { +export function getTags(factors, type) { + if (!factors) { return []; } - if (type === "vectors") { - return getVectorTag(vectors); + if (type === "factors") { + return getFactorTag(factors); } else if (type === "users") { - return getUserTag(vectors); + return getUserTag(factors); } } -function getVectorTag(vectors) { +function getFactorTag(factors) { const res = []; - vectors.forEach((vector, i) => { - if (vector.data.length !== 0) { + factors.forEach((factor, i) => { + if (factor.data.length !== 0) { res.push( - + - {vector.name} + {factor.name} ); } else { res.push( - {vector.name} + {factor.name} ); } @@ -401,11 +401,11 @@ export function workbook2blob(workbook) { export function downloadXlsx(wordset) { const data = []; - wordset.vectors.forEach((vector, i) => { + wordset.factors.forEach((factor, i) => { const row = {}; - row[0] = vector.name; - vector.data.forEach((dataItem, i) => { + row[0] = factor.name; + factor.data.forEach((dataItem, i) => { row[i + 1] = dataItem; }); @@ -419,8 +419,8 @@ export function downloadXlsx(wordset) { // ]; try { - const blob = sheet2blob(sheet, "vectors"); - const fileName = `vectors-${wordset.name}.xlsx`; + const blob = sheet2blob(sheet, "factors"); + const fileName = `factors-${wordset.name}.xlsx`; FileSaver.saveAs(blob, fileName); } catch (error) { showMessage("error", `failed to download: ${error.message}`); diff --git a/web/src/VideoListPage.js b/web/src/VideoListPage.js index fb40f02..6391652 100644 --- a/web/src/VideoListPage.js +++ b/web/src/VideoListPage.js @@ -1,17 +1,17 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import React from "react"; import {Link} from "react-router-dom"; import {Button, Col, Popconfirm, Row, Table, Upload} from "antd"; @@ -185,7 +185,7 @@ class VideoListPage extends React.Component { dataIndex: "labels", key: "labels", // width: '120px', - sorter: (a, b) => a.vectors.localeCompare(b.vectors), + sorter: (a, b) => a.factors.localeCompare(b.factors), render: (text, record, index) => { return Setting.getLabelTags(text); }, diff --git a/web/src/WordsetEditPage.js b/web/src/WordsetEditPage.js index 29d44fc..cd0d1bb 100644 --- a/web/src/WordsetEditPage.js +++ b/web/src/WordsetEditPage.js @@ -1,25 +1,25 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import React from "react"; import {Button, Card, Col, Input, InputNumber, Row, Select} from "antd"; import * as WordsetBackend from "./backend/WordsetBackend"; import * as Setting from "./Setting"; import i18next from "i18next"; -import VectorTable from "./VectorTable"; +import FactorTable from "./FactorTable"; import WordsetGraph from "./WordsetGraph"; -import * as VectorsetBackend from "./backend/VectorsetBackend"; +import * as FactorsetBackend from "./backend/FactorsetBackend"; const {Option} = Select; @@ -30,14 +30,14 @@ class WordsetEditPage extends React.Component { classes: props, wordsetName: props.match.params.wordsetName, wordset: null, - vectorsets: null, + factorsets: null, matchLoading: false, }; } UNSAFE_componentWillMount() { this.getWordset(); - this.getVectorsets(); + this.getFactorsets(); } getWordset() { @@ -53,15 +53,15 @@ class WordsetEditPage extends React.Component { }); } - getVectorsets() { - VectorsetBackend.getVectorsets(this.props.account.name) + getFactorsets() { + FactorsetBackend.getFactorsets(this.props.account.name) .then((res) => { if (res.status === "ok") { this.setState({ - vectorsets: res.data, + factorsets: res.data, }); } else { - Setting.showMessage("error", `Failed to get vectorsets: ${res.msg}`); + Setting.showMessage("error", `Failed to get factorsets: ${res.msg}`); } }); } @@ -84,8 +84,8 @@ class WordsetEditPage extends React.Component { } renderWordset() { - const allWords = this.state.wordset?.vectors.length; - const validWords = this.state.wordset?.vectors.filter(vector => vector.data.length !== 0).length; + const allWords = this.state.wordset?.factors.length; + const validWords = this.state.wordset?.factors.filter(factor => factor.data.length !== 0).length; return ( - {i18next.t("wordset:Vectorset")}: + {i18next.t("wordset:Factorset")}: - {this.updateWordsetField("factorset", value);})}> { - this.state.vectorsets?.map((vectorset, index) => ) + this.state.factorsets?.map((factorset, index) => ) } @@ -172,11 +172,11 @@ class WordsetEditPage extends React.Component { {i18next.t("wordset:Words")}: - {this.updateWordsetField("vectors", value);}} + onUpdateTable={(value) => {this.updateWordsetField("factors", value);}} /> diff --git a/web/src/WordsetListPage.js b/web/src/WordsetListPage.js index 4c2e17e..749c2a5 100644 --- a/web/src/WordsetListPage.js +++ b/web/src/WordsetListPage.js @@ -1,17 +1,17 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import React from "react"; import {Link} from "react-router-dom"; import {Button, Col, Popconfirm, Row, Table} from "antd"; @@ -54,8 +54,8 @@ class WordsetListPage extends React.Component { createdTime: moment().format(), displayName: `New Wordset - ${randomName}`, distanceLimit: 14, - vectorset: "wordVector_utf-8", - vectors: [], + factorset: "wordFactor_utf-8", + factors: [], }; } @@ -119,43 +119,23 @@ class WordsetListPage extends React.Component { }, { title: i18next.t("wordset:Words"), - dataIndex: "vectors", - key: "vectors", + dataIndex: "factors", + key: "factors", // width: '120px', - sorter: (a, b) => a.vectors.localeCompare(b.vectors), + sorter: (a, b) => a.factors.localeCompare(b.factors), render: (text, record, index) => { - return Setting.getTags(text, "vectors"); + return Setting.getTags(text, "factors"); }, }, - // { - // title: i18next.t("wordset:All words"), - // dataIndex: 'allWords', - // key: 'allWords', - // width: '140px', - // sorter: (a, b) => a.allWords - b.allWords, - // render: (text, record, index) => { - // return record.vectors.length; - // } - // }, - // { - // title: i18next.t("wordset:Valid words"), - // dataIndex: 'validWords', - // key: 'validWords', - // width: '140px', - // sorter: (a, b) => a.validWords - b.validWords, - // render: (text, record, index) => { - // return record.vectors.filter(vector => vector.data.length !== 0).length; - // } - // }, { - title: i18next.t("wordset:Vectorset"), - dataIndex: "vectorset", - key: "vectorset", + title: i18next.t("wordset:Factorset"), + dataIndex: "factorset", + key: "factorset", width: "140px", - sorter: (a, b) => a.vectorset.localeCompare(b.vectorset), + sorter: (a, b) => a.factorset.localeCompare(b.factorset), render: (text, record, index) => { return ( - + {text} ); @@ -167,8 +147,8 @@ class WordsetListPage extends React.Component { key: "matched", width: "140px", render: (text, record, index) => { - const allWords = record.vectors.length; - const validWords = record.vectors.filter(vector => vector.data.length !== 0).length; + const allWords = record.factors.length; + const validWords = record.factors.filter(factor => factor.data.length !== 0).length; return `${Setting.getPercentage(allWords === 0 ? 0 : validWords / allWords)}% (${validWords} / ${allWords})`; }, }, diff --git a/web/src/backend/VectorsetBackend.js b/web/src/backend/FactorsetBackend.js similarity index 56% rename from web/src/backend/VectorsetBackend.js rename to web/src/backend/FactorsetBackend.js index 4c96ce2..65197d5 100644 --- a/web/src/backend/VectorsetBackend.js +++ b/web/src/backend/FactorsetBackend.js @@ -1,70 +1,70 @@ -// Copyright 2023 The casbin Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - +// Copyright 2023 The casbin Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import * as Setting from "../Setting"; -export function getGlobalVectorsets() { - return fetch(`${Setting.ServerUrl}/api/get-global-vectorsets`, { +export function getGlobalFactorsets() { + return fetch(`${Setting.ServerUrl}/api/get-global-factorsets`, { method: "GET", credentials: "include", }).then(res => res.json()); } -export function getVectorsets(owner) { - return fetch(`${Setting.ServerUrl}/api/get-vectorsets?owner=${owner}`, { +export function getFactorsets(owner) { + return fetch(`${Setting.ServerUrl}/api/get-factorsets?owner=${owner}`, { method: "GET", credentials: "include", }).then(res => res.json()); } -export function getVectorset(owner, name) { - return fetch(`${Setting.ServerUrl}/api/get-vectorset?id=${owner}/${encodeURIComponent(name)}`, { +export function getFactorset(owner, name) { + return fetch(`${Setting.ServerUrl}/api/get-factorset?id=${owner}/${encodeURIComponent(name)}`, { method: "GET", credentials: "include", }).then(res => res.json()); } -export function getVectorsetGraph(owner, name, clusterNumber, distanceLimit) { - return fetch(`${Setting.ServerUrl}/api/get-vectorset-graph?id=${owner}/${encodeURIComponent(name)}&clusterNumber=${clusterNumber}&distanceLimit=${distanceLimit}`, { +export function getFactorsetGraph(owner, name, clusterNumber, distanceLimit) { + return fetch(`${Setting.ServerUrl}/api/get-factorset-graph?id=${owner}/${encodeURIComponent(name)}&clusterNumber=${clusterNumber}&distanceLimit=${distanceLimit}`, { method: "GET", credentials: "include", }).then(res => res.json()); } -export function updateVectorset(owner, name, vectorset) { - const newVectorset = Setting.deepCopy(vectorset); - return fetch(`${Setting.ServerUrl}/api/update-vectorset?id=${owner}/${encodeURIComponent(name)}`, { +export function updateFactorset(owner, name, factorset) { + const newFactorset = Setting.deepCopy(factorset); + return fetch(`${Setting.ServerUrl}/api/update-factorset?id=${owner}/${encodeURIComponent(name)}`, { method: "POST", credentials: "include", - body: JSON.stringify(newVectorset), + body: JSON.stringify(newFactorset), }).then(res => res.json()); } -export function addVectorset(vectorset) { - const newVectorset = Setting.deepCopy(vectorset); - return fetch(`${Setting.ServerUrl}/api/add-vectorset`, { +export function addFactorset(factorset) { + const newFactorset = Setting.deepCopy(factorset); + return fetch(`${Setting.ServerUrl}/api/add-factorset`, { method: "POST", credentials: "include", - body: JSON.stringify(newVectorset), + body: JSON.stringify(newFactorset), }).then(res => res.json()); } -export function deleteVectorset(vectorset) { - const newVectorset = Setting.deepCopy(vectorset); - return fetch(`${Setting.ServerUrl}/api/delete-vectorset`, { +export function deleteFactorset(factorset) { + const newFactorset = Setting.deepCopy(factorset); + return fetch(`${Setting.ServerUrl}/api/delete-factorset`, { method: "POST", credentials: "include", - body: JSON.stringify(newVectorset), + body: JSON.stringify(newFactorset), }).then(res => res.json()); } diff --git a/web/src/locales/en/data.json b/web/src/locales/en/data.json index 35733c3..f903fdf 100644 --- a/web/src/locales/en/data.json +++ b/web/src/locales/en/data.json @@ -26,7 +26,7 @@ "Save": "Save", "Stores": "Stores", "URL": "URL", - "Vectorsets": "Vectorsets", + "Factorsets": "Factorsets", "Videos": "Videos", "View": "View", "Wordsets": "Wordsets" @@ -66,11 +66,11 @@ "files and": "files and", "folders are checked": "folders are checked" }, - "vectorset": { + "factorset": { "Count": "Count", "Dimension": "Dimension", - "Edit Vectorset": "Edit Vectorset", - "Example vectors": "Example vectors", + "Edit Factorset": "Edit Factorset", + "Example factors": "Example factors", "File name": "File name", "File size": "File size" }, @@ -94,7 +94,7 @@ "Match": "Match", "Matched": "Matched", "Valid words": "Valid words", - "Vectorset": "Vectorset", + "Factorset": "Factorset", "Words": "Words" } } \ No newline at end of file diff --git a/web/src/locales/zh/data.json b/web/src/locales/zh/data.json index 002e18d..a8a20f1 100644 --- a/web/src/locales/zh/data.json +++ b/web/src/locales/zh/data.json @@ -26,7 +26,7 @@ "Save": "保存", "Stores": "我的数据仓库", "URL": "链接", - "Vectorsets": "我的向量集", + "Factorsets": "我的向量集", "Videos": "我的视频", "View": "查看", "Wordsets": "我的词汇集" @@ -66,11 +66,11 @@ "files and": "个文件和", "folders are checked": "文件夹已被选择" }, - "vectorset": { + "factorset": { "Count": "个数", "Dimension": "维度", - "Edit Vectorset": "编辑向量集", - "Example vectors": "示例向量", + "Edit Factorset": "编辑向量集", + "Example factors": "示例向量", "File name": "文件名", "File size": "文件大小" }, @@ -94,7 +94,7 @@ "Match": "匹配", "Matched": "匹配度", "Valid words": "有效词汇", - "Vectorset": "向量集", + "Factorset": "向量集", "Words": "词汇表" } }