@gracexwho/model-card-generator
Version:
Tool for generating model cards for Jupyter Notebook.
234 lines (191 loc) • 5.88 kB
JavaScript
var args = process.argv.slice(2);
var fs = require('fs');
var py = require("modified-python-program-analysis/dist/es5");
var filename = "/../lib/lale/sklearn/logistic_regression.py"
//var file = fs.readFileSync(schemaname.toString());
// @TODO: Also parse the "properties" of relevant hyperparameters!
const testFolder = '/../lib/lale/sklearn/';
var schemas = [];
filenames = fs.readdirSync(__dirname + testFolder);
filenames.forEach(file => {
file = file.replace("_", "");
file = file.replace(".py", "");
schemas.push(file);
});
//console.log(schemas);
var input = "import sklearn.logisticregression";
input = input.toLowerCase();
for (let s of schemas) {
if (input.includes(s)) {
console.log("MATCH!");
}
}
// So now for each import statement "input" want to check if each KEY of the array is in that input
//var schema = JSON.parse();
var contents = fs.readFileSync(__dirname + filename, "utf8");
var flag = false;
var hyperparams = "";
var properties = "";
var pflag = false;
var hyperflag = false;
var brackets = 0;
for (let line of contents.split("\n")) {
//console.log(line);
if (line.includes("_hyperparams_schema =")) {
hyperflag = true;
}
if (hyperflag) {
brackets += (line.match(/{/g)||[]).length
brackets -= (line.match(/}/g)||[]).length
//console.log(line);
//console.log(brackets);
//console.log();
}
if (line.includes("relevantToOptimizer")) {
flag = true;
}
if (flag) {
hyperparams += line;
}
if (line.includes("],")) {
flag = false;
}
if (line.includes("properties")) {
pflag = true;
}
if (pflag && hyperflag) {
properties = properties + line + "\n";
}
if (hyperflag && brackets == 0) {
break;
}
}
//console.log("PROPERTIES", properties);
//@TODO //CHANGE IT SO THAT PROPERTIES RELIES ON OPEN BRACKET COUNT TO END PFLAG
hyperparams = hyperparams.substr(hyperparams.indexOf('[')+1);
hyperparams = hyperparams.split("]")[0];
hyperparams = hyperparams.split(",");
var parameters = [];
for (let s of hyperparams) {
s = s.replace(/['"]+/g, "");
s = s.trim();
if (s) {
parameters.push(s);
}
}
console.log(parameters);
var openbrackets=0;
var desc = "";
var propertyflag = false;
var hyperparam_descriptions = "";
function containsAny(str, substrings) {
for (var i = 0; i != substrings.length; i++) {
var substring = "'" + substrings[i] + "'";
if (str.indexOf(substring) != - 1) {
return substring;
}
}
return null;
}
var substring = null;
var param = "";
for (let line of properties.split("\n")) {
if (!propertyflag) {
substring = containsAny(line, parameters);
if (substring != null) {
//parameters.some(function(v) {hyperparam_descriptions["'" + v + "'"] = ""; return line.indexOf("'" + v + "'") >= 0; })
propertyflag = true;
param = substring;
}
}
if (propertyflag) {
if (line.includes("{")) {
openbrackets += 1;
}
if (line.includes("}")) {
openbrackets -=1;
}
desc = desc + line + "\n";
if (openbrackets <= 0) {
propertyflag = false;
//console.log("PARAM: ", param)
//console.log(desc);
hyperparam_descriptions += desc;
var desc = "";
}
}
}
console.log(hyperparam_descriptions);
//hyperparams = hyperparams.split("]")[0];
//console.log(hyperparams);
//console.log(hyperparams.split(","));
//console.log(contents);
//console.log(schema);
//console.log("Hyperparameters: ", Object.keys(schema['allOf'][0]['properties']));
/**
let tree = py.parse(contents);
let cfg = new py.ControlFlowGraph(tree);
const analyzer = new py.DataflowAnalyzer();
const flows = analyzer.analyze(cfg).dataflows;
var lineToCode = {};
// https://github.com/nodeca/argparse
var count = 1
for (let line of contents.split("\n")) {
lineToCode[count] = line;
count += 1;
}
var hyp_first = -1;
var hyp_last = -1;
var hyperparams_schema = "";
for (let flow of flows.items) {
let fromNode = py.printNode(flow.fromNode).split("\n");
let toNode = py.printNode(flow.toNode).split("\n");
console.log(flow.fromNode.type);
console.log(fromNode[0]);
if (flow.fromNode.type == "assign") {
if (fromNode[0].includes("_hyperparams_schema")) {
hyp_first = flow.fromNode.location.first_line;
hyp_last = flow.fromNode.location.last_line;
}
}
}
**/
/**
var h = hyp_first;
var hyperparams = "";
var flag = false;
while (h <= hyp_last) {
hyperparams_schema += lineToCode[h];
h += 1;
if (lineToCode[h].includes("relevantToOptimizer")) {
flag = true;
}
if (flag) {
hyperparams += lineToCode[h];
}
if (lineToCode[h].includes("],")) {
flag = false;
}
}
//console.log(hyperparams);
hyperparams = hyperparams.split("[")[1];
hyperparams = hyperparams.split("]")[0];
hyperparams = hyperparams.split(",");
//hyperparams = hyperparams.replace(/\s/g, "");
var parameters = [];
for (let s of hyperparams) {
s = s.replace(/['"]+/g, "");
s = s.trim();
if (s) {
parameters.push(s);
}
}
console.log(parameters);
**/
/**
var chars = {'_':'','F':'f','T':'t', "'":'"'};
hyperparams_schema = hyperparams_schema.replace(/[_FT']/g, m => chars[m]);
hyperparams_schema= hyperparams_schema.substr(hyperparams_schema.indexOf('{'));
console.log(hyperparams_schema);
hyperparams_schema = JSON.parse(hyperparams_schema);
**/