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.
211 lines
3.9 KiB
211 lines
3.9 KiB
'use strict';
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
|
|
/**
|
|
* Lazily required module dependencies
|
|
*/
|
|
|
|
var utils = require('lazy-cache')(require);
|
|
var fn = require;
|
|
|
|
require = utils;
|
|
require('arr-flatten', 'flatten');
|
|
require('extend-shallow', 'extend');
|
|
require('get-value', 'get');
|
|
require('has-glob');
|
|
require('has-value', 'has');
|
|
require('is-registered');
|
|
require('is-valid-app');
|
|
require('kind-of', 'typeOf');
|
|
require('merge-value');
|
|
require('mixin-deep', 'merge');
|
|
require('read-file', 'read');
|
|
require('resolve-glob', 'resolve');
|
|
require('set-value', 'set');
|
|
require('union-value');
|
|
require = fn;
|
|
|
|
/**
|
|
* Utils
|
|
*/
|
|
|
|
utils.isValid = function(app, prop) {
|
|
return utils.isValidApp(app, 'base-data:' + prop, ['app', 'collection', 'list', 'views', 'group']);
|
|
};
|
|
|
|
/**
|
|
* Return the last item in `arr`
|
|
*/
|
|
|
|
utils.last = function(arr) {
|
|
if (!Array.isArray(arr)) {
|
|
throw new TypeError('expected value to be an array');
|
|
}
|
|
return arr[arr.length - 1];
|
|
};
|
|
|
|
/**
|
|
* Cast `val` to an array
|
|
*/
|
|
|
|
utils.arrayify = function(val) {
|
|
return val ? (Array.isArray(val) ? val : [val]) : [];
|
|
};
|
|
|
|
/**
|
|
* Iterate over registered data loaders and return any
|
|
* that match the given `filepath`
|
|
*
|
|
* @param {Array} `loaders`
|
|
* @param {String} `filepath`
|
|
* @return {Array} Returns an array of data-loader functions
|
|
*/
|
|
|
|
utils.matchLoaders = function(loaders, fp) {
|
|
var len = loaders.length, i = -1;
|
|
var ext = path.extname(fp);
|
|
var fns = [];
|
|
|
|
if (len === 0 && ext === '.json') {
|
|
return [function(str) {
|
|
return JSON.parse(str);
|
|
}];
|
|
}
|
|
|
|
while (++i < len) {
|
|
var loader = loaders[i];
|
|
var name = loader.name;
|
|
if (typeof name === 'string' && ext === utils.formatExt(name)) {
|
|
fns.push(loader.fn);
|
|
|
|
} else if (utils.typeOf(name) === 'regexp' && name.test(ext)) {
|
|
fns.push(loader.fn);
|
|
}
|
|
}
|
|
if (!fns.length) return null;
|
|
return fns;
|
|
};
|
|
|
|
/**
|
|
* format the given file extension to always start with a dot
|
|
*/
|
|
|
|
utils.formatExt = function(ext) {
|
|
if (ext.charAt(0) !== '.') {
|
|
return '.' + ext;
|
|
}
|
|
return ext;
|
|
};
|
|
|
|
/**
|
|
* Namespace a file
|
|
*/
|
|
|
|
utils.namespace = function(key, data, opts) {
|
|
var stem = utils.rename(key, data, opts);
|
|
if (opts.namespace === true && stem === 'data') {
|
|
return data;
|
|
}
|
|
|
|
var obj = {};
|
|
utils.set(obj, stem, data);
|
|
return obj;
|
|
};
|
|
|
|
/**
|
|
* Rename a file
|
|
*/
|
|
|
|
utils.rename = function(key, data, opts) {
|
|
var renameFn = utils.basename;
|
|
if (typeof opts.namespace === 'string') {
|
|
return opts.namespace;
|
|
}
|
|
if (typeof opts.namespace === 'function') {
|
|
renameFn = opts.namespace;
|
|
}
|
|
return renameFn(key, data, opts);
|
|
};
|
|
|
|
/**
|
|
* Get the basename of a filepath excluding extension.
|
|
* This is used as the default renaming function
|
|
* when `namespace` is true.
|
|
*/
|
|
|
|
utils.basename = function(fp) {
|
|
return path.basename(fp, path.extname(fp));
|
|
};
|
|
|
|
/**
|
|
* Return true if the key/value pair looks like a glob
|
|
* + options or undefined.
|
|
*/
|
|
|
|
utils.isGlob = function(key, val) {
|
|
if (typeof val === 'undefined' || utils.isObject(val)) {
|
|
return utils.hasGlob(key);
|
|
}
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Return true if an object has any of the given keys.
|
|
* @return {Boolean}
|
|
*/
|
|
|
|
utils.hasAny = function(obj, keys) {
|
|
var len = keys.length;
|
|
while (len--) {
|
|
if (obj.hasOwnProperty(keys[len])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Return true if the given value is an object.
|
|
* @return {Boolean}
|
|
*/
|
|
|
|
utils.isObject = function(val) {
|
|
if (!val || Array.isArray(val)) {
|
|
return false;
|
|
}
|
|
return typeof val === 'object';
|
|
};
|
|
|
|
/**
|
|
* Return true if the given value looks like an options
|
|
* object.
|
|
*/
|
|
|
|
var optsKeys = ['namespace', 'renameKey'];
|
|
var globKeys = [
|
|
'base',
|
|
'cwd',
|
|
'destBase',
|
|
'expand',
|
|
'ext',
|
|
'extDot',
|
|
'extend',
|
|
'flatten',
|
|
'rename',
|
|
'process',
|
|
'srcBase'
|
|
];
|
|
|
|
utils.isOptions = function(val) {
|
|
if (!utils.isObject(val)) return false;
|
|
var keys = globKeys.concat(optsKeys);
|
|
return utils.hasAny(val, keys);
|
|
};
|
|
|
|
/**
|
|
* Expose `utils` modules
|
|
*/
|
|
|
|
module.exports = utils;
|
|
|