@ejfdelgado/ejflab-common 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +2 -0
  3. package/package.json +29 -0
  4. package/src/CollisionsEngine.js +252 -0
  5. package/src/CsvFormatter.js +54 -0
  6. package/src/CsvFormatter.test.js +119 -0
  7. package/src/CsvFormatterFilters.js +79 -0
  8. package/src/CsvParser.js +51 -0
  9. package/src/CsvParser.test.js +41 -0
  10. package/src/CsvWithFilters.js +114 -0
  11. package/src/FaceEncoder.js +64 -0
  12. package/src/FlowChartDiagram.js +503 -0
  13. package/src/IdGen.js +211 -0
  14. package/src/ModuloDatoSeguro.js +142 -0
  15. package/src/ModuloDatoSeguro.test.js +29 -0
  16. package/src/ModuloDatoSeguro.test.mjs +45 -0
  17. package/src/ModuloDatoSeguroBack.mjs +55 -0
  18. package/src/ModuloDatoSeguroFront.js +73 -0
  19. package/src/ModuloSonido.js +83 -0
  20. package/src/ModuloVideos.js +51 -0
  21. package/src/MyColor.js +136 -0
  22. package/src/MyColor.test.js +37 -0
  23. package/src/MyConstants.js +147 -0
  24. package/src/MyCookies.js +34 -0
  25. package/src/MyDates.js +412 -0
  26. package/src/MyDates.test.js +26 -0
  27. package/src/MyDatesBack.mjs +21 -0
  28. package/src/MyDatesFront.js +41 -0
  29. package/src/MyJsPdf.js +52 -0
  30. package/src/MyRoutes.js +29 -0
  31. package/src/MyTemplate.js +272 -0
  32. package/src/MyTemplate.test.js +90 -0
  33. package/src/MyTensorflow.js +248 -0
  34. package/src/MyTensorflow.test.js +19 -0
  35. package/src/MyTensorflowBack.mjs +33 -0
  36. package/src/MyThrottle.js +80 -0
  37. package/src/MyTuples.js +445 -0
  38. package/src/MyTuples.test.js +330 -0
  39. package/src/MyUtilities.js +137 -0
  40. package/src/SimpleObj.js +153 -0
  41. package/src/SimpleObj.test.js +58 -0
  42. package/src/TriangulacionGeometric.js +335 -0
  43. package/src/changePath.js +38 -0
  44. package/src/data/case0.csv +3 -0
  45. package/src/data/case0.json +24 -0
  46. package/src/data/case1.csv +2 -0
  47. package/src/data/case1.json +24 -0
  48. package/src/data/case2.csv +3 -0
  49. package/src/data/case2.json +24 -0
  50. package/src/data/case3.csv +3 -0
  51. package/src/data/case3.json +24 -0
  52. package/src/data/format0.json +0 -0
  53. package/src/data/format0.txt +1 -0
  54. package/src/data/tensordata.csv +10 -0
  55. package/src/data/tensordata.json +37 -0
  56. package/src/data/tensordata.test.csv +10 -0
  57. package/src/data/tensormodel.json +113 -0
  58. package/src/fft.js +224 -0
  59. package/src/flowchart/FlowChartExec.js +763 -0
  60. package/src/flowchart/steps/CommandBasic.js +32 -0
  61. package/src/flowchart/steps/CommandInc.js +19 -0
  62. package/src/flowchart/steps/CommandMilvus.js +47 -0
  63. package/src/flowchart/steps/CommandMinio.js +28 -0
  64. package/src/flowchart/steps/CommandMongo.js +59 -0
  65. package/src/flowchart/steps/CommandPrint.js +12 -0
  66. package/src/flowchart/steps/CommandSet.js +14 -0
  67. package/src/flowchart/steps/CommandTimeline.js +21 -0
  68. package/src/flowchart/steps/CommandTimelineNext.js +28 -0
  69. package/src/flowchart/steps/StepBasic.js +184 -0
  70. package/src/flowchart/steps/StepCheckProcessor.js +26 -0
  71. package/src/flowchart/steps/StepCheckSrc.js +42 -0
  72. package/src/flowchart/steps/StepIsTrue.js +12 -0
  73. package/src/flowchart/steps/StepOneTime.js +21 -0
  74. package/src/flowchart/steps/StepProcess.js +163 -0
  75. package/src/flowchart/steps/StepReadSrc.js +66 -0
  76. package/src/flowchart/steps/StepSleep.js +22 -0
  77. package/src/flowchart/steps/StepTimeLineEnds.js +21 -0
  78. package/src/flowchart/steps/StepTimeLineHasMore.js +16 -0
  79. package/src/gif/index.d.ts +20 -0
  80. package/src/gif/index.mjs +85 -0
  81. package/src/gif/utils/checkTypes.d.ts +2 -0
  82. package/src/gif/utils/checkTypes.mjs +11 -0
  83. package/src/js-colormaps.js +19484 -0
  84. package/src/sortify.js +75 -0
  85. package/src/sqlmodelparser/SqlModelParser.js +22 -0
  86. package/src/test/csv/test_1000_20230429204538700.csv +1001 -0
  87. package/src/test/csv/test_5_20230429204525930.csv +6 -0
  88. package/src/test/svg/test.html +5 -0
