1 2$(document).ready(function () { 3 var csrf_token = $("#csrf_token").val(); 4 var sigmajs_bn = {}; 5 var sigmajs_bn_settings = { 6 "instance_id": "bayesian-network-graph", 7 "drawing_engine": "webgl", 8 "display_original_height": 600, 9 "active_layout": "circular", 10 "active_group": "", 11 "active_category": "", 12 "active_structure": "", 13 "show_arrows": true, 14 "original_color": "", 15 "num_nodes": "", 16 "num_edges": "", 17 "color_common_edges": "", 18 "color_structure_1": "", 19 "color_structure_2": "", 20 "highlight_node_color": "", 21 "evidence_set_color": "#CC0000", 22 "width_slider": $("#bn-graph-width-slider")[0], 23 "height_slider": $("#bn-graph-height-slider")[0], 24 "nodes_slider": $("#bn-nodes-size-slider")[0], 25 "edges_slider": $("#bn-edges-size-slider")[0], 26 "filter_edges_weight_slider": $("#slider-filter-edges-by-weight")[0], 27 "structures_info": {} 28 }; 29 30 /* var current_graph_state = { 31 "view_options": { 32 "labels": false 33 }, 34 "highlight": { 35 "edges_thickness": false, 36 "nodes_size_by_markov_blanket": false, 37 "nodes_size_by_direct_neighbors": false, 38 "important_nodes": { 39 "betweenness_centrality": false, 40 "degrees": { 41 "active": false, 42 "num_neighbors": 3, 43 "include_neighbors": false 44 } 45 }, 46 "communities": { 47 "louvain": false 48 }, 49 }, 50 "on_click_node": { 51 "markov_blanket": false, 52 "parents": false, 53 "children": false, 54 "connections_info": false, 55 "parameters": true, 56 }, 57 "scale_options": { 58 "nodes_size": 12.0, 59 "edges_thickness": 4.0, 60 }, 61 "layout_size": { 62 "graph_width": 1.0, 63 "graph_height": 1.0, 64 }, 65 "layout": sigmajs_bn_settings["active_layout"] //TODO: unify 66 }; 67 68 function save_graph_state() { 69 70 current_graph_state = { 71 "view_options": { 72 "labels": sigmajs_bn.settings('drawLabels'), 73 }, 74 "highlight": { 75 "edges_thickness": $("#checkbox-scale-edges-dependent-weights").is(":checked"), 76 "nodes_size_by_markov_blanket": $("#checkbox-scale-nodes-dependent-markov-blanket").is(":checked"), 77 "nodes_size_by_direct_neighbors": $("#checkbox-scale-nodes-dependent-neighbors").is(":checked"), 78 "important_nodes": { 79 "active": $("#checkbox-highlight-important-nodes").is(":checked"), 80 "mode": $("#select-highlight-important-nodes-algorithm").val(), 81 "degrees_params": { 82 "num_neighbors": $("#n-neighbors-important").val(), 83 "include_neighbors": $("#checkbox-include-important-neighbors").is(":checked"), 84 } 85 }, 86 "communities": { 87 "active": $("#checkbox-highlight-communities").is(":checked"), 88 "mode": $("#select-highlight-communities-algorithm").val(), 89 }, 90 }, 91 "on_click_node": { 92 "markov_blanket": $("#checkbox-on-click-markov-blanket").is(":checked"), 93 "parents": $("#checkbox-on-click-parents").is(":checked"), 94 "children": $("#checkbox-on-click-children").is(":checked"), 95 "nodes_same_group": $("#checkbox-on-click-same-group").is(":checked"), 96 "connections_info": $("#checkbox-on-click-connections-info").is(":checked"), 97 "parameters": $("#checkbox-on-click-parameters").is(":checked"), 98 }, 99 "scale_options": { 100 "nodes_size": $("#bn-nodes-size-slider")[0].noUiSlider.get(), 101 "edges_thickness": $("#bn-edges-size-slider")[0].noUiSlider.get(), 102 }, 103 "layout_size": { 104 "graph_width": $("#bn-graph-width-slider")[0].noUiSlider.get(), 105 "graph_height": $("#bn-graph-height-slider")[0].noUiSlider.get(), 106 }, 107 "layout": "circular" 108 }; 109 }*/ 110 111 112 113 $(".load-bn-dataset-example").click(function(e){ 114 var waiting_div_elem = $("#waiting-continue-upload-dataset-bn"); 115 var error_elem = $("#error-continue-upload-dataset-bn"); 116 var success_elem = $("#success-continue-upload-dataset-bn"); 117 var next_section_elem = $("#section-learn-structure-bn"); 118 119 var data_client_json = { 120 "dataset_type": $(this).attr("dataset-type"), 121 "model_name": $("#model_name").val() 122 }; 123 data_client_json = JSON.stringify(data_client_json); 124 var data_send = { 125 "csrfmiddlewaretoken": csrf_token, 126 "data_client_json": data_client_json, 127 }; 128 129 $.ajax({ 130 type: "POST", 131 url: "/morpho/ml_bn_load_dataset_example/", 132 data: data_send, 133 dataType: 'json', 134 beforeSend: function () { 135 waiting_div_elem.removeClass("hide-element"); 136 waiting_div_elem.show(); 137 }, 138 success: function (data) { 139 waiting_div_elem.hide(); 140 if (data["error"]) { 141 error_elem.text(data["error_message"]); 142 success_elem.hide(); 143 } else { 144 error_elem.empty(); 145 success_elem.removeClass("hide-element"); 146 success_elem.show(); 147 next_section_elem.removeClass("hide-element"); 148 next_section_elem.show(); 149 150 $('html, body').animate({ 151 scrollTop: next_section_elem.offset().top 152 }, 1000); 153 //$('.dropup').addClass('open'); // substitute with your own selector 154 //$('.dropdown-toggle').attr('aria-expanded', true).focus(); 155 } 156 }, 157 error: function () { 158 waiting_div_elem.hide(); 159 success_elem.show(); 160 error_elem.text("Server error"); 161 } 162 }); 163 }); 164 165 $("#load-bn-discrete-example").click(function(e){ 166 var waiting_div = $("#waiting-load-bn-example"); 167 var error_div = $("#error-load-bn-example"); 168 169 var data_send = { 170 "csrfmiddlewaretoken": csrf_token, 171 }; 172 $.ajax({ 173 type: "POST", 174 url: "/morpho/ml_bn_load_discrete_example/", 175 data: data_send, 176 dataType: 'json', 177 beforeSend: function () { 178 waiting_div.removeClass("hide-element").show(); 179 }, 180 success: function (data) { 181 waiting_div.hide(); 182 if (data["error"]) { 183 error_div.text(data["error_message"]); 184 error_div.removeClass("hide-element").show(); 185 } else { 186 $("#continue-button-upload-bn").trigger("click"); 187 } 188 }, 189 error: function (e) { 190 waiting_div.hide(); 191 error_div.text(e); 192 error_div.removeClass("hide-element").show(); 193 } 194 }); 195 }); 196 197 $("#load-bn-continuous-example").click(function(e){ 198 var waiting_div = $("#waiting-load-bn-example"); 199 var error_div = $("#error-load-bn-example"); 200 201 var data_send = { 202 "csrfmiddlewaretoken": csrf_token, 203 }; 204 $.ajax({ 205 type: "POST", 206 url: "/morpho/ml_bn_load_continuous_example/", 207 data: data_send, 208 dataType: 'json', 209 beforeSend: function () { 210 waiting_div.removeClass("hide-element").show(); 211 }, 212 success: function (data) { 213 waiting_div.hide(); 214 if (data["error"]) { 215 error_div.text(data["error_message"]); 216 error_div.removeClass("hide-element").show(); 217 } else { 218 $("#continue-button-upload-bn").trigger("click"); 219 } 220 }, 221 error: function (e) { 222 waiting_div.hide(); 223 error_div.text(e); 224 error_div.removeClass("hide-element").show(); 225 } 226 }); 227 }); 228 229 $("#upload-bn-structure-1").fileinput({ 230 hideThumbnailContent: true, // hide image, pdf, text or other content in the thumbnail preview 231 theme: "explorer", 232 uploadUrl: "/morpho/ml_bn_load_only_structure/", 233 fileActionSettings: { 234 showDownload: false, 235 showUpload: false, 236 indicatorNew: '', 237 removeIcon: '<i class="glyphicon glyphicon-trash fa-2x" aria-hidden="true"></i>', 238 zoomIcon: '<i class="glyphicon glyphicon-zoom-in fa-2x"></i>', 239 }, 240 previewClass: "file-input-small container-center", 241 layoutTemplates: { 242 main1: "<div class=\'container-center\'>\n" + 243 "{preview}\n" + 244 "<div class=\'input-group {class} file-input-browse-small\'>\n" + 245 " <div class=\'input-group-btn\ input-group-prepend file-input-button-small'>\n" + 246 " {browse}\n" + 247 " {upload}\n" + 248 " {remove}\n" + 249 " </div>\n" + 250 " {caption}\n" + 251 "</div>" + 252 "</div>" 253 }, 254 browseIcon: "<i class=\"glyphicon glyphicon-folder-open icon-margin-right\"></i> ", 255 uploadExtraData: function(previewId, index) { 256 var obj = {}; 257 obj['csrfmiddlewaretoken'] = csrf_token; 258 obj['structure'] = 1; 259 return obj; 260 }, 261 uploadAsync: false 262 }); 263 264 $("#add-bn-structure").click(function() { 265 $("#upload-bn-structure-div").removeClass("hide-element"); 266 $("#upload-bn-structure-div").show(); 267 $("#structure-1-text").removeClass("hide-element"); 268 $("#structure-1-text").show(); 269 $("#structure-2-text").removeClass("hide-element"); 270 $("#structure-2-text").show(); 271 $("#add-bn-structure").hide(); 272 }); 273 274 $("#upload-bn-structure-2").fileinput( 275 { 276 hideThumbnailContent: true, // hide image, pdf, text or other content in the thumbnail preview 277 theme: "explorer", 278 uploadUrl: "/morpho/ml_bn_load_only_structure/", 279 fileActionSettings: { 280 showDownload: false, 281 showUpload: false, 282 indicatorNew: '', 283 removeIcon: '<i class="glyphicon glyphicon-trash fa-2x" aria-hidden="true"></i>', 284 zoomIcon: '<i class="glyphicon glyphicon-zoom-in fa-2x"></i>', 285 }, 286 previewClass: "file-input-small container-center", 287 layoutTemplates: { 288 main1: "<div class=\'container-center hide-element\' id=\'upload-bn-structure-div\'>\n" + 289 "{preview}\n" + 290 "<div class=\'input-group {class} file-input-browse-small\'>\n" + 291 " <div class=\'input-group-btn\ input-group-prepend file-input-button-small'>\n" + 292 " {browse}\n" + 293 " {upload}\n" + 294 " {remove}\n" + 295 " </div>\n" + 296 " {caption}\n" + 297 "</div>" + 298 "</div>" 299 }, 300 browseIcon: "<i class=\"glyphicon glyphicon-folder-open icon-margin-right\"></i> ", 301 uploadExtraData: function(previewId, index) { 302 var obj = {}; 303 obj['csrfmiddlewaretoken'] = csrf_token; 304 obj['structure'] = 2; 305 return obj; 306 }, 307 uploadAsync: false 308 }); 309 310 $('#upload-bn-structure-1').on('filebatchpreupload', function() { 311 $("#select-group-graph").addClass("hide-element").hide(); 312 $("#select-nodes-graph-evidence-effect").addClass("hide-element").hide(); 313 $("#select-group-graph-evidence-effect").addClass("hide-element").hide(); 314 }); 315 316 $('#upload-bn-structure-1').on('filebatchuploadcomplete', function() { 317 $("#upload-complete-label").text("Structure upload complete!"); 318 $("#continue-button-upload-bn").trigger("click"); 319 }); 320 321 $('#upload-bn-structure-2').on('filebatchuploadsuccess', function(event, data) { 322 var placeholder_html = $("#section-structures-metrics-content-table"); 323 placeholder_html.empty(); 324 placeholder_html.append(data.response["score_results"]); 325 placeholder_html.find('.datatable-new-ajax').each(function(){ 326 create_datatable($(this)); 327 }); 328 $("#section-structures-metrics").removeClass("hide-element").show(); 329 }); 330 331 $('#upload-bn-structure-2').on('filebatchuploadcomplete', function(event, files, extra) { 332 $("#upload-complete-label").text("Structure 2 upload complete!"); 333 $("#continue-button-upload-bn").trigger("click"); 334 $("#select-graph-structure").removeClass("hide-element").show(); 335 }); 336 337 338 $('#selectize-bn-structure').on("change", function (e) { 339 if ($("#model_name").val() !== "ml_probabilistic_clustering") { 340 var structure_option_id = $(this).val();
341 sigmajs_bn.graph.edges().forEach(function (edge) { 342 if (parseInt(structure_option_id) === 3) { 343 if (edge.originalColor === sigmajs_bn_settings["color_common_edges"]) { 344 change_node_edge_color(edge, sigmajs_bn_settings["color_common_edges"], true); 345 edge.structure_selected = true; 346 } else { 347 hide_node_edge(edge); 348 edge.structure_selected = true; 349 } 350 } else if (parseInt(structure_option_id) === 0) { 351 change_node_edge_color(edge, edge.originalColor, false); 352 } else if (parseInt(structure_option_id) === edge.structure_id || edge.structure_id === 0) { 353 if (parseInt(structure_option_id) === 1) { 354 change_node_edge_color(edge, sigmajs_bn_settings["color_structure_1"], true); 355 edge.structure_selected = true; 356 } else { 357 change_node_edge_color(edge, sigmajs_bn_settings["color_structure_2"], true); 358 edge.structure_selected = true; 359 } 360 } else { 361 hide_node_edge(edge); 362 edge.structure_selected = true; 363 } 364 }); 365 sigmajs_bn.refresh(); 366 } else { 367 var structure_id = $(this).val(); 368 369 if (structure_id === "all") { 370 $("#select-multi-structures").removeClass("hide-element").show(); 371 $("#select-bn-structure-common-edges").removeClass("hide-element").show(); 372 } else { 373 $("#select-multi-structures").hide(); 374 $("#select-bn-structure-common-edges").hide(); 375 } 376 377 reset_nodes_edges_color_prob_clustering(); 378 379 draw_evidences(structure_id); 380 } 381 }); 382 383 $('#selectize-bn-structure-common-edges').on("change", function (e) { 384 var val_common_edges = $(this).val(); 385 var select_multi_structures = $("#selectize-multi-structures"); 386 var selectize_multi_structures = select_multi_structures[0].selectize; 387 var vals_multi_structures = select_multi_structures.val(); 388 389 if (vals_multi_structures.length > 0 && val_common_edges !== "no-common") { 390 selectize_clear_items(selectize_multi_structures); 391 } 392 393 reset_nodes_edges_color_prob_clustering(); 394 }); 395 396 if ($("#model_name").val() === "ml_probabilistic_clustering") { 397 $('#selectize-multi-structures')[0].selectize.on("item_add", function (value, item) { 398 var select_common_edges = $("#selectize-bn-structure-common-edges"); 399 var val_common_edges = select_common_edges.val(); 400 var selectize_bn_structure_common_edges = select_common_edges[0].selectize; 401 402 if (val_common_edges !== "no-common") { 403 selectize_bn_structure_common_edges.addItem("no-common"); 404 } 405 }); 406 407 $('#selectize-multi-structures').on("change", function (value, item) { 408 reset_nodes_edges_color_prob_clustering(); 409 }); 410 } 411 412 $("#upload-bn-params-continuous").fileinput({ 413 hideThumbnailContent: true, // hide image, pdf, text or other content in the thumbnail preview 414 theme: "explorer", 415 uploadUrl: "/morpho/ml_bn_load_only_params_continuous/", 416 fileActionSettings: { 417 showDownload: false, 418 showUpload: false, 419 indicatorNew: '', 420 removeIcon: '<i class="glyphicon glyphicon-trash fa-2x" aria-hidden="true"></i>', 421 zoomIcon: '<i class="glyphicon glyphicon-zoom-in fa-2x"></i>', 422 }, 423 previewClass: "file-input-small container-center", 424 layoutTemplates: { 425 main1: "<div class=\'container-center\'>\n" + 426 "{preview}\n" + 427 "<div class=\'input-group {class} file-input-browse-small\'>\n" + 428 " <div class=\'input-group-btn\ input-group-prepend file-input-button-small'>\n" + 429 " {browse}\n" + 430 " {upload}\n" + 431 " {remove}\n" + 432 " </div>\n" + 433 " {caption}\n" + 434 "</div>" + 435 "</div>" 436 }, 437 browseIcon: "<i class=\"glyphicon glyphicon-folder-open icon-margin-right\"></i> ", 438 uploadExtraData: function(previewId, index) { 439 var obj = {} 440 obj['csrfmiddlewaretoken'] = csrf_token; 441 return obj; 442 }, 443 uploadAsync: false 444 }); 445 446 $('#upload-bn-params-continuous').on('filebatchpreupload', function(event, data) { 447 448 }); 449 450 $('#upload-bn-params-continuous').on('filebatchuploadcomplete', function(event, files, extra) { 451 $("#upload-complete-label").text("Parameters upload complete!") 452 $("#continue-button-upload-bn").trigger("click"); 453 }); 454 455 $("#upload-bn").fileinput({ 456 hideThumbnailContent: true, // hide image, pdf, text or other content in the thumbnail preview 457 theme: "explorer", 458 uploadUrl: "/morpho/ml_upload_bn_file/", 459 fileActionSettings: { 460 showDownload: false, 461 showUpload: false, 462 indicatorNew: '', 463 removeIcon: '<i class="glyphicon glyphicon-trash fa-2x" aria-hidden="true"></i>', 464 zoomIcon: '<i class="glyphicon glyphicon-zoom-in fa-2x"></i>', 465 }, 466 previewClass: "file-input-small container-center", 467 layoutTemplates: { 468 main1: "<div class=\'container-center\'>\n" + 469 "{preview}\n" + 470 "<div class=\'input-group {class} file-input-browse-small\'>\n" + 471 " <div class=\'input-group-btn\ input-group-prepend file-input-button-small'>\n" + 472 " {browse}\n" + 473 " {upload}\n" + 474 " {remove}\n" + 475 " </div>\n" + 476 " {caption}\n" + 477 "</div>" + 478 "</div>" 479 }, 480 uploadExtraData: function(previewId, index) { 481 var obj = {} 482 483 obj['csrfmiddlewaretoken'] = csrf_token; 484 obj['classes-bn-file'] = $("#select-classes-bn-file").val(); 485 obj['bn-name'] = $("#bn-input-name").val(); 486 487 return obj; 488 }, 489 uploadAsync: false 490 }); 491 492 $('#upload-bn').on('filebatchpreupload', function(event, data) { 493 494 }); 495 496 $('#upload-bn').on('filebatchuploadcomplete', function(event, files, extra) { 497 $("#upload-complete-label").text("Upload complete! Click in the Continue button at the bottom.") 498 }); 499 500 $("#upload-bn-additional-parameters").fileinput({ 501 hideThumbnailContent: true, // hide image, pdf, text or other content in the thumbnail preview 502 theme: "explorer", 503 uploadUrl: "/morpho/ml_upload_bn_additional_parameters/", 504 fileActionSettings: { 505 showDownload: false, 506 showUpload: true, 507 indicatorNew: '', 508 removeIcon: '<i class="glyphicon glyphicon-trash fa-2x" aria-hidden="true"></i>', 509 zoomIcon: '<i class="glyphicon glyphicon-zoom-in fa-2x"></i>', 510 }, 511 previewClass: "file-input-small container-center", 512 layoutTemplates: { 513 main1: "<div class=\'container-center\'>\n" + 514 "{preview}\n" + 515 "<div class=\'input-group {class} file-input-browse-small\'>\n" + 516 " <div class=\'input-group-btn\ input-group-prepend file-input-button-small'>\n" + 517 " {browse}\n" + 518 " {upload}\n" + 519 " {remove}\n" + 520 " </div>\n" + 521 " {caption}\n" + 522 "</div>" + 523 "</div>" 524 }, 525 browseIcon: "<i class=\"glyphicon glyphicon-folder-open icon-margin-right\"></i> ", 526 uploadExtraData: function(previewId, index) { 527 var obj = {} 528 obj['model_name'] = $("#model_name").val(); 529 obj['csrfmiddlewaretoken'] = csrf_token; 530 return obj; 531 }, 532 uploadAsync: false 533 }); 534 535 $('#upload-bn-additional-parameters').on('filebatchuploadcomplete', function(event, files, extra) { 536 if ($("#model_name").val() === "ml_probabilistic_clustering" && $("#datatable_available").val() === "True") { 537 init_update_selectize_datatable_cols_groups(); 538 } 539 reload_sigmajs_graph(); 540 $("#success-upload-additional-parameters-bn").removeClass("hide-element"); 541 $("#success-upload-additional-parameters-bn").show(); 542 }); 543 544 $("#checkbox-dataset-discretize").change(function(e){ 545 var is_checked = $(this).is(":checked"); 546 if (is_checked) { 547 $("#discretize-methods").removeClass("hide-element"); 548 $("#discretize-methods").show(); 549 } else { 550 $("#discretize-methods").hide(); 551 $(".discretize-parameters").hide(); //Close old methods parameters input 552 } 553 }); 554 555 $("#select-dataset-discretize-method").on("change", function (e) { 556 var method_chosen = $(this).val(); 557 var placeholder_method_paremeters = $("#discretize-parameters-" + method_chosen); 558 559 $(".discretize-parameters").hide(); //Close old methods parameters input 560 placeholder_method_paremeters.removeClass("hide-element").show(); 561 }); 562 563 $(".dataset-features").selectize({}); 564 565 $("#select-dataset").on("change", function (e) { 566 var values_chosen = $(this).val(); 567 if (values_chosen.length !== 0 && values_chosen !== "") { 568 var value_str = ""; 569 var choose_value_elem = $('#' + $(this).attr("choose_value_elem")); 570 var selectizes_value_elem = $('.' + $(this).attr("selectize_value_elem")); 571 var waiting_div_elem = $('#' + $(this).attr("waiting_div_elem")); 572 choose_value_elem.removeClass("hide-element"); 573 choose_value_elem.show(); 574 575 selectizes_value_elem.each(function( index ) { 576 $(this).selectize()[0].selectize.destroy(); 577 $(this).empty(); 578 }); 579 var data_client_json = { 580 "datasets_names": values_chosen, 581 "include_ids": false, 582 "model_name": $("#model_name").val() 583 }; 584 data_client_json = JSON.stringify(data_client_json) 585 var data_send = { 586 "csrfmiddlewaretoken": csrf_token, 587 "data_client_json": data_client_json 588 }; 589 $.ajax({ 590 type: "POST", 591 url: "/morpho/get_features_datasets/", 592 data: data_send, 593 dataType: 'json', 594 beforeSend: function () { 595 waiting_div_elem.removeClass("hide-element"); 596 waiting_div_elem.show(); 597 }, 598 success: function (data) { 599 waiting_div_elem.hide(); 600 $("#error-upload-bn").empty(); 601 602 var values = data["values"]; 603 var maxItems = values.length; 604 var maxOptions = values.length; 605 var items = values.map(function(x) { return { item: x }; }); 606 607 selectizes_value_elem.selectize({ 608 maxItems: maxItems, 609 maxOptions: maxOptions, 610 labelField: "item", 611 valueField: "item", 612 searchField: "item", 613 options: items, 614 }); 615 616 }, 617 error: function () { 618 waiting_div_elem.hide(); 619 $("#error-upload-bn").val("Server error"); 620 } 621 }); 622 } 623 }); 624 625 626 $("#continue-button-upload-dataset").click(function(e){ 627 var bn_name = $("#bn-input-name").val(); 628 var dataframes_names = $("#select-dataset").val(); 629 var dataframes_features = {}; 630 var select_dataframes_features = $("#select-dataset-features"); 631 var selectize_dataframes_features = select_dataframes_features[0].selectize; 632 var dataframes_features_all = select_dataframes_features.attr("selected-all"); 633 var dataframes_features_classes = $("#select-dataset-classes").val(); 634 var discretize = false;
635 var discretize_method = ""; 636 var discretize_method_parameters = {}; 637 if ($("#checkbox-dataset-discretize").is(":checked")) { 638 discretize = true; 639 discretize_method = $("#select-dataset-discretize-method").val(); 640 $(".discretize-parameters:visible .discretize-parameter").each(function() { 641 var parameter_name = $(this).attr("id"); 642 var parameter_value = $(this).val(); 643 discretize_method_parameters[parameter_name] = parameter_value; 644 }); 645 } 646 647 dataframes_features["values"] = $("#select-dataset-features").val(); 648 dataframes_features["selected_all"] = false; 649 if (dataframes_features_all === "true") { 650 dataframes_features["selected_all"] = true; 651 } 652 653 var progress_elem_html_id = "progress-upload-dataset-bn"; 654 var progress_elem_html = $("#" + progress_elem_html_id); 655 var waiting_div_elem = $("#waiting-continue-upload-dataset-bn"); 656 var error_elem = $("#error-continue-upload-dataset-bn"); 657 var success_elem = $("#success-continue-upload-dataset-bn"); 658 var next_section_elem = $("#section-learn-structure-bn"); 659 660 var data_client_json = { 661 "bn_name": bn_name, 662 "datasets_names": dataframes_names, 663 "dataframes_features": dataframes_features, 664 "dataframes_features_classes": dataframes_features_classes, 665 "discretize": discretize, 666 "discretize_method": discretize_method, 667 "discretize_method_parameters": discretize_method_parameters, 668 "model_name": $("#model_name").val() 669 }; 670 data_client_json = JSON.stringify(data_client_json) 671 var data_send = { 672 "csrfmiddlewaretoken": csrf_token, 673 "data_client_json": data_client_json, 674 }; 675 676 $.ajax({ 677 type: "POST", 678 url: "/morpho/ml_bn_upload_dataset/", 679 data: data_send, 680 dataType: 'json', 681 beforeSend: function () { 682 waiting_div_elem.removeClass("hide-element"); 683 waiting_div_elem.show(); 684 progress_elem_html.show(); 685 }, 686 success: function (data_task) { 687 var data_processed = run_worker(data_task, progress_elem_html_id, function (data_processed) { 688 waiting_div_elem.hide(); 689 if (data_processed["error"]) { 690 error_elem.removeClass("hide-element"); 691 error_elem.show(); 692 error_elem.text("Error: " + data_processed["error_message"]); 693 success_elem.hide(); 694 } else { 695 error_elem.empty(); 696 success_elem.removeClass("hide-element"); 697 success_elem.show(); 698 next_section_elem.removeClass("hide-element"); 699 next_section_elem.show(); 700 } 701 }) 702 }, 703 error: function () { 704 waiting_div_elem.hide(); 705 success_elem.show(); 706 error_elem.text("Server error"); 707 } 708 }); 709 }); 710 711 $("#continue-button-upload-bn").click(function(e){ 712 var bn_features_classes = $("#select-classes-bn-file").val(); 713 var waiting_div_elem = $("#waiting-continue-upload-dataset-bn"); 714 var success_elem = $("#success-continue-upload-dataset-bn"); 715 var error_elem = $("#error-continue-upload-dataset-bn"); 716 var next_section_elem = $("#section-draw-bn"); 717 var next_section_elem_2 = $("#section-export-bn"); 718 719 var data_client_json = { 720 "model_name": $("#model_name").val() 721 }; 722 data_client_json = JSON.stringify(data_client_json) 723 var data_send = { 724 "csrfmiddlewaretoken": csrf_token, 725 "data_client_json": data_client_json, 726 }; 727 728 $.ajax({ 729 type: "POST", 730 url: "/morpho/ml_bn_upload_bn/", 731 data: data_send, 732 dataType: 'json', 733 beforeSend: function () { 734 waiting_div_elem.removeClass("hide-element"); 735 waiting_div_elem.show(); 736 }, 737 success: function (data) { 738 waiting_div_elem.hide(); 739 if (data["error"]) { 740 error_elem.text(data["error_message"]); 741 success_elem.hide(); 742 } else { 743 error_elem.empty(); 744 success_elem.removeClass("hide-element"); 745 success_elem.show(); 746 next_section_elem.removeClass("hide-element"); 747 next_section_elem.show(); 748 next_section_elem_2.removeClass("hide-element"); 749 next_section_elem_2.show(); 750 751 $('html, body').animate({ 752 scrollTop: $("#section-draw-bn").offset().top 753 }, 1000); 754 755 draw_bayesian_network_sigma(data["graph_sigmajs"], data["sigmajs_default_settings"], data["nodes"], data["additional_discrete_features"]); 756 } 757 }, 758 error: function () { 759 waiting_div_elem.hide(); 760 success_elem.hide(); 761 error_elem.text("Server error"); 762 } 763 }); 764 }); 765 766 $("#select-structure-algorithm").on("change", function (e) { 767 var algorithm_chosen = $(this).val(); 768 var placeholder_algorithm_paremeters = $("#structure-learning-parameters-" + algorithm_chosen); 769 770 $("#container-continue-learn-structure").removeClass("hide-element"); 771 $("#container-continue-learn-structure").show(); 772 773 $("#section-structure-learning-parameters").removeClass("hide-element"); 774 $("#section-structure-learning-parameters").show(); 775 $(".structure-learning-algorithm-parameters").hide(); //Close old algorithm parameters input 776 placeholder_algorithm_paremeters.show(); 777 }); 778 779 780 $("#continue-learn-structure").click(function(e){ 781 var structure_algorithm = $("#select-structure-algorithm").val(); 782 var structure_algorithm_parameters = {}; 783 784 var waiting_div_elem = $("#waiting-continue-learn-structure"); 785 var progress_elem_html_id = "progress-bn-learn-structure"; 786 var progress_elem_html = $("#" + progress_elem_html_id); 787 var error_elem = $("#error-continue-learn-structure"); 788 var success_elem = $("#success-continue-learn-structure"); 789 var this_section = $("#section-learn-structure-bn"); 790 var next_section_1_elem = $("#section-parameters-learning-bn"); 791 var next_section_2_elem = $("#section-draw-bn"); 792 var next_section_3_elem = $("#section-export-bn"); 793 794 795 $(".structure-learning-algorithm-parameters:visible .structure-learning-parameter").each(function() { 796 var parameter_name = $(this).attr("id"); 797 if (parameter_name !== undefined) { 798 var parameter_value = $(this).val(); 799 structure_algorithm_parameters[parameter_name] = parameter_value; 800 } 801 }); 802 803 var data_client_json = { 804 "structure_algorithm": structure_algorithm, 805 "structure_algorithm_parameters": structure_algorithm_parameters, 806 "model_name": $("#model_name").val() 807 }; 808 data_client_json = JSON.stringify(data_client_json) 809 var data_send = { 810 "csrfmiddlewaretoken": csrf_token, 811 "data_client_json": data_client_json, 812 }; 813 814 $.ajax({ 815 type: "POST", 816 url: "/morpho/ml_bn_learn_structure/", 817 data: data_send, 818 dataType: 'json', 819 beforeSend: function () { 820 waiting_div_elem.removeClass("hide-element"); 821 waiting_div_elem.show(); 822 progress_elem_html.show(); 823 error_elem.hide(); 824 }, 825 success: function (data_task) { 826 var data_processed = run_worker(data_task, progress_elem_html_id, function(data_processed){ 827 waiting_div_elem.hide(); 828 if (data_processed["error"]) { 829 error_elem.removeClass("hide-element").show(); 830 error_elem.text("Error: " + data_processed["error_message"]); 831 success_elem.hide(); 832 } else { 833 error_elem.empty(); 834 error_elem.hide(); 835 success_elem.removeClass("hide-element"); 836 success_elem.show(); 837 this_section.removeClass("last-section-page"); 838 next_section_1_elem.removeClass("hide-element"); 839 next_section_1_elem.show(); 840 next_section_2_elem.removeClass("hide-element"); 841 next_section_2_elem.show(); 842 next_section_3_elem.removeClass("hide-element"); 843 next_section_3_elem.show(); 844 draw_bayesian_network_sigma(data_processed["graph_sigmajs"], data_processed["sigmajs_default_settings"], data_processed["nodes"], data_processed["additional_discrete_features"]); 845 } 846 }); 847 }, 848 error: function (e) { 849 waiting_div_elem.hide(); 850 success_elem.hide(); 851 error_elem.removeClass("hide-element").show(); 852 next_section_1_elem.hide(); 853 next_section_2_elem.hide(); 854 error_elem.text("Error: check if the selected columns have NaN or empty values"); 855 } 856 }); 857 }); 858 859 $("#select-parameters-algorithm").on("change", function (e) { 860 var algorithm_chosen = $(this).val(); 861 var placeholder_algorithm_paremeters = $("#parameters-learning-parameters-" + algorithm_chosen); 862 863 $("#container-continue-learn-parameters").removeClass("hide-element"); 864 $("#container-continue-learn-parameters").show(); 865 866 $("#section-parameters-learning-parameters").removeClass("hide-element"); 867 $("#section-parameters-learning-parameters").show(); 868 $(".parameters-learning-algorithm-parameters").hide(); //Close old algorithm parameters input 869 placeholder_algorithm_paremeters.show(); 870 }); 871 872 $("#bayesianEstimation_prior").on("change", function(e){ 873 var prior_chosen = $(this).val(); 874 if (prior_chosen === "BDeu") { 875 $("#bayesianEstimation_set_equivalent_size").removeClass("hide-element"); 876 $("#bayesianEstimation_set_equivalent_size").show(); 877 } else { 878 $("#bayesianEstimation_set_equivalent_size").hide(); 879 } 880 }); 881 882 $("#continue-learn-parameters").click(function(e){ 883 var parameters_algorithm = $("#select-parameters-algorithm").val(); 884 var algorithm_parameters = {}; 885 886 var progress_elem_html_id = "progress-bn-learn-parameters"; 887 var progress_elem_html = $("#" + progress_elem_html_id); 888 var waiting_div_elem = $("#waiting-continue-learn-parameters"); 889 var error_elem = $("#error-continue-learn-parameters"); 890 var success_elem = $("#success-continue-learn-parameters"); 891 var this_section = $("#section-learn-parameters-bn"); 892 var next_section_1_elem = $("#section-draw-bn"); 893 var next_section_2_elem = $("#section-export-bn"); 894 895 896 $(".parameters-learning-algorithm-parameters:visible .parameters-learning-parameter").each(function() { 897 var parameter_name = $(this).attr("id"); 898 if (parameter_name !== undefined) { 899 var parameter_value = $(this).val(); 900 algorithm_parameters[parameter_name] = parameter_value; 901 } 902 }); 903 904 var data_client_json = { 905 "parameters_algorithm": parameters_algorithm, 906 "algorithm_parameters": algorithm_parameters, 907 "model_name": $("#model_name").val() 908 }; 909 data_client_json = JSON.stringify(data_client_json) 910 var data_send = { 911 "csrfmiddlewaretoken": csrf_token, 912 "data_client_json": data_client_json, 913 }; 914 915 $.ajax({ 916 type: "POST", 917 url: "/morpho/ml_bn_learn_parameters/", 918 data: data_send, 919 dataType: 'json', 920 beforeSend: function () { 921 waiting_div_elem.removeClass("hide-element"); 922 waiting_div_elem.show(); 923 progress_elem_html.show(); 924 error_elem.hide(); 925 }, 926 success: function (data_task) { 927 var data_processed = run_worker(data_task, progress_elem_html_id, function(data_processed) { 928 waiting_div_elem.hide(); 929 if (data_processed["error"]) { 930 error_elem.removeClass("hide-element"); 931 error_elem.show(); 932 error_elem.text("Error: " + data_processed["error_message"]); 933 success_elem.hide(); 934 } else { 935 error_elem.empty(); 936 error_elem.hide(); 937 success_elem.removeClass("hide-element"); 938 success_elem.show(); 939 this_section.removeClass("last-section-page"); 940 next_section_1_elem.removeClass("hide-element"); 941 next_section_1_elem.show(); 942 next_section_2_elem.removeClass("hide-element"); 943 next_section_2_elem.show(); 944 draw_bayesian_network_sigma(data_processed["graph_sigmajs"], data_processed["sigmajs_default_settings"], data_processed["nodes"], data_processed["additional_discrete_features"]); 945 } 946 }); 947 }, 948 error: function () { 949 waiting_div_elem.hide(); 950 success_elem.hide(); 951 error_elem.removeClass("hide-element").show(); 952 next_section_1_elem.hide(); 953 next_section_2_elem.hide(); 954 error_elem.text("Error: check if the selected columns have NaN or empty values"); 955 } 956 }); 957 }); 958 959 960 $("#select-export-bn-formats").on("change", function (e) { 961 $("#section-continue-export-bn").removeClass("hide-element"); 962 $("#section-continue-export-bn").show(); 963 }); 964 965 $("#continue-export-bn").click(function (e) { 966 var form = $("#form-export-bn"); 967 var file_format = $("#select-export-bn-formats").val(); 968 var waiting_div_elem = $("#waiting-operation-export-bn"); 969 970 waiting_div_elem.removeClass("hide-element"); 971 waiting_div_elem.show(); 972 973 $("#file-format-export-bn").val(file_format); 974 form.submit(); 975 976 waiting_div_elem.hide(); 977 }); 978 979 if ($("#model_name").val() === "ml_probabilistic_clustering") { 980 init_sliders_glasso(); 981 } 982 983 $("#checkbox-layout-forceatlas2-client").on("change", function() { 984 var checked = $(this).is(":checked"); 985 if (checked) { 986 sigmajs_bn.startForceAtlas2({}); 987 setTimeout(function() { sigmajs_bn.stopForceAtlas2(); }, 500000); 988 } else { 989 sigmajs_bn.stopForceAtlas2(); 990 } 991 }); 992 993 $(".bn-options-change-layout-server").click(function(e) { 994 var layout_name = $(this).attr("layout-name"); 995 var additional_params = {}; 996 997 if (layout_name === "image") { 998 additional_params["layout-image-url"] = $("#layout-image-url").val(); 999 additional_params["layout-image-threshold"] = $("#layout-image-threshold").val(); 1000 } 1001 1002 change_layout_sigmajs(layout_name, additional_params); 1003 }); 1004 1005 1006 function change_layout_sigmajs(layout_name, additional_params) { 1007 var notify_loading = print_notify_message(permanent = true, type = "info", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Loading layout", message = "Loading " + layout_name + " layout", delay = 4000, additional_message = ""); 1008 1009 var data_client_json = { 1010 "layout_name": layout_name, 1011 "additional_params": additional_params,
1011 1012 "model_name": $("#model_name").val() 1013 }; 1014 1015 data_client_json = JSON.stringify(data_client_json); 1016 var data_send = { 1017 "csrfmiddlewaretoken": csrf_token, 1018 "data_client_json": data_client_json, 1019 }; 1020 1021 $.ajax({ 1022 type: "POST", 1023 url: "/morpho/ml_bn_change_layout/", 1024 data: data_send, 1025 dataType: 'json', 1026 beforeSend: function () { 1027 //clear_sigmajs_instance(sigmajs_bn); 1028 sigmajs_bn.stopForceAtlas2(); 1029 }, 1030 success: function (data) { 1031 notify_loading.close(); 1032 1033 if (data["error"]) { 1034 var notify_error = print_notify_message(permanent = false, type = "danger", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Error loading layout", message = data["error_message"], delay = 3000); 1035 } else { 1036 sigmajs_bn_settings["active_layout"] = layout_name; 1037 var nodes_pos = data["nodes_pos"]; 1038 var edges = data["edges"]; 1039 1040 for (let node_id in nodes_pos){ 1041 var node_sigmajs = sigmajs_bn.graph.getNode(node_id); 1042 node_sigmajs.x = nodes_pos[node_id][0]; 1043 node_sigmajs.y = nodes_pos[node_id][1]; 1044 } 1045
1046 sigmajs_bn.graph.edges().forEach(function (edge) { 1047 sigmajs_bn.graph.dropEdge(edge.id); 1048 }); 1049 1050 for (let edge_id in edges) { 1051 sigmajs_bn.graph.addEdge(edges[edge_id]); 1052 } 1053 1054 if ($("#model_name").val() === "ml_probabilistic_clustering") { 1055 initialize_selectize_structures(sigmajs_bn_settings["structures_info"]); 1056 } 1057 1058 show_hide_arrows(); 1059 1060 sigmajs_bn.refresh(); // Ask sigma to draw it 1061 } 1062 }, 1063 error: function () { 1064 notify_loading.close(); 1065 var notify_error = print_notify_message(permanent = false, type = "danger", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Error loading layout", message = "Server error", delay = 3000); 1066 } 1067 }); 1068 } 1069 1070 $("#checkbox-show-hide-labels").on("change", function (e) { 1071 var show_labels = $(this).is(":checked"); 1072 sigmajs_bn.settings('drawLabels', show_labels); 1073 sigmajs_bn.refresh(); // Ask sigma to draw it 1074 }); 1075 1076 $("#checkbox-show-hide-arrows").on("change", function (e) { 1077 show_hide_arrows(); 1078 }); 1079 1080 $("#checkbox-allow-drag-drop").on("change", function (e) { 1081 var allow_drag_drop = $(this).is(":checked"); 1082 if (allow_drag_drop) { 1083 var dragListener = sigma.plugins.dragNodes(sigmajs_bn, sigmajs_bn.renderers[0]); 1084 } else { 1085 sigma.plugins.killDragNodes(sigmajs_bn); 1086 } 1087 }); 1088 1089 1090 $("#checkbox-on-click-group-hide-others").on("change", function (e) { 1091 var hide = $(this).is(":checked"); 1092 1093 sigmajs_bn.graph.nodes().forEach(function(n) { 1094 if (!hide && n.hidden) { 1095 hide_node_edge(n); 1096 } else if (n.color === sigmajs_bn_settings["color_hidden"]) { 1097 n.hidden = hide; 1098 } 1099 }); 1100
1101 sigmajs_bn.graph.edges().forEach(function(e) { 1102 if (!hide && e.hidden) { 1103 hide_node_edge(e); 1104 } else if (e.color === sigmajs_bn_settings["color_hidden"]) { 1105 e.hidden = hide; 1106 } 1107 }); 1108 1109 sigmajs_bn.refresh(); 1110 }); 1111 1112 1113 $("#checkbox-on-click-group-show-neighbors").on("change", function (e) { 1114 if (sigmajs_bn_settings["active_category"] !== "") { 1115 var notify_loading = undefined; 1116 get_all_nodes_in_category(sigmajs_bn, sigmajs_bn_settings["active_category"], 1117 "render_nodes_in_category", notify_loading); 1118 } 1119 }); 1120 1121 $("#bn-options-view-toggle-autoRescale").click(function(e) { 1122 var autoRescale = true; 1123 if (sigmajs_bn.settings('autoRescale') == true) { 1124 autoRescale = false; 1125 } 1126 sigmajs_bn.settings('autoRescale', autoRescale); 1127 sigmajs_bn.refresh(); // Ask sigma to draw it 1128 }); 1129 1130 $("#bn-options-view-full-scren").click(function(e) { 1131 var bn_section_elem = $("#section-draw-bn")[0]; 1132 var bn_graph_elem = $("#bayesian-network-graph"); 1133 1134 if (screenfull.enabled) { 1135 screenfull.toggle(bn_section_elem); 1136 1137 //Change buttons layout to fit in the full screen 1138 $(".dropup").addClass("dropdown").removeClass("dropup"); 1139 var height_section = $("#section-draw-bn").height(); 1140 bn_graph_elem.css("height", height_section+ 60); 1141 } 1142 }); 1143 1144 1145 $(".export-bn-button").click(function(e) { 1146 var format = $(this).attr("export-format"); 1147 1148 if (format == "svg") { 1149 var output_file = sigmajs_bn.toSVG({download: true, filename: 'bn.svg', size: 1000}); 1150 } 1151 }); 1152 1153 $("#bn-options-view-reload-graph").click(function(e) { 1154 reload_sigmajs_graph(); 1155 }); 1156 1157 $('#modal-set-evidence-group').on('shown.bs.modal', function (event) { 1158 $('#modal-set-evidence-group').attr("group", event.relatedTarget.id); 1159 }); 1160 1161 $("#confirm-evidence-group").click(function(e) { 1162 var notify_loading = print_notify_message(permanent = true, type = "info", 1163 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Setting evidences", 1164 message = "Setting evidences for selected nodes.", delay = 0, 1165 additional_message = "", position = "bottom-right"); 1166 1167 var group = $('#modal-set-evidence-group').attr('group'); 1168 if (group === "set-evidence-group-1") { 1169 var select_multi_nodes_bn = $("#select-multi-nodes-bn"); 1170 var selected_nodes_ids = select_multi_nodes_bn.val(); 1171 var evidence_group_value = $("#evidence-group-value"); 1172 var new_evidence_value = evidence_group_value.val(); 1173 $("#node-parameters-plot-copy").remove(); 1174 set_nodes_evidences(selected_nodes_ids, new_evidence_value, {}, true, callback_function = function() {notify_loading.close();}); 1175 } else if (group === "set-evidence-group-2") { 1176 var select_category_input = $("#select-category-bn"); 1177 var category_id = select_category_input.val(); 1178 get_all_nodes_in_category(null, category_id, "set_nodes_evidences", notify_loading); 1179 } 1180 $('#modal-set-evidence-group').attr("group", "0"); 1181 1182 }); 1183 1184 $("#clear-evidence-group").click(function(e) { 1185 var select_multi_nodes_bn = $("#select-multi-nodes-bn"); 1186 var selected_nodes_ids = select_multi_nodes_bn.val(); 1187 $("#node-parameters-plot-copy").remove(); 1188 clear_nodes_evidences(selected_nodes_ids, {}, true); 1189 }); 1190 1191 $("#clear-evidence-group-2").click(function(e) { 1192 var select_category_input = $("#select-category-bn"); 1193 var category_id = select_category_input.val(); 1194 get_all_nodes_in_category(null, category_id, "clear_nodes_evidences"); 1195 }); 1196 1197 $('#cp3').colorpicker({ 1198 color: '#000000', 1199 format: 'rgb' 1200 }); 1201 1202 $("#confirm-create-custom-group").click(function(e) { 1203 var select_multi_nodes_bn = $("#select-multi-nodes-bn"); 1204 var selected_nodes_ids = select_multi_nodes_bn.val(); 1205 var custom_group_name = $("#name-custom-group"); 1206 custom_group_name = custom_group_name.val(); 1207 var custom_group_color = $("#color-picker"); 1208 custom_group_color = custom_group_color.val(); 1209 var custom_group_nodes = {}; 1210 selected_nodes_ids.forEach(function(node) { 1211 custom_group_nodes[node] = {}; 1212 }); 1213 1214 if (custom_group_name === "") { 1215 e.preventDefault(); 1216 $("#create-custom-group-error").removeClass("hide-element").show(); 1217 } else { 1218 $("#name-custom-group").val(""); 1219 $("#create-custom-group-error").hide();
1220 $("#modal-create-custom-group").modal('hide'); 1221 1222 var data_client_json = { 1223 "custom_group": custom_group_nodes, 1224 "group_name": custom_group_name, 1225 "group_color": custom_group_color, 1226 "model_name": $("#model_name").val() 1227 }; 1228 data_client_json = JSON.stringify(data_client_json); 1229 1230 var data_send = { 1231 "csrfmiddlewaretoken": csrf_token, 1232 "data_client_json": data_client_json 1233 }; 1234 $.ajax({ 1235 type: "POST", 1236 url: "/morpho/ml_bn_create_custom_group/", 1237 data: data_send, 1238 dataType: 'json', 1239 success: function (data) { 1240 if (!$.isEmptyObject(data["additional_parameters"])) { 1241 set_additional_discrete_features(data["additional_parameters"]); 1242 sigmajs_bn.refresh(); 1243 } 1244 }, error: function () { 1245 } 1246 }); 1247 } 1248 }); 1249 1250 function get_edges_between_nodes(selected_nodes_ids) { 1251 reset_edges_color(sigmajs_bn); 1252 var data_client_json = { 1253 "nodes_ids": selected_nodes_ids, 1254 "structure_id": sigmajs_bn_settings["active_structure"], 1255 "model_name": $("#model_name").val() 1256 }; 1257 data_client_json = JSON.stringify(data_client_json); 1258 var data_send = { 1259 "csrfmiddlewaretoken": csrf_token, 1260 "data_client_json": data_client_json, 1261 }; 1262 1263 $.ajax({ 1264 type: "POST", 1265 url: "/morpho/ml_bn_get_edges_between_nodes/", 1266 data: data_send, 1267 dataType: 'json', 1268 success: function (data) { 1269 var selected_nodes = data["nodes_selection"]; 1270 var num_edges_selected = 0;
1271 sigmajs_bn.graph.edges().forEach(function(e) { 1272 if (!e.selected) { 1273 var source = e.source; 1274 var target = e.target; 1275 var highlight_edge = false; 1276 var valid_edge = false; 1277 1278 if (selected_nodes.indexOf(source) >= 0 && selected_nodes.indexOf(target) >= 0) { 1279 valid_edge = true; 1280 } 1281 1282 if (valid_edge) { 1283 change_node_edge_color(e, e.originalColor, false); 1284 e.selected = true; 1285 highlight_edge = true; 1286 num_edges_selected++; 1287 } 1288 if (!highlight_edge) { 1289 hide_node_edge(e); 1290 } 1291 } else { 1292 num_edges_selected++; 1293 } 1294 }); 1295 1296 $("#network-stats-num-edges-selected").text(num_edges_selected); 1297 1298 if ($("#model_name").val() === "ml_probabilistic_clustering") { 1299 reset_edges_color_prob_clustering(); 1300 } 1301 1302 sigmajs_bn.refresh(); 1303 }, 1304 error: function(data) { 1305 } 1306 }); 1307 } 1308 1309 $("#show-group-nodes-edges").click(function(e) { 1310 var select_multi_nodes_bn = $("#select-multi-nodes-bn"); 1311 var selected_nodes_ids = select_multi_nodes_bn.val(); 1312 var nodeId = ""; 1313 var selection = ""; 1314 render_x_nodes(selected_nodes_ids, sigmajs_bn, selection, nodeId, sigmajs_bn_settings["highlight_node_color"]); 1315 get_edges_between_nodes(selected_nodes_ids); 1316 }); 1317 1318 1319 if (screenfull.enabled) { 1320 screenfull.on('change', function (e) { 1321 if (!screenfull.isFullscreen) { 1322 $(".dropdown").addClass("dropup").removeClass("dropdown"); 1323 var bn_graph_elem = $("#bayesian-network-graph"); 1324 bn_graph_elem.css("height", sigmajs_bn_settings["display_original_height"]); 1325 } 1326 }); 1327 } 1328 1329 1330 $("#bn-options-clean-all-notifications").click(function(e) { 1331 $.notifyClose(); 1332 }); 1333 1334 function get_category_values_in_group(group_id) { 1335 var data_client_json = { 1336 "group_id": group_id, 1337 "model_name": $("#model_name").val() 1338 }; 1339 data_client_json = JSON.stringify(data_client_json) 1340 var data_send = { 1341 "csrfmiddlewaretoken": csrf_token, 1342 "data_client_json": data_client_json, 1343 }; 1344 1345 $.ajax({ 1346 type: "POST", 1347 url: "/morpho/ml_bn_category_values_in_group/", 1348 data: data_send, 1349 dataType: 'json', 1350 success: function (data) { 1351 //Search groups input: 1352 $("#select-category-graph").removeClass("hide-element"); 1353 $("#select-category-graph").show(); 1354 if (data["categories_in_group"].length > 0) { 1355 var select_category_input = $("#select-category-bn"); 1356 select_category_input.selectize()[0].selectize.destroy(); 1357 select_category_input.empty(); 1358 var items = data["categories_in_group"].map(function (x) { 1359 return {item: x}; 1360 }); 1361 items.push({"item": "All categories"}); 1362 select_category_input.selectize({ 1363 maxItems: 1, 1364 maxOptions: data["categories_in_group"].length+1, 1365 labelField: "item", 1366 valueField: "item", 1367 searchField: "item", 1368 options: items, 1369 }); 1370 select_category_input.on("change", function (e) { 1371 var category_chosen_id = $(this).val(); 1372 if (category_chosen_id == "All categories") { 1373 reset_nodes_edges_color(sigmajs_bn); 1374 $("#button-set-evidence-group").hide(); 1375 $("#button-clear-evidence-group").hide(); 1376 sigmajs_bn_settings["active_category"] = ""; 1377 get_and_render_all_nodes_by_group(sigmajs_bn, sigmajs_bn_settings["active_group"]); 1378 } else { 1379 get_all_nodes_in_category(sigmajs_bn, category_chosen_id, "render_nodes_in_category"); 1380 $("#button-set-evidence-group").removeClass("hide-element").show(); 1381 $("#button-clear-evidence-group").removeClass("hide-element").show(); 1382 $("#set-evidence-group-2").text("Set evidence in " + category_chosen_id); 1383 $("#clear-evidence-group-2").text("Clear evidence in " + category_chosen_id); 1384 } 1385 }); 1386 } else { 1387 reset_nodes_edges_color(sigmajs_bn); 1388 $("#select-category-graph").hide(); 1389 } 1390 }, 1391 error: function () { 1392 } 1393 }); 1394 } 1395 1396 $("#check-dseparation-nodes").click(function(e) { 1397 var start_nodes = $("#select-start-nodes-bn").val(); 1398 var end_nodes = $("#select-end-nodes-bn").val(); 1399 var observed_nodes = $("#select-observed-nodes-bn").val(); 1400 var data_client_json = { 1401 "start_nodes": start_nodes, 1402 "end_nodes": end_nodes, 1403 "observed_nodes": observed_nodes 1404 }; 1405 data_client_json = JSON.stringify(data_client_json) 1406 var data_send = { 1407 "csrfmiddlewaretoken": csrf_token, 1408 "data_client_json": data_client_json, 1409 }; 1410 1411 $.ajax({ 1412 type: "POST", 1413 url: "/morpho/ml_bn_is_dseparated/", 1414 data: data_send, 1415 dataType: 'json', 1416 success: function (data) { 1417 if ($('[data-notify="container"]').length > 3) { 1418 $.notifyClose(); 1419 } 1420 if (data["is_dseparated"] === true) { 1421 print_notify_message(permanent = true, type = "info", 1422 icon = 'fa fa-info icon-margin-right', title = "D-separation", 1423 message = "D-separation confirmed. Group 1 = [" + start_nodes + "], Group 2 = [" + end_nodes + "], Ob
1423served nodes = [" + observed_nodes + "]", delay = 0, 1424 additional_message = "", position = "bottom-right"); 1425 } else { 1426 print_notify_message(permanent = true, type = "info", 1427 icon = 'fa fa-info icon-margin-right', title = "D-separation", 1428 message = "D-separation unconfirmed. Group 1 = [" + start_nodes + "], Group 2 = [" + end_nodes + "], Observed nodes = [" + observed_nodes + "]", delay = 0, 1429 additional_message = "", position = "bottom-right"); 1430 } 1431 }, 1432 error: function () { 1433 } 1434 }); 1435 }); 1436 1437 $("#get-dseparated-nodes").click(function(e) { 1438 var start_nodes = $("#select-start-nodes-bn").val(); 1439 1440 var data_client_json = { 1441 "start_nodes": start_nodes 1442 }; 1443 data_client_json = JSON.stringify(data_client_json) 1444 var data_send = { 1445 "csrfmiddlewaretoken": csrf_token, 1446 "data_client_json": data_client_json, 1447 }; 1448 1449 $.ajax({ 1450 type: "POST", 1451 url: "/morpho/ml_bn_get_dseparated_nodes/", 1452 data: data_send, 1453 dataType: 'json', 1454 success: function (data) { 1455 if ($('[data-notify="container"]').length > 3) { 1456 $.notifyClose(); 1457 } 1458 var print_message = ""; 1459 for (var key in data["reachable_nodes"]) { 1460 print_message += "<strong>" + key + "</strong> = [" + data["reachable_nodes"][key] + "]\n" 1461 } 1462 print_notify_message(permanent = true, type = "info", 1463 icon = 'fa fa-info icon-margin-right', title = "Reachable nodes from each node", 1464 message = print_message, delay = 0, 1465 additional_message = "", position = "bottom-right"); 1466 }, 1467 error: function () { 1468 } 1469 }); 1470 }); 1471 1472 1473 1474 function draw_bayesian_network_sigma(graph_sigma_js, sigmajs_default_settings, nodes, additional_discrete_features) { 1475 $("#section-draw-bn").removeClass("hide-element"); 1476 $("#section-draw-bn").show(); 1477 $("#bayesian-network-graph").empty(); 1478 1479 clear_sigmajs_instance(sigmajs_bn); 1480 init_sigmajs_plugins_before_creation(sigmajs_default_settings); 1481 1482 initialize_sigmajs_bn_instance(sigmajs_default_settings); 1483 sigmajs_bn.graph.read(graph_sigma_js); 1484 1485 init_sigmajs_plugins_after_creation(sigmajs_default_settings, nodes, additional_discrete_features); 1486 1487 show_hide_arrows(); 1488 draw_evidences(); 1489 1490 sigmajs_bn.refresh(); // Ask sigma to draw it 1491 } 1492 1493 function initialize_sigmajs_bn_instance(sigmajs_default_settings) { 1494 sigmajs_bn = new sigma( 1495 { 1496 renderer: { 1497 container: document.getElementById(sigmajs_bn_settings["instance_id"]), 1498 type: sigmajs_bn_settings["drawing_engine"], 1499 }, 1500 settings: sigmajs_default_settings, 1501 } 1502 ); 1503 resetCameraSigmajs(sigmajs_bn); 1504 //sigmajs_bn.cameras[0].goTo({ x: 0, y: 0, angle: 0, ratio: 1.1}); 1505 } 1506 1507 function clear_sigmajs_instance(sigma_js_instance) { 1508 var placeholder_html_graph = $("#" + sigmajs_bn_settings["instance_id"]); 1509 placeholder_html_graph.empty(); 1510 reset_sigmajs_buttons(); 1511 1512 if (sigma_js_instance.graph !== undefined && sigma_js_instance.graph.nodesArray !== undefined) { 1513 //this gets rid of all the nodes and edges 1514 sigma_js_instance.graph.clear(); 1515 //this gets rid of any methods you've attached to s. 1516 sigma_js_instance.graph.kill(); 1517 } 1518 } 1519 1520 function draw_evidences(structure_id) { 1521 var data_client_json = { 1522 "structure_id": structure_id, 1523 "model_name": $("#model_name").val() 1524 }; 1525 data_client_json = JSON.stringify(data_client_json); 1526 var data_send = { 1527 "csrfmiddlewaretoken": csrf_token, 1528 "data_client_json": data_client_json, 1529 }; 1530 1531 $.ajax({ 1532 type: "POST",
1533 url: "/morpho/ml_bn_get_nodes_evidences/", 1534 data: data_send, 1535 dataType: 'json', 1536 success: function (data) { 1537 var nodes_evidences = data["nodes_evidences"]; 1538 1539 sigmajs_bn.graph.nodes().forEach(function (node) { 1540 if (nodes_evidences.indexOf(node.id) >= 0) { 1541 change_node_edge_color(node, sigmajs_bn_settings["evidence_set_color"], false); 1542 node.evidence_set = true; 1543 node.selected_important = true; 1544 } else { 1545 node.evidence_set = false; 1546 node.selected_important = false; 1547 } 1548 }); 1549 sigmajs_bn.refresh(); 1550 }, 1551 error: function () { 1552 } 1553 }); 1554 } 1555 1556 function reset_sigmajs_buttons() { 1557 $(".checkbox-option-bn").prop("checked", false); 1558 $(".button-binded-bn").off(); 1559 } 1560 1561 1562 function show_hide_arrows() { 1563 var show_arrows = $("#checkbox-show-hide-arrows").is(":checked"); 1564 sigmajs_bn_settings["show_arrows"] = show_arrows;
1565 sigmajs_bn.graph.edges().forEach(function(e) { 1566 if (show_arrows) { 1567 e.type = "arrow"; 1568 } else { 1569 e.type = "line"; 1570 } 1571 1572 }); 1573 sigmajs_bn.refresh(); // Ask sigma to draw it 1574 } 1575 1576 function init_sigmajs_plugins_before_creation(sigmajs_default_settings) { 1577 if (!sigma.classes.graph.hasMethod('neighbors')) { 1578 sigma.classes.graph.addMethod('neighbors', function(nodeId) { 1579 var k, 1580 neighbors = {}, 1581 index = this.allNeighborsIndex[nodeId] || {}; 1582 1583 for (k in index) 1584 neighbors[k] = this.nodesIndex[k]; 1585 1586 return neighbors; 1587 }); 1588 } 1589 if (!sigma.classes.graph.hasMethod('getNode')) { 1590 sigma.classes.graph.addMethod('getNode', function(nodeId) { 1591 return this.nodesIndex[nodeId];; 1592 }); 1593 } 1594 1595 sigmajs_bn_settings["original_color"] = sigmajs_default_settings["nodeOriginalColor"]; 1596 sigmajs_bn_settings["num_nodes"] = sigmajs_default_settings["num_nodes"]; 1597 sigmajs_bn_settings["num_edges"] = sigmajs_default_settings["num_edges"]; 1598 1599 1600 if (sigmajs_bn_settings["width_slider"].noUiSlider) { 1601 sigmajs_bn_settings["width_slider"].noUiSlider.destroy(); 1602 } 1603 noUiSlider.create(sigmajs_bn_settings["width_slider"], { 1604 start: [sigmajs_default_settings["width_original"]], 1605 connect: true, 1606 range: { 1607 'min': sigmajs_default_settings["width_original"], 1608 'max': sigmajs_default_settings["width_max"], 1609 }, 1610 step: sigmajs_default_settings["width_step"], 1611 pips: { 1612 mode: 'count', 1613 values: sigmajs_default_settings["width_number_options"], 1614 density: 1 1615 } 1616 }); 1617 1618 if (sigmajs_bn_settings["height_slider"].noUiSlider) { 1619 sigmajs_bn_settings["height_slider"].noUiSlider.destroy(); 1620 } 1621 noUiSlider.create(sigmajs_bn_settings["height_slider"], { 1622 start: [sigmajs_default_settings["height_original"]], 1623 connect: true, 1624 range: { 1625 'min': sigmajs_default_settings["height_original"], 1626 'max': sigmajs_default_settings["height_max"], 1627 }, 1628 step: sigmajs_default_settings["height_step"], 1629 pips: { 1630 mode: 'count', 1631 values: sigmajs_default_settings["height_number_options"], 1632 density: 1 1633 } 1634 }); 1635 1636 if (sigmajs_bn_settings["nodes_slider"].noUiSlider) { 1637 sigmajs_bn_settings["nodes_slider"].noUiSlider.destroy(); 1638 } 1639 1640 noUiSlider.create(sigmajs_bn_settings["nodes_slider"], { 1641 start: [sigmajs_default_settings["maxNodeSize"]], 1642 connect: true, 1643 format: wNumb({ 1644 decimals: 2 1645 }), 1646 range: { 1647 'min': sigmajs_default_settings["minNodeSize"], 1648 'max': sigmajs_default_settings["maxNodeSize"], 1649 }, 1650 step: sigmajs_default_settings["nodeSizeStep"], 1651 pips: { 1652 mode: 'count', 1653 values: 5, 1654 density: 1, 1655 format: wNumb({ 1656 decimals: 1, 1657 }), 1658 } 1659 }); 1660 1661 if (sigmajs_bn_settings["edges_slider"].noUiSlider) { 1662 sigmajs_bn_settings["edges_slider"].noUiSlider.destroy(); 1663 } 1664 noUiSlider.create(sigmajs_bn_settings["edges_slider"], { 1665 start: [sigmajs_default_settings["maxEdgeSize"]], 1666 connect: true, 1667 format: wNumb({ 1668 decimals: 2 1669 }), 1670 range: { 1671 'min': sigmajs_default_settings["minEdgeSize"], 1672 'max': sigmajs_default_settings["maxEdgeSize"], 1673 }, 1674 step: sigmajs_default_settings["edgeSizeStep"], 1675 pips: { 1676 mode: 'count', 1677 values: 5, 1678 density: 1, 1679 format: wNumb({ 1680 decimals: 1, 1681 }), 1682 } 1683 }); 1684 1685 if ($("#model_name").val() !== "ml_probabilistic_clustering") { 1686 if (sigmajs_bn_settings["filter_edges_weight_slider"].noUiSlider) { 1687 sigmajs_bn_settings["filter_edges_weight_slider"].noUiSlider.destroy(); 1688 } 1689 if (sigmajs_default_settings["minWeight"] !== "" && sigmajs_default_settings["minWeight"] !== sigmajs_default_settings["maxWeight"]) { 1690 $("#filter-edges-by-weight-section").removeClass("hide-element").show(); 1691 1692 noUiSlider.create(sigmajs_bn_settings["filter_edges_weight_slider"], { 1693 start: [sigmajs_default_settings["minWeight"], sigmajs_default_settings["maxWeight"]], 1694 connect: true, 1695 format: wNumb({ 1696 decimals: 3 1697 }), 1698 range: { 1699 'min': sigmajs_default_settings["minWeight"], 1700 'max': sigmajs_default_settings["maxWeight"], 1701 }, 1702 step: 0.001, 1703 pips: { 1704 mode: 'count', 1705 values: 3, 1706 density: 1, 1707 format: wNumb({ 1708 decimals: 3, 1709 }), 1710 } 1711 }); 1712 1713 set_input_left_for_slider("slider-filter-edges-by-weight", sigmajs_bn_settings["filter_edges_weight_slider"], sigmajs_default_settings["minWeight"], function () { 1714 }); 1715 set_input_rigth_for_slider("slider-filter-edges-by-weight", sigmajs_bn_settings["filter_edges_weight_slider"], sigmajs_default_settings["maxWeight"], function () { 1716 }); 1717 } else { 1718 $("#filter-edges-by-weight-section").hide(); 1719 } 1720 } 1721 1722 1723 sigmajs_bn_settings["width_old"] = sigmajs_default_settings["widht_original"]; 1724 sigmajs_bn_settings["height_old"] = sigmajs_default_settings["height_old"]; 1725 } 1726 1727 1728 function fill_node_input(input_select_name, nodes) { 1729 var select_input = $("#" + input_select_name); 1730 select_input.selectize()[0].selectize.destroy(); 1731 select_input.empty(); 1732 var items = nodes.map(function (x) { 1733 return {item: x}; 1734 }); 1735 if (input_select_name === "select-start-nodes-bn") { 1736 select_input.selectize({ 1737 maxOptions: nodes.length, 1738 labelField: "item", 1739 valueField: "item", 1740 searchField: "item", 1741 options: items, 1742 }); 1743 } else if (input_select_name === "select-end-nodes-bn") { 1744 select_input.selectize({ 1745 maxOptions: nodes.length, 1746 labelField: "item", 1747 valueField: "item", 1748 searchField: "item", 1749 options: items, 1750 }); 1751 } else { 1752 select_input.selectize({ 1753 maxOptions: nodes.length, 1754 labelField: "item", 1755 valueField: "item", 1756 searchField: "item", 1757 options: items, 1758 }); 1759 } 1760 } 1761 1762 1763 function init_sigmajs_plugins_after_creation(sigmajs_default_settings, nodes, additional_discrete_features) { 1764 //To have a copy of the original colors in case some plugin modify them: 1765 save_original_color_nodes_edges(sigmajs_bn, sigmajs_default_settings); 1766 1767 if ($("#model_name").val() === "ml_probabilistic_clustering") { 1768 initialize_selectize_structures(sigmajs_bn_settings["structures_info"]); 1769 } 1770 1771 print_current_num_nodes_edges(); 1772 1773 //Drag nodes: 1774 var dragListener = sigma.plugins.dragNodes(sigmajs_bn, sigmajs_bn.renderers[0]); 1775 1776 $("#checkbox-show-hide-labels").prop('checked', sigmajs_default_settings["drawLabels"]); 1777 1778 //Initial behaviour of "on_click_node" is defined by the html "checked" parameters in the checkboxes 1779 on_change_click_node_options(sigmajs_default_settings); 1780 on_change_click_edge_options(sigmajs_default_settings); 1781 1782 //Click outside of a node: 1783 sigmajs_bn.bind('clickStage', function (e) { 1784 $("#node-parameters-plot-copy").remove(); 1785 }); 1786 1787 //Double click stage: 1788 sigmajs_bn.bind('doubleClickStage', function (e) { 1789 sigmajs_bn.settings('doubleClickEnabled', false); 1790 reset_nodes_edges_color(sigmajs_bn); 1791 //resetCameraSigmajs(sigmajs_bn); 1792 sigmajs_bn.refresh(); 1793 }); 1794 1795 //Search nodes input: 1796 fill_node_input("select-node-bn", nodes); 1797 fill_node_input("select-multi-nodes-bn", nodes); 1798 if ($("#model_name").val() !== "ml_probabilistic_clustering") { 1799 fill_node_input("select-start-nodes-bn", nodes); 1800 fill_node_input("select-observed-nodes-bn", nodes); 1801 fill_node_input("select-end-nodes-bn", nodes); 1802 } 1803 var select_node_input = $("#select-node-bn"); 1804 select_node_input.on("change", function (e) { 1805 var node_chosen_id = $(this).val(); 1806 if (node_chosen_id !== "" && node_chosen_id !== undefined) { 1807 focusOnNodeSigmajs(sigmajs_bn, node_chosen_id); 1808 focus_single_node(node_chosen_id); 1809 } 1810 }); 1811 1812 // Search groups input: 1813 set_additional_discrete_features(additional_discrete_features); 1814 1815 sigmajs_bn_settings["width_slider"].noUiSlider.on("update", function (values, handle) { 1816 var width_now = parseFloat(values[handle]); 1817 var width_next = width_now + sigmajs_default_settings["width_step"]; 1818
1819 sigmajs_bn.graph.nodes().forEach(function (node) { 1820 if (width_now > sigmajs_bn_settings["width_old"]) { 1821 node.x /= width_now; 1822 } else if (width_now < sigmajs_bn_settings["width_old"]) { 1823 node.x *= width_next; 1824 } 1825 }); 1826 sigmajs_bn_settings["width_old"] = width_now; 1827 sigmajs_bn.refresh(); 1828 }); 1829 1830 sigmajs_bn_settings["height_slider"].noUiSlider.on("update", function (values, handle) { 1831 var height_now = parseFloat(values[handle]); 1832 var height_next = height_now + sigmajs_default_settings["height_step"]; 1833 1834 sigmajs_bn.graph.nodes().forEach(function (node) { 1835 if (height_now > sigmajs_bn_settings["height_old"]) { 1836 node.y /= height_now; 1837 } else if (height_now < sigmajs_bn_settings["height_old"]) { 1838 node.y *= height_next; 1839 } 1840 }); 1841 sigmajs_bn_settings["height_old"] = height_now; 1842 sigmajs_bn.refresh(); 1843 }); 1844 1845 sigmajs_bn_settings["nodes_slider"].noUiSlider.on("update", function (values, handle) { 1846 var nodes_size = parseFloat(values[handle]); 1847 sigmajs_bn.settings('maxNodeSize', nodes_size); 1848 sigmajs_bn.refresh(); 1849 1850 }); 1851 sigmajs_bn_settings["edges_slider"].noUiSlider.on("update", function (values, handle) { 1852 var edges_size = parseFloat(values[handle]); 1853 sigmajs_bn.settings('maxEdgeSize', edges_size); 1854 sigmajs_bn.refresh(); 1855 }); 1856 1857 $("#checkbox-scale-nodes-dependent-markov-blanket").on("change", function (e) { 1858 var scale_nodes_dependent = $(this).is(":checked"); 1859 if (scale_nodes_dependent) { 1860 var data_client_json = { 1861 "model_name": $("#model_name").val() 1862 }; 1863 data_client_json = JSON.stringify(data_client_json); 1864 var data_send = { 1865 "csrfmiddlewaretoken": csrf_token, 1866 "data_client_json": data_client_json, 1867 }; 1868 $.ajax({ 1869 type: "POST", 1870 url: "/morpho/ml_bn_nodes_sizes_dependent_markov_blanket/", 1871 data: data_send, 1872 dataType: 'json', 1873 success: function (data) { 1874 if (! $.isEmptyObject(data["nodes_sizes"])) { 1875 sigmajs_bn.graph.nodes().forEach(function (n) { 1876 n.size = data["nodes_sizes"][n.id]; 1877 }); 1878 sigmajs_bn.settings('minNodeSize', data["min_node_size"]); 1879 sigmajs_bn.settings('maxNodeSize', data["max_node_size"]); 1880 sigmajs_bn.refresh(); 1881 } 1882 }, 1883 error: function () { 1884 } 1885 }); 1886 } else { 1887 sigmajs_bn.graph.nodes().forEach(function(n) { 1888 sigmajs_bn.settings('minNodeSize', sigmajs_default_settings["minNodeSize"]); 1889 sigmajs_bn.settings('maxNodeSize', sigmajs_default_settings["maxNodeSize"]); 1890 n.size = sigmajs_default_settings["maxNodeSize"]; 1891 }); 1892 sigmajs_bn.refresh(); 1893 } 1894 }); 1895 1896 $("#checkbox-scale-nodes-dependent-neighbors").on("change", function (e) { 1897 var scale_nodes_dependent = $(this).is(":checked"); 1898 if (scale_nodes_dependent) { 1899 var data_client_json = { 1900 "model_name": $("#model_name").val() 1901 }; 1902 data_client_json = JSON.stringify(data_client_json); 1903 var data_send = { 1904 "csrfmiddlewaretoken": csrf_token, 1905 "data_client_json": data_client_json, 1906 }; 1907 $.ajax({ 1908 type: "POST", 1909 url: "/morpho/ml_bn_nodes_sizes_dependent_neighbors/", 1910 data: data_send, 1911 dataType: 'json', 1912 success: function (data) {
1913 if (! $.isEmptyObject(data["nodes_sizes"])) { 1914 sigmajs_bn.graph.nodes().forEach(function (n) { 1915 n.size = data["nodes_sizes"][n.id]; 1916 }); 1917 sigmajs_bn.settings('minNodeSize', data["min_node_size"]); 1918 sigmajs_bn.settings('maxNodeSize', data["max_node_size"]); 1919 sigmajs_bn.refresh(); 1920 } 1921 }, 1922 error: function () { 1923 } 1924 }); 1925 } else { 1926 sigmajs_bn.graph.nodes().forEach(function(n) { 1927 sigmajs_bn.settings('minNodeSize', sigmajs_default_settings["minNodeSize"]); 1928 sigmajs_bn.settings('maxNodeSize', sigmajs_default_settings["maxNodeSize"]); 1929 n.size = sigmajs_default_settings["maxNodeSize"]; 1930 }); 1931 sigmajs_bn.refresh(); 1932 } 1933 }); 1934 1935 $("#checkbox-scale-edges-dependent-weights").on("change", function (e) { 1936 var scale_edges_dependent = $(this).is(":checked"); 1937 if (scale_edges_dependent) { 1938 var data_client_json = { 1939 "model_name": $("#model_name").val() 1940 }; 1941 data_client_json = JSON.stringify(data_client_json); 1942 var data_send = { 1943 "csrfmiddlewaretoken": csrf_token, 1944 "data_client_json": data_client_json, 1945 }; 1946 $.ajax({ 1947 type: "POST", 1948 url: "/morpho/ml_bn_edges_size_dependent_weights/", 1949 data: data_send, 1950 dataType: 'json', 1951 success: function (data) { 1952 if (! $.isEmptyObject(data["edges_sizes"])) {
1953 sigmajs_bn.graph.edges().forEach(function (edge) { 1954 edge.size = data["edges_sizes"][edge.source + data["edges_sep_char"] + edge.target]; 1955 }); 1956 sigmajs_bn.settings('minEdgeSize', data["min_edge_size"]); 1957 sigmajs_bn.settings('maxEdgeSize', data["max_edge_size"]); 1958 sigmajs_bn.refresh(); 1959 } 1960 }, 1961 error: function (e) { 1962 } 1963 }); 1964 } else { 1965 sigmajs_bn.graph.edges().forEach(function(edge) { 1966 sigmajs_bn.settings('minEdgeSize', sigmajs_default_settings["minEdgeSize"]); 1967 sigmajs_bn.settings('maxEdgeSize', sigmajs_default_settings["maxEdgeSize"]); 1968 edge.size = sigmajs_default_settings["maxEdgeSize"]; 1969 }); 1970 sigmajs_bn.refresh(); 1971 } 1972 }); 1973 1974 $("#checkbox-highlight-important-nodes").on("change", function () { 1975 var highlight_important_nodes = $(this).is(":checked"); 1976 var num_neighbors = $("#n-neighbors-important").val(); 1977 var include_neighbors = $("#checkbox-include-important-neighbors").is(":checked"); 1978 var propagate_colors_to_hubs_neighbors = true; 1979 var highlight_algorithm_selected = $("#select-highlight-important-nodes-algorithm").val(); 1980 if (highlight_important_nodes) { 1981 if (highlight_algorithm_selected === "degrees") { 1982 get_important_nodes_degrees(highlight_algorithm_selected, sigmajs_default_settings, num_neighbors, include_neighbors, propagate_colors_to_hubs_neighbors); 1983 } else if (highlight_algorithm_selected === "betweenness-centrality") { 1984 get_important_nodes_betweenness(highlight_algorithm_selected, sigmajs_default_settings); 1985 } 1986 } else { 1987 sigmajs_bn.graph.nodes().forEach(function(n) { 1988 change_node_edge_color(n, n.originalColor, false); 1989 n.selected_important = false; 1990 1991 sigmajs_bn.settings('maxNodeSize', sigmajs_default_settings["maxNodeSize"]); 1992 n.size = sigmajs_default_settings["maxNodeSize"]; 1993 }); 1994 sigmajs_bn_settings["nodes_slider"].noUiSlider.updateOptions({ 1995 start: [sigmajs_bn.settings('maxNodeSize')], 1996 range: { 1997 'min': sigmajs_bn.settings('minNodeSize'), 1998 'max': parseFloat(sigmajs_bn.settings('maxNodeSize').toFixed(1)) 1999 } 2000 }); 2001 sigmajs_bn.refresh(); 2002 } 2003 2004 }); 2005 2006 $("#checkbox-highlight-communities").on("change", function () { 2007 var highlight_communities = $(this).is(":checked"); 2008 var highlight_algorithm_selected = $("#select-highlight-communities-algorithm").val(); 2009 if (highlight_communities) { 2010 if (highlight_algorithm_selected === "louvain") { 2011 var notify_loading = print_notify_message(permanent = true, type = "info", 2012 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Loading louvain", 2013 message = "Loading louvain algorithm", delay = 0, 2014 additional_message = "", position = "bottom-right"); 2015 var data_client_json = { 2016 "selection_option": highlight_algorithm_selected, 2017 "model_name": $("#model_name").val() 2018 }; 2019 data_client_json = JSON.stringify(data_client_json); 2020 2021 var data_send = { 2022 "csrfmiddlewaretoken": csrf_token, 2023 "data_client_json": data_client_json 2024 }; 2025 $.ajax({ 2026 type: "POST", 2027 url: "/morpho/ml_bn_highlight_communities/", 2028 data: data_send, 2029 dataType: 'json', 2030 success: function (data) { 2031 if (!$.isEmptyObject(data["communities"]) && !$.isEmptyObject(data["additional_parameters"])) { 2032 for (var node_id in data["communities"]) { 2033 var node = data["communities"][node_id]; 2034 var node_sigmajs = sigmajs_bn.graph.getNode(node_id); 2035 change_node_edge_color(node_sigmajs, node.color, true); 2036 node_sigmajs.selected_important = true; 2037 } 2038 set_additional_discrete_features(data["additional_parameters"]); 2039 sigmajs_bn.refresh(); 2040 } 2041 }, error: function () { 2042 }, 2043 complete:function() { 2044 notify_loading.close(); 2045 } 2046 }); 2047 } 2048 } else { 2049 var data_client_json = { 2050 "selection_option": highlight_algorithm_selected, 2051 "model_name": $("#model_name").val() 2052 }; 2053 data_client_json = JSON.stringify(data_client_json); 2054 var data_send = { 2055 "csrfmiddlewaretoken": csrf_token, 2056 "data_client_json": data_client_json 2057 }; 2058 $.ajax({ 2059 type: "POST", 2060 url: "/morpho/ml_bn_restore_highlight_communities/", 2061 data: data_send, 2062 dataType: 'json', 2063 success: function (data) { 2064 if (!$.isEmptyObject(data["additional_parameters"])) { 2065 set_additional_discrete_features(data["additional_parameters"]); 2066 } else { 2067 set_additional_discrete_features(); 2068 } 2069 sigmajs_bn.refresh(); 2070 }, error: function () { 2071 } 2072 }); 2073
2074 sigmajs_bn.graph.nodes().forEach(function(n) { 2075 if (n.evidence_set === true) { 2076 change_node_edge_color(n, sigmajs_bn_settings["evidence_set_color"], false); 2077 n.selected_important = true; 2078 } else { 2079 change_node_edge_color(n, sigmajs_bn_settings["original_color"], true); 2080 n.selected_important = false; 2081 } 2082 n.label = n.id; 2083 sigmajs_bn.settings('maxNodeSize', sigmajs_default_settings["maxNodeSize"]); 2084 n.size = sigmajs_default_settings["maxNodeSize"]; 2085 }); 2086 sigmajs_bn.graph.edges().forEach(function(e) { 2087 change_node_edge_color(e, e.originalColor, false); 2088 e.selected = false; 2089 }); 2090 sigmajs_bn_settings["nodes_slider"].noUiSlider.updateOptions({ 2091 start: [sigmajs_bn.settings('maxNodeSize')], 2092 range: { 2093 'min': sigmajs_bn.settings('minNodeSize'), 2094 'max': parseFloat(sigmajs_bn.settings('maxNodeSize').toFixed(1)) 2095 } 2096 }); 2097 sigmajs_bn.refresh(); 2098 } 2099 }); 2100 2101 $("#select-highlight-important-nodes-algorithm").on("change", function(e) { 2102 var highlight_algorithm_selected = $("#select-highlight-important-nodes-algorithm").val(); 2103 var n_neighbors_important_form = $("#n-neighbors-important-form"); 2104 var include_important_neighbors_form = $("#include-important-neighbors-form"); 2105 2106 if (highlight_algorithm_selected === "degrees") { 2107 n_neighbors_important_form.removeClass("hide-element"); 2108 include_important_neighbors_form.removeClass("hide-element"); 2109 } else { 2110 n_neighbors_important_form.addClass("hide-element"); 2111 include_important_neighbors_form.addClass("hide-element"); 2112 } 2113 }); 2114 2115 //Prevent on click node options to close the dropdown menu: 2116 $(".buttons-options-draw-bn").on('click', '.dropdown-menu ', function (e) { 2117 e.stopPropagation(); 2118 }); 2119 2120 $("#select-highlight-important-nodes-algorithm").on('click', function (e) { 2121 e.stopPropagation(); 2122 }); 2123 2124 $("#select-highlight-communities-algorithm").on('click', function (e) { 2125 e.stopPropagation(); 2126 }); 2127 2128 $(".checkbox-on-click-node-option").on("change", function (e) { 2129 on_change_click_node_options(sigmajs_default_settings); 2130 }); 2131 2132 2133 $(".checkbox-on-click-edge-option").on("change", function (e) { 2134 on_change_click_edge_options(sigmajs_default_settings); 2135 }); 2136 2137 } 2138 2139 function set_additional_discrete_features(additional_discrete_features) { 2140 if (additional_discrete_features) { 2141 $("#bn-options-on-click-group").removeClass("hide-element"); 2142 $("#bn-options-on-click-group").show(); 2143 $("#select-category-graph").hide(); 2144 2145 $("#select-group-graph").removeClass("hide-element"); 2146 $("#select-group-graph").show(); 2147 var select_groups_input = $("#select-group-bn"); 2148 select_groups_input.selectize()[0].selectize.destroy(); 2149 select_groups_input.empty(); 2150 var items = additional_discrete_features.map(function (x) { 2151 return {item: x}; 2152 }); 2153 var current_item = additional_discrete_features[additional_discrete_features.length-1]; 2154 items.push({"item": "No group"}); 2155 select_groups_input.selectize({ 2156 maxItems: 1, 2157 maxOptions: additional_discrete_features.length+1, 2158 labelField: "item", 2159 valueField: "item", 2160 searchField: "item", 2161 options: items, 2162 }); 2163 2164 if ($("#model_name").val() === "ml_probabilistic_clustering" && $("#datatable_available").val() === "True") { 2165 init_update_selectize_datatable_cols_groups(); 2166 } 2167 2168 select_groups_input.on("change", function (e) { 2169 var group_chosen_id = $(this).val(); 2170 if (group_chosen_id == "No group") { 2171 $("#button-set-evidence-group").addClass("hide-element"); 2172 $("#button-clear-evidence-group").addClass("hide-element"); 2173 sigmajs_bn_settings["active_group"] = ""; 2174 sigmajs_bn_settings["active_category"] = ""; 2175 } 2176 get_and_render_all_nodes_by_group(sigmajs_bn, group_chosen_id); 2177 get_category_values_in_group(group_chosen_id); 2178 }); 2179 2180 var selectize_groups_input = select_groups_input[0].selectize; 2181 selectize_groups_input.addItem(current_item); 2182 } else { 2183 $("#bn-options-on-click-group").hide(); 2184 $("#select-group-graph").hide(); 2185 } 2186 } 2187 2188 function on_change_click_node_options(sigmajs_default_settings) { 2189 var show_markov_blanket = $("#checkbox-on-click-markov-blanket").is(":checked"); 2190 var show_neighbors = $("#checkbox-on-click-neighbors").is(":checked"); 2191 var show_parents = $("#checkbox-on-click-parents").is(":checked"); 2192 var show_children = $("#checkbox-on-click-children").is(":checked"); 2193 var show_parameters = $("#checkbox-on-click-parameters").is(":checked"); 2194 var show_connections_info = $("#checkbox-on-click-connections-info").is(":checked"); 2195 var show_same_category = $("#checkbox-on-click-same-group").is(":checked"); 2196 on_click_node_options(sigmajs_default_settings, show_markov_blanket, show_neighbors, show_parents, show_children, show_parameters, show_same_category, show_connections_info) 2197 } 2198 2199 function on_change_click_edge_options(sigmajs_default_settings) { 2200 var show_edge_info = $("#checkbox-on-click-edge-info").is(":checked"); 2201 on_click_edge_options(sigmajs_default_settings, show_edge_info) 2202 } 2203 2204 function on_click_node_options(sigmajs_default_settings, show_markov_blanket, show_neighbors, show_parents, show_children, show_parameters, show_same_category, show_connections_info) { 2205 sigmajs_bn.unbind('clickNode'); 2206 sigmajs_bn.bind('clickNode', function(e) { 2207 var node_chosen_id = e.data.node.id; 2208 if ($("#model_name").val() !== "ml_probabilistic_clustering") { 2209 reset_nodes_color(sigmajs_bn); 2210 } 2211 copyToClipboard(node_chosen_id); 2212 2213 if (show_parameters) { 2214 get_and_render_node_parameters(sigmajs_bn, node_chosen_id, e.data.captor); 2215 } 2216 if (show_same_category) { 2217 get_and_render_nodes_same_category(sigmajs_bn, node_chosen_id, sigmajs_default_settings["highlightNodeColor"]); 2218 } 2219 if (show_markov_blanket) { 2220 var url = "/morpho/ml_bn_get_markov_blanket/"; 2221 var selection = "markov_blanket"; 2222 get_and_render_x_nodes(sigmajs_bn, node_chosen_id, sigmajs_default_settings["highlightNodeColor"], url, selection); 2223 } 2224 if (show_neighbors) { 2225 var url = "/morpho/ml_bn_get_neighbors/"; 2226 var selection = "neighbors"; 2227 get_and_render_x_nodes(sigmajs_bn, node_chosen_id, sigmajs_default_settings["highlightNodeColor"], url, selection); 2228 } 2229 if (show_parents) { 2230 var url = "/morpho/ml_bn_get_parents/"; 2231 var selection = "parents"; 2232 get_and_render_x_nodes(sigmajs_bn, node_chosen_id, sigmajs_default_settings["highlightNodeColor"], url, selection); 2233 } 2234 if (show_children) { 2235 var url = "/morpho/ml_bn_get_children/"; 2236 var selection = "children"; 2237 get_and_render_x_nodes(sigmajs_bn, node_chosen_id, sigmajs_default_settings["highlightNodeColor"], url, selection); 2238 } 2239 if (show_connections_info) { 2240 get_and_render_node_connections_info(sigmajs_bn, node_chosen_id, sigmajs_default_settings["highlightNodeColor"]); 2241 } 2242 }); 2243 } 2244 2245 function on_click_edge_options(sigmajs_default_settings, show_edge_info) { 2246 //sigmajs_bn_settings["drawing_engine"] = "canvas"; 2247 2248 sigmajs_bn.unbind('clickEdge'); 2249 sigmajs_bn.bind('clickEdge', function (e) { 2250 var source_node = e.data.edge.source; 2251 var target_node = e.data.edge.target; 2252 reset_nodes_edges_color(sigmajs_bn); 2253 2254 if (show_edge_info) { 2255 get_and_render_edge_info(sigmajs_bn, source_node, target_node); 2256 } 2257 }); 2258 2259 } 2260 2261 function reload_sigmajs_graph(sigmajs_instance) { 2262 // var layout_name = undefined; 2263 // var additional_params = undefined; 2264 // change_layout_sigmajs(layout_name, additional_params); 2265 $("#continue-button-upload-bn").trigger("click"); 2266 } 2267 2268 function focusOnNodeSigmajs(sigmajs_instance, node_id) { 2269 var node = sigmajs_instance.graph.getNode(node_id); 2270 2271 //resetCameraSigmajs(sigmajs_bn); 2272 2273 2274 sigma.misc.animation.camera( 2275 sigmajs_instance.camera, 2276 {
2277 x: node[sigmajs_instance.camera.readPrefix + 'x'], 2278 y: node[sigmajs_instance.camera.readPrefix + 'y'], 2279 ratio: 0.15 2280 }, 2281 { 2282 duration: 500 2283 } 2284 ); 2285 } 2286 2287 function resetCameraSigmajs(sigmajs_instance) { 2288 sigma.misc.animation.camera( 2289 sigmajs_instance.camera, 2290 { 2291 x: 0, 2292 y: 0, 2293 angle: 0, 2294 ratio: 1.1 2295 }, 2296 { 2297 duration: 500 2298 } 2299 ); 2300 } 2301 2302 function save_original_color_nodes_edges(sigmajs_instance, sigmajs_default_settings) { 2303 sigmajs_instance.graph.nodes().forEach(function(n) { 2304 n.originalColor = n.color; 2305 }); 2306 sigmajs_instance.graph.edges().forEach(function(e) { 2307 e.originalColor = e.color; 2308 }); 2309 2310 sigmajs_bn_settings["color_hidden"] = sigmajs_default_settings["color_hidden"]; 2311 sigmajs_bn_settings["color_common_edges"] = sigmajs_default_settings["color_common_edges"]; 2312 sigmajs_bn_settings["color_structure_1"] = sigmajs_default_settings["color_structure_1"]; 2313 sigmajs_bn_settings["color_structure_2"] = sigmajs_default_settings["color_structure_2"]; 2314 sigmajs_bn_settings["highlight_node_color"] = sigmajs_default_settings["highlightNodeColor"]; 2315 sigmajs_bn_settings["structures_info"] = sigmajs_default_settings["structures_info"]; 2316 } 2317 2318 function hide_node_edge(x) { 2319 var hide = $("#checkbox-on-click-group-hide-others").is(":checked"); 2320 if (hide) { 2321 x.hidden = true; 2322 } else { 2323 x.color = sigmajs_bn_settings["color_hidden"]; 2324 x.hidden = false; 2325 } 2326 x.selected = false; 2327 } 2328 2329 function change_node_edge_color(x, color, important) { 2330 x.hidden = false; 2331 2332 x.color = color; 2333 if (important) { 2334 x.color_important = color; 2335 } 2336 } 2337 2338 function reset_node_color(n) { 2339 if (!n.selected_important) { 2340 change_node_edge_color(n, sigmajs_bn_settings["original_color"], false); 2341 n.selected = false; 2342 } else { 2343 if (n.evidence_set) { 2344 change_node_edge_color(n, sigmajs_bn_settings["evidence_set_color"], false); 2345 } else { 2346 change_node_edge_color(n, n.color_important, false); 2347 } 2348 n.selected = false; 2349 } 2350 } 2351 2352 function reset_nodes_color(sigmajs_instance) { 2353 sigmajs_instance.graph.nodes().forEach(function(n) { 2354 reset_node_color(n); 2355 }); 2356 2357 sigmajs_instance.refresh(); 2358 } 2359 2360 function reset_edges_color(sigmajs_instance) {
2361 sigmajs_instance.graph.edges().forEach(function(e) { 2362 if (!e.structure_selected || e.selected) { 2363 change_node_edge_color(e, e.originalColor, false); 2364 e.selected = false; 2365 } 2366 }); 2367 2368 sigmajs_instance.refresh(); 2369 } 2370 2371 function reset_nodes_edges_color(sigmajs_instance) { 2372 reset_nodes_color(sigmajs_instance); 2373 2374 if (sigmajs_bn_settings["active_category"] !== "") { 2375 $("#select-category-bn")[0].selectize.addItem("All categories"); 2376 } 2377 sigmajs_bn_settings["active_category"] = ""; 2378 2379 print_current_num_nodes_edges(); 2380 2381 if ($("#model_name").val() === "ml_probabilistic_clustering") { 2382 reset_nodes_edges_color_prob_clustering(); 2383 } else { 2384 reset_edges_color(sigmajs_instance); 2385 } 2386 } 2387 2388 function render_x_nodes(nodes_selection, sigmajs_instance, selection, nodeId, highlight_node_color) { 2389 var toKeep = {}; 2390 for (var i = 0; i < nodes_selection.length; i++) { 2391 var node_id = nodes_selection[i]; 2392 toKeep[node_id] = sigmajs_instance.graph.getNode(node_id) 2393 } 2394 2395 sigmajs_instance.graph.nodes().forEach(function (n) { 2396 var valid = true; 2397 2398 if (sigmajs_bn_settings["active_category"] !== "" && !n.selected) { 2399 valid = false; 2400 } 2401 2402 if (valid) { 2403 if (toKeep[n.id]) { 2404 if (!n.selected_important) { 2405 change_node_edge_color(n, n.originalColor, false); 2406 } else { 2407 change_node_edge_color(n, n.color_important, false); 2408 } 2409 n.selected = true; 2410 } else { 2411 hide_node_edge(n); 2412 } 2413 } else { 2414 hide_node_edge(n) 2415 } 2416 }); 2417
2418 sigmajs_instance.graph.edges().forEach(function (e) { 2419 var source = e.source; 2420 var target = e.target; 2421 var valid_edge = true; 2422 var highlight_edge = false; 2423 2424 if (selection === "parents" && target !== nodeId) { 2425 valid_edge = false; 2426 } 2427 if (selection === "children" && source !== nodeId) { 2428 valid_edge = false; 2429 } 2430 if (sigmajs_bn_settings["active_category"] !== "" && !e.selected) { 2431 valid_edge = false; 2432 } 2433 2434 if (valid_edge) { 2435 if (toKeep[source] && toKeep[target]) { 2436 change_node_edge_color(e, e.color, false); 2437 e.selected = true; 2438 highlight_edge = true; 2439 } 2440 } 2441 if (!highlight_edge) { 2442 hide_node_edge(e); 2443 } 2444 }); 2445 2446 sigmajs_instance.refresh(); 2447 2448 set_node_color(sigmajs_instance, nodeId, highlight_node_color); 2449 } 2450 2451 function get_and_render_x_nodes(sigmajs_instance, nodeId, highlight_node_color, url, selection) { 2452 var data_client_json = { 2453 "node_id": nodeId, 2454 "model_name": $("#model_name").val() 2455 }; 2456 data_client_json = JSON.stringify(data_client_json); 2457 var data_send = { 2458 "csrfmiddlewaretoken": csrf_token, 2459 "data_client_json": data_client_json, 2460 }; 2461 2462 $.ajax({ 2463 type: "POST", 2464 url: url, 2465 data: data_send, 2466 dataType: 'json', 2467 success: function (data) { 2468 var nodes_selection = data["nodes_selection"]; 2469 if (! nodes_selection.includes(nodeId)) { 2470 nodes_selection.push(nodeId); 2471 } 2472 render_x_nodes(nodes_selection, sigmajs_instance, selection, nodeId, highlight_node_color); 2473 }, 2474 error: function () { 2475 } 2476 }); 2477 } 2478 2479 function get_and_render_all_nodes_by_group(sigmajs_instance, group_id) { 2480 var data_client_json = { 2481 "group_id": group_id, 2482 "model_name": $("#model_name").val() 2483 }; 2484 data_client_json = JSON.stringify(data_client_json); 2485 var data_send = { 2486 "csrfmiddlewaretoken": csrf_token, 2487 "data_client_json": data_client_json, 2488 }; 2489 2490 $.ajax({ 2491 type: "POST", 2492 url: "/morpho/ml_bn_get_info_nodes_by_group/", 2493 data: data_send, 2494 dataType: 'json', 2495 success: function (data) { 2496 if (! $.isEmptyObject(data["info_nodes"])) { 2497 sigmajs_bn_settings["active_group"] = group_id; 2498 sigmajs_instance.graph.nodes().forEach(function(n) { 2499 if (data["info_nodes"][n.id]) { 2500 change_node_edge_color(n, data["info_nodes"][n.id]["color"], true); 2501 n.selected_important = true; 2502 n.label = n.id + " | (" + data["info_nodes"][n.id]["category"] + ")"; 2503 } else if (!n.evidence_set) { 2504 n.originalColor = sigmajs_bn_settings["original_color"]; 2505 change_node_edge_color(n, sigmajs_bn_settings["original_color"], true); 2506 n.selected_important = false; 2507 n.label = n.id; 2508 n.selected = false; 2509 } 2510 }); 2511 } else { 2512 sigmajs_bn_settings["active_group"] = ""; 2513 sigmajs_instance.graph.nodes().forEach(function(n) { 2514 if (!n.evidence_set) { 2515 n.originalColor = sigmajs_bn_settings["original_color"]; 2516 change_node_edge_color(n, sigmajs_bn_settings["original_color"], true); 2517 n.selected_important = false; 2518 n.label = n.id; 2519 n.selected = false;
2520 } 2521 }); 2522 } 2523 2524 sigmajs_instance.refresh(); 2525 }, 2526 error: function () { 2527 } 2528 }); 2529 } 2530 2531 function get_all_nodes_in_category(sigmajs_instance, category_id, option, notify_loading) { 2532 var notify_loading = print_notify_message(permanent = true, type = "info", 2533 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Filtering", 2534 message = "Loading nodes and edges.", delay = 0, 2535 additional_message = "", position = "bottom-right"); 2536 2537 var show_neighbors = $("#checkbox-on-click-group-show-neighbors").is(":checked"); 2538 var data_client_json = { 2539 "group_id": sigmajs_bn_settings["active_group"], 2540 "category_id": category_id, 2541 "structure_id": sigmajs_bn_settings["active_structure"], 2542 "show_neighbors": show_neighbors, 2543 "model_name": $("#model_name").val() 2544 }; 2545 data_client_json = JSON.stringify(data_client_json); 2546 var data_send = { 2547 "csrfmiddlewaretoken": csrf_token, 2548 "data_client_json": data_client_json, 2549 }; 2550 2551 $.ajax({ 2552 type: "POST", 2553 url: "/morpho/ml_bn_get_nodes_in_category/", 2554 data: data_send, 2555 dataType: 'json', 2556 success: function (data) { 2557 notify_loading.close(); 2558 if (!data["error"]) { 2559 sigmajs_bn_settings["active_category"] = category_id; 2560 2561 if (option === "render_nodes_in_category") { 2562 reset_nodes_color(sigmajs_bn); 2563 render_nodes_in_category(sigmajs_instance, data["nodes_in_category"], data["color_category"]); 2564 if (show_neighbors) { 2565 render_nodes_in_category(sigmajs_instance, data["neighbors"], undefined); 2566 var nodes_to_highlight = data["nodes_in_category"].concat(data["neighbors"]); 2567 get_edges_between_nodes(nodes_to_highlight); 2568 } else { 2569 get_edges_between_nodes(data["nodes_in_category"]); 2570 } 2571 } else if (option === "clear_nodes_evidences") { 2572 $("#node-parameters-plot-copy").remove(); 2573 clear_nodes_evidences(data["nodes_in_category"], {}, true); 2574 } else if (option === "set_nodes_evidences") { 2575 var evidence_group_value = $("#evidence-group-value"); 2576 var new_evidence_value = evidence_group_value.val(); 2577 $("#node-parameters-plot-copy").remove(); 2578 set_nodes_evidences(data["nodes_in_category"], new_evidence_value, {}, true, callback_function = function () { 2579 notify_loading.close(); 2580 }); 2581 } 2582 } 2583 }, 2584 error: function (e) { 2585 notify_loading.close(); 2586 } 2587 }); 2588 } 2589 2590 function get_and_render_nodes_same_category(sigmajs_instance, nodeId, highlight_node_color) { 2591 if (sigmajs_bn_settings["active_group"] === "") { 2592 var notify_error = print_notify_message(permanent=false, type="danger", 2593 icon='fa fa-warning icon-margin-right', title="Error showing the category (" + nodeId + "): ", 2594 message="First select a group and category at the left side of the screen", delay=400, 2595 additional_message="", position="bottom-right"); 2596 } else { 2597 var data_client_json = { 2598 "group_id": sigmajs_bn_settings["active_group"], 2599 "node_id": nodeId, 2600 "model_name": $("#model_name").val() 2601 }; 2602 data_client_json = JSON.stringify(data_client_json) 2603 var data_send = { 2604 "csrfmiddlewaretoken": csrf_token, 2605 "data_client_json": data_client_json, 2606 }; 2607 2608 $.ajax({ 2609 type: "POST", 2610 url: "/morpho/ml_bn_get_nodes_same_category/", 2611 data: data_send, 2612 dataType: 'json', 2613 success: function (data) { 2614 render_nodes_in_category(sigmajs_instance, data["nodes_in_category"], data["color_category"]); 2615 get_edges_between_nodes(data["nodes_in_category"]); 2616 set_node_color(sigmajs_instance, nodeId, highlight_node_color); 2617 }, 2618 error: function () { 2619 } 2620 }); 2621 } 2622 } 2623 2624 function render_nodes_in_category(sigmajs_instance, nodes_in_category, color_category) { 2625 if (nodes_in_category !== undefined) { 2626 var toKeep = {}; 2627 var num_nodes_selected = 0; 2628 for (var i = 0; i < nodes_in_category.length; i++) { 2629 var node_id = nodes_in_category[i]; 2630 toKeep[node_id] = sigmajs_instance.graph.getNode(node_id) 2631 } 2632 2633 if (color_category === undefined) { 2634 color_category = sigmajs_bn_settings["original_color"]; 2635 } 2636
2637 sigmajs_instance.graph.nodes().forEach(function (n) { 2638 if (toKeep[n.id]) { 2639 if (n.evidence_set) { 2640 change_node_edge_color(n, sigmajs_bn_settings["evidence_set_color"], false); 2641 } else { 2642 change_node_edge_color(n, color_category, false); 2643 } 2644 n.selected = true; 2645 n.selected_important = true; 2646 num_nodes_selected++; 2647 } else { 2648 if (! n.selected) { 2649 hide_node_edge(n) 2650 } else { 2651 num_nodes_selected++; 2652 } 2653 } 2654 }); 2655 2656 sigmajs_instance.graph.edges().forEach(function (e) { 2657 if (!e.selected) { 2658 hide_node_edge(e); 2659 } 2660 }); 2661 } else { 2662 reset_nodes_edges_color(sigmajs_instance); 2663 } 2664 2665 $("#network-stats-num-nodes-selected").text(num_nodes_selected); 2666 2667 sigmajs_instance.refresh(); 2668 } 2669 2670 function set_node_color(sigmajs_instance, nodeId, rgb_color) { 2671 var node = sigmajs_instance.graph.getNode(nodeId); 2672 change_node_edge_color(node, rgb_color, false); 2673 node.selected = true; 2674 2675 sigmajs_instance.refresh(); 2676 } 2677 2678 function render_continuous_params(placeholder_node_plot, parameters_plot, node_parameters_selection, evidence_value) { 2679 placeholder_node_plot.append(parameters_plot); 2680 var chart = placeholder_node_plot.find(".plotly-graph-div"); 2681 var plot_maximum = chart[0].data[0].x[chart[0].data[0].x.length - 1]; 2682 var plot_minimum = chart[0].data[0].x[0]; 2683 2684 node_parameters_selection.attr({ 2685 "min": chart[0].data[0].x[0], 2686 "max": chart[0].data[0].x[chart[0].data[0].x.length - 1], 2687 "step": ((plot_maximum - plot_minimum) / 100).toFixed(3) 2688 }); 2689 node_parameters_selection.val(evidence_value); 2690 2691 placeholder_node_plot.find(".plotly-graph-div").on('plotly_click', function (data, points) { 2692 var new_evidence_value = points.points[0].x; 2693 node_parameters_selection.val(new_evidence_value); 2694 }); 2695 } 2696 2697 function show_waiting_inference(node_probability_continuous_parameters, node_probability_discrete_parameters, evidence_buttons, waiting_div) { 2698 node_probability_continuous_parameters.hide(); 2699 node_probability_discrete_parameters.hide(); 2700 evidence_buttons.hide(); 2701 waiting_div.find('#text-waiting-param-node').text("Running inference"); 2702 waiting_div.show(); 2703 } 2704 2705 function get_and_render_node_parameters(sigmajs_instance, nodeId, node_data_captor) { 2706 var node_sigmajs = sigmajs_bn.graph.getNode(nodeId); 2707 var inference_mode = $("#bn-evidence-mode").is(":checked"); 2708 var placeholder_node_params = $("#node-parameters-plot-root"); 2709 var bayesian_network_graph = $("#bayesian-network-graph"); 2710 $("#node-parameters-plot-copy").remove(); 2711 var placeholder_node_params_copy = placeholder_node_params.clone(); 2712 placeholder_node_params_copy.attr("id", "node-parameters-plot-copy"); 2713 bayesian_network_graph.append(placeholder_node_params_copy); 2714 placeholder_node_params_copy.removeClass("hide-element").show(); 2715 2716 bayesian_network_graph.css({position:'relative'}); 2717 var parameters_height = (bayesian_network_graph.height()/2)+node_data_captor.y-(placeholder_node_params_copy.height()+60); 2718 var parameters_width = (bayesian_network_graph.width()/2)+node_data_captor.x-(placeholder_node_params_copy.width()/2); 2719 placeholder_node_params_copy.css({top: parameters_height, left: parameters_width, position:'absolute'}); 2720 2721 2722 var data_client_json = { 2723 "node_id": nodeId, 2724 "inference_mode": inference_mode, 2725 "structure_id": $("#selectize-bn-structure").val(), 2726 "model_name": $("#model_name").val() 2727 }; 2728 data_client_json = JSON.stringify(data_client_json); 2729 var data_send = { 2730 "csrfmiddlewaretoken": csrf_token, 2731 "data_client_json": data_client_json, 2732 }; 2733 2734 $.ajax({ 2735 type: "POST", 2736 url: "/morpho/ml_bn_get_node_parameters/", 2737 data: data_send, 2738 dataType: 'json', 2739 success: function (data) { 2740 if(data["error"]) { 2741 placeholder_node_params_copy.remove(); 2742 var message_error = "No parameters available for this node. <br> Learn them in the section above or upload them."; 2743 var notify_error = print_notify_message(permanent=false, type="danger", 2744 icon='fa fa-align-left icon-margin-right', title="Parameters (" + nodeId + "): ", 2745 message=message_error, delay=150, 2746 additional_message="", position="bottom-right"); 2747 } else { 2748 var data_type = data["data_type"]; 2749 var node_probability_discrete_parameters = $('#node-parameters-plot-copy #node-probability-discrete-parameters'); 2750 var node_probability_continuous_parameters = $('#node-parameters-plot-copy #node-probability-continuous-parameters'); 2751 var evidence_buttons = $('#node-parameters-plot-copy #evidence-buttons'); 2752 var evidence_button_clear = evidence_buttons.find("#clear-evidence"); 2753 var waiting_div = $('#node-parameters-plot-copy .waiting-param-node'); 2754 var node_parameters_root = $('#node-parameters-plot-root #node-parameters-0'); 2755 var placeholder_node_plot = $("#node-parameters-plot-copy #node-html-plot"); 2756 var node_name_plot = $("#node-parameters-plot-copy #node-name-plot"); 2757 var evidence_value = data["evidence_value"]; 2758 waiting_div.hide(); 2759 node_name_plot.text(nodeId); 2760 2761 if (evidence_value != null) { 2762 evidence_button_clear.prop('disabled', false); 2763 } 2764 2765 if (data_type === "discrete") { 2766 var node_parameters_states = data["node_parameters_states"]; 2767 var node_parameters_values = data["node_parameters_values"]; 2768 createParametersStates(node_parameters_states, node_parameters_values, node_parameters_root, node_probability_discrete_parameters, node_probability_continuous_parameters); 2769 node_probability_continuous_parameters.hide(); 2770 node_probability_discrete_parameters.removeClass("hide-element").show(); 2771 } else { 2772 node_probability_continuous_parameters.removeClass("hide-element").show(); 2773 2774 var parameters_plot = data["node_parameters_plot_html"]; 2775 var node_parameters_selection = $("#node-parameters-plot-copy #node-parameters-selection"); 2776 render_continuous_params(placeholder_node_plot, parameters_plot, node_parameters_selection, evidence_value); 2777 } 2778 2779 parameters_height = (bayesian_network_graph.height()/2)+node_data_captor.y-(placeholder_node_params_copy.height()+60); 2780 placeholder_node_params_copy.css({top: parameters_height}); 2781 evidence_buttons.removeClass("hide-element").show(); 2782 2783 evidence_buttons.find("#set-evidence").click(function(e) { 2784 show_waiting_inference(node_probability_continuous_parameters, node_probability_discrete_parameters, evidence_buttons, waiting_div); 2785 var new_evidence_value = node_parameters_selection.val();
2786 set_nodes_evidences([nodeId], new_evidence_value, node_data_captor, false); 2787 }); 2788 2789 evidence_buttons.find("#clear-evidence").click(function(e) { 2790 show_waiting_inference(node_probability_continuous_parameters, node_probability_discrete_parameters, evidence_buttons, waiting_div); 2791 clear_nodes_evidences([nodeId], node_data_captor, false); 2792 }); 2793 2794 } 2795 }, 2796 error: function () { 2797 placeholder_node_params_copy.remove(); 2798 var notify_error = print_notify_message(permanent=false, type="danger", 2799 icon='fa fa-align-left icon-margin-right', title="Parameters (" + nodeId + "): ", 2800 message="Exception: No parameters or render available for this node.", delay=150, 2801 additional_message="", position="bottom-right"); 2802 } 2803 }); 2804 } 2805 2806 function createParametersStates(node_parameters_states, node_parameters_values, node_parameters_root, node_probability_discrete_parameters, node_probability_continuous_parameters) { 2807 node_probability_discrete_parameters.empty(); 2808 for (let i = 0; i < node_parameters_states.length; i++) { 2809 var name = node_parameters_states[i]; 2810 var value = node_parameters_values[i]; 2811 let cloneDiv = node_parameters_root.clone(); 2812 cloneDiv.attr("id", "node-parameters-" + i); 2813 cloneDiv.find('.progress-percentage-params').text((value * 100).toFixed(2) + "%"); 2814 cloneDiv.find('#checkbox-node-parameters-0').attr("id", "checkbox-node-parameters-" + i); 2815 var percent = cloneDiv.find('.progress-fill-params span').html(); 2816 cloneDiv.find('.progress-fill-params').css('width', percent); 2817 cloneDiv.find('.node-param-state-name').text(name); 2818 cloneDiv.show(); 2819 node_probability_discrete_parameters.append(cloneDiv); 2820 2821 cloneDiv.find("#checkbox-node-parameters-" + i).on("change", function () { 2822 var checkbox_node_parameters = $(this).is(":checked"); 2823 if (checkbox_node_parameters) { 2824 node_probability_discrete_parameters.find('.progress-fill-params span').each(function () { 2825 $(this).text("0.00%"); 2826 $(this).parent().css('width', "0.00%"); 2827 }); 2828 node_probability_discrete_parameters.find('.node-parameters-discrete-checkbox').each(function () { 2829 $(this).prop('checked',false); 2830 }); 2831 cloneDiv.find('.node-parameters-discrete-checkbox').prop('checked',true); 2832 cloneDiv.find('.progress-fill-params').css('width', "100.00%"); 2833 cloneDiv.find('.progress-percentage-params').text("100.00%"); 2834 } else { 2835 createParametersStates(node_parameters_states, node_parameters_values, node_parameters_root, node_probability_discrete_parameters, node_probability_continuous_parameters); 2836 } 2837 }); 2838 } 2839 } 2840 2841 function set_nodes_evidences(nodes_ids, evidence_value, node_data_captor, multiple_nodes_set, callback) { 2842 var data_client_json = { 2843 "nodes_ids": nodes_ids, 2844 "evidence_value": evidence_value, 2845 "evidence_scale": "scalar", 2846 "structure_id": $("#selectize-bn-structure").val(), 2847 "model_name": $("#model_name").val() 2848 }; 2849 if (multiple_nodes_set) { 2850 data_client_json["evidence_scale"] = "num_std_deviations"; 2851 } 2852 data_client_json = JSON.stringify(data_client_json); 2853 var data_send = { 2854 "csrfmiddlewaretoken": csrf_token, 2855 "data_client_json": data_client_json, 2856 }; 2857 2858 $.ajax({ 2859 type: "POST", 2860 url: "/morpho/ml_bn_set_nodes_evidences/", 2861 data: data_send, 2862 dataType: 'json', 2863 beforeSend: function () { 2864 }, 2865 success: function (data) { 2866 if(data["error"]) { 2867 var notify_error = print_notify_message(permanent=false, type="danger", 2868 icon='fa fa-align-left icon-margin-right', title="Evidence (" + nodeId + "): ", 2869 message="Exception: error setting the evidence for this node.", delay=150, 2870 additional_message="", position="bottom-right"); 2871 } else { 2872 for (let i=0; i < nodes_ids.length; i++) { 2873 var node_sigmajs = sigmajs_bn.graph.getNode(nodes_ids[i]); 2874 change_node_edge_color(node_sigmajs, sigmajs_bn_settings["evidence_set_color"], false); 2875 node_sigmajs.selected_important = true; 2876 node_sigmajs.evidence_set = true; 2877 } 2878 if (!multiple_nodes_set) { 2879 get_and_render_node_parameters(sigmajs_bn, nodes_ids[0], node_data_captor); 2880 } 2881 sigmajs_bn.refresh(); 2882 } 2883 show_probabilities_effect(); 2884 }, 2885 error: function () { 2886 var notify_error = print_notify_message(permanent=false, type="danger", 2887 icon='fa fa-align-left icon-margin-right', title="Evidence (" + nodes_ids + "): ", 2888 message="Exception: error setting the evidence for this node.", delay=150, 2889 additional_message="", position="bottom-right"); 2890 }, 2891 complete: function () { 2892 if (callback !== undefined) { 2893 callback(); 2894 } 2895 } 2896 }); 2897 } 2898 2899 function show_probabilities_effect() { 2900 var data_send = { 2901 "csrfmiddlewaretoken": csrf_token, 2902 }; 2903 2904 $.ajax({ 2905 type: "POST", 2906 url: "/morpho/ml_bn_show_probabilities_effect/", 2907 data: data_send, 2908 dataType: 'json', 2909 beforeSend: function () { 2910 }, 2911 success: function (data) { 2912 var nodes_graph_evidence_effect = $("#select-nodes-graph-evidence-effect"); 2913 var group_graph_evidence_effect_select = $("#select-group-graph-evidence-effect"); 2914 var select_node_input_kl_divergence = $("#select-node-bn-kl-divergence"); 2915 var select_node_input_mean_alteration = $("#select-node-bn-mean-alteration"); 2916 var select_node_input_std_deviation_alteration = $("#select-node-bn-std-deviation-alteration"); 2917 var kl_divergences = data["kl_divergences"]; 2918 var mean_alteration = data["mean_alteration"]; 2919 var std_deviation_alteration = data["std_deviation_alteration"]; 2920 var graph_groups = data["graph_groups"]; 2921 nodes_graph_evidence_effect.removeClass("hide-element"); 2922 nodes_graph_evidence_effect.show(); 2923 if (Object.keys(graph_groups).length > 0) { 2924 group_graph_evidence_effect_select.removeClass("hide-element"); 2925 group_graph_evidence_effect_select.show(); 2926 var group_graph_evidence_effect = $("#select-group-graph-evidence-effect-bn"); 2927 group_graph_evidence_effect.selectize()[0].selectize.destroy(); 2928 group_graph_evidence_effect.empty(); 2929 var items = []; 2930 for (var dict_key in graph_groups) { 2931 items.push({item: dict_key}); 2932 } 2933 items.push({"item": "No group"}); 2934 group_graph_evidence_effect.selectize({ 2935 maxItems: 1, 2936 maxOptions: items.length+1, 2937 labelField: "item", 2938 valueField: "item", 2939 searchField: "item", 2940 options: items, 2941 }); 2942 group_graph_evidence_effect.on("change", function (e) { 2943 var group_chosen_id = $(this).val(); 2944 if (group_chosen_id == "No group") { 2945 $("#button-set-evidence-group").addClass("hide-element"); 2946 $("#button-clear-evidence-group").addClass("hide-element"); 2947 } 2948 get_and_render_all_nodes_by_group(sigmajs_bn, group_chosen_id); 2949 get_category_values_in_group_probabilities_effect(group_chosen_id); 2950 }); 2951 } 2952 create_probabilities_effect_drop_down(select_node_input_kl_divergence, kl_divergences); 2953 create_probabilities_effect_drop_down(select_node_input_mean_alteration, mean_alteration); 2954 create_probabilities_effect_drop_down(select_node_input_std_deviation_alteration, std_deviation_alteration); 2955 } 2956 }); 2957 } 2958 2959 function get_category_values_in_group_probabilities_effect(group_chosen_id) { 2960 var notify_loading = print_notify_message(permanent = true, type = "info", 2961 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Calculating groups inference effect", 2962 message = "Running multivariate KL-divergence", delay = 0, 2963 additional_message = "", position = "bottom-right"); 2964 2965 if (group_chosen_id == "No group") { 2966 reset_nodes_edges_color(sigmajs_bn); 2967 $("#select-category-graph-evidence-effect").hide(); 2968 } else { 2969 var data_client_json = { 2970 "group_chosen_id": group_chosen_id, 2971 "model_name": $("#model_name").val() 2972 }; 2973 data_client_json = JSON.stringify(data_client_json); 2974 var data_send = { 2975 "csrfmiddlewaretoken": csrf_token, 2976 "data_client_json": data_client_json 2977 }; 2978 $.ajax({ 2979 type: "POST", 2980 url: "/morpho/ml_bn_show_probabilities_effect_group/", 2981 data: data_send, 2982 dataType: 'json', 2983 beforeSend: function () { 2984 }, 2985 success: function (data) { 2986 $("#select-category-graph-evidence-effect").removeClass("hide-element"); 2987 $("#select-category-graph-evidence-effect").show(); 2988 if (data["kl_divergences_group_categories"].length > 0) { 2989 var select_category_input = $("#select-category-evidence-effect-bn"); 2990 select_category_input.selectize()[0].selectize.destroy(); 2991 select_category_input.empty(); 2992 var items = data["kl_divergences_group_categories"].map(function (x) { 2993 return {item: x[0] + " " + x[1]}; 2994 }); 2995 items.push({"item": "All categories"}); 2996 select_category_input.selectize({ 2997 maxItems: 1, 2998 maxOptions: data["kl_divergences_group_categories"].length+1, 2999 labelField: "item", 3000 valueField: "item", 3001 searchField: "item", 3002 options: items, 3003 }); 3004 select_category_input.on("change", function (e) { 3005 var category_chosen_id = $(this).val();
3006 if (category_chosen_id == "All categories") { 3007 reset_nodes_edges_color(sigmajs_bn); 3008 sigmajs_bn_settings["active_category"] = ""; 3009 get_and_render_all_nodes_by_group(sigmajs_bn, sigmajs_bn_settings["active_group"]); 3010 } else { 3011 category_chosen_id = category_chosen_id.split(' ')[0]; 3012 get_all_nodes_in_category(sigmajs_bn, category_chosen_id, "render_nodes_in_category"); 3013 } 3014 }); 3015 } else { 3016 $("#select-category-graph-evidence-effect").hide(); 3017 } 3018 }, 3019 complete: function () { 3020 notify_loading.close(); 3021 } 3022 }); 3023 } 3024 } 3025 3026 3027 function focus_single_node(node_chosen_id) { 3028 var node_sigmajs = sigmajs_bn.graph.getNode(node_chosen_id); 3029 3030 sigmajs_bn.renderers[0].dispatchEvent('clickNode', node_sigmajs); 3031 } 3032 3033 function create_probabilities_effect_drop_down(select_element, nodes) { 3034 var items = nodes.map(function (x) { 3035 return {item: x[0] + ' ' + x[1].toFixed(2)}; 3036 }); 3037 3038 select_element.selectize()[0].selectize.destroy(); 3039 select_element.empty(); 3040 select_element.selectize({ 3041 maxItems: 1, 3042 maxOptions: nodes.length, 3043 labelField: "item", 3044 valueField: "item", 3045 searchField: "item", 3046 options: items, 3047 }); 3048 select_element.on("change", function (e) { 3049 var node_chosen_id = $(this).val(); 3050 if (node_chosen_id !== "" && node_chosen_id !== undefined) { 3051 node_chosen_id = node_chosen_id.split(" ")[0]; 3052 focusOnNodeSigmajs(sigmajs_bn, node_chosen_id); 3053 focus_single_node(node_chosen_id); 3054 } 3055 }); 3056 } 3057 3058 function clear_nodes_evidences(nodes_ids, node_data_captor, multiple_nodes_set) { 3059 var data_client_json = { 3060 "nodes_ids": nodes_ids, 3061 "structure_id": $('#selectize-bn-structure').val(), 3062 "model_name": $("#model_name").val() 3063 }; 3064 data_client_json = JSON.stringify(data_client_json); 3065 var data_send = { 3066 "csrfmiddlewaretoken": csrf_token, 3067 "data_client_json": data_client_json, 3068 }; 3069 3070 $.ajax({ 3071 type: "POST", 3072 url: "/morpho/ml_bn_clear_nodes_evidences/", 3073 data: data_send, 3074 dataType: 'json', 3075 beforeSend: function () { 3076 }, 3077 success: function (data) { 3078 if(data["error"]) { 3079 var notify_error = print_notify_message(permanent=false, type="danger", 3080 icon='fa fa-align-left icon-margin-right', title="Evidence (" + nodes_ids + "): ", 3081 message="Exception: error clearing the evidence for this node.", delay=150, 3082 additional_message="", position="bottom-right"); 3083 } else { 3084 for (let i=0; i < nodes_ids.length; i++) { 3085 var node_sigmajs = sigmajs_bn.graph.getNode(nodes_ids[i]); 3086 if (node_sigmajs.color_important !== undefined) { 3087 change_node_edge_color(node_sigmajs, node_sigmajs.color_important, false); 3088 } else { 3089 change_node_edge_color(node_sigmajs, node_sigmajs.originalColor, false); 3090 node_sigmajs.selected_important = false; 3091 } 3092 node_sigmajs.evidence_set = false; 3093 } 3094 3095 if (!multiple_nodes_set) { 3096 get_and_render_node_parameters(sigmajs_bn, nodes_ids[0], node_data_captor); 3097 } 3098 var nodes = sigmajs_bn.graph.nodes(); 3099 var i = 0; 3100 var is_evidence_set_graph = false;
3101 while (!is_evidence_set_graph && i < nodes.length) { 3102 if (nodes[i].evidence_set === true) { 3103 is_evidence_set_graph = true; 3104 } 3105 i = i + 1; 3106 } 3107 if (!is_evidence_set_graph) { 3108 $("#select-nodes-graph-evidence-effect").hide(); 3109 $("#select-group-graph-evidence-effect").hide(); 3110 $("#select-category-graph-evidence-effect").hide(); 3111 } 3112 3113 sigmajs_bn.refresh(); 3114 } 3115 }, 3116 error: function () { 3117 var notify_error = print_notify_message(permanent=false, type="danger", 3118 icon='fa fa-align-left icon-margin-right', title="Evidence (" + nodes_ids + "): ", 3119 message="Exception: error clearing the evidence for this node.", delay=150, 3120 additional_message="", position="bottom-right"); 3121 } 3122 }); 3123 } 3124 3125 function get_and_render_node_connections_info(sigmajs_instance, nodeId, highlight_node_color) { 3126 var data_client_json = { 3127 "node_id": nodeId, 3128 "model_name": $("#model_name").val() 3129 }; 3130 data_client_json = JSON.stringify(data_client_json); 3131 var data_send = { 3132 "csrfmiddlewaretoken": csrf_token, 3133 "data_client_json": data_client_json, 3134 }; 3135 3136 $.ajax({ 3137 type: "POST", 3138 url: "/morpho/ml_bn_get_node_connections_info/", 3139 data: data_send, 3140 dataType: 'json', 3141 success: function (data) { 3142 if(data["error"]) { 3143 var message_error = "Fatal error" + data["error_message"]; 3144 var notify_error = print_notify_message(permanent=false, type="danger", 3145 icon='fa fa-link icon-margin-right', title="Error", 3146 message=message_error, delay=150, 3147 additional_message="", position="bottom-right"); 3148 } else { 3149 if ($('[data-notify="container"]').length > 2) { 3150 $.notifyClose(); 3151 } 3152 set_node_color(sigmajs_instance, nodeId, highlight_node_color); 3153 3154 var top_parents = "Top parents (" + data["top_parents"].length + "): " + list_tuple_to_str(data["top_parents"]); 3155 var top_chidlren = "Top children (" + data["top_children"].length + "): " + list_tuple_to_str(data["top_children"]); 3156 3157 var message = "Num parents: " + data["num_parents"] + "<br>" + "Num children: " + data["num_children"] 3158 + "<br>" + "Num neighbors: " + data["num_neighbors"] + "<br>" + top_parents + "<br>" + top_chidlren; 3159 3160 3161 var notify_parameters = print_notify_message(permanent=true, type="info", 3162 icon='fa fa-link icon-margin-right', title="Connections (" + nodeId + "): ", 3163 message=message, delay=4000, 3164 additional_message="", position="bottom-right"); 3165 } 3166 }, 3167 error: function () { 3168 var notify_error = print_notify_message(permanent=false, type="danger", 3169 icon='fa fa-align-left icon-margin-right', title="Parameters (" + nodeId + "): ", 3170 message="Exception: No parameters or render available for this node.", delay=150, 3171 additional_message="", position="bottom-right"); 3172 } 3173 }); 3174 } 3175 3176 function get_and_render_edge_info(sigmajs_instance, source_node, target_node) { 3177 var data_client_json = { 3178 "source_node": source_node, 3179 "target_node": target_node, 3180 "model_name": $("#model_name").val() 3181 }; 3182 data_client_json = JSON.stringify(data_client_json) 3183 var data_send = { 3184 "csrfmiddlewaretoken": csrf_token, 3185 "data_client_json": data_client_json, 3186 }; 3187 3188 var message_error = "No info available for this edge."; 3189 3190 $.ajax({ 3191 type: "POST", 3192 url: "/morpho/ml_bn_get_edge_info/", 3193 data: data_send, 3194 dataType: 'json', 3195 success: function (data) { 3196 if(data["error"]) { 3197 var notify_error = print_notify_message(permanent=false, type="danger", 3198 icon='fa fa-info icon-margin-right', title="Error", 3199 message=message_error, delay=150, 3200 additional_message="", position="bottom-right"); 3201 } else { 3202 if ($('[data-notify="container"]').length > 4) { 3203 $.notifyClose(); 3204 } 3205 var message = "Weight: " + data["weight"] 3206 var notify_parameters = print_notify_message(permanent=true, type="info", 3207 icon='fa fa-info icon-margin-right', title="Edge (" + source_node + "-" + target_node + "): ", 3208 message=message, delay=4000, 3209 additional_message="", position="bottom-right"); 3210 } 3211 }, 3212 error: function () { 3213 var notify_error = print_notify_message(permanent=false, type="danger", 3214 icon='fa fa-info icon-margin-right', title="Edge (" + source_node + "-" + target_node + "): ", 3215 message=message_error, delay=150, 3216 additional_message="", position="bottom-right"); 3217 } 3218 }); 3219 } 3220 3221 function get_important_nodes_degrees(highlight_algorithm_selected, sigmajs_default_settings, num_neighbors, include_neighbors, propagate_colors_to_hubs_neighbors) { 3222 var notify_loading = print_notify_message(permanent = true, type = "info", 3223 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Loading algorithm", 3224 message = "Loading algorithm", delay = 0, 3225 additional_message = "", position = "bottom-right"); 3226 var data_client_json = { 3227 "selection_option": highlight_algorithm_selected, 3228 "num_neighbors": num_neighbors, 3229 "include_neighbors": include_neighbors, 3230 "max_node_size": sigmajs_default_settings["maxNodeSize"], 3231 "model_name": $("#model_name").val() 3232 }; 3233 data_client_json = JSON.stringify(data_client_json); 3234 var data_send = { 3235 "csrfmiddlewaretoken": csrf_token, 3236 "data_client_json": data_client_json, 3237 }; 3238 $.ajax({ 3239 type: "POST", 3240 url: "/morpho/ml_bn_highlight_important_nodes/", 3241 data: data_send, 3242 dataType: 'json', 3243 success: function (data) { 3244 if (! $.isEmptyObject(data["important_nodes"])) { 3245 for (var node_id in data["important_nodes"]) { 3246 var params = data["important_nodes"][node_id]; 3247 var node_sigmajs = sigmajs_bn.graph.getNode(node_id); 3248 var color_hub = params["color"]; 3249 if (!node_sigmajs.selected_important) { 3250 change_node_edge_color(node_sigmajs, params["color"], true); 3251 } else { 3252 color_hub = node_sigmajs.color; 3253 } 3254 node_sigmajs.size = params["size"]; 3255 sigmajs_bn.settings('maxNodeSize', params["size"]); 3256 node_sigmajs.selected_important = true; 3257 3258 if (include_neighbors) { 3259 var neighbors = params["neighbors"];
3260 neighbors.forEach(function (neighbor_node_id) { 3261 var neighbor_node_sigmajs = sigmajs_bn.graph.getNode(neighbor_node_id); 3262 if (propagate_colors_to_hubs_neighbors && neighbor_node_sigmajs.selected_important) { 3263 var hubs_of_neighbor = []; 3264 3265 for (var node_id_ in data["important_nodes"]) { 3266 var params_ = data["important_nodes"][node_id_]; 3267 var neighbors_ = params_["neighbors"]; 3268 neighbors_.forEach(function (neighbor_node_id_) { 3269 if (neighbor_node_id_ === neighbor_node_id) { 3270 hubs_of_neighbor.push(node_id_); 3271 var hub_node_sigmajs = sigmajs_bn.graph.getNode(node_id_); 3272 change_node_edge_color(hub_node_sigmajs, color_hub, true); 3273 } 3274 }); 3275 } 3276 3277 for (var hub_node_idx in hubs_of_neighbor) { 3278 var hub_node_id = hubs_of_neighbor[hub_node_idx]; 3279 var hub_params = data["important_nodes"][hub_node_id] 3280 var neighbors_of_hub = hub_params["neighbors"]; 3281 3282 neighbors_of_hub.forEach(function (neighbor_hub_id) { 3283 var neighbor_hub = sigmajs_bn.graph.getNode(neighbor_hub_id); 3284 change_node_edge_color(neighbor_hub, color_hub, false); 3285 }); 3286 } 3287 } 3288 change_node_edge_color(neighbor_node_sigmajs, color_hub, false); 3289 neighbor_node_sigmajs.selected_important = true; 3290 }); 3291 } 3292 } 3293 if (include_neighbors) { 3294 for (var node_id in data["important_nodes"]) { 3295 var params = data["important_nodes"][node_id]; 3296 var node_sigmajs = sigmajs_bn.graph.getNode(node_id); 3297 var color_hub = node_sigmajs.color; 3298 var neighbors = params["neighbors"]; 3299 neighbors.forEach(function (neighbor_node_id) { 3300 var neighbor_node_sigmajs = sigmajs_bn.graph.getNode(neighbor_node_id); 3301 change_node_edge_color(neighbor_node_sigmajs, color_hub, true); 3302 }); 3303 } 3304 } 3305 sigmajs_bn_settings["nodes_slider"].noUiSlider.updateOptions({ 3306 start: [sigmajs_bn.settings('maxNodeSize')], 3307 range: { 3308 'min': sigmajs_bn.settings('minNodeSize'), 3309 'max': parseFloat(sigmajs_bn.settings('maxNodeSize').toFixed(1)) 3310 } 3311 }); 3312 sigmajs_bn.refresh(); 3313 } 3314 }, 3315 error: function () { 3316 }, 3317 complete: function() { 3318 notify_loading.close(); 3319 } 3320 }); 3321 } 3322 3323 function get_important_nodes_betweenness(highlight_algorithm_selected, sigmajs_default_settings) { 3324 var notify_loading = print_notify_message(permanent = true, type = "info", 3325 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Loading algorithm", 3326 message = "Loading algorithm", delay = 0, 3327 additional_message = "", position = "bottom-right"); 3328 var data_client_json = { 3329 "selection_option": highlight_algorithm_selected, 3330 "max_node_size": sigmajs_default_settings["maxNodeSize"], 3331 "model_name": $("#model_name").val() 3332 }; 3333 data_client_json = JSON.stringify(data_client_json); 3334 3335 var data_send = { 3336 "csrfmiddlewaretoken": csrf_token, 3337 "data_client_json": data_client_json 3338 }; 3339 $.ajax({ 3340 type: "POST", 3341 url: "/morpho/ml_bn_highlight_important_nodes/", 3342 data: data_send, 3343 dataType: 'json', 3344 success: function (data) { 3345 if (! $.isEmptyObject(data["important_nodes"])) { 3346 var maxNodeSize = sigmajs_bn.settings('maxNodeSize'); 3347 for (var node_id in data["important_nodes"]) { 3348 var node = data["important_nodes"][node_id]; 3349 var node_sigmajs = sigmajs_bn.graph.getNode(node_id); 3350 3351 if (node.size > 0) { 3352 node_sigmajs.size = node.size; 3353 change_node_edge_color(node_sigmajs, node.color, true); 3354 node_sigmajs.selected_important = true; 3355 if (node_sigmajs.size > maxNodeSize) { 3356 maxNodeSize = node_sigmajs.size; 3357 } 3358 } 3359 } 3360 if (maxNodeSize > sigmajs_bn.settings('maxNodeSize')) { 3361 sigmajs_bn.settings('maxNodeSize', maxNodeSize); 3362 } 3363 sigmajs_bn_settings["nodes_slider"].noUiSlider.updateOptions({ 3364 start: [sigmajs_bn.settings('maxNodeSize')], 3365 range: { 3366 'min': sigmajs_bn.settings('minNodeSize'), 3367 'max': parseFloat(sigmajs_bn.settings('maxNodeSize').toFixed(1)) 3368 } 3369 }); 3370 sigmajs_bn.refresh(); 3371 } 3372 }, error: function () { 3373 }, 3374 complete:function() { 3375 notify_loading.close(); 3376 } 3377 }); 3378 } 3379
3380 function get_num_common_structures(edge, structures_multi_selected, break_if_multi) { 3381 var num_common_structures = 0; 3382 for (i = 0; i <= edge.structure_id.length; i++) { 3383 if (structures_multi_selected.indexOf(edge.structure_id[i]) !== -1) { 3384 num_common_structures++; 3385 if (num_common_structures > 1) { 3386 if (break_if_multi) { 3387 break; 3388 } 3389 } 3390 } 3391 } 3392 return num_common_structures; 3393 } 3394 3395 function color_common_structures_edges(edge, structures_multi_selected) { 3396 var num_common_structures = get_num_common_structures(edge, structures_multi_selected, true); 3397 if (num_common_structures > 1) { 3398 change_node_edge_color(edge, sigmajs_bn_settings["color_common_edges"], false); 3399 } else { 3400 hide_node_edge(edge); 3401 } 3402 } 3403 3404 function reset_nodes_edges_color_prob_clustering() { 3405 var structure_id = $('#selectize-bn-structure').val(); 3406 3407 sigmajs_bn_settings["active_structure"] = structure_id; 3408 3409 // Select the nodes (and their neighbors with edges in this cluster: 3410 if (sigmajs_bn_settings["active_category"] !== "") { 3411 var notify_loading = undefined; 3412 get_all_nodes_in_category(sigmajs_bn, sigmajs_bn_settings["active_category"], 3413 "render_nodes_in_category", notify_loading); 3414 } else { 3415 reset_edges_color_prob_clustering(); 3416 } 3417 3418 } 3419 3420 3421 function reset_edges_color_prob_clustering() { 3422 var structure_id = $('#selectize-bn-structure').val(); 3423 var structure_common_edges = $('#selectize-bn-structure-common-edges').val(); 3424 var structures_multi_selected = $('#selectize-multi-structures').val(); 3425 3426 if (structure_id === "all" && (structure_common_edges !== "" && structure_common_edges !== "no-common")) { 3427 structure_id = structure_common_edges; 3428 } 3429 3430 if (structures_multi_selected.length === 0) { 3431 structures_multi_selected = Object.keys(sigmajs_bn_settings["structures_info"]) 3432 } else if (structure_id === "all" && structures_multi_selected.length === 1) { 3433 structure_id = structures_multi_selected[0]; 3434 } 3435 3436 var num_structures = structures_multi_selected.length; 3437 var num_edges_selected = 0; 3438
3439 sigmajs_bn.graph.edges().forEach(function (edge) { 3440 edge.structure_selected = true; 3441 3442 if ((sigmajs_bn_settings["active_category"] !== "" && edge.selected) || sigmajs_bn_settings["active_category"] === "") { 3443 if (structure_id === "all") { 3444 if (edge.structure_id.length == 1) { 3445 if (structures_multi_selected.indexOf(edge.structure_id[0]) !== -1) { 3446 change_node_edge_color(edge, sigmajs_bn_settings["structures_info"][edge.structure_id[0]]["color"], false); 3447 } else { 3448 hide_node_edge(edge); 3449 } 3450 } else { 3451 color_common_structures_edges(edge, structures_multi_selected); 3452 } 3453 } else if (structure_id === "common") { 3454 color_common_structures_edges(edge, structures_multi_selected); 3455 } else if (structure_id === "common-all") { 3456 var num_common_structures = get_num_common_structures(edge, structures_multi_selected, false); 3457 if (num_common_structures === num_structures) { 3458 change_node_edge_color(edge, sigmajs_bn_settings["color_common_edges"], false); 3459 } else { 3460 hide_node_edge(edge); 3461 } 3462 } else { //one specific structure 3463 if (edge.structure_id.indexOf(structure_id) !== -1) { 3464 change_node_edge_color(edge, sigmajs_bn_settings["structures_info"][structure_id]["color"], false); 3465 } else { 3466 hide_node_edge(edge); 3467 } 3468 } 3469 } 3470 3471 var hide_edges = $("#checkbox-on-click-group-hide-others").is(":checked"); 3472 if (hide_edges) { 3473 if (!edge.hidden) { 3474 num_edges_selected++; 3475 } 3476 edge.originalColor = edge.color; 3477 } else { 3478 if (edge.color !== sigmajs_bn_settings["color_hidden"]) { 3479 num_edges_selected++; 3480 edge.originalColor = edge.color; 3481 } 3482 } 3483 3484 if (sigmajs_bn_settings["active_category"] === "" && edge.selected) { 3485 edge.selected = false; 3486 } 3487 }); 3488 3489 $("#network-stats-num-edges-selected").text(num_edges_selected); 3490 3491 sigmajs_bn.refresh(); 3492 } 3493 3494 $("#update-filter-edges-by-weight").click(function(e) { 3495 var notify_loading = print_notify_message(permanent = true, type = "info", 3496 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Filter edges", 3497 message = "Filtering edges by weights...", delay = 4000, additional_message = ""); 3498 3499 var weights_range = sigmajs_bn_settings["filter_edges_weight_slider"].noUiSlider.get(); 3500 3501 var data_client_json = { 3502 "weights_range": weights_range, 3503 "model_name": $("#model_name").val() 3504 }; 3505 data_client_json = JSON.stringify(data_client_json); 3506 var data_send = { 3507 "csrfmiddlewaretoken": $("#csrf_token").val(), 3508 "data_client_json": data_client_json, 3509 }; 3510 3511 $.ajax({ 3512 type: "POST", 3513 url: "/morpho/ml_bn_filter_edges_by_weight/", 3514 data: data_send, 3515 dataType: 'json', 3516 success: function (data) { 3517 notify_loading.close(); 3518 if (data["error"]) { 3519 var notify_error = print_notify_message(permanent = false, type = "danger", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Error filtering edges", message = data["error_message"], delay = 3000); 3520 } else { 3521 var layout_name = sigmajs_bn_settings["active_layout"]; 3522 var additional_params = undefined; 3523 sigmajs_bn_settings["num_nodes"] = data["num_nodes"]; 3524 sigmajs_bn_settings["num_edges"] = data["num_edges"]; 3525 print_current_num_nodes_edges(); 3526 change_layout_sigmajs(layout_name, additional_params); 3527 } 3528 }, 3529 error: function () { 3530 notify_loading.close(); 3531 var notify_error = print_notify_message(permanent = false, t
3531ype = "danger", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Error filtering edges", message = data["error_message"], delay = 3000); 3532 } 3533 }); 3534 }); 3535 3536 function init_sliders_glasso() { 3537 var slider_glasso_alpha = $("#glasso-alpha")[0]; 3538 var slider_glasso_tol = $("#glasso-tol")[0]; 3539 var slider_glasso_max_iter = $("#glasso-max-iter")[0]; 3540 3541 var min_val_alpha = 0.0001; 3542 noUiSlider.create(slider_glasso_alpha, { 3543 start: [min_val_alpha], 3544 connect: true, 3545 format: wNumb({ 3546 decimals: 4 3547 }), 3548 range: { 3549 'min': min_val_alpha, 3550 'max': 0.01, 3551 }, 3552 tooltips: [true], 3553 step: 0.0001, 3554 pips: { 3555 mode: 'count', 3556 values: 3, 3557 density: 1, 3558 format: wNumb({ 3559 decimals: 2, 3560 }), 3561 } 3562 }); 3563 3564 var min_val_tol = 0.0001; 3565 noUiSlider.create(slider_glasso_tol, { 3566 start: [min_val_tol], 3567 connect: true, 3568 format: wNumb({ 3569 decimals: 4 3570 }), 3571 range: { 3572 'min': min_val_tol, 3573 'max': 1, 3574 }, 3575 tooltips: [true], 3576 step: 0.0001, 3577 pips: { 3578 mode: 'count', 3579 values: 2, 3580 density: 1, 3581 format: wNumb({ 3582 decimals: 3, 3583 }), 3584 } 3585 }); 3586 3587 var min_val_max_iter = 1000; 3588 noUiSlider.create(slider_glasso_max_iter, { 3589 start: [min_val_max_iter], 3590 connect: true, 3591 format: wNumb({ 3592 decimals: 0 3593 }), 3594 range: { 3595 'min': min_val_max_iter, 3596 'max': 10000, 3597 }, 3598 tooltips: [true], 3599 step: 1, 3600 pips: { 3601 mode: 'count', 3602 values: 3, 3603 density: 1, 3604 format: wNumb({ 3605 decimals: 0, 3606 }), 3607 } 3608 }); 3609 3610 set_input_left_for_slider("glasso-alpha", slider_glasso_alpha, min_val_alpha, function(){}); 3611 set_input_left_for_slider("glasso-tol", slider_glasso_tol, min_val_tol, function(){}); 3612 set_input_left_for_slider("glasso-max-iter", slider_glasso_max_iter, min_val_max_iter, function(){}); 3613 3614 } 3615 3616 $("#update-params-glasso").click(update_glasso_params); 3617 3618 function update_glasso_params() { 3619 var notify_loading = print_notify_message(permanent = true, type = "info", 3620 icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Loading layout", 3621 message = "Updating graphical lasso parameters...", delay = 4000, additional_message = ""); 3622 3623 var alpha = $("#glasso-alpha")[0].noUiSlider.get(); 3624 var tol = $("#glasso-tol")[0].noUiSlider.get(); 3625 var max_iter = $("#glasso-max-iter")[0].noUiSlider.get(); 3626 3627 var data_client_json = { 3628 "alpha": alpha, 3629 "tol": tol, 3630 "max_iter": max_iter, 3631 "model_name": $("#model_name").val() 3632 }; 3633 data_client_json = JSON.stringify(data_client_json); 3634 var data_send = { 3635 "csrfmiddlewaretoken": $("#csrf_token").val(), 3636 "data_client_json": data_client_json, 3637 }; 3638 3639 $.ajax({ 3640 type: "POST", 3641 url: "/morpho/ml_prob_clustering_update_glasso/", 3642 data: data_send, 3643 dataType: 'json', 3644 success: function (data) { 3645 notify_loading.close(); 3646 if (data["error"]) { 3647 var notify_error = print_notify_message(permanent = false, type = "danger", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Error loading layout", message = data["error_message"], delay = 3000); 3648 } else { 3649 var layout_name = sigmajs_bn_settings["active_layout"]; 3650 var additional_params = undefined; 3651 sigmajs_bn_settings["num_nodes"] = data["num_nodes"]; 3652 sigmajs_bn_settings["num_edges"] = data["num_edges"]; 3653 print_current_num_nodes_edges(); 3654 change_layout_sigmajs(layout_name, additional_params); 3655 } 3656 }, 3657 error: function () { 3658 notify_loading.close(); 3659 var notify_error = print_notify_message(permanent = false, t
3659ype = "danger", icon = 'fa fa-spinner fa-spin icon-margin-right', title = "Error updating graphical lasso parameters", message = "Server error", delay = 3000); 3660 } 3661 }); 3662 } 3663 3664 function print_current_num_nodes_edges() { 3665 $("#network-stats-num-nodes").text(sigmajs_bn_settings["num_nodes"]); 3666 $("#network-stats-num-edges").text(sigmajs_bn_settings["num_edges"]); 3667 $("#network-stats-num-nodes-selected").text(sigmajs_bn_settings["num_nodes"]); 3668 $("#network-stats-num-edges-selected").text(sigmajs_bn_settings["num_edges"]); 3669 } 3670 3671 function update_num_nodes_edges_selected() { 3672 var num_nodes = 0; 3673 var num_edges = 0; 3674 sigmajs_bn.graph.edges().forEach(function (edge) { 3675 if (edge.selected) { 3676 num_edges++; 3677 } 3678 }); 3679 sigmajs_bn.graph.nodes().forEach(function (node) { 3680 if (node.selected) { 3681 num_nodes++; 3682 } 3683 }); 3684 3685 $("#network-stats-num-nodes-selected").text(sigmajs_bn_settings["num_nodes"]); 3686 $("#network-stats-num-edges-selected").text(sigmajs_bn_settings["num_edges"]); 3687 } 3688 3689 $('#selectize-bn-structure-sort').on("change", function (e) { 3690 var selectize_structure = $("#selectize-bn-structure")[0].selectize; 3691 var structures_info = sigmajs_bn_settings["structures_info"]; 3692 var filter_by = $(this).val(); 3693 initialize_selectize_structures(structures_info, filter_by); 3694 selectize_structure.refreshOptions(); 3695 }); 3696 3697 function list_tuple_to_str(list_tuples) { 3698 var str_result = "["; 3699 for (var i=0; i < list_tuples.length; i++) { 3700 var tuple = list_tuples[i]; 3701 3702 for (var j = 0; j < tuple.length; j++) { 3703 if (j == 0) { 3704 str_result += tuple[j]; 3705 } else { 3706 str_result += " (" + tuple[j] + ")"; 3707 } 3708 } 3709 3710 if (i !== list_tuples.length -1) { 3711 str_result += ", "; 3712 } 3713 } 3714 str_result += "]"; 3715 3716 return str_result; 3717 } 3718 3719});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.