UNPKG

@naimi/alib

Version:
588 lines (384 loc) 13.1 kB
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 }