@@ -0,0 +1,272 @@
1
+ const { CsvFormatterFilters } = require("./CsvFormatterFilters");
2
+ const { CsvWithFilters } = require("./CsvWithFilters");
3
+ const { SimpleObj } = require("./SimpleObj");
4
+
5
+ const pInicio = "\\$\\s*\\[\\s*for\\s+([^\\s\\]]+)\\s+in\\s+([^\\s\\]]+\\s*})\\]";
6
+ const pFin = "\\$\\s*\\[\\s*endfor\\s*\\]";
7
+ const pNoFor = "((?!\\$\\s*\\[for).)*?";
8
+ const pAny = "(.*?)";
9
+
10
+ const pIfInicio = "\\$\\s*\\[\\s*if\\s+([^\\]]*?)\\s*\\]";
11
+ const pIfFin = "\\$\\s*\\[\\s*endif\\s*\\]";
12
+ const pElse = "\\$\\s*\\[\\s*else\\s*\\]";
13
+
14
+ class MyTemplate extends CsvWithFilters {
15
+ static interpolate(text, model) {
16
+ const renderer = new MyTemplate();
17
+ return renderer.render(text, model);
18
+ }
19
+ // ${algo} -> algo
20
+ static getBiggerOpenClose(text, startPattern, endPattern, openIndex, closeIndex, extractDataFun, elsePattern = null, elseIndex = 4) {
21
+ let startOrEnd;
22
+ if (elsePattern == null) {
23
+ startOrEnd = new RegExp("(" + startPattern + ")|(" + endPattern + ")", "gsi");
24
+ } else {
25
+ startOrEnd = new RegExp("(" + startPattern + ")|(" + endPattern + ")|(" + elsePattern + ")", "gsi");
26
+ }
27
+ let m;
28
+ let starterFor = null;
29
+ let closeFor = null;
30
+ let elseTag = null;
31
+ let closeCounter = 0;
32
+ do {
33
+ m = startOrEnd.exec(text);
34
+ if (m) {
35
+ if (m[closeIndex] !== undefined) {
36
+ // Is closing
37
+ if (starterFor == null) {
38
+ throw Error("Template error, can not close without start");
39
+ }
40
+ if (closeCounter == 0) {
41
+ closeFor = {
42
+ startIndex: m.index,
43
+ finishIndex: m.index + m[0].length
44
+ };
45
+ break;
46
+ }
47
+ closeCounter--;
48
+ } else if (m[openIndex] !== undefined) {
49
+ // Is oppening
50
+ if (starterFor == null) {
51
+ starterFor = extractDataFun(m);
52
+ starterFor.startIndex = m.index;
53
+ starterFor.finishIndex = m.index + m[0].length;
54
+ } else {
55
+ closeCounter++;
56
+ }
57
+ } else if (m[elseIndex] !== undefined) {
58
+ if (closeCounter == 0) {
59
+ elseTag = {
60
+ startIndex: m.index,
61
+ finishIndex: m.index + m[0].length
62
+ };
63
+ }
64
+ }
65
+ }
66
+ } while (m);
67
+ if (starterFor == null) {
68
+ //There is no mode fors...
69
+ return null;
70
+ }
71
+ if (starterFor !== null && closeFor == null) {
72
+ throw Error(`Expected close somewhere after ${starterFor.match}`);
73
+ }
74
+ return {
75
+ starterFor,
76
+ closeFor,
77
+ elseTag
78
+ };
79
+ }
80
+ static getBiggerIf(text) {
81
+ const temp = MyTemplate.getBiggerOpenClose(text, pIfInicio, pIfFin, 1, 3, (m) => {
82
+ return {
83
+ formula: m[2],
84
+ };
85
+ }, pElse);
86
+ if (temp == null) {
87
+ return null;
88
+ }
89
+ const {
90
+ starterFor,
91
+ closeFor,
92
+ elseTag,
93
+ } = temp;
94
+ const response = {
95
+ formula: starterFor.formula,
96
+ part1: text.substring(0, starterFor.startIndex),
97
+ part2: text.substring(closeFor.finishIndex),
98
+ localTemplateFalse: "",
99
+ };
100
+
101
+ if (elseTag == null) {
102
+ response.localTemplateTrue = text.substring(starterFor.finishIndex, closeFor.startIndex);
103
+ } else {
104
+ response.localTemplateTrue = text.substring(starterFor.finishIndex, elseTag.startIndex);
105
+ response.localTemplateFalse = text.substring(elseTag.finishIndex, closeFor.startIndex);
106
+ }
107
+ return response;
108
+ }
109
+ static getBiggerFor(text) {
110
+ const temp = MyTemplate.getBiggerOpenClose(text, pInicio, pFin, 1, 4, (m) => {
111
+ return {
112
+ match: m[0],
113
+ varName: m[2],
114
+ arrayname: m[3],
115
+ }
116
+ });
117
+ if (temp == null) {
118
+ return null;
119
+ }
120
+ const {
121
+ starterFor,
122
+ closeFor
123
+ } = temp;
124
+ return {
125
+ varName: starterFor.varName,
126
+ arrayName: MyTemplate.getVariableNames(starterFor.arrayname),
127
+ localTemplate: text.substring(starterFor.finishIndex, closeFor.startIndex),
128
+ part1: text.substring(0, starterFor.startIndex),
129
+ part2: text.substring(closeFor.finishIndex),
130
+ };
131
+ }
132
+ static getVariableNames(text) {
133
+ return text.replace(/\$\s*\{\s*([^}]+?)\s*\}/g, "$1");
134
+ }
135
+ replaceFors(template, data) {
136
+ // Expand for
137
+ // ${for color in colores} este es mi ${color.id} ${endfor}
138
+ const someFor = MyTemplate.getBiggerFor(template);
139
+ if (someFor == null) {
140
+ return {
141
+ template,
142
+ times: 0,
143
+ };
144
+ }
145
+ const {
146
+ arrayName,
147
+ localTemplate,
148
+ part1,
149
+ part2,
150
+ varName
151
+ } = someFor;
152
+ let response = [];
153
+ const valor = SimpleObj.getValue(data, arrayName);
154
+ if (valor != null && typeof valor == "object") {
155
+ const llaves = Object.keys(valor);
156
+ response = llaves.map((llave) => {
157
+ const keyPatter = new RegExp("\\$\\s*\\{" + varName, "g");
158
+ //console.log(`keyPatter = ${keyPatter}`);
159
+ return localTemplate.replace(keyPatter, (match) => {
160
+ return "${" + arrayName + "." + llave;
161
+ });
162
+ });
163
+ }
164
+ const middle = response.join("");
165
+ return {
166
+ template: part1 + middle + part2,
167
+ times: 1
168
+ };
169
+ }
170
+ computeIf(formula, data) {
171
+ const plainFormula = this.replaceBareValues(formula, data, "\\{", "\\}", "\\}", true);
172
+ //console.log(plainFormula);
173
+ return eval(plainFormula);// Yes it's safe here, believeme, uncomment above
174
+ }
175
+ replaceIfs(template, data) {
176
+ const someIf = MyTemplate.getBiggerIf(template);
177
+ if (someIf == null) {
178
+ return {
179
+ template,
180
+ times: 0,
181
+ };
182
+ }
183
+ //console.log(plainFormula);
184
+ const isTrue = this.computeIf(someIf.formula, data);
185
+ if (isTrue === true) {
186
+ return {
187
+ template: someIf.part1 + someIf.localTemplateTrue + someIf.part2,
188
+ times: 1,
189
+ };
190
+ } else {
191
+ return {
192
+ template: someIf.part1 + someIf.localTemplateFalse + someIf.part2,
193
+ times: 1,
194
+ };
195
+ }
196
+ }
197
+ render(template, data) {
198
+
199
+ let iteration = {};
200
+ do {
201
+ iteration = this.replaceFors(template, data);
202
+ template = iteration.template;
203
+ } while (iteration.times > 0);
204
+
205
+ // Evaluate ${if ...} ${endif}
206
+ do {
207
+ iteration = this.replaceIfs(template, data);
208
+ template = iteration.template;
209
+ } while (iteration.times > 0);
210
+
211
+ // Replace values
212
+ return this.replaceBareValues(template, data);
213
+ }
214
+ replaceBareValues(template, data, open = "\\{", close = "\\}", closeNoScape = "}", useStringify = false) {
215
+ const myPattern = new RegExp("\\$\\s*" + open + "([^" + closeNoScape + "]+)\\s*" + close, "g");
216
+ template = template.replace(myPattern, (match, g1) => {
217
+ const response = this.getColumnDescription(g1)[0];
218
+ const valor = SimpleObj.getValue(data, response.id);
219
+ if (!useStringify) {
220
+ const temp = this.filterValue(valor, response, undefined, response.id);
221
+ if (typeof temp == "object") {
222
+ return JSON.stringify(temp);
223
+ }
224
+ return temp;
225
+ } else {
226
+ const temp = this.filterValue(valor, response, undefined, response.id);
227
+ return JSON.stringify(temp);
228
+ }
229
+ });
230
+ return template;
231
+ }
232
+
233
+ // MyTemplate.readCall("call(sound, ${val} + ${val1}, param2)", { val: 5, val1: 8 });
234
+ static readCall(texto, model) {
235
+ const renderer = new MyTemplate();
236
+ renderer.registerFunction("rand", CsvFormatterFilters.rand);
237
+ const response = {
238
+ action: null,
239
+ arguments: [],
240
+ }
241
+ const partes = /^\s*call\(\s*([^,]+)\s*(.+)\)\s*$/ig.exec(texto);
242
+ if (partes) {
243
+ response.action = partes[1];
244
+ const argumentos = partes[2].split(",");
245
+ for (let i = 0; i < argumentos.length; i++) {
246
+ const argumento = argumentos[i].trim();
247
+ if (argumento.length > 0) {
248
+ try {
249
+ const evaluado = renderer.render(argumento, model);
250
+ try {
251
+ const evaluado2 = eval(evaluado);
252
+ response.arguments.push(evaluado2);
253
+ } catch (err0) {
254
+ response.arguments.push(evaluado);
255
+ }
256
+ } catch (err) {
257
+ response.arguments.push(argumento);
258
+ }
259
+ }
260
+ }
261
+ }
262
+ return response;
263
+ }
264
+ };
265
+
266
+ module.exports = {
267
+ MyTemplate,
268
+ pInicio,
269
+ pFin,
270
+ pNoFor,
271
+ pAny
272
+ };
@@ -0,0 +1,90 @@
1
+ const { CsvFormatterFilters } = require("./CsvFormatterFilters");
2
+ const { MyTemplate } = require("./MyTemplate");
3
+
4
+
5
+ function myTest() {
6
+ const renderer = new MyTemplate();
7
+
8
+ const cases = [
9
+ {
10
+ txt: "my name is ${name} and I like ${colors.0.id|mapColor} ${colors.0.id|personal:1:2:3}",
11
+ data: { name: "Edgar", colors: [{ id: 1 }] },
12
+ exp: "my name is Edgar and I like red 1-1-2-3",
13
+ },
14
+ {
15
+ txt: "All combines: $[for color in ${colors}]$[for name in ${names}]Color ${color.id|mapColor} + ${name}, $[endfor]$[endfor]",
16
+ data: { names: { first: "Edgar", last: "Delgado" }, colors: [{ id: 1 }, { id: 2 }] },
17
+ exp: "All combines: Color red + Edgar, Color red + Delgado, Color blue + Edgar, Color blue + Delgado, ",
18
+ },
19
+ {
20
+ txt: "Esto es una prueba $[for parent in ${parents}] parent ${parent.name} has $[for child in ${parent.children}] ${child.name} $[endfor] $[endfor] here there is nothing",
21
+ data: {
22
+ parents: [
23
+ { name: "Dog", children: [{ name: "Pepito" }, { name: "Cuco" }] },
24
+ { name: "Bird", children: [{ name: "Fly" }, { name: "Shym" }] },
25
+ { name: "Cat", children: [] }
26
+ ]
27
+ },
28
+ exp: "Esto es una prueba parent Dog has Pepito Cuco parent Bird has Fly Shym parent Cat has here there is nothing",
29
+ },
30
+ {
31
+ txt: "Esto es una prueba $[for parent in ${parents}] parent ${parent.name} has $[for child in ${parent.children}] ${child.name} $[endfor] $[endfor] here there is nothing",
32
+ data: {
33
+ parents: [
34
+ { name: "Dog", children: undefined },
35
+ { name: "Bird" },
36
+ { name: "Cat", children: null }
37
+ ]
38
+ },
39
+ exp: "Esto es una prueba parent Dog has parent Bird has parent Cat has here there is nothing",
40
+ },
41
+ {
42
+ txt: 'Es $[if ${color.id} == "texto" && ${algo} === undefined && ${otro.valor} == ${color.id} ] Es uno $[endif] fin',
43
+ data: { color: { id: "texto" }, otro: { valor: "texto" } },
44
+ exp: "Es Es uno fin",
45
+ },
46
+ {
47
+ txt: "Es $[if ${color.id} == 1 && ${algo} === undefined ]Verdadero$[else]Falso$[endif] fin",
48
+ data: { color: { id: 2 } },
49
+ exp: "Es Falso fin",
50
+ },
51
+ {
52
+ txt: 'Es $[if ${color.id} == 1 && ${algo} === undefined ]Verdadero$[else]pero acá es $[if typeof ${color} == "object" ]Sí$[else]No$[endif]$[endif] fin',
53
+ data: { color: { id: 2 } },
54
+ exp: "Es pero acá es Sí fin",
55
+ },
56
+ {
57
+ txt: 'Filtrado $[for el in ${arreglo}]$[if ${el.num} >= 3]${el.num} ${el.txt}$[endif]$[endfor]',
58
+ data: {
59
+ arreglo: [
60
+ { num: 1, txt: "no debe salir" },
61
+ { num: 2, txt: "tampoco debe salir" },
62
+ { num: 3, txt: "sí debe salir" }
63
+ ]
64
+ },
65
+ exp: "Filtrado 3 sí debe salir",
66
+ }
67
+ ];
68
+
69
+ renderer.registerFunction("json", CsvFormatterFilters.json);
70
+ renderer.registerFunction("mapColor", CsvFormatterFilters.map({ 1: "red", 2: "blue" }));
71
+ renderer.registerFunction("personal", (val, ...args) => {
72
+ return val + "-" + args.join("-");
73
+ });
74
+ renderer.registerFunction("rand", CsvFormatterFilters.rand);
75
+
76
+ for (let i = 0; i < cases.length; i++) {
77
+ const myCase = cases[i];
78
+ const actual = renderer.render(myCase.txt, myCase.data);
79
+ //console.log(actual);
80
+ if (actual !== myCase.exp) {
81
+ throw Error(`expected:\n${myCase.exp}\nactual:\n${actual}`);
82
+ } else {
83
+ console.log(`case ${i + 1} OK!`);
84
+ }
85
+ }
86
+
87
+ console.log(renderer.render('Todo salió bien ${person.name} ${o|rand:"azul":"amarillo":"verde"}', { person: { name: "Amigo" }, n: null }));
88
+ }
89
+
90
+ myTest();
@@ -0,0 +1,248 @@
1
+
2
+ //import * as tf from '@tensorflow/tfjs'
3
+ //import * as tfvis from "../../../node_modules/@tensorflow/tfjs-vis/dist/index.js";
4
+
5
+ const { CsvParser } = require("./CsvParser");
6
+
7
+ //3. Call front front end
8
+ //4. Add tfvisu...
9
+
10
+ class MyJSONTensorHandler {
11
+ constructor(someModel) {
12
+ this.someModel = someModel;
13
+ this.listener = null;
14
+ }
15
+ setListener(callback) {
16
+ this.listener = callback;
17
+ }
18
+ toArrayBuffer(buffer) {
19
+ const arrayBuffer = new ArrayBuffer(buffer.length);
20
+ const view = new Uint8Array(arrayBuffer);
21
+ for (let i = 0; i < buffer.length; ++i) {
22
+ view[i] = buffer[i];
23
+ }
24
+ return arrayBuffer;
25
+ }
26
+ load() {
27
+ const modelJSON = this.someModel;
28
+ const modelArtifacts = {
29
+ modelTopology: modelJSON.modelTopology,
30
+ format: modelJSON.format,
31
+ generatedBy: modelJSON.generatedBy,
32
+ convertedBy: modelJSON.convertedBy
33
+ };
34
+ if (modelJSON.weightsManifest != null) {
35
+ const buffer = Buffer.from(modelJSON.weightsManifest[0].binary, "base64");
36
+ modelArtifacts.weightSpecs = modelJSON.weightsManifest[0].weights;
37
+ modelArtifacts.weightData = this.toArrayBuffer(buffer);
38
+ }
39
+ if (modelJSON.trainingConfig != null) {
40
+ modelArtifacts.trainingConfig = modelJSON.trainingConfig;
41
+ }
42
+ if (modelJSON.userDefinedMetadata != null) {
43
+ modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata;
44
+ }
45
+ return modelArtifacts;
46
+ }
47
+ save(modelArtifacts) {
48
+ const binary = modelArtifacts.weightData;
49
+ const weightsManifest = [{
50
+ binary: Buffer.from(binary).toString("base64"),
51
+ weights: modelArtifacts.weightSpecs
52
+ }];
53
+ const modelJSON = {
54
+ modelTopology: modelArtifacts.modelTopology,
55
+ weightsManifest,
56
+ format: modelArtifacts.format,
57
+ generatedBy: modelArtifacts.generatedBy,
58
+ convertedBy: modelArtifacts.convertedBy
59
+ };
60
+ if (modelArtifacts.trainingConfig != null) {
61
+ modelJSON.trainingConfig = modelArtifacts.trainingConfig;
62
+ }
63
+ if (modelArtifacts.userDefinedMetadata != null) {
64
+ modelJSON.userDefinedMetadata = modelArtifacts.userDefinedMetadata;
65
+ }
66
+ if (typeof this.listener == "function") {
67
+ this.listener(modelJSON);
68
+ }
69
+ }
70
+ }
71
+
72
+ class MyTensorflow {
73
+
74
+ constructor() {
75
+ console.log("Constructor MyTensorflow");
76
+ this.myData = [];
77
+ this.myTestData = [];
78
+ this.metadata = null;
79
+ this.model = null;
80
+ }
81
+
82
+ setMetadata(jsonMetadata) {
83
+ this.metadata = jsonMetadata;
84
+ }
85
+
86
+ setData(textData) {
87
+ const parser = new CsvParser();
88
+ this.myData = parser.parse(textData, null, true);
89
+ }
90
+
91
+ setTestData(textTestData) {
92
+ const parser = new CsvParser();
93
+ this.myTestData = parser.parse(textTestData, null, true);
94
+ }
95
+
96
+ static clampZeroOne(val, min, max) {
97
+ const tam = (max - min);
98
+ let zeroBased = val - min;
99
+ if (zeroBased < 0) {
100
+ zeroBased = 0;
101
+ }
102
+ let zeroOne = zeroBased / tam;
103
+ if (zeroOne > 1) {
104
+ zeroOne = 1;
105
+ }
106
+ return zeroOne;
107
+ }
108
+
109
+ extractInputs(tf, data) {
110
+ const inmetadata = this.metadata.in;
111
+ return data.map((fila) => {
112
+ const resp = [];
113
+ for (let i = 0; i < inmetadata.length; i++) {
114
+ const metadata = inmetadata[i];
115
+ const val = fila[metadata.column];
116
+ const clamped = MyTensorflow.clampZeroOne(val, metadata.min, metadata.max);
117
+ resp.push(clamped);
118
+ }
119
+ return resp;
120
+ });
121
+ }
122
+
123
+ extractOutput(tf, data) {
124
+ const outmetadata = this.metadata.out;
125
+ const outputs = data.map((fila) => {
126
+ const val = fila[outmetadata.column];
127
+ const zeroOne = MyTensorflow.clampZeroOne(val, outmetadata.min, outmetadata.max);
128
+ const extended = zeroOne * (outmetadata.ngroups);
129
+ let response = Math.floor(extended);
130
+ if (response == outmetadata.ngroups) {
131
+ response = outmetadata.ngroups - 1;
132
+ }
133
+ return response;
134
+ });
135
+ return outputs;
136
+ }
137
+
138
+ prepareData(tf, data) {
139
+ return tf.tidy(() => {
140
+ const outmetadata = this.metadata.out;
141
+ tf.util.shuffle(data);
142
+ const inputs = this.extractInputs(tf, data);
143
+ const output = this.extractOutput(tf, data);
144
+ const inputTensor = tf.tensor2d(inputs, [inputs.length, inputs[0].length]);
145
+ const outputTensor = tf.oneHot(tf.tensor1d(output, 'int32'), outmetadata.ngroups);
146
+ //inputTensor.print(true);
147
+ //outputTensor.print(true);
148
+ return {
149
+ inputs: inputTensor,
150
+ outputs: outputTensor,
151
+ }
152
+ });
153
+ }
154
+
155
+ async validate(tf) {
156
+ if (this.model == null) {
157
+ throw Error("No hay un modelo creado");
158
+ }
159
+ const {
160
+ inputs,
161
+ outputs,
162
+ } = this.prepareData(tf, this.myTestData);
163
+ const results = await this.model.evaluate(inputs, outputs, { batchSize: 2 });
164
+ console.log('Accuracy is:')
165
+ results[1].print();
166
+ }
167
+
168
+ async predict(tf, valores) {
169
+ if (this.model == null) {
170
+ throw Error("No hay un modelo creado");
171
+ }
172
+ const predProb = this.model.predict(tf.tensor2d([valores])).dataSync();
173
+ console.log("predProb:" + JSON.stringify(predProb));
174
+ }
175
+
176
+ async fit(tf) {
177
+ if (this.model == null) {
178
+ throw Error("No hay un modelo creado");
179
+ }
180
+ const {
181
+ inputs,
182
+ outputs,
183
+ } = this.prepareData(tf, this.myData);
184
+
185
+ const X = inputs;
186
+ const y = outputs;
187
+ const data = this.metadata;
188
+ await this.model.fit(X, y, data.fit);
189
+ }
190
+
191
+ compile(tf) {
192
+ const data = this.metadata;
193
+ const myCompile = Object.assign({}, data.compile, { optimizer: tf.train.adam(0.1) });
194
+ this.model.compile(myCompile);
195
+ }
196
+
197
+ async getJsonModel(tf) {
198
+ if (this.model == null) {
199
+ throw Error("No hay un modelo creado");
200
+ }
201
+ return new Promise((resolve, reject) => {
202
+ const saver = new MyJSONTensorHandler();
203
+ saver.setListener(async (modelJson) => {
204
+ resolve(modelJson);
205
+ });
206
+ this.model.save(saver);
207
+ });
208
+ }
209
+
210
+ async setJsonModel(tf, modelJson) {
211
+ const handler = new MyJSONTensorHandler(modelJson);
212
+ this.model = await tf.loadLayersModel(handler);
213
+ this.compile(tf);
214
+ }
215
+
216
+ async createJsonModel(tf) {
217
+ const data = this.metadata;
218
+ this.model = tf.sequential();
219
+
220
+ for (let i = 0; i < data.layers.length; i++) {
221
+ const actual = data.layers[i];
222
+ const myLayer = {
223
+ name: `hidden-layer-${i + 1}`,
224
+ units: actual.units,
225
+ activation: actual.activation
226
+ }
227
+ if (i == 0) {
228
+ myLayer.inputShape = [data.in.length];
229
+ }
230
+ this.model.add(
231
+ tf.layers.dense(myLayer)
232
+ );
233
+ }
234
+
235
+ this.model.add(
236
+ tf.layers.dense({
237
+ units: data.out.ngroups,
238
+ activation: "softmax"
239
+ })
240
+ );
241
+
242
+ this.compile(tf);
243
+ }
244
+ }
245
+
246
+ module.exports = {
247
+ MyTensorflow
248
+ };
@@ -0,0 +1,19 @@
1
+ const { MyTensorflow } = require("./MyTensorflow");
2
+ const tf = require('@tensorflow/tfjs');
3
+ const fs = require('fs');
4
+
5
+ const test = () => {
6
+
7
+ const csvText = fs.readFileSync("./data/tensordata.csv", { encoding: "utf8" });
8
+ const csvTestText = fs.readFileSync("./data/tensordata.test.csv", { encoding: "utf8" });
9
+ const jsonMeta = JSON.parse(fs.readFileSync("./data/tensordata.json", { encoding: "utf8" }));
10
+
11
+ const tensorflow = new MyTensorflow();
12
+ tensorflow.setMetadata(jsonMeta);
13
+ tensorflow.setData(csvText);
14
+ tensorflow.setTestData(csvTestText);
15
+ await tensorflow.run(tf);
16
+ await tensorflow.validate(tf);
17
+ }
18
+
19
+ test();
@@ -0,0 +1,33 @@
1
+ import * as tf from '@tensorflow/tfjs-node'
2
+ import { MyTensorflow } from "./MyTensorflow.js";
3
+ import fs from 'fs'
4
+
5
+ export default class MyTensorflowBack extends MyTensorflow {
6
+ static async test() {
7
+ const csvText = fs.readFileSync("./data/tensordata.csv", { encoding: "utf8" });
8
+ const csvTestText = fs.readFileSync("./data/tensordata.test.csv", { encoding: "utf8" });
9
+ const jsonMeta = JSON.parse(fs.readFileSync("./data/tensordata.json", { encoding: "utf8" }));
10
+ const jsonModel = JSON.parse(fs.readFileSync("./data/tensormodel.json", { encoding: "utf8" }));
11
+
12
+ let tensorflow = new MyTensorflowBack();
13
+ tensorflow.setMetadata(jsonMeta);
14
+ tensorflow.setData(csvText);
15
+ tensorflow.createJsonModel(tf);
16
+ await tensorflow.fit(tf);
17
+
18
+ //const jsonModel = await tensorflow.getJsonModel(tf);
19
+ //console.log(JSON.stringify(jsonModel, null, 4));
20
+ tensorflow = new MyTensorflowBack();
21
+ tensorflow.setMetadata(jsonMeta);
22
+ tensorflow.setData(csvText);
23
+ tensorflow.setTestData(csvTestText);
24
+ await tensorflow.setJsonModel(tf, jsonModel);
25
+
26
+ await tensorflow.fit(tf);
27
+
28
+ await tensorflow.validate(tf);
29
+ await tensorflow.predict(tf, [0, 0]);
30
+ }
31
+ }
32
+
33
+ MyTensorflowBack.test();