Skip to content

Commit 996de8c

Browse files
committed
Memory reduction and speed optimization
1 parent bc0af2a commit 996de8c

File tree

4 files changed

+161
-59
lines changed

4 files changed

+161
-59
lines changed

src/clusternetwork.js

+101-42
Original file line numberDiff line numberDiff line change
@@ -871,11 +871,27 @@ var hivtrace_cluster_network_graph = function (
871871
mapped_clusters = _.omit(mapped_clusters, self.exclude_cluster_ids);
872872
}
873873

874-
d_clusters.children = _.map(mapped_clusters, (value, key) => ({
874+
let all_clusters = _.map(mapped_clusters, (value, key) => ({
875875
cluster_id: key,
876876
children: value,
877877
}));
878878

879+
if (_.size(mapped_clusters) > max_points_to_render) {
880+
let reduced_clusters = _.chain(all_clusters)
881+
.pairs()
882+
.sortBy((d) => (-d.children ? d.children.length : 0))
883+
.value();
884+
d_clusters.children = [];
885+
for (let i = 0; i < max_points_to_render; i++) {
886+
d_clusters.children.push({
887+
cluster_id: reduced_clusters[i][0],
888+
children: reduced_clusters[i][1],
889+
});
890+
}
891+
} else {
892+
d_clusters.children = all_clusters;
893+
}
894+
879895
var treemap = packed
880896
? d3.layout
881897
.pack()
@@ -895,10 +911,7 @@ var hivtrace_cluster_network_graph = function (
895911
.ratio(1);
896912

897913
var clusters = treemap.nodes(d_clusters);
898-
_.each(clusters, (c) => {
899-
//c.fixed = true;
900-
});
901-
return clusters;
914+
return [clusters, all_clusters];
902915
}
903916

904917
function prepare_data_to_graph() {
@@ -1489,16 +1502,11 @@ var hivtrace_cluster_network_graph = function (
14891502
function default_layout(packed) {
14901503
// let's create an array of clusters from the json
14911504

1492-
var init_layout = get_initial_xy(packed);
1505+
let [init_layout, cluster_set] = get_initial_xy(packed);
14931506

14941507
if (self.clusters.length === 0) {
1495-
self.clusters = init_layout.filter((v, i, obj) => {
1496-
if (!(typeof v.cluster_id === "undefined")) {
1497-
return true;
1498-
}
1499-
return false;
1500-
});
1501-
} else {
1508+
self.clusters = cluster_set;
1509+
} /*else {
15021510
var coordinate_update = {};
15031511
_.each(self.clusters, (c) => {
15041512
coordinate_update[c.cluster_id] = c;
@@ -1508,18 +1516,28 @@ var hivtrace_cluster_network_graph = function (
15081516
_.extendOwn(coordinate_update[c.cluster_id], c);
15091517
}
15101518
});
1511-
}
1519+
}*/
15121520

15131521
//var sizes = network_layout.size();
15141522

15151523
var set_init_coords = packed
15161524
? function (n) {
1517-
n.x += n.r * 0.5;
1518-
n.y += n.r * 0.5;
1525+
if ("x" in n) {
1526+
n.x += n.r * 0.5;
1527+
n.y += n.r * 0.5;
1528+
} else {
1529+
n.x = Math.random() * self.width;
1530+
n.y = Math.random() * self.height;
1531+
}
15191532
}
15201533
: function (n) {
1521-
n.x += n.dx * 0.5;
1522-
n.y += n.dy * 0.5;
1534+
if ("x" in n) {
1535+
n.x += n.dx * 0.5;
1536+
n.y += n.dy * 0.5;
1537+
} else {
1538+
n.x = Math.random() * self.width;
1539+
n.y = Math.random() * self.height;
1540+
}
15231541
};
15241542

15251543
_.each([self.nodes, self.clusters], (list) => {
@@ -2780,7 +2798,7 @@ var hivtrace_cluster_network_graph = function (
27802798
console.log(err);
27812799
}
27822800

2783-
self._aux_populate_category_menus = function () {
2801+
self._aux_populate_category_menus = function (subset) {
27842802
if (button_bar_ui) {
27852803
// decide if the variable can be considered categorical by examining its range
27862804

@@ -2790,22 +2808,28 @@ var hivtrace_cluster_network_graph = function (
27902808
graph_data[kGlobals.network.GraphAttrbuteID],
27912809
self._aux_populate_category_fields
27922810
),
2793-
(d) =>
2811+
(d, k) =>
27942812
/*if (d.discrete) {
27952813
console.log (d["value_range"].length);
27962814
}*/
2797-
d.discrete &&
2798-
"value_range" in d &&
2799-
/*d["value_range"].length <= kGlobals.MaximumValuesInCategories &&*/
2800-
!d["_hidden_"]
2815+
{
2816+
return (
2817+
d.discrete &&
2818+
"value_range" in d &&
2819+
/*d["value_range"].length <= kGlobals.MaximumValuesInCategories &&*/
2820+
!d["_hidden_"] &&
2821+
(!subset || subset.has(d["raw_attribute_key"]))
2822+
);
2823+
}
28012824
);
28022825

28032826
var valid_shapes = _.filter(
28042827
valid_cats,
28052828
(d) =>
2806-
(d.discrete && d.dimension <= 7) ||
2807-
(d["raw_attribute_key"] in self.networkShapeScheme &&
2808-
!d["_hidden_"])
2829+
(!subset || subset.has(d["raw_attribute_key"])) &&
2830+
((d.discrete && d.dimension <= 7) ||
2831+
(d["raw_attribute_key"] in self.networkShapeScheme &&
2832+
!d["_hidden_"]))
28092833
);
28102834

28112835
// sort values alphabetically for consistent coloring
@@ -2830,13 +2854,15 @@ var hivtrace_cluster_network_graph = function (
28302854

28312855
function determine_scaling(d, values, scales) {
28322856
var low_var = Infinity;
2857+
d["value_range"] = d3.extent(values);
28332858
_.each(scales, (scl, i) => {
2834-
d["value_range"] = d3.extent(values);
28352859
var bins = _.map(_.range(color_stops), () => 0);
28362860
scl.range([0, color_stops - 1]).domain(d["value_range"]);
2837-
_.each(values, (v) => {
2838-
bins[Math.floor(scl(v))]++;
2839-
});
2861+
2862+
let N = values.length;
2863+
while (N--) {
2864+
bins[~~scl(values[N])]++; // truncate the value
2865+
}
28402866

28412867
var mean = values.length / color_stops;
28422868
var vrnc = _.reduce(
@@ -2854,12 +2880,25 @@ var hivtrace_cluster_network_graph = function (
28542880
d["raw_attribute_key"] = k;
28552881

28562882
if (d.type === "Number" || d.type === "Number-categories") {
2857-
var values = _.filter(
2883+
var values = [];
2884+
2885+
let N = self.json.Nodes.length;
2886+
while (N--) {
2887+
const v = self.attribute_node_value_by_id(
2888+
self.json.Nodes[N],
2889+
k,
2890+
d.type === "Number"
2891+
);
2892+
if (_.isNumber(v)) {
2893+
values.push(v);
2894+
}
2895+
}
2896+
/*_.filter(
28582897
_.map(graph_data.Nodes, (nd) =>
28592898
self.attribute_node_value_by_id(nd, k, d.type === "Number")
28602899
),
28612900
(v) => _.isNumber(v)
2862-
);
2901+
);*/
28632902
// automatically determine the scale and see what spaces the values most evenly
28642903
const range = d3.extent(values);
28652904

@@ -3629,6 +3668,13 @@ var hivtrace_cluster_network_graph = function (
36293668

36303669
if (container) {
36313670
node_list = node_list || self.aggregate_indvidual_level_records();
3671+
3672+
const N = node_list.length;
3673+
3674+
if (node_list.length > max_nodes_to_show) {
3675+
node_list = node_list.slice(0, max_nodes_to_show);
3676+
}
3677+
36323678
var column_ids = self._extract_exportable_attributes(true);
36333679

36343680
self.displayed_node_subset = _.filter(
@@ -3819,7 +3865,8 @@ var hivtrace_cluster_network_graph = function (
38193865
[table_headers],
38203866
table_rows,
38213867
container,
3822-
'Showing <span class="badge" data-hivtrace-ui-role="table-count-shown">--</span>/<span class="badge" data-hivtrace-ui-role="table-count-total">--</span> network entities'
3868+
'Showing <span class="badge" data-hivtrace-ui-role="table-count-shown">--</span>/<span class="badge" data-hivtrace-ui-role="table-count-total">--</span> network entities <span class="label label-warning" data-hivtrace-ui-role="table-count-warning"></span>',
3869+
N
38233870
);
38243871
}
38253872
};
@@ -3965,13 +4012,16 @@ var hivtrace_cluster_network_graph = function (
39654012
headers,
39664013
rows,
39674014
container,
3968-
table_caption
4015+
table_caption,
4016+
ND
39694017
) {
39704018
container = container || nodesTab.getNodeTable();
39714019

39724020
if (container) {
39734021
node_list = node_list || self.nodes;
39744022

4023+
ND = ND || node_list.length;
4024+
39754025
if (!headers) {
39764026
headers = [
39774027
[
@@ -4065,8 +4115,8 @@ var hivtrace_cluster_network_graph = function (
40654115
rows,
40664116
true,
40674117
table_caption,
4068-
clustersOfInterest.get_editor()
4069-
// rows
4118+
clustersOfInterest.get_editor(),
4119+
ND
40704120
);
40714121
}
40724122
};
@@ -5802,13 +5852,13 @@ var hivtrace_cluster_network_graph = function (
58025852
12
58035853
);
58045854

5805-
try {
5855+
/*try {
58065856
if (self.isPrimaryGraph) {
58075857
self.priority_groups_compute_node_membership();
58085858
}
58095859
} catch (err) {
58105860
console.log(err);
5811-
}
5861+
}*/
58125862
}
58135863

58145864
if (
@@ -6551,11 +6601,19 @@ var hivtrace_cluster_network_graph = function (
65516601

65526602
if (d["type"] === "String") {
65536603
d.discrete = true;
6554-
d["value_range"] = _.keys(
6604+
d["value_range"] = new Set();
6605+
6606+
graph_data.Nodes.forEach((nd) => {
6607+
d["value_range"].add(self.attribute_node_value_by_id(nd, k));
6608+
});
6609+
6610+
/*_.keys(
65556611
_.countBy(graph_data.Nodes, (nd) =>
65566612
self.attribute_node_value_by_id(nd, k)
65576613
)
6558-
);
6614+
);*/
6615+
6616+
d["value_range"] = [...d["value_range"]];
65596617
d["dimension"] = d["value_range"].length;
65606618
}
65616619
return d;
@@ -7772,7 +7830,8 @@ var hivtrace_cluster_network_graph = function (
77727830

77737831
var l_scale = 5000, // link scale
77747832
graph_data = self.json, // the raw JSON network object
7775-
max_points_to_render = 2048,
7833+
max_points_to_render = 1536,
7834+
max_nodes_to_show = 16384,
77767835
singletons = 0,
77777836
open_cluster_queue = [],
77787837
currently_displayed_objects,

src/hiv_tx_network.js

+30-9
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,13 @@ class HIVTxNetwork {
3737
**/
3838
this.primary_key = _.isFunction(primary_key_function)
3939
? primary_key_function
40-
: (node) => node.id.split("|")[0];
41-
40+
: (node) => {
41+
const i = node.id.indexOf("|");
42+
if (i >= 0) {
43+
return node.id.substr(0, i);
44+
}
45+
return node.id;
46+
};
4247
this.tabulate_multiple_sequences();
4348

4449
/** initialize UI/UX elements */
@@ -1378,7 +1383,6 @@ class HIVTxNetwork {
13781383
const nodeID2idx = {};
13791384

13801385
_.each(this.json.Nodes, (n, i) => {
1381-
this.node_id_to_object[n.id] = n;
13821386
nodeID2idx[n.id] = i;
13831387
});
13841388

@@ -1757,17 +1761,26 @@ class HIVTxNetwork {
17571761
priority_groups_compute_node_membership() {
17581762
const pg_nodesets = [];
17591763

1764+
let node2set = {};
1765+
17601766
_.each(this.defined_priority_groups, (g) => {
17611767
pg_nodesets.push([
17621768
g.name,
17631769
g.createdBy === kGlobals.CDCCOICreatedBySystem,
1764-
new Set(_.map(g.nodes, (n) => n.name)),
17651770
]);
1771+
1772+
_.each(g.nodes, (n) => {
1773+
if (n.name in node2set) {
1774+
node2set[n.name].push(pg_nodesets.length - 1);
1775+
} else {
1776+
node2set[n.name] = [pg_nodesets.length - 1];
1777+
}
1778+
});
17661779
});
17671780

17681781
const pg_enum = [
1769-
"Yes (dx12 months)",
1770-
"Yes (12<dx36 months)",
1782+
"Yes (dx12 months)",
1783+
"Yes (12<dx36 months)",
17711784
"Yes (dx>36 months)",
17721785
"No",
17731786
];
@@ -1797,7 +1810,10 @@ class HIVTxNetwork {
17971810
]);
17981811
},
17991812
map: function (node) {
1800-
const npcoi = _.some(pg_nodesets, (d) => d[1] && d[2].has(node.id));
1813+
const npcoi =
1814+
node.id in node2set
1815+
? _.some(node2set[node.id], (d) => pg_nodesets[d][1])
1816+
: false;
18011817
if (npcoi) {
18021818
const cutoffs = [
18031819
timeDateUtil.n_months_ago(ref_date, 12),
@@ -1836,9 +1852,9 @@ class HIVTxNetwork {
18361852
type: "String",
18371853
volatile: true,
18381854
map: function (node) {
1839-
const memberships = _.filter(pg_nodesets, (d) => d[2].has(node.id));
1855+
const memberships = node2set[node.id] || [];
18401856
if (memberships.length === 1) {
1841-
return memberships[0][0];
1857+
return pg_nodesets[memberships[0]][0];
18421858
} else if (memberships.length > 1) {
18431859
return "Multiple";
18441860
}
@@ -1859,11 +1875,16 @@ class HIVTxNetwork {
18591875
},
18601876
};
18611877

1878+
let subset = new Set();
1879+
18621880
for (const [key, def] of Object.entries(attrib_defs)) {
1881+
subset.add(key);
18631882
this.populate_predefined_attribute(def, key);
18641883
}
18651884

1885+
//console.time ("SUBS");
18661886
this._aux_populate_category_menus();
1887+
//console.timeEnd ("SUBS");
18671888
}
18681889

18691890
/** Add an attribute value to the node object

0 commit comments

Comments
 (0)