@@ -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