@datagrok/eda 1.1.25 → 1.1.28

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 (111) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +1 -0
  4. package/dist/05e5e0770f54f07e9474.wasm +0 -0
  5. package/dist/111.js +2 -0
  6. package/dist/111.js.map +1 -0
  7. package/dist/153.js +2 -0
  8. package/dist/153.js.map +1 -0
  9. package/dist/23.js +2 -2
  10. package/dist/23.js.map +1 -0
  11. package/dist/234.js +2 -0
  12. package/dist/234.js.map +1 -0
  13. package/dist/242.js +2 -0
  14. package/dist/242.js.map +1 -0
  15. package/dist/260.js +2 -0
  16. package/dist/260.js.map +1 -0
  17. package/dist/317.js +2 -0
  18. package/dist/317.js.map +1 -0
  19. package/dist/33.js +2 -0
  20. package/dist/33.js.map +1 -0
  21. package/dist/348.js +2 -0
  22. package/dist/348.js.map +1 -0
  23. package/dist/377.js +2 -0
  24. package/dist/377.js.map +1 -0
  25. package/dist/412.js +2 -0
  26. package/dist/412.js.map +1 -0
  27. package/dist/415.js +2 -0
  28. package/dist/415.js.map +1 -0
  29. package/dist/531.js +2 -0
  30. package/dist/531.js.map +1 -0
  31. package/dist/583.js +2 -0
  32. package/dist/583.js.map +1 -0
  33. package/dist/589.js +2 -0
  34. package/dist/589.js.map +1 -0
  35. package/dist/603.js +2 -0
  36. package/dist/603.js.map +1 -0
  37. package/dist/656.js +2 -0
  38. package/dist/656.js.map +1 -0
  39. package/dist/682.js +2 -0
  40. package/dist/682.js.map +1 -0
  41. package/dist/705.js +2 -0
  42. package/dist/705.js.map +1 -0
  43. package/dist/731.js +2 -0
  44. package/dist/731.js.map +1 -0
  45. package/dist/738.js +3 -0
  46. package/dist/738.js.map +1 -0
  47. package/dist/763.js +2 -0
  48. package/dist/763.js.map +1 -0
  49. package/dist/778.js +2 -0
  50. package/dist/778.js.map +1 -0
  51. package/dist/783.js +2 -0
  52. package/dist/783.js.map +1 -0
  53. package/dist/793.js +2 -0
  54. package/dist/793.js.map +1 -0
  55. package/dist/907.js +2 -0
  56. package/dist/907.js.map +1 -0
  57. package/dist/91.js +2 -0
  58. package/dist/91.js.map +1 -0
  59. package/dist/950.js +2 -0
  60. package/dist/950.js.map +1 -0
  61. package/dist/package-test.js +2 -2
  62. package/dist/package-test.js.map +1 -0
  63. package/dist/package.js +2 -2
  64. package/dist/package.js.map +1 -0
  65. package/package.json +92 -92
  66. package/scripts/command.txt +1 -1
  67. package/scripts/func.json +1 -1
  68. package/scripts/module.json +1 -1
  69. package/src/missing-values-imputation/ui.ts +80 -66
  70. package/src/package.ts +288 -38
  71. package/src/pls/pls-tools.ts +16 -15
  72. package/src/regression.ts +232 -0
  73. package/src/svm.ts +78 -38
  74. package/tsconfig.json +4 -4
  75. package/wasm/EDA.js +65 -1
  76. package/wasm/EDA.wasm +0 -0
  77. package/wasm/EDAAPI.js +30 -0
  78. package/wasm/EDAForWebWorker.js +1 -1
  79. package/wasm/callWasm.js +384 -393
  80. package/wasm/regression-api.cpp +66 -0
  81. package/wasm/regression.h +128 -0
  82. package/wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js +13 -0
  83. package/wasm/workers/fitLinearRegressionParamsWorker.js +13 -0
  84. package/webpack.config.js +1 -1
  85. package/dist/208.js +0 -2
  86. package/dist/221.js +0 -2
  87. package/dist/231.js +0 -2
  88. package/dist/261.js +0 -2
  89. package/dist/282.js +0 -2
  90. package/dist/334.js +0 -2
  91. package/dist/356.js +0 -2
  92. package/dist/36.js +0 -2
  93. package/dist/367.js +0 -2
  94. package/dist/374.js +0 -2
  95. package/dist/40.js +0 -2
  96. package/dist/413.js +0 -2
  97. package/dist/42.js +0 -2
  98. package/dist/427.js +0 -2
  99. package/dist/467.js +0 -2
  100. package/dist/523.js +0 -3
  101. package/dist/533.js +0 -2
  102. package/dist/590.js +0 -2
  103. package/dist/65.js +0 -2
  104. package/dist/694.js +0 -2
  105. package/dist/729.js +0 -2
  106. package/dist/796.js +0 -2
  107. package/dist/902.js +0 -2
  108. package/dist/910.js +0 -2
  109. package/dist/972.js +0 -2
  110. package/dist/f5343e2c2e15952ce916.wasm +0 -0
  111. /package/dist/{523.js.LICENSE.txt → 738.js.LICENSE.txt} +0 -0
