StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.7 KiB
135 lines
2.7 KiB
4 years ago
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* ```sh
|
||
|
* $ gen
|
||
|
* $ gen default
|
||
|
* $ gen foo
|
||
|
* $ gen foo:default
|
||
|
* $ gen foo,bar
|
||
|
* $ gen foo bar
|
||
|
* $ gen foo bar:baz
|
||
|
* $ gen foo:bar,baz
|
||
|
* $ gen foo.bar
|
||
|
* $ gen foo.bar:baz
|
||
|
* $ gen foo.bar baz
|
||
|
* $ gen foo.bar baz.qux
|
||
|
* $ gen foo.bar:baz qux.fez:default
|
||
|
* ```
|
||
|
*/
|
||
|
|
||
|
// foo:bar,baz
|
||
|
exports.parse = function(app, name, tasks) {
|
||
|
if (tasks && !tasks.length) {
|
||
|
tasks = undefined;
|
||
|
}
|
||
|
|
||
|
if (Array.isArray(name)) {
|
||
|
var arr = name.reduce(function(acc, val) {
|
||
|
return acc.concat(exports.parse(app, val));
|
||
|
}, []);
|
||
|
|
||
|
return arr.reduce(function(acc, obj) {
|
||
|
var prev = acc[acc.length - 1];
|
||
|
if (prev && prev.name === obj.name) {
|
||
|
prev.tasks = prev.tasks.concat(obj.tasks);
|
||
|
return acc;
|
||
|
}
|
||
|
return acc.concat(obj);
|
||
|
}, []);
|
||
|
}
|
||
|
|
||
|
if (!tasks && /:/.test(name)) {
|
||
|
return exports.parse.apply(null, [app].concat(name.split(':')));
|
||
|
}
|
||
|
|
||
|
if (typeof tasks === 'string') {
|
||
|
tasks = tasks.split(',');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* If `name` and `tasks` was passed, call process, e.g:
|
||
|
*
|
||
|
* ```sh
|
||
|
* $ gen foo:default
|
||
|
* $ gen foo bar:baz
|
||
|
* $ gen foo:bar,baz
|
||
|
* $ gen foo.bar:baz
|
||
|
* $ gen foo.bar:baz qux.fez:default
|
||
|
* ```
|
||
|
*/
|
||
|
|
||
|
if (tasks) {
|
||
|
return [{name: name, tasks: tasks}];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Otherwise, we have one of the following:
|
||
|
*
|
||
|
* ```sh
|
||
|
* $ gen
|
||
|
* $ gen default
|
||
|
* $ gen foo
|
||
|
* $ gen foo,bar,baz
|
||
|
* $ gen foo bar
|
||
|
* $ gen foo.bar
|
||
|
* $ gen foo.bar baz
|
||
|
* $ gen foo.bar baz.qux
|
||
|
* ```
|
||
|
*/
|
||
|
|
||
|
if (typeof name === 'string') {
|
||
|
name = name.split(',');
|
||
|
}
|
||
|
|
||
|
return name.reduce(function(acc, str) {
|
||
|
var obj = exports.process(app, str);
|
||
|
var prev = acc[acc.length - 1];
|
||
|
if (prev && prev.name === obj.name) {
|
||
|
prev.tasks = prev.tasks.concat(obj.tasks);
|
||
|
return acc;
|
||
|
}
|
||
|
return acc.concat(obj);
|
||
|
}, []);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* All we have left at this point is ambiguous args
|
||
|
* that could represent tasks or generators:
|
||
|
*
|
||
|
* ```sh
|
||
|
* $ gen
|
||
|
* $ gen default
|
||
|
* $ gen foo
|
||
|
* $ gen foo bar
|
||
|
* ```
|
||
|
*/
|
||
|
|
||
|
exports.process = function(app, str) {
|
||
|
var generator;
|
||
|
if (app.tasks.hasOwnProperty(str)) {
|
||
|
return {name: app.isDefault ? 'default' : 'this', tasks: [str]};
|
||
|
}
|
||
|
|
||
|
if (/\./.test(str) || app.generators.hasOwnProperty(str)) {
|
||
|
return {name: app.isDefault ? ('default.' + str) : str, tasks: ['default']};
|
||
|
}
|
||
|
|
||
|
// `app` is **not** the default generator
|
||
|
if (!app.isDefault) {
|
||
|
generator = app.base.getGenerator('default');
|
||
|
if (generator) {
|
||
|
return exports.process(generator, str);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// `app` is the default generator
|
||
|
generator = app.base.getGenerator(str);
|
||
|
if (generator) {
|
||
|
return {name: generator.name, tasks: ['default'], app: generator};
|
||
|
}
|
||
|
|
||
|
// unresolved argument
|
||
|
return {_: [str]};
|
||
|
};
|