@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.
- package/.vscode/settings.json +5 -0
- package/CHANGELOG.md +12 -0
- package/README.md +1 -0
- package/dist/05e5e0770f54f07e9474.wasm +0 -0
- package/dist/111.js +2 -0
- package/dist/111.js.map +1 -0
- package/dist/153.js +2 -0
- package/dist/153.js.map +1 -0
- package/dist/23.js +2 -2
- package/dist/23.js.map +1 -0
- package/dist/234.js +2 -0
- package/dist/234.js.map +1 -0
- package/dist/242.js +2 -0
- package/dist/242.js.map +1 -0
- package/dist/260.js +2 -0
- package/dist/260.js.map +1 -0
- package/dist/317.js +2 -0
- package/dist/317.js.map +1 -0
- package/dist/33.js +2 -0
- package/dist/33.js.map +1 -0
- package/dist/348.js +2 -0
- package/dist/348.js.map +1 -0
- package/dist/377.js +2 -0
- package/dist/377.js.map +1 -0
- package/dist/412.js +2 -0
- package/dist/412.js.map +1 -0
- package/dist/415.js +2 -0
- package/dist/415.js.map +1 -0
- package/dist/531.js +2 -0
- package/dist/531.js.map +1 -0
- package/dist/583.js +2 -0
- package/dist/583.js.map +1 -0
- package/dist/589.js +2 -0
- package/dist/589.js.map +1 -0
- package/dist/603.js +2 -0
- package/dist/603.js.map +1 -0
- package/dist/656.js +2 -0
- package/dist/656.js.map +1 -0
- package/dist/682.js +2 -0
- package/dist/682.js.map +1 -0
- package/dist/705.js +2 -0
- package/dist/705.js.map +1 -0
- package/dist/731.js +2 -0
- package/dist/731.js.map +1 -0
- package/dist/738.js +3 -0
- package/dist/738.js.map +1 -0
- package/dist/763.js +2 -0
- package/dist/763.js.map +1 -0
- package/dist/778.js +2 -0
- package/dist/778.js.map +1 -0
- package/dist/783.js +2 -0
- package/dist/783.js.map +1 -0
- package/dist/793.js +2 -0
- package/dist/793.js.map +1 -0
- package/dist/907.js +2 -0
- package/dist/907.js.map +1 -0
- package/dist/91.js +2 -0
- package/dist/91.js.map +1 -0
- package/dist/950.js +2 -0
- package/dist/950.js.map +1 -0
- package/dist/package-test.js +2 -2
- package/dist/package-test.js.map +1 -0
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -0
- package/package.json +92 -92
- package/scripts/command.txt +1 -1
- package/scripts/func.json +1 -1
- package/scripts/module.json +1 -1
- package/src/missing-values-imputation/ui.ts +80 -66
- package/src/package.ts +288 -38
- package/src/pls/pls-tools.ts +16 -15
- package/src/regression.ts +232 -0
- package/src/svm.ts +78 -38
- package/tsconfig.json +4 -4
- package/wasm/EDA.js +65 -1
- package/wasm/EDA.wasm +0 -0
- package/wasm/EDAAPI.js +30 -0
- package/wasm/EDAForWebWorker.js +1 -1
- package/wasm/callWasm.js +384 -393
- package/wasm/regression-api.cpp +66 -0
- package/wasm/regression.h +128 -0
- package/wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js +13 -0
- package/wasm/workers/fitLinearRegressionParamsWorker.js +13 -0
- package/webpack.config.js +1 -1
- package/dist/208.js +0 -2
- package/dist/221.js +0 -2
- package/dist/231.js +0 -2
- package/dist/261.js +0 -2
- package/dist/282.js +0 -2
- package/dist/334.js +0 -2
- package/dist/356.js +0 -2
- package/dist/36.js +0 -2
- package/dist/367.js +0 -2
- package/dist/374.js +0 -2
- package/dist/40.js +0 -2
- package/dist/413.js +0 -2
- package/dist/42.js +0 -2
- package/dist/427.js +0 -2
- package/dist/467.js +0 -2
- package/dist/523.js +0 -3
- package/dist/533.js +0 -2
- package/dist/590.js +0 -2
- package/dist/65.js +0 -2
- package/dist/694.js +0 -2
- package/dist/729.js +0 -2
- package/dist/796.js +0 -2
- package/dist/902.js +0 -2
- package/dist/910.js +0 -2
- package/dist/972.js +0 -2
- package/dist/f5343e2c2e15952ce916.wasm +0 -0
- /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 = '
|
|
69
|
-
const KERNEL = '
|
|
70
|
-
const KERNEL_PARAMS = '
|
|
71
|
-
const KERNEL_PARAM_1 = '
|
|
72
|
-
const KERNEL_PARAM_2 = '
|
|
73
|
-
const FEATURES_COUNT_NAME = '
|
|
74
|
-
const TRAIN_SAMPLES_COUNT_NAME = '
|
|
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,
|
|
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
|
-
|
|
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,
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
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
|
|
475
|
-
res
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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":
|
|
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
|
+
|