theprogrammablemind_4wp 7.5.8-beta.3 → 7.5.8-beta.30

Sign up to get free protection for your applications and to get access to all the features.
package/src/config.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // lookup = (name) => returns <config>
2
2
  const { Semantics, normalizeGenerator } = require('./semantics')
3
3
  const { Generators } = require('./generators')
4
- // const { uuid: uuidv4 } = require('uuidv4')
4
+ const { v4 : uuidv4 } = require('uuid');
5
5
  const client = require('../client')
6
6
  const DigraphInternal = require('./digraph_internal')
7
7
  const helpers = require('./helpers')
@@ -22,6 +22,142 @@ const indent = (string, indent) => {
22
22
  return string.replace(/^/gm, ' '.repeat(indent));
23
23
  }
24
24
 
25
+ const config_toServer = (config) => {
26
+ if (config.contextual_priorities) {
27
+ config.contextual_priorities = config.contextual_priorities.map((cp) => {
28
+ return [cp.context, cp.choose]
29
+ })
30
+ }
31
+ }
32
+
33
+ const validConfigProps = (config) => {
34
+ const valid = [
35
+ 'hierarchy',
36
+ 'objects',
37
+ 'bridges',
38
+ 'operators',
39
+ 'words',
40
+ 'priorities',
41
+ 'contextual_priorities',
42
+ 'associations',
43
+ 'name',
44
+ 'version',
45
+ 'generators',
46
+ 'semantics',
47
+ 'where',
48
+ 'floaters',
49
+ 'debug',
50
+
51
+ // TODO Fix these from the test app
52
+ 'implicits',
53
+ 'convolution',
54
+ 'expected_generated',
55
+ 'expected_results',
56
+ 'skipSemantics',
57
+ 'description',
58
+ 'contexts',
59
+ 'utterances',
60
+ 'flatten',
61
+
62
+ 'namespaces',
63
+ 'eqClasses',
64
+ ]
65
+ helpers.validProps(valid, config, 'config')
66
+ }
67
+
68
+ const setupInitializerFNArgs = (config, args) => {
69
+ const aw = (word, def) => config.addWord(word, def, args.uuid)
70
+ const ag = (generator) => config.addGenerator(generator, args.uuid, config.name)
71
+ const km = (name) => config.getConfig(name)
72
+ const apis = (name) => config.getConfig(name).api
73
+
74
+ return {
75
+ ...args,
76
+ addWord: aw,
77
+ addGenerator: ag,
78
+ config: config.getPseudoConfig(args.uuid, args.currentConfig),
79
+ km,
80
+ baseConfig: config,
81
+ apis,
82
+ }
83
+ }
84
+
85
+ const contextual_priorities_toServer = (cp) => {
86
+ if (cp.context && cp.choose) {
87
+ return [cp.context, cp.choose]
88
+ }
89
+ return cp
90
+ }
91
+
92
+ const contextual_priorities_toClient = (cp) => {
93
+ if (cp.context && cp.choose) {
94
+ return cp
95
+ }
96
+ return { context: cp[0], choose: cp[1] }
97
+ }
98
+
99
+ const operatorKey_valid = (key) => {
100
+ if (
101
+ !_.isArray(key) ||
102
+ key.length != 2 ||
103
+ !_.isString(key[0]) ||
104
+ !_.isInteger(key[1]) ||
105
+ key[1] < 0
106
+ ) {
107
+
108
+ let details = ''
109
+ if (!_.isArray(key)) {
110
+ details = "Expected an array."
111
+ } else if (key.length != 2) {
112
+ details = "Expected an array of length two."
113
+ } else if (!_.isString(key[0])) {
114
+ details = "Expected element zero to be a string that is an operator id."
115
+ } else if (!_.isInteger(key[1])) {
116
+ details = "Expected element one to be a number that is an operator level."
117
+ } else if (key[1] < 0) {
118
+ details = "Expected element one to be a number that is an operator level which is greater than zero."
119
+ }
120
+ throw new Error(`${JSON.stringify(key)} is not a valid operator key. Values are of the form [<operatorId>, <operatorLevel>]. ${details}`)
121
+ }
122
+ }
123
+
124
+ const elist = (list, check, prefix) => {
125
+ for ([index, element] of list.entries()) {
126
+ try {
127
+ check(element)
128
+ } catch( e ) {
129
+ throw new Error(prefix(index, e))
130
+ }
131
+ }
132
+ }
133
+ const contextual_priorities_valid = (cps) => {
134
+ elist(cps, (cp) => contextual_priority_valid(cp), (index, e) => `contextual_priorities has an invalid contextual priority at position ${index}. ${e}`)
135
+ }
136
+
137
+ const contextual_priority_valid = (cp) => {
138
+ if (!cp.context) {
139
+ throw new Error(`The contextual priority ${JSON.stringify(cp)} is missing the "context" property. That is a list of the operator keys that are to be prioritized differently.`)
140
+ }
141
+ if (!_.isArray(cp.context)) {
142
+ throw new Error(`The contextual priority ${JSON.stringify(cp)} has an invalid "context" value. That is a list of the operator keys that are to be prioritized differently.`)
143
+ }
144
+ elist(cp.context, (element) => operatorKey_valid(element), (index, e) => `The contextual priority ${JSON.stringify(cp)} has an invalid operator key at position ${index}. ${e}`)
145
+ if (!_.isArray(cp.choose)) {
146
+ throw new Error(`The contextual priority ${JSON.stringify(cp)} has an invalid "choose" value. The value should be a list of the operators in the context to consider for prioritization.`)
147
+ }
148
+ elist(cp.choose,
149
+ (element) => {
150
+ if (!element && element !== 0) {
151
+ throw new Error(`The value should be an index into the "context" property of the operator that is to be considered for prioritization.`)
152
+ }
153
+ if (!_.isInteger(element) || element < 0 || element >= cp.context.length) {
154
+ throw new Error(`The value should be an index into the "context" property of the operator that is to be considered for prioritization. Valid values are between 0 and ${cp.context.length-1}.`)
155
+ }
156
+ },
157
+ (index, e) => `The choose property in the contextual priority ${JSON.stringify(cp)} has an invalid index at position ${index}. ${e}`
158
+ )
159
+ }
160
+
25
161
  const handleBridgeProps = (config, bridge) => {
26
162
  ecatch(`While processing the bridge for ${bridge.id}#${bridge.level}`,
27
163
  () => {
@@ -68,7 +204,7 @@ const handleBridgeProps = (config, bridge) => {
68
204
  config.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
69
205
  } else {
70
206
  const word = def.word
71
- def = { initial: JSON.stringify(def), id: bridge.id, word: undefined }
207
+ def = { initial: JSON.stringify(def), id: bridge.id, word }
72
208
  config.addWordInternal(word, def)
73
209
  }
74
210
  }
@@ -148,7 +284,7 @@ const handleBridgeProps = (config, bridge) => {
148
284
  const handleCalculatedProps = (baseConfig, moreConfig) => {
149
285
  for (let bridge of moreConfig.bridges) {
150
286
  const valid = [ 'after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
151
- 'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where' ]
287
+ 'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where', 'uuid' ]
152
288
  helpers.validProps(valid, bridge, 'bridge')
153
289
  handleBridgeProps(baseConfig, bridge)
154
290
  }
@@ -171,6 +307,10 @@ if (runtime.process.env.DEBUG_PRIORITY) {
171
307
  global.entodictonDebugPriority = JSON.parse(runtime.process.env.DEBUG_PRIORITY)
172
308
  }
173
309
 
310
+ if (runtime.process.env.DEBUG_CONTEXTUAL_PRIORITY) {
311
+ global.entodictonDebugContextualPriority = JSON.parse(runtime.process.env.DEBUG_CONTEXTUAL_PRIORITY)
312
+ }
313
+
174
314
  if (runtime.process.env.DEBUG_ASSOCIATION) {
175
315
  global.entodictonDebugAssociation = JSON.parse(runtime.process.env.DEBUG_ASSOCIATION)
176
316
  }
@@ -252,6 +392,14 @@ const normalizeConfig = (config) => {
252
392
  }
253
393
  }
254
394
  }
395
+
396
+ if (config.semantics) {
397
+ for (let semantic of config.semantics) {
398
+ if (semantic.oneShot) {
399
+ semantic.id = uuid()
400
+ }
401
+ }
402
+ }
255
403
  }
