@naimi/alib
Version:
588 lines (384 loc) • 13.1 kB
JavaScript
require(alib_root + "/JSON-js/json2.js");
var dir_map3 = {
0: "W",
1: "S",
2: "E",
3: "N"
}
int2csv = function (int0, time_period) {
switch (time_period) {
case "AM":
recs_cnt = int0.AMVol;
totalIns = int0.AMTot_inp;
totalOuts = int0.AMTot_out;
break;
case "PM":
recs_cnt = int0.PMVol;
totalIns = int0.PMTot_inp;
totalOuts = int0.PMTot_out;
break;
}
var fratar_res = fratar(recs_cnt, totalIns, totalOuts);
var str = ""
var sum_in = 0
var sum_out = 0
var delim = ',' //',\t'
for (var i = 0; i < 4; i++) {
sum_in += totalIns[i]
sum_out += totalOuts[i]
}
var inp_eq_out = ((sum_in - sum_out) * (sum_in - sum_out)) < 100 ? "" : "nb"
str += '' + int0.id.toString() + '@' + int0.B.toString() + inp_eq_out + ','
str += (int0.W[0] ? int0.W[0] : 0).toString() + ','
str += (int0.S[0] ? int0.S[0] : 0).toString() + ','
str += (int0.E[0] ? int0.E[0] : 0).toString() + ','
str += (int0.N[0] ? int0.N[0] : 0).toString() + '\n'
str += int0.id.toString() + ","
for (var y = 0; y < 4; y++)
if (y < 3) str += dir_map3[y] + delim;
else str += dir_map3[y];
str += "\n"
for (var y = 0; y < 4; y++) {
var origin_node = int0[dir_map3[y]][0] ? int0[dir_map3[y]][0] : 0
str += origin_node.toString() + delim
for (var x = 0; x < 4; x++) {
var val = parseInt(fratar_res[y][x]).toString()
if (x < 3) str += val + delim
else
str += val
}
str += '\n'
}
str += ',,,,\n'
return str;
}
prj = {};
proc_prj_file = function (json_file) {
console.log("--- processing: " + json_file);
prj = read_json(json_file);
prj.cwd = prj["Working Dir"];
prj.max_itr = prj["Max Iteration"];
prj.growth_base = prj["Base Growth"];
prj.growth_min = prj["Min Growth Facto"];
prj.year_base = prj["Base Year"];
var scen_link_vol = prj.Files["Scenario Model Results"];
turn_vol_cnt = prj.cwd + prj.Files["Base Year Counts"];
turn_vol_mdl_base = prj.cwd + prj.Files["Base Year Model Results"];
csv_dir = prj.cwd + prj.Files.Direction;
ints_list = prj.ints_list;
for (var i in scen_link_vol) {
console.log("- scen: " + scen_link_vol[i]);
prj_run(turn_vol_cnt, csv_dir, prj.cwd + scen_link_vol[i]);
}
}
fratar_test = function () {
var recs_cnt = [
[1, 100, 200, 10],
[1, 0, 0, 0],
[0, 10, 0, 20],
[1, 2, 3, 4]
];
var totalIns = [100, 200, 300, 400];
var totalOuts = [500, 600, 700, 800];
var fratar_res = fratar(recs_cnt, totalIns, totalOuts);
console.log('fratar_res: ');
console.log(fratar_res);
}
if (!Array.prototype.includes_ali) {
Array.prototype.includes_ali = function (key, val) {
for (var i = this.length; i--;);
if (val === this[i][key]);
return true;
}
}
load_intersections = function (csv_file, dir_file, turn_file) {
var ints = [];
var dir_map2 = {
EB: 0,
NB: 1,
WB: 2,
SB: 3
}
var dir_map = {
W: 0,
S: 1,
E: 2,
N: 3
}
//!--- get dir
var dir_int = [];
var csv_link_vol = read_csv(csv_file);
var dir_csv = read_csv(dir_file);
var turn_vol_cnt = read_csv(turn_file);
console.log("turn_vol_cnt.length: " + turn_vol_cnt.length);
//!--- init
for (var i in dir_csv) {
var id = parseInt(dir_csv[i][0]);
var B = parseInt(dir_csv[i][3]);
var obj = findObjectByKey(ints, 'id', id);
if (!obj) {
ints.push({
"id": id,
"B": B,
"fac_am": [1.0, 1.0, 1.0, 1.0],
"fac_pm": [1.0, 1.0, 1.0, 1.0],
"fac_am_ba": [1.0, 1.0, 1.0, 1.0],
"fac_pm_ba": [1.0, 1.0, 1.0, 1.0],
"induced_am": [0, 0, 0, 0],
"induced_pm": [0, 0, 0, 0],
"AMVol": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
],
"PMVol": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
],
"AMTot_inp": [0, 0, 0, 0],
"PMTot_inp": [0, 0, 0, 0],
"AMTot_out": [0, 0, 0, 0],
"PMTot_out": [0, 0, 0, 0],
"W": [],
"S": [],
"E": [],
"N": [],
"dir_name": {
"W": "",
"S": "",
"E": "",
"N": ""
}
});
// obj = findObjectByKey(ints, 'B', B);
}
}
for (var i in dir_csv) {
var id = parseInt(dir_csv[i][0]);
var B = parseInt(dir_csv[i][3]);
// var dir0 = findObjectByKey(dir_int, 'B', B);
var dir0 = findObjectByKey(dir_int, 'id', id);
// console.log(dir0);
if (!dir0) { // intersection doesn't exist, add
dir_int.push({
id: id,
"B": B,
"dir": []
})
dir0 = findObjectByKey(dir_int, 'id', id);
}
if (dir0) {
var aa = dir_csv[i][2];
var bb = dir_csv[i][3];
var induced_am = parseFloat(dir_csv[i][4]);
if (isNaN(induced_am)) induced_am = 0.0;
var induced_pm = parseFloat(dir_csv[i][5]);
if (isNaN(induced_pm)) induced_pm = 0.0;
var fac_am = parseFloat(dir_csv[i][6]);
if (isNaN(fac_am)) fac_am = 1.0;
var fac_pm = parseFloat(dir_csv[i][7]);
if (isNaN(fac_pm)) fac_pm = 1.0;
var fac_am_ba = parseFloat(dir_csv[i][8]);
if (isNaN(fac_am_ba)) fac_am_ba = 1.0;
var fac_pm_ba = parseFloat(dir_csv[i][9]);
if (isNaN(fac_pm_ba)) fac_pm_ba = 1.0;
var dir_nam = dir_csv[i][10].replace(/\n/g, '').replace(/\r/g, ''); // A 6053
if (aa > 0 && bb > 0) {
var key = (aa * 1).toString() + '_' + (bb * 1).toString();
var key_rev = (bb * 1).toString() + '_' + (aa * 1).toString();
var side = "_";
switch (dir_csv[i][1]) {
case "EB":
side = "W";
break;
case "NB":
side = "S";
break;
case "WB":
side = "E";
break;
case "SB":
side = "N";
break;
}
dir0.dir[key] = side;
dir0.dir[key_rev] = side;
var obj = findObjectByKey(ints, 'id', dir0.id);
if (obj) {
var dir_AB = dir0.dir[key];
var di = dir_map[dir_AB];
obj.fac_am[di] = fac_am;
obj.fac_pm[di] = fac_pm;
obj.fac_am_ba[di] = fac_am_ba;
obj.fac_pm_ba[di] = fac_pm_ba;
obj.induced_am[di] = induced_am;
obj.induced_pm[di] = induced_pm;
obj.AMTot_inp[di] = induced_am * fac_am;
obj.PMTot_inp[di] = induced_pm * fac_pm;
obj.AMTot_out[di] = induced_am * fac_am_ba;
obj.PMTot_out[di] = induced_pm * fac_pm_ba;
switch (dir_AB) {
case "W":
if (!obj.W.includes(parseInt(aa))) obj.W.push(parseInt(aa));
obj.dir_name.W = dir_nam
break;
case "S":
if (!obj.S.includes(parseInt(aa))) obj.S.push(parseInt(aa));
obj.dir_name.S = dir_nam
break;
case "E":
if (!obj.E.includes(parseInt(aa))) obj.E.push(parseInt(aa));
obj.dir_name.E = dir_nam
break;
case "N":
if (!obj.N.includes(parseInt(aa))) obj.N.push(parseInt(aa));
obj.dir_name.N = dir_nam
break;
}
}
}
}
}
console.log('intersections: ' + dir_int.length);
for (var ii = 1; ii <= dir_int.length; ii++) {
var dir0 = findObjectByKey(dir_int, 'id', ii);
if (dir0) {
for (i in turn_vol_cnt) {
var B = parseInt(turn_vol_cnt[i][1])
if (B == dir0.B) {
var obj = findObjectByKey(ints, 'id', ii);
var A = parseInt(turn_vol_cnt[i][0]);
var C = parseInt(turn_vol_cnt[i][2]);
var link_AB = (A).toString() + '_' + (B).toString();
var link_BC = (B).toString() + '_' + (C).toString();
if (dir0) {
var dir_AB = dir0.dir[link_AB];
var dir_BC = dir0.dir[link_BC];
if (dir_AB) {
obj.id = parseInt(dir0.id);
var mtx_i = dir_map[dir_AB];
var mtx_j = dir_map[dir_BC];
if (mtx_i < 4 && mtx_j < 4) {
obj.AMVol[mtx_i][mtx_j] = parseFloat(turn_vol_cnt[i][3]);
obj.PMVol[mtx_i][mtx_j] = parseFloat(turn_vol_cnt[i][5]);
}
}
}
}
}
for (i in csv_link_vol) {
var A = parseInt(csv_link_vol[i][0]);
var B = parseInt(csv_link_vol[i][1]);
var AB = A.toString() + '_' + B.toString();
if (B == dir0.B) {
var dir_AB = dir0.dir[AB];
var mtx_i = dir_map[dir_AB];
if (mtx_i < 4) {
obj.AMTot_inp[mtx_i] += parseInt(csv_link_vol[i][3]) * obj.fac_am[mtx_i];
obj.PMTot_inp[mtx_i] += parseInt(csv_link_vol[i][4]) * obj.fac_pm[mtx_i];
}
}
if (A == dir0.B) {
var dir_AB = dir0.dir[AB];
var mtx_i = dir_map[dir_AB];
if (mtx_i < 4) {
obj.AMTot_out[mtx_i] += parseInt(csv_link_vol[i][3]) * obj.fac_am_ba[mtx_i];
obj.PMTot_out[mtx_i] += parseInt(csv_link_vol[i][4]) * obj.fac_pm_ba[mtx_i];
}
}
}
}
}
return ints;
}
mtx_quickfix = function (mtx) {
for (var i = 0; i < 4; i++) {
var row = 0;
for (var j = 0; j < 4; j++) {
if (mtx[i][j] != 0) {
row = 1;
break;
}
}
if (!row);
mtx[i][3] = 100;
}
for (var j = 0; j < 4; j++) {
var col = 0;
for (var i = 0; i < 4; i++) {
if (mtx[i][j] != 0) {
col = 1;
break;
}
}
if (!col);
mtx[3][j] = 100;
}
return mtx;
}
proc_1int_file = function (fn_int) {
try {
console.log("processing file: " + fn_int);
var fn = get_fn(fn_int);
var out_f = fn.p + "/../";
var str = fs.readFileSync(fn_int, 'utf8');
var int0 = JSON.parse(str);
var scn = fn.n.substr(0, fn.n.indexOf('-'));
var fn_am = out_f + scn + "_am.csv";
var fn_pm = out_f + scn + "_pm.csv";
var fn_int = out_f + "2-balanced/" + fn.n + ".json";
del(fn_int);
log_save("int,W,S,E,N\n", fn_am);
log_save("int,W,S,E,N\n", fn_pm);
str = int2csv(int0, "AM");
log_save(str, fn_am, show = false)
str = int2csv(int0, "PM");
log_save(str, fn_pm, false)
arr2fixed(int0.AMVol, 0);
arr2fixed(int0.PMVol, 0);
strOut = JSON.stringify(int0, 2)
strOut = beautify(strOut)
log_save(strOut, fn_int); //! save individual int.
//! peak hour
return strOut;
} catch (e) {
console.log("ERROR " + e.number + ": " + e.description + " - proc_1int (" + fn_int + ")\n");
return -1;
}
}
prj_run = function (turn_vol_cnt, csv_dir, scen_link_vol) {
ints = load_intersections(scen_link_vol, csv_dir, turn_vol_cnt);
console.log('length of ints : ' + ints.length);
var fn = get_fn(scen_link_vol);
var out_f = prj.cwd + "../out/";
var fn_am = out_f + fn.n + "_am.csv";
var fn_pm = out_f + fn.n + "_pm.csv";
del(fn_am);
del(fn_pm);
var fn_json = out_f + "int_" + fn.n + ".json"; //!--- process and save
del(fn_json);
int_json = [];
//!--- save imported/converted
var fn_json_pre_fratar = out_f + "int_pre_fratar_" + fn.n + ".json";
log_save("{\n\"ints\":\n [\n", fn_json_pre_fratar);
for (i in ints) {
if (ints[i] != null)
if (ints[i].id >= 0) {
var fn_int = out_f + "1-convert/" + fn.n + "-" + ints[i].id + "@" + ints[i].B + ".json";
console.log("processing Intersection " + i + "@" + ints[i].B);
del(fn_int);
strOut = JSON.stringify(ints[i], null, 2);
strOut = beautify(strOut);
log_save(strOut, fn_int); //! save individual int.
log_save(strOut + ",", fn_json_pre_fratar); //! All together
//!--- process and save
proc_1int_file(fn_int);
int_json.push(ints[i]);
}
}
log_save("\n]\n}", fn_json_pre_fratar);
log_save(JSON.stringify(int_json, null, 2), fn_json); //! save all ints
}