-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcore.js
117 lines (94 loc) · 3.39 KB
/
core.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
const brain = require('brain.js');
const fs = require('fs');
const accuracy = require('./accuracy');
const utils = require('./utils');
const ACTIONS = utils.actions;
const ROUND = utils.round;
const percent = utils.percent;
const NN_OPTS = {
activation: 'sigmoid',
errorThresh: 0.01,
hiddenLayers: [7],
iterations: 2000,
};
function datasetFromFilename(filename) {
return new Promise((resolve, reject) => {
const DATA_PATH = `${__dirname}/${filename}`;
const DATA_STAT = fs.lstatSync(DATA_PATH);
if (!DATA_STAT.isFile())
reject(DATA_PATH, '- Should be a file');
const DATA_STREAM = fs.readFileSync(DATA_PATH);
const DATA_SET = JSON.parse(DATA_STREAM);
resolve(DATA_SET);
});
}
function testNN(options) {
function extractSets(dataset) {
const TRAIN_SET = dataset.slice(0, ROUND(dataset.length));
const TEST_SET = dataset.slice(ROUND(dataset.length));
return { first: TRAIN_SET, second: TEST_SET };
}
function trainNet(sets) {
const _NET = new brain.NeuralNetwork(NN_OPTS);
_NET.train(sets.first);
return { net: _NET, tests: sets.second };
}
function findAccuracy(obj) {
const ACCURACY = accuracy(obj.net, obj.tests);
console.log('Accuracy:', percent(ACCURACY), '%');
}
return new Promise((resolve, reject) => {
return datasetFromFilename(options.dataFile)
.then(extractSets)
.then(trainNet)
.then(findAccuracy)
.catch(reject);
});
}
function trainNN(options) {
return new Promise((resolve, reject) => {
reject('Not implemented yet');
});
}
function predictNN(options) {
return new Promise((resolve, reject) => {
const DATA_PATH = `${__dirname}/${options.dataFile}`;
const INPUTS_PATH = `${__dirname}/${options.inputsFile}`;
const DATA_STAT = fs.lstatSync(DATA_PATH);
const INPUTS_STAT = fs.lstatSync(INPUTS_PATH);
if (!DATA_STAT.isFile())
reject(DATA_PATH + ': Should be a file');
else if (!INPUTS_STAT.isFile())
reject(INPUTS_PATH + ': Should be a file');
const DATA_STREAM = fs.readFileSync(DATA_PATH);
const INPUTS_STREAM = fs.readFileSync(INPUTS_PATH);
const DATA_SET = JSON.parse(DATA_STREAM);
const INPUTS_SET = JSON.parse(INPUTS_STREAM);
const _NET = new brain.NeuralNetwork(NN_OPTS);
_NET.train(DATA_SET);
const GUESSES = INPUTS_SET.reduce((acc, test) => {
let guess = _NET.run(test.input);
acc.push(guess);
return acc;
}, []);
const OUTPUT_PATH = `${__dirname}/${options.outputFile}`;
const writing = fs.writeFileSync(OUTPUT_PATH, JSON.stringify(GUESSES));
resolve('Success');
});
}
module.exports = (config) => {
const OPTIONS = config.options;
const ACTION = config.action;
return new Promise((resolve, reject) => {
switch (ACTION) {
case ACTIONS.TEST:
return testNN(OPTIONS).then(resolve).catch(reject);
case ACTIONS.TRAIN:
return trainNN(OPTIONS).then(resolve).catch(reject);
case ACTIONS.PREDICT:
return predictNN(OPTIONS).then(resolve).catch(reject);
default:
reject('Unknown action');
}
});
};