@@ -0,0 +1,232 @@
1
+ // Linear regression tools
2
+
3
+ import * as grok from 'datagrok-api/grok';
4
+ import * as ui from 'datagrok-api/ui';
5
+ import * as DG from 'datagrok-api/dg';
6
+
7
+ import {_fitLinearRegressionParamsWithDataNormalizing} from '../wasm/EDAAPI';
8
+ import {getPlsAnalysis} from './pls/pls-tools';
9
+
10
+ // Linear regression computations limits
11
+ const FATURES_COUNT_LIMIT = 1000;
12
+ const SAMPLES_COUNT_LIMIT = 1000000;
13
+
14
+ // Default PLS components count
15
+ const PLS_COMPONENTS_COUNT = 10;
16
+
17
+ // Wasm computations specific constants (see https://eigen.tuxfamily.org/dox/classEigen_1_1LDLT.html)
18
+ const BYTES_PER_VALUE = 4; // wasm computations operates 4-byte floats
19
+ const MEMORY_SCALE = 2; // due to the features of the Eigen lib decomposition
20
+ const BUFFERS_COUNT = 1; // due to the features of the Eigen lib decomposition
21
+ const WASM_MEMORY = 268435456; // wasm buffer size specified in '../scripts/module.json'
22
+
23
+ /** Compute coefficients of linear regression */
24
+ export async function getLinearRegressionParams(features: DG.ColumnList, targets: DG.Column): Promise<Float32Array> {
25
+ const featuresCount = features.length;
26
+ const samplesCount = targets.length;
27
+
28
+ const yAvg = targets.stats.avg;
29
+ const yStdev = targets.stats.stdev;
30
+
31
+ const params = new Float32Array(featuresCount + 1).fill(0);
32
+ params[featuresCount] = yAvg;
33
+
34
+ // The trivial case
35
+ if ((yStdev === 0) || (samplesCount === 1))
36
+ return params;
37
+
38
+ try {
39
+ // Analyze inputs sizes
40
+ const inputsAnalysis = getInputsAnalysis(featuresCount, samplesCount);
41
+
42
+ if (inputsAnalysis.toApplyPLS) {
43
+ // Apply the PLS method
44
+ const paramsByPLS = await getLinearRegressionParamsUsingPLS(features, targets, inputsAnalysis.components);
45
+
46
+ let tmpSum = 0;
47
+
48
+ // Compute bias (due to the centering feature of PLS)
49
+ for (let i = 0; i < featuresCount; ++i) {
50
+ params[i] = paramsByPLS[i];
51
+ tmpSum += paramsByPLS[i] * features.byIndex(i).stats.avg;
52
+ }
53
+
54
+ params[featuresCount] -= tmpSum;
55
+
56
+ return params;
57
+ }
58
+
59
+ // Non-constant columns data
60
+ const nonConstFeatureColsIndeces: number[] = [];
61
+ const nonConstFeatureCols: DG.Column[] = [];
62
+ const nonConstFeatureAvgs = new Float32Array(featuresCount);
63
+ const nonConstFeatureStdevs = new Float32Array(featuresCount);
64
+
65
+ let idx = 0;
66
+ let nonConstFeaturesCount = 0;
67
+
68
+ // Extract non-constant columns data
69
+ for (const col of features) {
70
+ const stats = col.stats;
71
+
72
+ if (stats.stdev > 0) {
73
+ nonConstFeatureColsIndeces.push(idx);
74
+ nonConstFeatureCols.push(col);
75
+ nonConstFeatureAvgs[nonConstFeaturesCount] = stats.avg;
76
+ nonConstFeatureStdevs[nonConstFeaturesCount] = stats.stdev;
77
+ ++nonConstFeaturesCount;
78
+ }
79
+
80
+ ++idx;
81
+ }
82
+
83
+ // The trivial case
84
+ if (nonConstFeaturesCount === 0)
85
+ return params;
86
+
87
+ // Compute parameters of linear regression
88
+ const tempParams = _fitLinearRegressionParamsWithDataNormalizing(
89
+ DG.DataFrame.fromColumns(nonConstFeatureCols).columns,
90
+ DG.Column.fromFloat32Array('xAvgs', nonConstFeatureAvgs, nonConstFeaturesCount),
91
+ DG.Column.fromFloat32Array('xStdevs', nonConstFeatureStdevs, nonConstFeaturesCount),
92
+ targets,
93
+ yAvg,
94
+ yStdev,
95
+ nonConstFeaturesCount + 1,
96
+ ).getRawData();
97
+
98
+ // Extract params taking into account non-constant columns
99
+ for (let i = 0; i < nonConstFeaturesCount; ++i)
100
+ params[nonConstFeatureColsIndeces[i]] = tempParams[i];
101
+
102
+ params[featuresCount] = tempParams[nonConstFeaturesCount];
103
+ } catch (e) {
104
+ grok.shell.error(`Fitted the trivial model: ${e instanceof Error ? e.message : 'due to the platform issue'}`);
105
+ }
106
+
107
+ return params;
108
+ } // computeLinRegressionCoefs
109
+
110
+ /** Return prediction of linear regression model */
111
+ export function getPredictionByLinearRegression(features: DG.ColumnList, params: Float32Array): DG.Column {
112
+ const featuresCount = features.length;
113
+ if (featuresCount !== params.length - 1)
114
+ throw new Error('Incorrect parameters count');
115
+
116
+ const col = features.byIndex(0);
117
+ const samplesCount = col.length;
118
+ const prediction = new Float32Array(samplesCount);
119
+
120
+ let rawData = col.getRawData();
121
+ const bias = params[featuresCount];
122
+ let weight = params[0];
123
+
124
+ for (let i = 0; i < samplesCount; ++i)
125
+ prediction[i] = bias + weight * rawData[i];
126
+
127
+ for (let j = 1; j < featuresCount; ++j) {
128
+ rawData = features.byIndex(j).getRawData();
129
+ weight = params[j];
130
+
131
+ for (let i = 0; i < samplesCount; ++i)
132
+ prediction[i] += weight * rawData[i];
133
+ }
134
+
135
+ return DG.Column.fromFloat32Array(
136
+ features.getUnusedName('prediction'),
137
+ prediction,
138
+ samplesCount,
139
+ );
140
+ } // getPredictionByLinearRegression
141
+
142
+ /** Generate test dataset */
143
+ export function getTestDatasetForLinearRegression(rowCount: number, colCount: number,
144
+ featuresScale: number, featuresBias: number, paramsScale: number, paramsBias: number): DG.DataFrame {
145
+ const df = grok.data.demo.randomWalk(rowCount, colCount + 1);
146
+ const cols = df.columns;
147
+ const noiseCol = cols.byIndex(colCount);
148
+ noiseCol.name = 'y (noisy)';
149
+ const yNoisy = noiseCol.getRawData();
150
+ const y = new Float32Array(rowCount).fill(paramsBias);
151
+
152
+ let idx = 0;
153
+ let scale = 0;
154
+ let bias = 0;
155
+ let weight = 0;
156
+
157
+ for (const col of cols) {
158
+ col.name = `x${idx}`;
159
+ scale = Math.random() * featuresScale;
160
+ bias = Math.random() * featuresBias;
161
+ const arr = col.getRawData();
162
+ weight = Math.random() * paramsScale;
163
+
164
+ for (let j = 0; j < rowCount; ++j) {
165
+ arr[j] = scale * arr[j] + bias;
166
+ y[j] += arr[j] * weight;
167
+ }
168
+
169
+ ++idx;
170
+
171
+ if (idx === colCount)
172
+ break;
173
+ }
174
+
175
+ scale = Math.random() * featuresScale;
176
+ bias = Math.random() * featuresBias;
177
+
178
+ for (let j = 0; j < rowCount; ++j)
179
+ yNoisy[j] = scale * yNoisy[j] + y[j];
180
+
181
+ cols.add(DG.Column.fromFloat32Array('y', y, rowCount));
182
+
183
+ return df;
184
+ } // getTestDatasetForLinearRegression
185
+
186
+ /** Reteurn linear regression params using the PLS method */
187
+ async function getLinearRegressionParamsUsingPLS(features: DG.ColumnList,
188
+ targets: DG.Column, components: number): Promise<Float32Array> {
189
+ const plsAnalysis = await getPlsAnalysis({
190
+ table: DG.DataFrame.fromColumns([targets]),
191
+ features: features,
192
+ predict: targets,
193
+ components: components,
194
+ names: null,
195
+ });
196
+
197
+ return plsAnalysis.regressionCoefficients.getRawData() as Float32Array;
198
+ }
199
+
200
+ /** Check wasm-buffer overflow */
201
+ const wasmBufferOverflow = (featuresCount: number, samplesCount: number) => {
202
+ return MEMORY_SCALE * BYTES_PER_VALUE * samplesCount * (featuresCount + BUFFERS_COUNT) >= WASM_MEMORY;
203
+ };
204
+
205
+ /** Check whether to apply the PLS method & how many components to use */
206
+ const getInputsAnalysis = (featuresCount: number, samplesCount: number) => {
207
+ if (wasmBufferOverflow(featuresCount, samplesCount) || (featuresCount >= FATURES_COUNT_LIMIT)) {
208
+ return {
209
+ toApplyPLS: true,
210
+ components: PLS_COMPONENTS_COUNT,
211
+ };
212
+ }
213
+
214
+ if (samplesCount >= SAMPLES_COUNT_LIMIT) {
215
+ return {
216
+ toApplyPLS: true,
217
+ components: Math.min(PLS_COMPONENTS_COUNT, featuresCount),
218
+ };
219
+ }
220
+
221
+ if (samplesCount <= featuresCount) {
222
+ return {
223
+ toApplyPLS: true,
224
+ components: Math.min(PLS_COMPONENTS_COUNT, samplesCount),
225
+ };
226
+ }
227
+
228
+ return {
229
+ toApplyPLS: false,
230
+ components: PLS_COMPONENTS_COUNT,
231
+ };
232
+ }; // getInputsAnalysis
package/src/svm.ts CHANGED
@@ -55,6 +55,7 @@ const WRONG_RBF_SIGMA_MESSAGE = 'sigma must be strictly positive.';
55
55
  const WRONG_POLYNOMIAL_C_MESSAGE = 'c must be strictly positive.';