256
404
  }
257
405
 
@@ -459,8 +607,8 @@ const multiApiImpl = (initializer) => {
459
607
  initializer(config, api)
460
608
  const name = api.getName()
461
609
  multiApi.apis[name] = api
462
- api.objects = config.get('objects')
463
- api.config = () => config
610
+ // api.objects = config.get('objects')
611
+ // api.config = () => config
464
612
  multiApi.current = name
465
613
  },
466
614
 
@@ -471,11 +619,13 @@ const multiApiImpl = (initializer) => {
471
619
  }
472
620
  },
473
621
 
622
+ /*
474
623
  set objects (value) {
475
624
  for (const key in Object.keys(this.apis)) {
476
625
  this.apis[key].objects = value
477
626
  }
478
627
  },
628
+ */
479
629
 
480
630
  // "product1": apiInstance(testData1),
481
631
  apis: {
@@ -489,6 +639,46 @@ const multiApiImpl = (initializer) => {
489
639
 
490
640
  class Config {
491
641
 
642
+ toServer (config) {
643
+ return config_toServer(config)
644
+ }
645
+
646
+ base () {
647
+ const base = new Config()
648
+ for (let km of this.configs.reverse()) {
649
+ if (km.isSelf) {
650
+ continue
651
+ }
652
+ base.add(km.config)
653
+ }
654
+ return base
655
+ }
656
+
657
+ getPseudoConfig (uuid, config) {
658
+ return {
659
+ description: "this is a pseudo config that has limited functionality due to being available in the initializer function context",
660
+ addAssociation: (...args) => this.addAssociation(...args),
661
+ addAssociations: (...args) => this.addAssociations(...args),
662
+ addBridge: (...args) => this.addBridge(...args, uuid),
663
+ addContextualPriority: (...args) => this.addContextualPriority(...args),
664
+ addGenerator: (...args) => this.addGenerator(...args, uuid, config.name),
665
+ addHierarchy: (...args) => this.addHierarchy(...args),
666
+ addOperator: (...args) => this.addOperator(...args, uuid),
667
+ addPriorities: (...args) => this.addPriorities(...args),
668
+ addSemantic: (...args) => this.addSemantic(...args, uuid, config.name),
669
+ removeSemantic: (...args) => this.removeSemantic(...args, uuid, config.name),
670
+ addWord: (...args) => this.addWord(...args, uuid),
671
+
672
+ getHierarchy: (...args) => this.config.hierarchy,
673
+ getBridges: (...args) => this.config.bridges,
674
+
675
+ addArgs: (...args) => this.addArgs(...args),
676
+ getBridge: (...args) => this.getBridge(...args),
677
+ fragment: (...args) => this.fragment(...args),
678
+ addAPI: (...args) => this.addAPI(...args),
679
+ }
680
+ }
681
+
492
682
  inDevelopmentMode (call) {
493
683
  config.developmentModeOn += 1
494
684
  try {
@@ -527,9 +717,6 @@ class Config {
527
717
  }
528
718
 
529
719
  setTestConfig(testConfig) {
530
- if (this.name == 'ui') {
531
- console.log('ui setting testConfig')
532
- }
533
720
  this.testConfig = testConfig
534
721
  }
535
722
 
@@ -548,6 +735,7 @@ class Config {
548
735
  },
549
736
  eqClasses: [],
550
737
  priorities: [], // Done
738
+ contextual_priorities: [],
551
739
  version: '3',
552
740
  debug: false,
553
741
  associations: { // Done
@@ -586,6 +774,7 @@ class Config {
586
774
  'namespaces',
587
775
  'eqClasses',
588
776
  'priorities',
777
+ 'contextual_priorities',
589
778
  'associations',
590
779
  'words',
591
780
  'floaters',
@@ -739,6 +928,11 @@ class Config {
739
928
  }
740
929
  }
741
930
 
931
+ toData (data) {
932
+ Object.assign(data, this.config)
933
+ config_toServer(data)
934
+ }
935
+
742
936
  load (template, instance, options = { rebuild: false } ) {
743
937
  this.validifyTemplate(template)
744
938
  instance.template = template
@@ -750,7 +944,7 @@ class Config {
750
944
  // TODO fix beforeQuery
751
945
  template = { fragments: [], queries: [], ...template }
752
946
  template.fragments = template.fragments.concat(this.dynamicFragments)
753
- client.build({ config: this, target: this.name, beforeQuery: () => {}, template, ...options })
947
+ client.rebuildTemplate({ config: this, target: this.name, beforeQuery: () => {}, template, ...options })
754
948
  } else {
755
949
  // no change
756
950
  // this.initInstances.push({ ...instance, name: config.name })
@@ -825,6 +1019,22 @@ class Config {
825
1019
  this._delta.json.priorities.push({ action: 'add', priorities })
826
1020
  }
827
1021
 
1022
+ // [ operators: <list of [id, level]>, select: <index of prioritized operator> ]
1023
+ addContextualPriority(contextual_priority) {
1024
+ if (!this.config.contextual_priorities) {
1025
+ this.config.contextual_priorities = []
1026
+ }
1027
+ if (global.entodictonDebugContextualPriority) {
1028
+ if (helpers.safeEquals(entodictonDebugContextualPriority, contextual_priorities)) {
1029
+ debugger; // debug hierarchy hit
1030
+ }
1031
+ }
1032
+ contextual_priority_valid(contextual_priority)
1033
+ this.config.contextual_priorities.push(contextual_priority)
1034
+ const cpServer = contextual_priorities_toServer(contextual_priority)
1035
+ this._delta.json.contextual_priorities.push({ action: 'add', contextual_priority: cpServer })
1036
+ }
1037
+
828
1038
  addHierarchy (child, parent) {
829
1039
  if (child && parent || !child || Array.isArray(child) || (typeof child == 'string' && !parent)) {
830
1040
  this.addHierarchyChildParent(child, parent)
@@ -881,15 +1091,19 @@ class Config {
881
1091
  }
882
1092
 
883
1093
  getBridge (id, level) {
884
- return this.config.bridges.find( (bridge) => bridge.id == id && bridge.level == level )
1094
+ if (level) {
1095
+ return this.config.bridges.find( (bridge) => bridge.id == id && bridge.level == level )
1096
+ } else {
1097
+ return this.config.bridges.find( (bridge) => bridge.id == id)
1098
+ }
885
1099
  }
886
1100
 
887
- addBridge (bridge) {
1101
+ addBridge (bridge, uuid) {
888
1102
  if (!this.config.bridges) {
889
1103
  this.config.bridges = []
890
1104
  }
891
1105
  const bridges = this.config.bridges
892
- const def = Object.assign({}, bridge, { uuid: this._uuid })
1106
+ const def = Object.assign({}, bridge, { uuid: uuid || this._uuid })
893
1107
 
894
1108
  if (global.entodictonDebugBridge) {
895
1109
  if (global.entodictonDebugBridge[0] == bridge.id && global.entodictonDebugBridge[1] == bridge.level) {
@@ -911,12 +1125,7 @@ class Config {
911
1125
  this._delta.json.bridges.push({ action: 'add', bridge: def })
912
1126
  }
913
1127
 
914
- addGenerator (match, apply) {
915
- let generator = match
916
- if ((typeof match === 'function') && (typeof apply === 'function')) {
917
- generator = { match, apply }
918
- }
919
-
1128
+ addGenerator (generator, uuid, name) {
920
1129
  if (!(typeof generator.match === 'function')) {
921
1130
  throw new Error('addGenerator: Expected matcher to be a function')
922
1131
  }
@@ -933,20 +1142,16 @@ class Config {
933
1142
  }
934
1143
 
935
1144
  const generators = this.config.generators
936
- Object.assign(generator, { uuid: this._uuid, km: this.name, index: generators.length })
1145
+ Object.assign(generator, { uuid: uuid || this._uuid, km: name || this.name, index: generators.length })
937
1146
  // used to be unshift
938
1147
  generators.unshift(generator)
939
1148
  }
940
1149
 
941
- addSemantic (match, apply) {
942
- let semantic = match
943
- if ((typeof match === 'function') && (typeof apply === 'function')) {
944
- semantic = { match, apply }
945
- }
946
-
1150
+ addSemantic (semantic, uuid, name) {
947
1151
  if (!(typeof semantic.match === 'function')) {
948
1152
  throw new Error('addSemantic: Expected match to be a function')
949
1153
  }
1154
+
950
1155
  if (!(typeof semantic.apply === 'function')) {
951
1156
  throw new Error('addSemantic: Expected apply to be a function')
952
1157
  }
@@ -960,11 +1165,18 @@ class Config {
960
1165
  }
961
1166
 
962
1167
  const semantics = this.config.semantics
963
- Object.assign(semantic, { uuid: this._uuid, km: this.name, index: semantics.length })
1168
+ Object.assign(semantic, { uuid: uuid || semantic.uuid || this._uuid, km: name || this.name, index: semantics.length, id: semantic.id || uuidv4() })
964
1169
  semantics.unshift(semantic)
965
1170
  }
966
1171
 
967
- addOperator (objectOrPattern) {
1172
+ removeSemantic(deleteSemantic) {
1173
+ const index = this.config.semantics.findIndex( (semantic) => semantic.id === deleteSemantic.id )
1174
+ if (index >= 0) {
1175
+ this.config.semantics.splice(index, 1)
1176
+ }
1177
+ }
1178
+
1179
+ addOperator (objectOrPattern, uuid) {
968
1180
  if (!this.config.operators) {
969
1181
  this.config.operators = []
970
1182
  }
@@ -973,9 +1185,9 @@ class Config {
973
1185
 
974
1186
  let operator;
975
1187
  if (typeof objectOrPattern === 'string') {
976
- operator = { pattern: objectOrPattern, uuid: this._uuid }
1188
+ operator = { pattern: objectOrPattern, uuid: uuid || this._uuid }
977
1189
  } else {
978
- operator = Object.assign({}, objectOrPattern, { uuid: this._uuid })
1190
+ operator = Object.assign({}, objectOrPattern, { uuid: uuid || this._uuid })
979
1191
  }
980
1192
 
981
1193
  if (global.entodictonDebugOperator) {
@@ -996,16 +1208,16 @@ class Config {
996
1208
  this._delta.json.operators.push({ action: 'add', operator })
997
1209
  }
998
1210
 
999
- addWord (word, def) {
1000
- this.addWordInternal(word, def)
1211
+ addWord (word, def, uuid) {
1212
+ this.addWordInternal(word, def, uuid)
1001
1213
  }
1002
1214
 
1003
- addWordInternal (word, def) {
1215
+ addWordInternal (word, def, uuid) {
1004
1216
  if (!this.config.words) {
1005
1217
  this.config.words = {}
1006
1218
  }
1007
1219
  const words = this.config.words
1008
- def = Object.assign({}, def, { uuid: this._uuid })
1220
+ def = Object.assign({}, def, { uuid: uuid || this._uuid })
1009
1221
  if (words[word]) {
1010
1222
  if (!words[word].some((e) => helpers.safeEquals(e, def))) {
1011
1223
  words[word].unshift(def)
@@ -1226,33 +1438,7 @@ class Config {
1226
1438
  }
1227
1439
 
1228
1440
  if (config) {
1229
- const valid = [
1230
- 'hierarchy',
1231
- 'objects',
1232
- 'bridges',
1233
- 'operators',
1234
- 'words',
1235
- 'priorities',
1236
- 'associations',
1237
- 'name',
1238
- 'version',
1239
- 'generators',
1240
- 'semantics',
1241
- 'floaters',
1242
- 'debug',
1243
-
1244
- // TODO Fix these from the test app
1245
- 'implicits',
1246
- 'convolution',
1247
- 'expected_generated',
1248
- 'expected_results',
1249
- 'skipSemantics',
1250
- 'description',
1251
- 'contexts',
1252
- 'utterances',
1253
- 'flatten',
1254
- ]
1255
- helpers.validProps(valid, config, 'config')
1441
+ validConfigProps(config)
1256
1442
 
1257
1443
  config.operators = config.operators || []
1258
1444
  config.bridges = config.bridges || []
@@ -1262,6 +1448,7 @@ class Config {
1262
1448
  config.hierarchy = config.hierarchy || []
1263
1449
  config.associations = config.associations || { negative: [], positive: [] }
1264
1450
  config.priorities = config.priorities || []
1451
+ config.contextual_priorities = config.contextual_priorities || []
1265
1452
  }
1266
1453
 
1267
1454
  this.maxDepth = 20 // for generators and semantics
@@ -1315,6 +1502,10 @@ class Config {
1315
1502
  }
1316
1503
  }
1317
1504
 
1505
+ if (config && config.contextual_priorities) {
1506
+ contextual_priorities_valid(config.contextual_priorities)
1507
+ }
1508
+
1318
1509
  normalizeConfig(config)
1319
1510
 
1320
1511
  // set the default server so stuff just works
@@ -1330,7 +1521,6 @@ class Config {
1330
1521
  if (config) {
1331
1522
  this.name = config.name
1332
1523
  }
1333
- this.motivations = []
1334
1524
  this.loadOrder = new DigraphInternal()
1335
1525
  this.wasInitialized = false
1336
1526
  this.configs = []
@@ -1385,7 +1575,10 @@ class Config {
1385
1575
  }
1386
1576
 
1387
1577
  delta () {
1388
- return { cacheKey: this._delta.cacheKey, json: this._delta.json }
1578
+ return {
1579
+ cacheKey: this._delta.cacheKey,
1580
+ json: this._delta.json
1581
+ }
1389
1582
  }
1390
1583
 
1391
1584
  resetDelta (cacheKey) {
@@ -1397,6 +1590,7 @@ class Config {
1397
1590
  bridges: [],
1398
1591
  associations: [],
1399
1592
  priorities: [],
1593
+ contextual_priorities: [],
1400
1594
  hierarchy: [],
1401
1595
  }
1402
1596
  }
@@ -1431,11 +1625,13 @@ class Config {
1431
1625
  this._api.add(this, this._api, value)
1432
1626
  } else {
1433
1627
  this._api = _.cloneDeep(value)
1628
+ /*
1434
1629
  if (this._api) {
1435
- this._api.objects = this.config.objects
1436
- this._api.config = () => this
1437
- this._api.uuid = this._uuid
1630
+ // this._api.objects = this.config.objects
1631
+ // this._api.config = () => this
1632
+ // this._api.uuid = this._uuid
1438
1633
  }
1634
+ */
1439
1635
  this.rebuild()
1440
1636
  }
1441
1637
  }
@@ -1478,40 +1674,6 @@ class Config {
1478
1674
  // this.valid() init was not run because the kms are not all setup yet
1479
1675
  }
1480
1676
 
1481
- // motivation === { match, apply, uuid }
1482
- addMotivation (motivation) {
1483
- if (!motivation.uuid) {
1484
- motivation.uuid = this.uuid
1485
- }
1486
- this.motivations.push(motivation)
1487
- }
1488
-
1489
- resetMotivations () {
1490
- this.motivations = []
1491
- }
1492
-
1493
- doMotivations (args, context) {
1494
- args = Object.assign({}, args, { context, api: this.api })
1495
- // console.log('src/config doMotivations this.uuid', this.uuid)
1496
- // args.objects = args.getObjects(this.uuid)
1497
- const motivations = this.motivations
1498
- this.motivations = []
1499
- let done = false
1500
- for (const motivation of motivations) {
1501
- args.objects = args.getObjects(motivation.uuid)
1502
- if (!done && motivation.match(args)) {
1503
- motivation.apply(args)
1504
- if (args.context.controlKeepMotivation || motivation.repeat) {
1505
- this.motivations.push(motivation)
1506
- }
1507
- done = true
1508
- } else {
1509
- this.motivations.push(motivation)
1510
- }
1511
- }
1512
- return done
1513
- }
1514
-
1515
1677
  // TODO add more details
1516
1678
  equal(config) {
1517
1679
  if (JSON.stringify(this.config) != JSON.stringify(config.config)) {
@@ -1525,6 +1687,9 @@ class Config {
1525
1687
  runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
1526
1688
  }
1527
1689
 
1690
+ copy (options = { callInitializers: true }) {
1691
+ }
1692
+
1528
1693
  copy (options = { callInitializers: true }) {
1529
1694
  this.valid()
1530
1695
  const cp = new Config()
@@ -1534,15 +1699,14 @@ class Config {
1534
1699
  cp.transitoryMode = this.transitoryMode
1535
1700
  cp.configs = this.configs.map((km) => km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
1536
1701
  cp._uuid = cp.configs[0]._uuid
1702
+ // update uuid here set the uuid in the objects and add error checking
1537
1703
  cp.initializerFn = this.initializerFn
1538
- cp.initAfterApi = this.initAfterApi
1539
1704
  cp._api = _.cloneDeep(this._api)
1540
1705
  cp._namespace = this._namespace
1541
1706
  cp._eqClasses = this._eqClasses
1542
1707
  cp.name = this.name
1543
1708
  cp.description = this.description
1544
1709
  cp.tests = this.tests
1545
- cp.motivations = [...this.motivations]
1546
1710
  cp.isModule = this.isModule
1547
1711
  cp.loadedForTesting = this.loadedForTesting
1548
1712
  cp.initInstances = this.initInstances.slice()
@@ -1567,25 +1731,38 @@ class Config {
1567
1731
  }
1568
1732
  cp.mapUUIDs(map)
1569
1733
 
1734
+ if (cp._uuid == 'concept2') {
1735
+ // debugger
1736
+ }
1570
1737
  if (options.callInitializers) {
1571
1738
  cp.rebuild(options)
1572
- }
1573
- if (cp._api) {
1574
- cp._api.objects = cp.config.objects
1575
- cp._api.config = () => (cp instanceof Config) ? cp : cp.config
1576
- cp._api.uuid = cp._uuid
1577
- }
1739
+ } else {
1740
+ // this mess is for duplicate into a KM after resetToOne was called
1741
+ /*
1742
+ if (cp._api) {
1743
+ // cp._api.objects = cp.config.objects
1744
+ // cp._api.config = () => (cp instanceof Config) ? cp : cp.config
1745
+ // cp._api.uuid = cp._uuid
1746
+ }
1747
+ */
1578
1748
 
1579
- if (!cp.config.objects) {
1580
- cp.config.objects = { namespaced: {} }
1581
- } else if (!cp.config.objects.namespaced) {
1582
- cp.config.objects.namespaced = {}
1749
+ if (!cp.config.objects) {
1750
+ cp.config.objects = { namespaced: {} }
1751
+ } else if (!cp.config.objects.namespaced) {
1752
+ cp.config.objects.namespaced = {}
1753
+ }
1754
+ cp.configs.forEach((km) => {
1755
+ // const namespace = km.namespace
1756
+ cp.config.objects.namespaced[km._uuid] = {}
1757
+ })
1758
+ /*
1759
+ if (cp._uuid == 'concept2') {
1760
+ if (!cp.api.objects.defaultTypesForHierarchy) {
1761
+ debugger
1762
+ }
1763
+ }
1764
+ */
1583
1765
  }
1584
- cp.configs.forEach((km) => {
1585
- // const namespace = km.namespace
1586
- cp.config.objects.namespaced[km._uuid] = {}
1587
- })
1588
-
1589
1766
  cp.valid()
1590
1767
  return cp
1591
1768
  }
@@ -1685,25 +1862,24 @@ class Config {
1685
1862
  }
1686
1863
  */
1687
1864
  const objects = {}
1688
- const km = (name) => this.getConfig(name)
1689
1865
  if (config instanceof Config) {
1690
- // const aw = addWord(this.config, config.uuid)
1691
- const aw = (word, def) => this.addWord(word, def)
1692
1866
  this.get('objects').namespaced[config._uuid] = objects
1867
+ /*
1693
1868
  if (config._api) {
1694
- config._api.objects = objects
1695
- config._api.config = () => this
1869
+ // config._api.objects = objects
1870
+ // config._api.config = () => this
1696
1871
  }
1697
- config.initializerFn({ addWord: aw, km, config, baseConfig: this, currentConfig: config, objects, namespace, uuid, api: config.api })
1872
+ */
1873
+ config.initializerFn(setupInitializerFNArgs(this, { testConfig: config, currentConfig: config, objects, namespace, uuid }))
1698
1874
  } else {
1699
- // const aw = addWord(this.config, this.uuid)
1700
- const aw = (word, def) => this.addWord(word, def)
1701
1875
  this.get('objects').namespaced[this._uuid] = objects
1876
+ /*
1702
1877
  if (config._api) {
1703
- config._api.objects = objects
1704
- config._api.config = () => this
1878
+ // config._api.objects = objects
1879
+ // config._api.config = () => this
1705
1880
  }
1706
- this.initializerFn({ addWord: aw, km, config: this, baseConfig: this, currentConfig: this, objects, namespace, uuid, api: this.api })
1881
+ */
1882
+ this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, namespace, uuid }))
1707
1883
  }
1708
1884
  })
1709
1885
  this.instances.forEach((instance) => client.processInstance(this, instance))
@@ -1711,12 +1887,8 @@ class Config {
1711
1887
 
1712
1888
  initialize ({ force = true } = {}) {
1713
1889
  if (force || !this.wasInitialized) {
1714
- // const aw = addWord(this.config, this.uuid)
1715
- const aw = (word, def) => this.addWord(word, def)
1716
- const km = (name) => this.getConfig(name)
1717
- // this.initializerFn({ addWord: aw, km, config: this, baseConfig: this, currentConfig: this, objects: this.get('objects'), uuid: this._uuid, namespace: '', api: this.api })
1718
1890
  const objects = this.config.objects.namespaced[this._uuid]
1719
- this.initializerFn({ addWord: aw, km, config: this, baseConfig: this, currentConfig: this, objects, uuid: this._uuid, namespace: '', api: this.api })
1891
+ this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, uuid: this._uuid, namespace: '' }))
1720
1892
  this.wasInitialized = true
1721
1893
  }
1722
1894
  }
@@ -1724,29 +1896,22 @@ class Config {
1724
1896
  initializer (fn, options = {}) {
1725
1897
  if (options) {
1726
1898
  for (let option of Object.keys(options)) {
1727
- const validOptions = ['initAfterApi']
1728
- if (!['initAfterApi'].includes(option)) {
1899
+ const validOptions = []
1900
+ if (!validOptions.includes(option)) {
1729
1901
  throw new Error(`For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`)
1730
1902
  }
1731
1903
  }
1732
1904
  }
1733
- const { initAfterApi = false } = options;
1734
1905
  this.wasInitialized = false
1735
- this.initAfterApi = initAfterApi
1736
- this.initializerFn = (args) => {
1906
+ this.initializerFn = (args, { dontCallFn } = {}) => {
1737
1907
  const transitoryMode = global.transitoryMode
1738
1908
  global.transitoryMode = false
1739
1909
  // const baseConfig = args.baseConfig
1740
1910
  const currentConfig = args.currentConfig
1741
1911
 
1742
- if (currentConfig.api) {
1743
- currentConfig.api.objects = args.objects
1744
- // GREG42 currentConfig.api.config = () => this
1745
- currentConfig.api.config = () => args.baseConfig
1746
- currentConfig.api.uuid = currentConfig._uuid
1912
+ if (args.isAfterApi) {
1913
+ fn(args)
1747
1914
  }
1748
- // this.instances.forEach( (instance) => client.processInstance(this, instance) )
1749
- fn(args)
1750
1915
  currentConfig.wasInitialized = true
1751
1916
  global.transitoryMode = transitoryMode
1752
1917
  }
@@ -1913,7 +2078,6 @@ class Config {
1913
2078
  }
1914
2079
  this.config.objects.namespaced = {}
1915
2080
  this.resetWasInitialized()
1916
- this.resetMotivations()
1917
2081
 
1918
2082
  // reorder configs base on load ordering
1919
2083
  {
@@ -1939,8 +2103,8 @@ class Config {
1939
2103
  this.config.objects.namespaced[km._uuid] = {}
1940
2104
  const namespacedObjects = this.config.objects.namespaced[km._uuid]
1941
2105
  this.setupNamespace(km)
1942
- // const aw = addWord(km.config.config ? km.config.config : km.config, km.config.uuid)
1943
- const aw = (word, def) => this.addWord(word, def)
2106
+ // const aw = (word, def) => this.addWord(word, def)
2107
+ // const ag = (matchOrGenerator, applyOrNothing) => this.addGenerator(matchOrGenerator, applyOrNothing)
1944
2108
  let config = km.config
1945
2109
 
1946
2110
  if (config.addedArgss) {
@@ -1961,45 +2125,51 @@ class Config {
1961
2125
  }
1962
2126
  config.wasInitialized = false
1963
2127
  // TODO change name of config: to baseConfig:
1964
- const kmFn = (name) => this.getConfig(name)
2128
+ const kmFn = (name) => {
2129
+ const config = this.getConfig(name)
2130
+ return config
2131
+ }
1965
2132
  // const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
1966
- const args = {
2133
+ const args = new Object(setupInitializerFNArgs(this, {
1967
2134
  isModule,
1968
- addWord: aw,
1969
- km: kmFn,
1970
2135
  hierarchy: this.hierarchy,
1971
- config,
1972
- baseConfig: this,
2136
+ testConfig: config,
1973
2137
  currentConfig: config,
1974
2138
  uuid: config._uuid,
1975
2139
  objects: namespacedObjects,
1976
2140
  namespace,
1977
- motivation: (m) => config.addMotivation(m),
1978
- api: config.api
2141
+ api: config.api,
2142
+ }))
2143
+
2144
+ const currentConfig = args.currentConfig
2145
+
2146
+ /*
2147
+ if (args.currentConfig.api) {
2148
+ // args.currentConfig.api.objects = args.objects
2149
+ // TODO assign pseudo config?
2150
+ // args.currentConfig.api.config = () => args.baseConfig
2151
+ // args.currentConfig.api.uuid = args.currentConfig._uuid
2152
+ args.currentConfig.wasInitialized = true
1979
2153
  }
1980
- config.initializerFn(args)
1981
- if (config.initAfterApi) {
1982
- // reverse the list
2154
+ */
2155
+ // debugger
2156
+ // greg55
2157
+ config.initializerFn(args, { dontCallFn: true })
1983
2158
  initAfterApis.unshift({ config, args })
1984
- } else {
1985
- if (interleaved) {
1986
- initAfterApis.unshift(null)
1987
- }
1988
- }
1989
- // greg
1990
2159
  if (config._api) {
1991
2160
  if (config._api.initialize) {
1992
2161
  // reverse the list
1993
- inits.unshift( () => config._api.initialize({ config: this, km: kmFn, api: config._api }) )
2162
+ // TODO sync up the args with initialize of config
2163
+ inits.unshift( () => config._api.initialize({ config: this, km: kmFn, ...args, api: config._api }) )
1994
2164
  // config._api.initialize({ config, api: config._api })
1995
2165
  } else {
1996
2166
  if (interleaved) {
1997
2167
  inits.unshift(null)
1998
2168
  }
1999
2169
  }
2000
- config._api.objects = namespacedObjects
2001
- config._api.config = () => this
2002
- config._api.uuid = config._uuid
2170
+ // config._api.objects = namespacedObjects
2171
+ // config._api.config = () => this
2172
+ // config._api.uuid = config._uuid
2003
2173
  } else {
2004
2174
  if (interleaved) {
2005
2175
  inits.unshift(null)
@@ -2041,7 +2211,6 @@ class Config {
2041
2211
  init()
2042
2212
  }
2043
2213
  for (let init of initAfterApis) {
2044
- // init.args.isAfterApi = true
2045
2214
  init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
2046
2215
  }
2047
2216
  this.instances.forEach((instance) => client.processInstance(this, instance))
@@ -2051,6 +2220,7 @@ class Config {
2051
2220
  bridges: this.config.bridges,
2052
2221
  hierarchy: this.config.hierarchy,
2053
2222
  priorities: this.config.priorities,
2223
+ contextual_priorities: this.config.contextual_priorities,
2054
2224
  associations: this.config.associations,
2055
2225
  words: this.config.words
2056
2226
  }
@@ -2059,6 +2229,7 @@ class Config {
2059
2229
  this.config.bridges = []
2060
2230
  this.config.hierarchy = []
2061
2231
  this.config.priorities = []
2232
+ this.config.contextual_priorities = []
2062
2233
  this.config.associations = { positive: [], negative: [] }
2063
2234
  this.config.words = {}
2064
2235
 
@@ -2073,11 +2244,12 @@ class Config {
2073
2244
  }
2074
2245
  // console.log('name -------------', name)
2075
2246
  if (inits[i]) {
2247
+ // greg55
2076
2248
  inits[i]()
2077
2249
  }
2078
2250
  if (initAfterApis[i]) {
2079
2251
  const init = initAfterApis[i]
2080
- init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
2252
+ init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true})
2081
2253
  }
2082
2254
  const instance = this.instances.find((instance) => instance.name == name)
2083
2255
  if (instance) {
@@ -2085,7 +2257,6 @@ class Config {
2085
2257
  }
2086
2258
  this.hierarchy.edges = this.config.hierarchy
2087
2259
  }
2088
- // this.instances.forEach((instance) => client.processInstance(this, instance))
2089
2260
  }
2090
2261
 
2091
2262
  if (reverseIt) {
@@ -2208,13 +2379,9 @@ class Config {
2208
2379
  }
2209
2380
  const km = (name) => this.getConfig(name)
2210
2381
  if (config instanceof Config) {
2211
- // const aw = addWord(this.config, config.uuid)
2212
- const aw = (word, def) => this.addWord(word, def)
2213
- config.initializerFn({ isModule: this.isModule, addWord: aw, baseConfig: this, km, currentConfig: config, config, objects: nsobjects, namespace, uuid, api: config.api })
2382
+ config.initializerFn(setupInitializerFNArgs(this, { isModule: this.isModule, currentConfig: config, testConfig: config, objects: nsobjects, namespace, uuid }))
2214
2383
  } else {
2215
- // const aw = addWord(this.config, this.uuid)
2216
- const aw = (word, def) => this.addWord(word, def)
2217
- this.initializerFn({ isModule: this.isModule, addWord: aw, baseConfig: this, km, currentConfig: this, config: this, objects: nsobjects, namespace, uuid, api: this.api })
2384
+ this.initializerFn(setupInitializerFNArgs(this, { isModule: this.isModule, currentConfig: this, testConfig: this, objects: nsobjects, namespace, uuid }))
2218
2385
  }
2219
2386
  })
2220
2387
  }
@@ -2279,6 +2446,20 @@ class Config {
2279
2446
  config.priorities = priorities
2280
2447
  }
2281
2448
 
2449
+ if (config.contextual_priorities) {
2450
+ let contextual_priorities = config.contextual_priorities
2451
+ contextual_priorities = contextual_priorities.map((cp) => {
2452
+ const { context, choose } = cp
2453
+ return {
2454
+ context: context.map((id) => {
2455
+ return [toNS(id[0]), id[1]]
2456
+ }),
2457
+ choose
2458
+ }
2459
+ })
2460
+ config.contextual_priorities = contextual_priorities
2461
+ }
2462
+
2282
2463
  for (const bag of bags) {
2283
2464
  if (config[bag]) {
2284
2465
  config[bag] = config[bag].map((b) => {
@@ -2474,6 +2655,7 @@ class Config {
2474
2655
 
2475
2656
  // TODO get rid of useOldVersion arg
2476
2657
  addInternal (more, { useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps : hcps = false } = {}) {
2658
+ validConfigProps(more)
2477
2659
  if (more instanceof Config) {
2478
2660
  more.initialize({ force: false })
2479
2661
  if (useOldVersion) {
@@ -2571,7 +2753,7 @@ class Config {
2571
2753
  this.config[key].splice(iOldOne, 1)
2572
2754
  break;
2573
2755
  }
2574
- }
2756
+ }
2575
2757
  }
2576
2758
  }
2577
2759
  }
@@ -2708,5 +2890,7 @@ class Config {
2708
2890
  }
2709
2891
 
2710
2892
  module.exports = {
2711
- Config
2893
+ Config,
2894
+ config_toServer,
2895
+ operatorKey_valid,
2712
2896
  }