@@ -83,7 +83,7 @@ define([
83
83
modelStep : 1 ,
84
84
step : [
85
85
{ 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' ] } ,
87
87
{ name : 'pp_fit' , label : 'Fit' } ,
88
88
{ name : 'pp_predict' , label : 'Predict' } ,
89
89
{ name : 'ml_evaluation' , label : 'Evaluation' , useApp : true , state : { modelType : 'rgs' } } ,
@@ -94,7 +94,7 @@ define([
94
94
modelStep : 1 ,
95
95
step : [
96
96
{ 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' ] } ,
98
98
{ name : 'pp_fit' , label : 'Fit' } ,
99
99
{ name : 'pp_predict' , label : 'Predict' } ,
100
100
{ name : 'ml_evaluation' , label : 'Evaluation' , useApp : true , state : { modelType : 'clf' } } ,
@@ -104,7 +104,7 @@ define([
104
104
label : 'Clustering' ,
105
105
modelStep : 0 ,
106
106
step : [
107
- { name : 'ml_clustering' , label : 'Clustering' , useApp : true } ,
107
+ { name : 'ml_clustering' , label : 'Clustering' , useApp : true , child : [ 'pp_fit' , 'pp_predict' , 'pp_transform' ] } ,
108
108
{ name : 'pp_fit' , label : 'Fit' } ,
109
109
{ name : 'pp_predict' , label : 'Predict' } ,
110
110
{ name : 'pp_transform' , label : 'Transform' } ,
@@ -115,7 +115,7 @@ define([
115
115
label : 'Dimension Reduction' ,
116
116
modelStep : 0 ,
117
117
step : [
118
- { name : 'ml_dimensionReduction' , label : 'Dimension Reduction' , useApp : true } ,
118
+ { name : 'ml_dimensionReduction' , label : 'Dimension Reduction' , useApp : true , child : [ 'pp_fit' , 'pp_transform' ] } ,
119
119
{ name : 'pp_fit' , label : 'Fit' } ,
120
120
{ name : 'pp_transform' , label : 'Transform' }
121
121
]
@@ -125,7 +125,7 @@ define([
125
125
modelStep : 1 ,
126
126
step : [
127
127
{ 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' ] } ,
129
129
{ name : 'pp_fit' , label : 'Fit' } ,
130
130
{ name : 'pp_predict' , label : 'Predict' } ,
131
131
{ name : 'ml_evaluation' , label : 'Evaluation' , useApp : true } ,
@@ -134,7 +134,22 @@ define([
134
134
}
135
135
136
136
// 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
+ }
138
153
this . mlAppList = libObj . library . item . filter ( x => x . id === 'pkg_ml' ) [ 0 ] . item ;
139
154
140
155
this . modelConfig = ML_LIBRARIES ;
@@ -268,7 +283,7 @@ define([
268
283
let appFileList = [ ] ;
269
284
// load pipeline items
270
285
tplObj . step . forEach ( ( stepObj , idx ) => {
271
- let { name, label, useApp= false , state= { } } = stepObj ;
286
+ let { name, label, useApp= false , child = [ ] , state= { } } = stepObj ;
272
287
ppTag . appendFormatLine ( `<div class="vp-pp-item" data-flag="enabled" data-name="{0}" data-seq="{1}" data-label="{2}">
273
288
<span>{3}</span>
274
289
<div class="vp-pp-item-menu">
@@ -280,7 +295,7 @@ define([
280
295
if ( useApp === true ) {
281
296
let mlObj = that . mlAppList . filter ( x => x . id === name ) [ 0 ] ;
282
297
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 } ) ;
284
299
} else {
285
300
appFileList . push ( { index : idx , name : name , file : 'vp_base/js/' + mlObj . file } ) ;
286
301
}
@@ -293,6 +308,7 @@ define([
293
308
} ;
294
309
if ( tplObj . modelStep === idx ) {
295
310
pipeObj . modelStep = true ;
311
+ pipeObj . child = child ;
296
312
}
297
313
that . state . pipeline . push ( pipeObj ) ;
298
314
// append pages
@@ -311,14 +327,15 @@ define([
311
327
// for lite and lab
312
328
if ( vpConfig . extensionType === 'lab' || vpConfig . extensionType === 'lite' ) {
313
329
appFileList . forEach ( ( obj , argIdx ) => {
314
- let MlComponent = require ( obj . file ) ;
330
+ let MlComponent = that . MlAppComponent [ obj . name ] ;
315
331
if ( MlComponent ) {
316
332
// DUP AREA: pp-1
317
- let { name, label , index, file } = obj ;
333
+ let { name, index, file } = obj ;
318
334
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 } ,
320
336
...that . state . pipeline [ index ] . state
321
337
} ) ;
338
+ mlComponent . loadState ( ) ;
322
339
// mlComponent.open($(that.wrapSelector(`.vp-pp-step-page[data-name="${appId}"]`)));
323
340
that . state . pipeline [ index ] . app = mlComponent ;
324
341
@@ -328,6 +345,10 @@ define([
328
345
that . state . modelType = mlComponent . state . modelType ;
329
346
let modelObj = that . modelConfig [ that . state . modelType ] ;
330
347
that . state . modelTypeName = modelObj . code . split ( '(' ) [ 0 ] ;
348
+
349
+ that . state . pipeline [ index ] . child . forEach ( childId => {
350
+ that . renderApp ( childId ) ;
351
+ } ) ;
331
352
}
332
353
// handle app view
333
354
that . handleAppView ( name , mlComponent ) ;
@@ -345,19 +366,25 @@ define([
345
366
let MlComponent = arguments [ argIdx ] ;
346
367
if ( MlComponent ) {
347
368
// DUP AREA: pp-1
348
- let { name, label , index, file } = obj ;
369
+ let { name, index, file } = obj ;
349
370
let mlComponent = new MlComponent ( {
350
- config : { id : name , name : label , path : file , category : 'Pipeline' , resizable : false } ,
371
+ config : { id : name , name : that . state . pipeline [ index ] . label , path : file , category : 'Pipeline' , resizable : false } ,
351
372
...that . state . pipeline [ index ] . state
352
373
} ) ;
374
+ mlComponent . loadState ( ) ;
353
375
// mlComponent.open($(that.wrapSelector(`.vp-pp-step-page[data-name="${appId}"]`)));
354
376
that . state . pipeline [ index ] . app = mlComponent ;
355
377
356
378
if ( that . state . pipeline [ index ] . modelStep === true ) {
357
379
// set default model type
380
+ that . state . model = mlComponent . state . allocateToCreation ;
358
381
that . state . modelType = mlComponent . state . modelType ;
359
382
let modelObj = that . modelConfig [ that . state . modelType ] ;
360
383
that . state . modelTypeName = modelObj . code . split ( '(' ) [ 0 ] ;
384
+
385
+ that . state . pipeline [ index ] . child . forEach ( childId => {
386
+ that . renderApp ( childId ) ;
387
+ } ) ;
361
388
}
362
389
// handle app view
363
390
that . handleAppView ( name , mlComponent ) ;
@@ -460,12 +487,69 @@ define([
460
487
label = com_util . optionToLabel ( label ) ;
461
488
optBox . appendFormatLine ( '<label for="{0}" title="{1}">{2}</label>'
462
489
, opt . name , opt . name , label ) ;
463
- let content = com_generator . renderContent ( this , opt . component [ 0 ] , opt , this . state ) ;
490
+ let tmpState = { } ;
491
+ if ( opt . value && opt . value !== '' ) {
492
+ tmpState [ opt . name ] = opt . value ;
493
+ }
494
+ let content = com_generator . renderContent ( this , opt . component [ 0 ] , opt , tmpState ) ;
464
495
optBox . appendLine ( content [ 0 ] . outerHTML ) ;
465
496
} ) ;
466
497
return optBox . toString ( ) ;
467
498
}
468
499
500
+ checkBeforeRun ( ) {
501
+ let that = this ;
502
+ var result = true ;
503
+ for ( let idx = 0 ; idx < this . state . pipeline . length ; idx ++ ) {
504
+ let ppObj = this . state . pipeline [ idx ] ;
505
+ var { name, label, useApp, app } = ppObj ;
506
+ let requiredList = [ ] ;
507
+ result = true ;
508
+ let isVisible = $ ( that . wrapSelector ( `.vp-pp-item[data-seq="${ idx } "]` ) ) . is ( ':visible' ) === true ;
509
+ let isEnabled = $ ( that . wrapSelector ( `.vp-pp-item[data-seq="${ idx } "]` ) ) . attr ( 'data-flag' ) === 'enabled' ;
510
+ if ( isVisible && isEnabled ) {
511
+ switch ( name ) {
512
+ case 'ml_dataSplit' :
513
+ requiredList = [ 'featureData' , 'targetData' ] ;
514
+ // check required data
515
+ for ( let i = 0 ; i < requiredList . length ; i ++ ) {
516
+ let reqKey = requiredList [ i ] ;
517
+ result = that . _checkIsEmpty ( $ ( app . wrapSelector ( '#' + reqKey ) ) ) ;
518
+ if ( result === false ) {
519
+ // show page and focus it
520
+ $ ( that . wrapSelector ( `.vp-pp-item[data-name="${ name } "]` ) ) . click ( ) ;
521
+ $ ( app . wrapSelector ( '#' + reqKey ) ) . focus ( ) ;
522
+ break ;
523
+ }
524
+ }
525
+ break ;
526
+ case 'ml_gridSearch' :
527
+ result = app . checkBeforeRun ( ) ;
528
+ if ( result === false ) {
529
+ // show page
530
+ $ ( that . wrapSelector ( `.vp-pp-item[data-name="${ name } "]` ) ) . click ( ) ;
531
+ break ;
532
+ }
533
+ break ;
534
+ }
535
+ }
536
+ if ( result === false ) {
537
+ break ;
538
+ }
539
+ }
540
+ return result ;
541
+
542
+ }
543
+
544
+ _checkIsEmpty ( tag ) {
545
+ let requiredFilled = true ;
546
+ // if it's empty, focus on it
547
+ if ( tag && $ ( tag ) && $ ( tag ) . val ( ) == '' ) {
548
+ requiredFilled = false ;
549
+ }
550
+ return requiredFilled ;
551
+ }
552
+
469
553
generateCodeForOptionPage ( appId ) {
470
554
let actions = this . modelEditor . getAction ( this . state . modelTypeName ) ;
471
555
let actObj = { } ;
@@ -514,24 +598,36 @@ define([
514
598
515
599
// check disabled
516
600
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' ;
601
+ let isEnabled = $ ( that . wrapSelector ( `.vp-pp-item[data-seq="${ idx } "]` ) ) . attr ( 'data- flag') === 'enabled' ;
518
602
if ( isVisible && isEnabled ) {
519
603
if ( code . toString ( ) !== '' ) {
520
604
code . appendLine ( ) ;
521
605
code . appendLine ( ) ;
522
606
}
523
- code . appendFormatLine ( "# [{0}] {1}" , stepNo , label ) ;
524
607
if ( useApp ) {
525
- code . append ( app . generateCode ( ) ) ;
608
+ let appCode = app . generateCode ( ) ;
609
+ if ( appCode instanceof Array ) {
610
+ appCode = appCode . join ( '\n' ) ;
611
+ }
612
+ if ( appCode && appCode . trim ( ) !== '' ) {
613
+ code . appendFormatLine ( "# [{0}] {1}" , stepNo ++ , label ) ;
614
+ if ( name === 'ml_evaluation' ) {
615
+ // import auto generate
616
+ code . appendLine ( app . generateImportCode ( ) . join ( '\n' ) ) ;
617
+ }
618
+ code . append ( appCode ) ;
619
+ }
526
620
// save state
527
621
that . state . pipeline [ idx ] . state = app . state ;
528
622
} else {
529
623
let ppResult = that . generateCodeForOptionPage ( name ) ;
530
- code . append ( ppResult . code ) ;
624
+ if ( ppResult && ppResult ?. code ?. trim ( ) !== '' ) {
625
+ code . appendFormatLine ( "# [{0}] {1}" , stepNo ++ , label ) ;
626
+ code . append ( ppResult . code ) ;
627
+ }
531
628
// save state
532
629
that . state . pipeline [ idx ] . state = ppResult . state ;
533
630
}
534
- stepNo ++ ;
535
631
}
536
632
} ) ;
537
633
0 commit comments