Skip to content

Commit fa276fe

Browse files
authored
Merge pull request #236 from minjk-bl/devops
Hotfix for v2.4.6
2 parents 35c7b81 + 19d056a commit fa276fe

File tree

1 file changed

+109
-18
lines changed

1 file changed

+109
-18
lines changed

visualpython/js/m_ml/Pipeline.js

Lines changed: 109 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ define([
8383
modelStep: 1,
8484
step: [
8585
{ name: 'ml_dataSplit', label: 'Data Split', useApp: true },
86-
{ name: 'ml_regression', label: 'Regressor', useApp: true },
86+
{ name: 'ml_regression', label: 'Regressor', useApp: true, child: ['pp_fit', 'pp_predict'] },
8787
{ name: 'pp_fit', label: 'Fit' },
8888
{ name: 'pp_predict', label: 'Predict' },
8989
{ name: 'ml_evaluation', label: 'Evaluation', useApp: true, state: { modelType: 'rgs' } },
@@ -94,7 +94,7 @@ define([
9494
modelStep: 1,
9595
step: [
9696
{ name: 'ml_dataSplit', label: 'Data Split', useApp: true },
97-
{ name: 'ml_classification', label: 'Classifier', useApp: true },
97+
{ name: 'ml_classification', label: 'Classifier', useApp: true, child: ['pp_fit', 'pp_predict'] },
9898
{ name: 'pp_fit', label: 'Fit' },
9999
{ name: 'pp_predict', label: 'Predict' },
100100
{ name: 'ml_evaluation', label: 'Evaluation', useApp: true, state: { modelType: 'clf' } },
@@ -104,7 +104,7 @@ define([
104104
label: 'Clustering',
105105
modelStep: 0,
106106
step: [
107-
{ name: 'ml_clustering', label: 'Clustering', useApp: true },
107+
{ name: 'ml_clustering', label: 'Clustering', useApp: true, child: ['pp_fit', 'pp_predict', 'pp_transform'] },
108108
{ name: 'pp_fit', label: 'Fit' },
109109
{ name: 'pp_predict', label: 'Predict' },
110110
{ name: 'pp_transform', label: 'Transform' },
@@ -115,7 +115,7 @@ define([
115115
label: 'Dimension Reduction',
116116
modelStep: 0,
117117
step: [
118-
{ name: 'ml_dimensionReduction', label: 'Dimension Reduction', useApp: true },
118+
{ name: 'ml_dimensionReduction', label: 'Dimension Reduction', useApp: true, child: ['pp_fit', 'pp_transform'] },
119119
{ name: 'pp_fit', label: 'Fit' },
120120
{ name: 'pp_transform', label: 'Transform' }
121121
]
@@ -125,7 +125,7 @@ define([
125125
modelStep: 1,
126126
step: [
127127
{ name: 'ml_dataSplit', label: 'Data Split', useApp: true },
128-
{ name: 'ml_gridSearch', label: 'GridSearch', useApp: true },
128+
{ name: 'ml_gridSearch', label: 'GridSearch', useApp: true, child: ['pp_fit', 'pp_predict'] },
129129
{ name: 'pp_fit', label: 'Fit' },
130130
{ name: 'pp_predict', label: 'Predict' },
131131
{ name: 'ml_evaluation', label: 'Evaluation', useApp: true },
@@ -134,7 +134,22 @@ define([
134134
}
135135

136136
// menu libraries for ml
137-
let libObj = JSON.parse(librariesJson);
137+
let libObj = {};
138+
if (vpConfig.extensionType === 'lab' || vpConfig.extensionType === 'lite') {
139+
libObj = librariesJson;
140+
141+
this.MlAppComponent = {};
142+
this.MlAppComponent['ml_dataSplit'] = require('./dataSplit');
143+
this.MlAppComponent['ml_dataPrep'] = require('./DataPrep');
144+
this.MlAppComponent['ml_regression'] = require('./Regression');
145+
this.MlAppComponent['ml_classification'] = require('./Classification');
146+
this.MlAppComponent['ml_clustering'] = require('./Clustering');
147+
this.MlAppComponent['ml_dimensionReduction'] = require('./DimensionReduction');
148+
this.MlAppComponent['ml_gridSearch'] = require('./GridSearch');
149+
this.MlAppComponent['ml_evaluation'] = require('./evaluation');
150+
} else {
151+
libObj = JSON.parse(librariesJson);
152+
}
138153
this.mlAppList = libObj.library.item.filter(x => x.id === 'pkg_ml')[0].item;
139154

140155
this.modelConfig = ML_LIBRARIES;
@@ -268,7 +283,7 @@ define([
268283
let appFileList = [];
269284
// load pipeline items
270285
tplObj.step.forEach((stepObj, idx) => {
271-
let { name, label, useApp=false, state={} } = stepObj;
286+
let { name, label, useApp=false, child=[], state={} } = stepObj;
272287
ppTag.appendFormatLine(`<div class="vp-pp-item" data-flag="enabled" data-name="{0}" data-seq="{1}" data-label="{2}">
273288
<span>{3}</span>
274289
<div class="vp-pp-item-menu">
@@ -280,7 +295,7 @@ define([
280295
if (useApp === true) {
281296
let mlObj = that.mlAppList.filter(x => x.id === name)[0];
282297
if (vpConfig.extensionType === 'lab' || vpConfig.extensionType === 'lite') {
283-
appFileList.push({ index: idx, name: name, file: './' + mlObj.file});
298+
appFileList.push({ index: idx, name: name, file: 'vp_base/js/' + mlObj.file});
284299
} else {
285300
appFileList.push({ index: idx, name: name, file: 'vp_base/js/' + mlObj.file});
286301
}
@@ -293,6 +308,7 @@ define([
293308
};
294309
if (tplObj.modelStep === idx) {
295310
pipeObj.modelStep = true;
311+
pipeObj.child = child;
296312
}
297313
that.state.pipeline.push(pipeObj);
298314
// append pages
@@ -311,14 +327,15 @@ define([
311327
// for lite and lab
312328
if (vpConfig.extensionType === 'lab' || vpConfig.extensionType === 'lite') {
313329
appFileList.forEach((obj, argIdx) => {
314-
let MlComponent = require(obj.file);
330+
let MlComponent = that.MlAppComponent[obj.name];
315331
if (MlComponent) {
316332
// DUP AREA: pp-1
317-
let { name, label, index, file } = obj;
333+
let { name, index, file } = obj;
318334
let mlComponent = new MlComponent({
319-
config: { id: name, name: label, path: file, category: 'Pipeline', resizable: false },
335+
config: { id: name, name: that.state.pipeline[index].label, path: file, category: 'Pipeline', resizable: false },
320336
...that.state.pipeline[index].state
321337
});
338+
mlComponent.loadState();
322339
// mlComponent.open($(that.wrapSelector(`.vp-pp-step-page[data-name="${appId}"]`)));
323340
that.state.pipeline[index].app = mlComponent;
324341

@@ -347,9 +364,10 @@ define([
347364
// DUP AREA: pp-1
348365
let { name, label, index, file } = obj;
349366
let mlComponent = new MlComponent({
350-
config: { id: name, name: label, path: file, category: 'Pipeline', resizable: false },
367+
config: { id: name, name: that.state.pipeline[index].label, path: file, category: 'Pipeline', resizable: false },
351368
...that.state.pipeline[index].state
352369
});
370+
mlComponent.loadState();
353371
// mlComponent.open($(that.wrapSelector(`.vp-pp-step-page[data-name="${appId}"]`)));
354372
that.state.pipeline[index].app = mlComponent;
355373

@@ -358,6 +376,10 @@ define([
358376
that.state.modelType = mlComponent.state.modelType;
359377
let modelObj = that.modelConfig[that.state.modelType];
360378
that.state.modelTypeName = modelObj.code.split('(')[0];
379+
380+
that.state.pipeline[index].child.forEach(childId => {
381+
that.renderApp(childId);
382+
});
361383
}
362384
// handle app view
363385
that.handleAppView(name, mlComponent);
@@ -460,12 +482,69 @@ define([
460482
label = com_util.optionToLabel(label);
461483
optBox.appendFormatLine('<label for="{0}" title="{1}">{2}</label>'
462484
, opt.name, opt.name, label);
463-
let content = com_generator.renderContent(this, opt.component[0], opt, this.state);
485+
let tmpState = {};
486+
if (opt.value && opt.value !== '') {
487+
tmpState[opt.name] = opt.value;
488+
}
489+
let content = com_generator.renderContent(this, opt.component[0], opt, tmpState);
464490
optBox.appendLine(content[0].outerHTML);
465491
});
466492
return optBox.toString();
467493
}
468494

495+
checkBeforeRun() {
496+
let that = this;
497+
var result = true;
498+
for (let idx = 0; idx < this.state.pipeline.length; idx++) {
499+
let ppObj = this.state.pipeline[idx];
500+
var { name, label, useApp, app } = ppObj;
501+
let requiredList = [];
502+
result = true;
503+
let isVisible = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).is(':visible') === true;
504+
let isEnabled = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).attr('data-flag') === 'enabled';
505+
if (isVisible && isEnabled) {
506+
switch (name) {
507+
case 'ml_dataSplit':
508+
requiredList = ['featureData', 'targetData'];
509+
// check required data
510+
for (let i = 0; i < requiredList.length; i++) {
511+
let reqKey = requiredList[i];
512+
result = that._checkIsEmpty($(app.wrapSelector('#' + reqKey)));
513+
if (result === false) {
514+
// show page and focus it
515+
$(that.wrapSelector(`.vp-pp-item[data-name="${name}"]`)).click();
516+
$(app.wrapSelector('#' + reqKey)).focus();
517+
break;
518+
}
519+
}
520+
break;
521+
case 'ml_gridSearch':
522+
result = app.checkBeforeRun();
523+
if (result === false) {
524+
// show page
525+
$(that.wrapSelector(`.vp-pp-item[data-name="${name}"]`)).click();
526+
break;
527+
}
528+
break;
529+
}
530+
}
531+
if (result === false) {
532+
break;
533+
}
534+
}
535+
return result;
536+
537+
}
538+
539+
_checkIsEmpty(tag) {
540+
let requiredFilled = true;
541+
// if it's empty, focus on it
542+
if (tag && $(tag) && $(tag).val() == '') {
543+
requiredFilled = false;
544+
}
545+
return requiredFilled;
546+
}
547+
469548
generateCodeForOptionPage(appId) {
470549
let actions = this.modelEditor.getAction(this.state.modelTypeName);
471550
let actObj = {};
@@ -514,24 +593,36 @@ define([
514593

515594
// check disabled
516595
let isVisible = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).is(':visible') === true;
517-
let isEnabled = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).data('flag') === 'enabled';
596+
let isEnabled = $(that.wrapSelector(`.vp-pp-item[data-seq="${idx}"]`)).attr('data-flag') === 'enabled';
518597
if (isVisible && isEnabled) {
519598
if (code.toString() !== '') {
520599
code.appendLine();
521600
code.appendLine();
522601
}
523-
code.appendFormatLine("# [{0}] {1}", stepNo, label);
524602
if (useApp) {
525-
code.append(app.generateCode());
603+
let appCode = app.generateCode();
604+
if (appCode instanceof Array) {
605+
appCode = appCode.join('\n');
606+
}
607+
if (appCode && appCode.trim() !== '') {
608+
code.appendFormatLine("# [{0}] {1}", stepNo++, label);
609+
if (name === 'ml_evaluation') {
610+
// import auto generate
611+
code.appendLine(app.generateImportCode().join('\n'));
612+
}
613+
code.append(appCode);
614+
}
526615
// save state
527616
that.state.pipeline[idx].state = app.state;
528617
} else {
529618
let ppResult = that.generateCodeForOptionPage(name);
530-
code.append(ppResult.code);
619+
if (ppResult && ppResult?.code?.trim() !== '') {
620+
code.appendFormatLine("# [{0}] {1}", stepNo++, label);
621+
code.append(ppResult.code);
622+
}
531623
// save state
532624
that.state.pipeline[idx].state = ppResult.state;
533625
}
534-
stepNo++;
535626
}
536627
});
537628

0 commit comments

Comments
 (0)