56
56
  const WRONG_POLYNOMIAL_D_MESSAGE = 'd must be strictly positive.';
57
57
  const WRONG_KERNEL_MESSAGE = 'incorrect kernel.';
58
+ const WRONG_LABELS_MESSAGE = 'labels must be strings of two categories.';
58
59
 
59
60
  // names
60
61
  const LABELS = 'Labels';
@@ -65,14 +66,14 @@ const MEAN = 'mean';
65
66
  const STD_DEV = 'std dev';
66
67
  const MODEL_PARAMS_NAME = 'alpha';
67
68
  const MODEL_WEIGHTS_NAME = 'weight';
68
- const GAMMA = 'gamma';
69
- const KERNEL = 'kernel';
70
- const KERNEL_PARAMS = 'kernel params';
71
- const KERNEL_PARAM_1 = 'kernel param 1';
72
- const KERNEL_PARAM_2 = 'kernel param 2';
73
- const FEATURES_COUNT_NAME = 'features count';
74
- const TRAIN_SAMPLES_COUNT_NAME = 'train samples count';
75
- const TRAIN_ERROR = 'Train error,%';
69
+ const GAMMA = 'Gamma';
70
+ const KERNEL = 'Kernel';
71
+ const KERNEL_PARAMS = 'Kernel params';
72
+ const KERNEL_PARAM_1 = 'Kernel parameter 1';
73
+ const KERNEL_PARAM_2 = 'Kernel parameter 2';
74
+ const FEATURES_COUNT_NAME = 'Features count';
75
+ const TRAIN_SAMPLES_COUNT_NAME = 'Train samples count';
76
+ const TRAIN_ERROR = 'Train error, %';
76
77
  const KERNEL_TYPE_TO_NAME_MAP = ['linear', 'polynomial', 'RBF', 'sigmoid'];
