PageSourceSearch

https://neurosuites.com/static/neurosuite/js/morpho_analyzer/ml_bayesian_networks.js

js neurosuites.com collected 2026-09-25 22:06:43 UTC 161,593 bytes, 3,719 lines download raw bytes

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.