theprogrammablemind_4wp 7.5.6 → 7.5.7-beta.1
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +72 -21
- package/package.json +2 -1
- package/src/config.js +5 -5
- package/src/digraph.js +32 -0
- package/src/digraph_internal.js +131 -0
- package/src/generators.js +4 -1
package/client.js
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
const { Semantics, Semantic } = require('./src/semantics')
|
2
2
|
const { Generators, Generator } = require('./src/generators')
|
3
|
+
const DigraphInternal = require('./src/digraph_internal')
|
3
4
|
const Digraph = require('./src/digraph')
|
4
5
|
const fetch = require('node-fetch')
|
5
6
|
const base64 = require('base-64')
|
@@ -228,7 +229,7 @@ const processContext = (context, { objects = {}, config, logs = [] }) => {
|
|
228
229
|
const response = {} // NA but passed in
|
229
230
|
// generators = new Generators(generators.map((g) => new Generator(normalizeGenerator(g))))
|
230
231
|
// semantics = new Semantics(semantics.map((g) => new Semantic(normalizeSemantic(g))))
|
231
|
-
const hierarchy = new
|
232
|
+
const hierarchy = new DigraphInternal((config.config || {}).hierarchy || [])
|
232
233
|
|
233
234
|
const args = { objects, response, getObjects: getObjects(objects) }
|
234
235
|
setupArgs(args, config, logs, hierarchy)
|
@@ -244,14 +245,18 @@ const processContext = (context, { objects = {}, config, logs = [] }) => {
|
|
244
245
|
}
|
245
246
|
|
246
247
|
const convertToStable = (objects) => {
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
stableObjects.namespaced
|
252
|
-
counter
|
253
|
-
|
254
|
-
|
248
|
+
if (true) {
|
249
|
+
return objects
|
250
|
+
} else {
|
251
|
+
const stableObjects = Object.assign({}, objects)
|
252
|
+
stableObjects.namespaced = {}
|
253
|
+
let counter = 0
|
254
|
+
Object.keys(((objects || {}).namespaced || {})).forEach((uuid) => {
|
255
|
+
stableObjects.namespaced[`${counter}`] = objects.namespaced[uuid]
|
256
|
+
counter += 1
|
257
|
+
})
|
258
|
+
return stableObjects
|
259
|
+
}
|
255
260
|
}
|
256
261
|
|
257
262
|
const writeTestFile = (fn, tests) => {
|
@@ -378,7 +383,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
378
383
|
context.topLevel = true
|
379
384
|
try {
|
380
385
|
if (json.has_errors) {
|
381
|
-
throw new Error('There are errors in the logs')
|
386
|
+
throw new Error('There are errors in the logs. Run with the -d flag and grep for Error')
|
382
387
|
}
|
383
388
|
if (!config.get('skipSemantics')) {
|
384
389
|
if (!config.doMotivations(args, context)) {
|
@@ -505,7 +510,7 @@ const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
|
|
505
510
|
delete data.generators
|
506
511
|
// const semantics = new Semantics((data.semantics || []).map((g) => new Semantic(normalizeSemantic(g))))
|
507
512
|
delete data.semantics
|
508
|
-
const hierarchy = new
|
513
|
+
const hierarchy = new DigraphInternal((config.config || {}).hierarchy || [])
|
509
514
|
|
510
515
|
return {
|
511
516
|
data,
|
@@ -690,8 +695,10 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
690
695
|
}
|
691
696
|
|
692
697
|
let objects = getObjects(config.config.objects)(config.uuid)
|
698
|
+
let testConfigName = config.name
|
693
699
|
if (testConfig.testModuleName) {
|
694
700
|
objects = getObjects(config.config.objects)(config.getConfigs()[testConfig.testModuleName].uuid)
|
701
|
+
testConfigName = testConfig.testModuleName
|
695
702
|
}
|
696
703
|
config.beforeQuery({ query: test, isModule: false, objects })
|
697
704
|
// config.resetMotivations()
|
@@ -715,15 +722,40 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
715
722
|
const failed_contexts = !matching(result.contexts, expected.contexts)
|
716
723
|
const failed_objects = !matching(actual_objects, expected_objects)
|
717
724
|
|
718
|
-
const pickEm = (
|
725
|
+
const pickEm = (getObjects) => {
|
719
726
|
const picked = {}
|
720
727
|
for (let prop of (testConfig.check || [])) {
|
721
|
-
|
728
|
+
if (prop.km) {
|
729
|
+
c = config.getConfig(prop.km)
|
730
|
+
o = getObjects(prop.km)
|
731
|
+
picked[prop.km] = {}
|
732
|
+
for (let p of c.testConfig.check) {
|
733
|
+
if (p.km) {
|
734
|
+
continue
|
735
|
+
}
|
736
|
+
picked[p] = o[p]
|
737
|
+
}
|
738
|
+
} else {
|
739
|
+
picked[prop] = getObjects(testConfigName)[prop]
|
740
|
+
}
|
722
741
|
}
|
723
742
|
return picked
|
724
743
|
}
|
725
|
-
const
|
726
|
-
|
744
|
+
const expectedGetObjects = (name) => {
|
745
|
+
if (!name) {
|
746
|
+
name = config.name
|
747
|
+
}
|
748
|
+
return expected.objects.namespaced[expected.objects.nameToUUID[name]]
|
749
|
+
}
|
750
|
+
const expected_checked = sortJson(pickEm(expectedGetObjects), { depth: 25 })
|
751
|
+
const actualGetObjects = (name) => {
|
752
|
+
if (!name) {
|
753
|
+
name = config.name
|
754
|
+
}
|
755
|
+
const km = config.configs.find( (km) => km.name == name )
|
756
|
+
return config.config.objects.namespaced[km.uuid]
|
757
|
+
}
|
758
|
+
const actual_checked = sortJson(pickEm(actualGetObjects), { depth: 25 })
|
727
759
|
const failed_checked = !matching(actual_objects, expected_objects)
|
728
760
|
|
729
761
|
const failed_checks = !matching(actual_objects, expected_objects)
|
@@ -811,7 +843,14 @@ const saveTest = async (testFile, config, test, expected, testConfig, saveDevelo
|
|
811
843
|
const result = await _process(config, test, { isTest: true })
|
812
844
|
// const actualObjects = config.config.objects
|
813
845
|
const actualConfig = getConfigForTest(config, testConfig)
|
814
|
-
|
846
|
+
const args = {
|
847
|
+
}
|
848
|
+
const saveObjects = {...config.config.objects}
|
849
|
+
saveObjects.nameToUUID = {}
|
850
|
+
for (let km of config.configs) {
|
851
|
+
saveObjects.nameToUUID[km.name] = km.uuid
|
852
|
+
}
|
853
|
+
writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper)
|
815
854
|
}
|
816
855
|
|
817
856
|
const saveTestsHelper = async (testFile, config, tests, todo, testConfig, saveDeveloper) => {
|
@@ -849,12 +888,22 @@ const showInfo = (description, section, config) => {
|
|
849
888
|
visibleExamples.push(test.query)
|
850
889
|
}
|
851
890
|
}
|
852
|
-
const
|
891
|
+
const templateQueries = []
|
892
|
+
if (config.instances && config.instances.length > 0) {
|
893
|
+
for (let query of config.instances.slice(-1)[0].queries) {
|
894
|
+
if (typeof query == 'string') {
|
895
|
+
templateQueries.push(query)
|
896
|
+
}
|
897
|
+
}
|
898
|
+
}
|
899
|
+
const info = { name, description, examples: visibleExamples, template: templateQueries, section, includes, demo: config.demo }
|
900
|
+
/*
|
853
901
|
if (config.instances.length > 0) {
|
854
902
|
info.template = {
|
855
903
|
base: config.instances[0].base
|
856
904
|
}
|
857
905
|
}
|
906
|
+
*/
|
858
907
|
console.log(JSON.stringify(info, null, 2))
|
859
908
|
}
|
860
909
|
|
@@ -1265,9 +1314,11 @@ const knowledgeModule = async ({
|
|
1265
1314
|
processResults = processResults({ config, errorHandler })
|
1266
1315
|
config.description = description
|
1267
1316
|
config.demo = demo
|
1268
|
-
if (typeof test === 'object'
|
1269
|
-
|
1270
|
-
|
1317
|
+
if (typeof test === 'object') {
|
1318
|
+
if (test.contents) {
|
1319
|
+
config.tests = test.contents
|
1320
|
+
test = test.name
|
1321
|
+
}
|
1271
1322
|
} else {
|
1272
1323
|
if (runtime.fs && runtime.fs.existsSync(test)) {
|
1273
1324
|
config.tests = JSON.parse(runtime.fs.readFileSync(test))
|
@@ -1275,6 +1326,7 @@ const knowledgeModule = async ({
|
|
1275
1326
|
config.tests = {}
|
1276
1327
|
}
|
1277
1328
|
}
|
1329
|
+
config.setTestConfig(testConfig)
|
1278
1330
|
|
1279
1331
|
if (!isProcess) {
|
1280
1332
|
if (template) {
|
@@ -1652,7 +1704,6 @@ const knowledgeModule = async ({
|
|
1652
1704
|
}
|
1653
1705
|
} else {
|
1654
1706
|
config.addAssociationsFromTests(config.tests);
|
1655
|
-
config.setTestConfig(testConfig)
|
1656
1707
|
//for (let query in config.tests) {
|
1657
1708
|
// config.addAssociations(config.tests[query].associations || []);
|
1658
1709
|
//}
|
package/package.json
CHANGED
@@ -44,6 +44,7 @@
|
|
44
44
|
"src/config.js",
|
45
45
|
"src/copy.js",
|
46
46
|
"src/digraph.js",
|
47
|
+
"src/digraph_internal.js",
|
47
48
|
"src/generators.js",
|
48
49
|
"src/semantics.js"
|
49
50
|
],
|
@@ -62,6 +63,6 @@
|
|
62
63
|
"json-stable-stringify": "^1.0.1",
|
63
64
|
"node-fetch": "^2.6.1"
|
64
65
|
},
|
65
|
-
"version": "7.5.
|
66
|
+
"version": "7.5.7-beta.1",
|
66
67
|
"license": "ISC"
|
67
68
|
}
|
package/src/config.js
CHANGED
@@ -3,7 +3,7 @@ const { Semantics, normalizeGenerator } = require('./semantics')
|
|
3
3
|
const { Generators } = require('./generators')
|
4
4
|
// const { uuid: uuidv4 } = require('uuidv4')
|
5
5
|
const client = require('../client')
|
6
|
-
const
|
6
|
+
const DigraphInternal = require('./digraph_internal')
|
7
7
|
const helpers = require('./helpers')
|
8
8
|
const runtime = require('../runtime')
|
9
9
|
const _ = require('lodash')
|
@@ -1287,7 +1287,7 @@ class Config {
|
|
1287
1287
|
this.name = config.name
|
1288
1288
|
}
|
1289
1289
|
this.motivations = []
|
1290
|
-
this.loadOrder = new
|
1290
|
+
this.loadOrder = new DigraphInternal()
|
1291
1291
|
this.wasInitialized = false
|
1292
1292
|
this.configs = []
|
1293
1293
|
this._api = undefined
|
@@ -1300,7 +1300,7 @@ class Config {
|
|
1300
1300
|
this.config = config
|
1301
1301
|
handleCalculatedProps(this, config)
|
1302
1302
|
}
|
1303
|
-
this.hierarchy = new
|
1303
|
+
this.hierarchy = new DigraphInternal(this.config.hierarchy)
|
1304
1304
|
this.initConfig = _.cloneDeep(this.config)
|
1305
1305
|
this.configs.push(new KM({ config: this.config, getCounter: (name) => this.config.getCounter(name), uuid: this._uuid }))
|
1306
1306
|
|
@@ -1854,7 +1854,7 @@ class Config {
|
|
1854
1854
|
this.resetDelta()
|
1855
1855
|
const debug = this.config.debug;
|
1856
1856
|
this.config = _.cloneDeep(this.initConfig)
|
1857
|
-
this.hierarchy = new
|
1857
|
+
this.hierarchy = new DigraphInternal(this.config.hierarchy)
|
1858
1858
|
if (debug) {
|
1859
1859
|
this.config.debug = debug
|
1860
1860
|
}
|
@@ -1918,7 +1918,7 @@ class Config {
|
|
1918
1918
|
config.wasInitialized = false
|
1919
1919
|
// TODO change name of config: to baseConfig:
|
1920
1920
|
const kmFn = (name) => this.getConfig(name)
|
1921
|
-
// const hierarchy = new
|
1921
|
+
// const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
|
1922
1922
|
const args = { isModule, addWord: aw, km: kmFn, hierarchy: this.hierarchy, config, baseConfig: this, currentConfig: config, uuid: config._uuid, objects: namespacedObjects, namespace, api: config.api }
|
1923
1923
|
config.initializerFn(args)
|
1924
1924
|
if (config.initAfterApi) {
|
package/src/digraph.js
CHANGED
@@ -13,6 +13,38 @@ class Digraph {
|
|
13
13
|
this._edges = edges
|
14
14
|
}
|
15
15
|
|
16
|
+
// BFS
|
17
|
+
path(from, to) {
|
18
|
+
debugger
|
19
|
+
const frontier = { [from]: [[]] }
|
20
|
+
const done = new Set()
|
21
|
+
while (Object.keys(frontier).length > 0) {
|
22
|
+
const n = Object.keys(frontier)[0]
|
23
|
+
const ps = frontier[n]
|
24
|
+
if (to == n) {
|
25
|
+
return ps[0]
|
26
|
+
}
|
27
|
+
if (done.has(n)) {
|
28
|
+
delete frontier[n]
|
29
|
+
continue
|
30
|
+
}
|
31
|
+
done.add(n)
|
32
|
+
for (let edge of this._edges) {
|
33
|
+
if (edge.child == n) {
|
34
|
+
if (!frontier[edge.parent]) {
|
35
|
+
frontier[edge.parent] = []
|
36
|
+
}
|
37
|
+
for (let path of ps) {
|
38
|
+
if (edge.parent == to) {
|
39
|
+
return [...path, edge]
|
40
|
+
}
|
41
|
+
frontier[edge.parent].push([...path, edge])
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
16
48
|
addEdges(edges) {
|
17
49
|
for (let edge of edges) {
|
18
50
|
this.addEdge(edge)
|
@@ -0,0 +1,131 @@
|
|
1
|
+
const toA = (edge) => {
|
2
|
+
if (Array.isArray(edge)) {
|
3
|
+
return edge
|
4
|
+
} else {
|
5
|
+
return [edge.child, edge.parent]
|
6
|
+
}
|
7
|
+
}
|
8
|
+
|
9
|
+
class DigraphInternal {
|
10
|
+
// edges maybe either [child, parent] or { child, parent }
|
11
|
+
constructor (edges = []) {
|
12
|
+
// dont make a copy of edges. this is shared and that breaks stuff. TODO fix this
|
13
|
+
this._edges = edges
|
14
|
+
}
|
15
|
+
|
16
|
+
addEdges(edges) {
|
17
|
+
for (let edge of edges) {
|
18
|
+
this.addEdge(edge)
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
addEdge(edge) {
|
23
|
+
edge = toA(edge)
|
24
|
+
this._edges.push(edge)
|
25
|
+
}
|
26
|
+
|
27
|
+
get edges() {
|
28
|
+
return this._edges
|
29
|
+
}
|
30
|
+
|
31
|
+
set edges(edges) {
|
32
|
+
this._edges = edges
|
33
|
+
}
|
34
|
+
|
35
|
+
/*
|
36
|
+
set edges(edges) {
|
37
|
+
this._edges = edges.map( toA )
|
38
|
+
}
|
39
|
+
*/
|
40
|
+
|
41
|
+
acdcs (s, from, to) {
|
42
|
+
const todo = [s]
|
43
|
+
const seen = new Set([s])
|
44
|
+
const acdcs = new Set([])
|
45
|
+
while (todo.length > 0) {
|
46
|
+
const n = todo.pop()
|
47
|
+
this._edges.forEach((e) => {
|
48
|
+
e = toA(e)
|
49
|
+
if (e[from] === n) {
|
50
|
+
acdcs.add(e[to])
|
51
|
+
if (!seen.has(e[to])) {
|
52
|
+
todo.push(e[to])
|
53
|
+
seen.add(e[to])
|
54
|
+
}
|
55
|
+
}
|
56
|
+
})
|
57
|
+
}
|
58
|
+
return acdcs
|
59
|
+
}
|
60
|
+
|
61
|
+
isA (low, high) {
|
62
|
+
if (low === high) {
|
63
|
+
return true
|
64
|
+
}
|
65
|
+
return this.ancestors(low).has(high)
|
66
|
+
}
|
67
|
+
|
68
|
+
lessThan (low, high) {
|
69
|
+
if (low === high) {
|
70
|
+
return false
|
71
|
+
}
|
72
|
+
return this.ancestors(low).has(high)
|
73
|
+
}
|
74
|
+
|
75
|
+
descendants (s) {
|
76
|
+
return this.acdcs(s, 1, 0)
|
77
|
+
}
|
78
|
+
|
79
|
+
ancestors (s) {
|
80
|
+
return this.acdcs(s, 0, 1)
|
81
|
+
}
|
82
|
+
|
83
|
+
minima (nodes) {
|
84
|
+
let minima = new Set(nodes)
|
85
|
+
const ancestors = new Set([])
|
86
|
+
nodes.forEach((node) => {
|
87
|
+
this.ancestors(node).forEach((n) => ancestors.add(n))
|
88
|
+
})
|
89
|
+
ancestors.forEach((n) => minima.delete(n))
|
90
|
+
if (minima.size === 0) {
|
91
|
+
// all unrelated
|
92
|
+
minima = new Set(nodes)
|
93
|
+
}
|
94
|
+
return minima
|
95
|
+
}
|
96
|
+
|
97
|
+
maxima (nodes) {
|
98
|
+
const maxima = new Set(nodes)
|
99
|
+
const descendants = new Set([])
|
100
|
+
nodes.forEach((node) => {
|
101
|
+
this.descendants(node).forEach((n) => descendants.add(n))
|
102
|
+
})
|
103
|
+
descendants.forEach((n) => maxima.delete(n))
|
104
|
+
return maxima
|
105
|
+
}
|
106
|
+
|
107
|
+
add (child, parent) {
|
108
|
+
this._edges.push([child, parent])
|
109
|
+
}
|
110
|
+
|
111
|
+
addList (l) {
|
112
|
+
for (let i = 1; i < l.length; ++i) {
|
113
|
+
this._edges.push([l[i - 1], l[i]])
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
order (todo) {
|
118
|
+
const ordered = []
|
119
|
+
while (todo.length > 0) {
|
120
|
+
const nodes = this.minima(todo)
|
121
|
+
todo = todo.filter((e) => !nodes.has(e))
|
122
|
+
for (const node of nodes) {
|
123
|
+
ordered.push(node)
|
124
|
+
}
|
125
|
+
// ordered = ordered.concat([...nodes])
|
126
|
+
}
|
127
|
+
return ordered
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
module.exports = DigraphInternal
|
package/src/generators.js
CHANGED
@@ -115,6 +115,9 @@ class Generator {
|
|
115
115
|
apis: this.getAPIs(config)
|
116
116
|
}
|
117
117
|
const args = Object.assign({}, baseArgs, moreArgs, (baseArgs.getUUIDScoped || (() => { return {} }))(this.uuid))
|
118
|
+
if (this.property == 'generatorp') {
|
119
|
+
args.g = args.gp
|
120
|
+
}
|
118
121
|
// if (this.callId) {
|
119
122
|
// greg
|
120
123
|
/*
|
@@ -262,10 +265,10 @@ class Generators {
|
|
262
265
|
lines.newRow()
|
263
266
|
lines.setElement(0, 1, 'STACK')
|
264
267
|
lines.setElement(0, 2, stack)
|
265
|
-
lines.newRow()
|
266
268
|
lines.newRow()
|
267
269
|
lines.setElement(0, 1, 'DEBUG')
|
268
270
|
lines.setElement(0, 2, `To debug this use args.callId == '${args.calls.current()}'`)
|
271
|
+
lines.newRow()
|
269
272
|
lines.setElement(0, 1, 'TO')
|
270
273
|
lines.setElement(0, 2, `(HASHCODE ${helpers.hashCode(JSON.stringify(helpers.sortJson(context, { depth: 25 })))})`)
|
271
274
|
lines.setElement(1, 2, JSON.stringify(helpers.sortJson(context, { depth: 25 }), null, 2))
|