77
78
  const POSITIVE_NAME = 'positive (P)';
78
79
  const NEGATIVE_NAME = 'negative (N)';
@@ -271,12 +272,18 @@ async function trainAndAnalyzeModel(hyperparameters: any, dataset: DG.ColumnList
271
272
  } // trainAndAnalyzeModel
272
273
 
273
274
  // Wrapper for combining the function "trainAndAnalyzeModel" with Datagrok predicitve tools
274
- export async function getTrainedModel(hyperparameters: any, df: DG.DataFrame, predictColumn: string): Promise<any> {
275
+ export async function getTrainedModel(hyperparameters: any, df: DG.DataFrame, labels: DG.Column): Promise<any> {
275
276
  const columns = df.columns;
276
- const labels = columns.byName(predictColumn);
277
- columns.remove(predictColumn);
278
277
 
279
- return await trainAndAnalyzeModel(hyperparameters, columns, labels);
278
+ if (labels.categories.length != 2)
279
+ throw new Error(WRONG_LABELS_MESSAGE);
280
+ let labelNumeric : DG.Column = DG.Column.float(labels.name, labels.length);
281
+ for (var i = 0; i < labels.length; i++)
282
+ labelNumeric.set(i, labels.get(i) == labels.categories[0] ? -1.0 : 1.0, false);
283
+
284
+ let model = await trainAndAnalyzeModel(hyperparameters, columns, labelNumeric);
285
+ model.realLabels = labels;
286
+ return model;
280
287
  }
281
288
 
282
289
  // Returns dataframe with short info about model
@@ -313,26 +320,9 @@ function getConfusionMatrixDF(model: any): DG.DataFrame {
313
320
  }
314
321
 
315
322
  // Show training report
316
- export function showTrainReport(df: DG.DataFrame, model: any): void {
317
- df.name = ML_REPORT;
318
- df.columns.add(model.trainLabels);
319
- df.columns.add(model.predictedLabels);
320
- df.columns.add(model.correctness);
321
- const dfView = grok.shell.addTableView(df);
322
- dfView.addViewer(DG.Viewer.form(getModelInfo(model)));
323
- dfView.addViewer(DG.Viewer.scatterPlot(df,
324
- {title: ML_REPORT_PREDICTED_LABELS,
325
- color: model.predictedLabels.name,
326
- }));
327
- dfView.addViewer(DG.Viewer.scatterPlot(df,
328
- {title: ML_REPORT_TRAIN_LABELS,
329
- color: model.trainLabels.name,
330
- }));
331
- dfView.addViewer(DG.Viewer.grid(getConfusionMatrixDF(model)));
332
- dfView.addViewer(DG.Viewer.scatterPlot(df,
333
- {title: ML_REPORT_CORRECTNESS,
334
- color: model.correctness.name,
335
- }));
323
+ export function showTrainReport(df: DG.DataFrame, packedModel: any): HTMLElement {
324
+ const model = getUnpackedModel(packedModel);
325
+ return DG.Viewer.form(model.modelInfo, {showNavigation: false}).root;
336
326
  } // showTrainReport
337
327
 
338
328
  // Returns trained model packed into UInt8Array
@@ -341,14 +331,18 @@ export function getPackedModel(model: any): any {
341
331
  const dataCols = model.normalizedTrainData.columns;
342
332
  const samplesCount = model.trainSamplesCount;
343
333
  const featuresCount = model.featuresCount;
344
-
334
+ const realLabelsBuffer = DG.DataFrame.fromColumns([model.realLabels]).toByteArray();
335
+ const realLabelsSize = BYTES + realLabelsBuffer.length + 4 - realLabelsBuffer.length % 4;
336
+ const modelInfoBuffer = getModelInfo(model).toByteArray();
337
+ const modelInfoSize = BYTES + modelInfoBuffer.length + 4 - modelInfoBuffer.length % 4;
338
+
345
339
  /*let bufferSize = BYTES * (7 + featuresCount * samplesCount
346
340
  + 3 * featuresCount + 2 * samplesCount);*/
347
341
 
348
342
  // compute size of packed model
349
343
  const bufferSize = BYTES * (INTS_COUNT + KER_PARAMS_COUNT +
350
344
  samplesCount + featuresCount + featuresCount + samplesCount + LS_SVM_ADD_CONST +
351
- featuresCount + LS_SVM_ADD_CONST + featuresCount * samplesCount);
345
+ featuresCount + LS_SVM_ADD_CONST + featuresCount * samplesCount) + realLabelsSize + modelInfoSize;
352
346
 
353
347
  // packed model
354
348
  const result = new Uint8Array(bufferSize);
@@ -356,7 +350,7 @@ export function getPackedModel(model: any): any {
356
350
  let offset = 0;
357
351
 
358
352
  // pack kernel type and sizes
359
- const ints = new Int32Array(buffer, offset, INTS_COUNT);
353
+ let ints = new Int32Array(buffer, offset, INTS_COUNT);
360
354
  ints[MODEL_KERNEL_INDEX] = model.kernelType;
361
355
  ints[SAMPLES_COUNT_INDEX] = samplesCount;
362
356
  ints[FEATURES_COUNT_INDEX] = featuresCount;
@@ -399,6 +393,18 @@ export function getPackedModel(model: any): any {
399
393
  offset += featuresCount * BYTES;
400
394
  }
401
395
 
396
+ // pack labels of training data
397
+ ints = new Int32Array(buffer, offset, 1);
398
+ ints[0] = realLabelsBuffer.length;
399
+ result.set(realLabelsBuffer, offset + BYTES);
400
+ offset += realLabelsSize;
401
+
402
+ // pack model info
403
+ ints = new Int32Array(buffer, offset, 1);
404
+ ints[0] = modelInfoBuffer.length;
405
+ result.set(modelInfoBuffer, offset + BYTES);
406
+ offset += modelInfoSize;
407
+
402
408
  return result;
403
409
  } // getPackedModel
404
410
 
@@ -412,7 +418,6 @@ function getUnpackedModel(packedModel: any): any {
412
418
  offset += INTS_COUNT * BYTES;
413
419
  const samplesCount = header[SAMPLES_COUNT_INDEX];
414
420
  const featuresCount = header[FEATURES_COUNT_INDEX];
415
-
416
421
  // extract parameters of kernel
417
422
  const kernelParams = DG.Column.fromFloat32Array(KERNEL_PARAMS,
418
423
  new Float32Array(modelBytes, offset, KER_PARAMS_COUNT));
@@ -454,14 +459,30 @@ function getUnpackedModel(packedModel: any): any {
454
459
 
455
460
  const normalizedTrainData = DG.DataFrame.fromColumns(dataCols);
456
461
 
462
+ // extract real training labels
463
+ const labelsCount = new Int32Array(modelBytes, offset, 1)[0];
464
+ const labelsBytesCount = labelsCount + 4 - labelsCount % 4;
465
+ offset += BYTES;
466
+ const realLabels = DG.DataFrame.fromByteArray(new Uint8Array(modelBytes, offset, labelsCount)).columns.byIndex(0);
467
+ offset += labelsBytesCount;
468
+
469
+ // extract model info
470
+ const modelInfoSize = new Int32Array(modelBytes, offset, 1)[0];
471
+ const modelInfoBytesSize = modelInfoSize + 4 - modelInfoSize % 4;
472
+ offset += BYTES;
473
+ const modelInfo = DG.DataFrame.fromByteArray(new Uint8Array(modelBytes, offset, modelInfoSize));
474
+ offset += modelInfoBytesSize;
475
+
457
476
  const model = {kernelType: header[MODEL_KERNEL_INDEX],
458
477
  kernelParams: kernelParams,
459
478
  trainLabels: trainLabels,
479
+ realLabels: realLabels,
460
480
  means: means,
461
481
  stdDevs: stdDevs,
462
482
  modelParams: modelParams,
463
483
  modelWeights: modelWeights,
464
484
  normalizedTrainData: normalizedTrainData,
485
+ modelInfo: modelInfo
465
486
  };
466
487
 
467
488
  return model;
@@ -471,8 +492,27 @@ function getUnpackedModel(packedModel: any): any {
471
492
  export async function getPrediction(df: DG.DataFrame, packedModel: any): Promise<DG.DataFrame> {
472
493
  const model = getUnpackedModel(new Uint8Array(packedModel));
473
494
 
474
- const res = await predict(model, df.columns);
475
- res.name = PREDICTION;
495
+ const resNumeric = await predict(model, df.columns);
496
+ const res = DG.Column.string(PREDICTION, resNumeric.length);
497
+ const categories = model.realLabels.categories;
498
+ for (var i = 0; i < res.length; i++) {
499
+ res.set(i, resNumeric.get(i) == -1 ? categories[0] : categories[1]);
500
+ }
476
501
 
477
502
  return DG.DataFrame.fromColumns([res]);
478
503
  } // getPrediction
504
+
505
+
506
+ export function isApplicableSVM(df: DG.DataFrame, labels: DG.Column): boolean {
507
+ const columns = df.columns;
508
+ if (!labels.matches('categorical') || labels.categories.length > 2)
509
+ return false;
510
+ var res: boolean = true;
511
+ for (var i = 0; i < columns.length; i++)
512
+ res = res && (columns.byIndex(i).matches('numerical'));
513
+ return res;
514
+ }
515
+
516
+ export function isInteractiveSVM(df: DG.DataFrame, labels: DG.Column): boolean {
517
+ return df.rowCount <= 1000;
518
+ }
package/tsconfig.json CHANGED
@@ -12,7 +12,7 @@
12
12
  // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
13
13
  // "declaration": true, /* Generates corresponding '.d.ts' file. */
14
14
  // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15
- // "sourceMap": true, /* Generates corresponding '.map' file. */
15
+ "sourceMap": true, /* Generates corresponding '.map' file. */
16
16
  // "outFile": "./", /* Concatenate and emit output to single file. */
17
17
  // "outDir": "./", /* Redirect output structure to the directory. */
18
18
  // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
@@ -56,8 +56,8 @@
56
56
  // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
57
57
 
58
58
  /* Source Map Options */
59
- // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
60
- // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
59
+ "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
60
+ "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
61
61
  // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
62
62
  // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
63
63
 
@@ -66,7 +66,7 @@
66
66
  // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
67
67
 
68
68
  /* Advanced Options */
69
- "skipLibCheck": false, /* Skip type checking of declaration files. */
69
+ "skipLibCheck": true, /* Skip type checking of declaration files. */
70
70
  "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
71
71
  }
72
72
  }
package/wasm/EDA.js CHANGED
@@ -6,7 +6,7 @@ var exportEDA = (() => {
6
6
  function(exportEDA) {
7
7
  exportEDA = exportEDA || {};
8
8
 
9
- var Module=typeof exportEDA!="undefined"?exportEDA:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||268435456;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="EDA.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["e"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["i"];addOnInit(Module["asm"]["f"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function getCFunc(ident){var func=Module["_"+ident];return func}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}}var asmLibraryArg={"a":___assert_fail,"b":___cxa_throw,"d":_emscripten_memcpy_big,"c":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["f"]).apply(null,arguments)};var _principalComponentAnalysis=Module["_principalComponentAnalysis"]=function(){return(_principalComponentAnalysis=Module["_principalComponentAnalysis"]=Module["asm"]["g"]).apply(null,arguments)};var _error=Module["_error"]=function(){return(_error=Module["_error"]=Module["asm"]["h"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["j"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["k"]).apply(null,arguments)};var _partialLeastSquareRegression=Module["_partialLeastSquareRegression"]=function(){return(_partialLeastSquareRegression=Module["_partialLeastSquareRegression"]=Module["asm"]["l"]).apply(null,arguments)};var _generateDataset=Module["_generateDataset"]=function(){return(_generateDataset=Module["_generateDataset"]=Module["asm"]["m"]).apply(null,arguments)};var _normalizeDataset=Module["_normalizeDataset"]=function(){return(_normalizeDataset=Module["_normalizeDataset"]=Module["asm"]["n"]).apply(null,arguments)};var _trainLSSVM=Module["_trainLSSVM"]=function(){return(_trainLSSVM=Module["_trainLSSVM"]=Module["asm"]["o"]).apply(null,arguments)};var _predictByLSSVM=Module["_predictByLSSVM"]=function(){return(_predictByLSSVM=Module["_predictByLSSVM"]=Module["asm"]["p"]).apply(null,arguments)};var _trainAndAnalyzeLSSVM=Module["_trainAndAnalyzeLSSVM"]=function(){return(_trainAndAnalyzeLSSVM=Module["_trainAndAnalyzeLSSVM"]=Module["asm"]["q"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["r"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["s"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["t"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["u"]).apply(null,arguments)};Module["ccall"]=ccall;Module["cwrap"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
9
+ var Module=typeof exportEDA!="undefined"?exportEDA:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||268435456;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="EDA.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["e"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["i"];addOnInit(Module["asm"]["f"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function getCFunc(ident){var func=Module["_"+ident];return func}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}}var asmLibraryArg={"a":___assert_fail,"b":___cxa_throw,"d":_emscripten_memcpy_big,"c":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["f"]).apply(null,arguments)};var _principalComponentAnalysis=Module["_principalComponentAnalysis"]=function(){return(_principalComponentAnalysis=Module["_principalComponentAnalysis"]=Module["asm"]["g"]).apply(null,arguments)};var _error=Module["_error"]=function(){return(_error=Module["_error"]=Module["asm"]["h"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["j"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["k"]).apply(null,arguments)};var _partialLeastSquareRegression=Module["_partialLeastSquareRegression"]=function(){return(_partialLeastSquareRegression=Module["_partialLeastSquareRegression"]=Module["asm"]["l"]).apply(null,arguments)};var _generateDataset=Module["_generateDataset"]=function(){return(_generateDataset=Module["_generateDataset"]=Module["asm"]["m"]).apply(null,arguments)};var _normalizeDataset=Module["_normalizeDataset"]=function(){return(_normalizeDataset=Module["_normalizeDataset"]=Module["asm"]["n"]).apply(null,arguments)};var _trainLSSVM=Module["_trainLSSVM"]=function(){return(_trainLSSVM=Module["_trainLSSVM"]=Module["asm"]["o"]).apply(null,arguments)};var _predictByLSSVM=Module["_predictByLSSVM"]=function(){return(_predictByLSSVM=Module["_predictByLSSVM"]=Module["asm"]["p"]).apply(null,arguments)};var _trainAndAnalyzeLSSVM=Module["_trainAndAnalyzeLSSVM"]=function(){return(_trainAndAnalyzeLSSVM=Module["_trainAndAnalyzeLSSVM"]=Module["asm"]["q"]).apply(null,arguments)};var _fitLinearRegressionParamsWithDataNormalizing=Module["_fitLinearRegressionParamsWithDataNormalizing"]=function(){return(_fitLinearRegressionParamsWithDataNormalizing=Module["_fitLinearRegressionParamsWithDataNormalizing"]=Module["asm"]["r"]).apply(null,arguments)};var _fitLinearRegressionParams=Module["_fitLinearRegressionParams"]=function(){return(_fitLinearRegressionParams=Module["_fitLinearRegressionParams"]=Module["asm"]["s"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["t"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["u"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["v"]).apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return(___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=Module["asm"]["w"]).apply(null,arguments)};Module["ccall"]=ccall;Module["cwrap"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
10
10
 
11
11
 
12
12
  return exportEDA.ready
@@ -430,6 +430,68 @@ var trainAndAnalyzeLSSVM = {
430
430
  }
431
431
  }; // trainAndAnalyzeLSSVM
432
432
 
433
+ var fitLinearRegressionParamsWithDataNormalizing = {
434
+ arguments: {
435
+ features: {
436
+ type: 'floatColumns'
437
+ },
438
+ featureAvgs: {
439
+ type: 'floatColumn'
440
+ },
441
+ featureStdDevs: {
442
+ type: 'floatColumn'
443
+ },
444
+ targets: {
445
+ type: 'floatColumn'
446
+ },
447
+ targetsAvg: {
448
+ type: 'num'
449
+ },
450
+ targetsStdDev: {
451
+ type: 'num'
452
+ },
453
+ paramsCount: {
454
+ type: 'num'
455
+ },
456
+ params: {
457
+ type: 'newFloatColumn',
458
+ numOfRows: {
459
+ ref: 'paramsCount',
460
+ value: 'data'
461
+ }
462
+ }
463
+ },
464
+ output: {
465
+ type: 'column',
466
+ source: 'params'
467
+ }
468
+ }; // fitLinearRegressionParamsWithDataNormalizing
469
+
470
+ var fitLinearRegressionParams = {
471
+ arguments: {
472
+ features: {
473
+ type: 'floatColumns'
474
+ },
475
+ targets: {
476
+ type: 'floatColumn'
477
+ },
478
+ paramsCount: {
479
+ type: 'num'
480
+ },
481
+ params: {
482
+ type: 'newFloatColumn',
483
+ numOfRows: {
484
+ ref: 'paramsCount',
485
+ value: 'data'
486
+ }
487
+ }
488
+ },
489
+ output: {
490
+ type: 'column',
491
+ source: 'params'
492
+ }
493
+ }; // fitLinearRegressionParams
494
+
433
495
  var EDA = undefined;
434
496
 
435
497
  async function initEDA() {
@@ -444,6 +506,8 @@ async function initEDA() {
444
506
  EDA.trainLSSVM = trainLSSVM;
445
507
  EDA.predictByLSSVM = predictByLSSVM;
446
508
  EDA.trainAndAnalyzeLSSVM = trainAndAnalyzeLSSVM;
509
+ EDA.fitLinearRegressionParamsWithDataNormalizing = fitLinearRegressionParamsWithDataNormalizing;
510
+ EDA.fitLinearRegressionParams = fitLinearRegressionParams;
447
511
  } else {
448
512
  console.log("Wasm Loaded, Passing");
449
513
  }
package/wasm/EDA.wasm CHANGED
Binary file
package/wasm/EDAAPI.js CHANGED
@@ -129,3 +129,33 @@ export async function _trainAndAnalyzeLSSVMInWebWorker(gamma, kernel, kernelPara
129
129
  });
130
130
  }
131
131
 
132
+ export function _fitLinearRegressionParamsWithDataNormalizing(features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount) {
133
+ return callWasm(EDA, 'fitLinearRegressionParamsWithDataNormalizing', [features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount]);
134
+ }
135
+
136
+ export async function _fitLinearRegressionParamsWithDataNormalizingInWebWorker(features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount) {
137
+ return new Promise((resolve, reject) => {
138
+ const worker = new Worker(new URL('../wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js', import.meta.url));
139
+ worker.postMessage(getCppInput(EDA['fitLinearRegressionParamsWithDataNormalizing'].arguments,[features, featureAvgs, featureStdDevs, targets, targetsAvg, targetsStdDev, paramsCount]));
140
+ worker.onmessage = function(e) {
141
+ worker.terminate();
142
+ resolve(getResult(EDA['fitLinearRegressionParamsWithDataNormalizing'], e.data));
143
+ }
144
+ });
145
+ }
146
+
147
+ export function _fitLinearRegressionParams(features, targets, paramsCount) {
148
+ return callWasm(EDA, 'fitLinearRegressionParams', [features, targets, paramsCount]);
149
+ }
150
+
151
+ export async function _fitLinearRegressionParamsInWebWorker(features, targets, paramsCount) {
152
+ return new Promise((resolve, reject) => {
153
+ const worker = new Worker(new URL('../wasm/workers/fitLinearRegressionParamsWorker.js', import.meta.url));
154
+ worker.postMessage(getCppInput(EDA['fitLinearRegressionParams'].arguments,[features, targets, paramsCount]));
155
+ worker.onmessage = function(e) {
156
+ worker.terminate();
157
+ resolve(getResult(EDA['fitLinearRegressionParams'], e.data));
158
+ }
159
+ });
160
+ }
161
+