'));
+ dropdown_div.append(dropdown_menu);
+
+ main_div.append(dropdown_div);
+ }
+
+ var feed_div = $('
');
+ var group_button = $('
');
+ if (params.grouped) {
+ group_button.text('Ungroup regressions');
+ group_button.on('click', function(evt) {
+ update_url({'grouped': []});
+ });
+ }
+ else {
+ group_button.text('Group regressions');
+ group_button.on('click', function(evt) {
+ update_url({'grouped': ["true"]});
+ });
+ }
+ group_div.append(group_button);
+ main_div.append(group_div);
+
+ $.each(branches, function(i, branch) {
+ var branch_div = $('
')
+
+ var display_table = $('
');
+ var ignored_table = $('
');
+ var ignored_button = $('
Show ignored regressions... ');
+ var ignored_conf_sample_div = $('
');
+
+ if (branches && branches.length > 1) {
+ var branch_link = $('
')
+ branch_link.text(branch);
+
+ dropdown_menu.append($('
').append(branch_link));
+ branch_link.on('click', function(evt) {
+ current_title = "Regressions in " + branch + " branch";
+ update_url({'branch': [branch]}, false);
+ $("#title").text(current_title);
+ $(".regression-div").hide();
+ $(".ignored").hide();
+ ignored_button.show();
+ $("#regression-div-" + i).show();
+ $("#regression-div-" + i + '-ignored').show();
+ });
+ }
+ else {
+ branch = null;
+ }
+
+ branch_div.attr('id', 'regression-div-' + i);
+ branch_div.hide();
+ main_div.append(branch_div);
+
+ if (params.grouped) {
+ create_grouped_data_table(display_table, ignored_table, ignored_conf_sample_div,
+ data, params, branch, all_ignored_keys);
+ }
+ else {
+ create_data_table(display_table, ignored_table, ignored_conf_sample_div,
+ data, params, branch, all_ignored_keys);
+ }
+ branch_div.append(display_table);
+ ignored_table.hide();
+ ignored_conf_sample_div.hide();
+
+ branch_div.append(ignored_table);
+ branch_div.append(ignored_conf_sample_div);
+
+ update_ignore_conf_sample(data, ignored_conf_sample_div, branch);
+
+ branch_div.append(ignored_button);
+ ignored_button.on('click', function(evt) {
+ ignored_button.hide();
+ $(".ignored").show();
+ });
+ });
+
+ var branch_index = 0;
+ if (branches && branches.length > 1) {
+ if (params.branch) {
+ branch_index = branches.indexOf(params.branch[0]);
+ if (branch_index < 0) {
+ branch_index = 0;
+ }
+ }
+ current_title = "Regressions in " + branches[branch_index] + " branch";
+ }
+ $("#title").text(current_title);
+ main_div.find("#regression-div-" + branch_index).show();
+ main_div.show();
+
+ if (local_storage_available) {
+ /* Clear out local storage space */
+ var keys = Object.keys(localStorage);
+ $.each(keys, function(i, key) {
+ if (key.slice(0, ignore_key_prefix.length) == ignore_key_prefix &&
+ !all_ignored_keys[key]) {
+ delete localStorage[key];
+ }
+ });
+ }
+
+ return main_div;
+ }
+
+ function create_data_table(display_table, ignored_table, ignored_conf_sample_div,
+ data, params, branch, all_ignored_keys) {
+ var table_head = $('
' +
+ 'Benchmark ' +
+ 'Date ' +
+ 'Commit ' +
+ 'Factor ' +
+ 'Before ' +
+ 'Best after ' +
+ ' ' +
+ ' ');
+
+ display_table.append(table_head);
+ ignored_table.append(table_head.clone());
+
+ var table_body = $('
');
+ var ignored_table_body = $('
');
+
+ var regressions = data['regressions'];
+
+ $.each(regressions, function (i, item) {
+ var benchmark_name = item[0];
+ var graph_url = item[1];
+ var param_dict = item[2];
+ var parameter_idx = item[3];
+ var last_value = item[4];
+ var best_value = item[5];
+ var jumps = item[6]; // [[rev1, rev2, before, after], ...]
+
+ if (jumps === null) {
+ return;
+ }
+
+ if (branch !== null && param_dict['branch'] != branch) {
+ return;
+ }
+
+ var benchmark_basename = benchmark_name.replace(/\([\s\S]*/, '');
+ var benchmark = $.asv.main_json.benchmarks[benchmark_basename];
+ var url_params = {};
+
+ $.each(param_dict, function (key, value) {
+ url_params[key] = [value];
+ });
+
+ if (parameter_idx !== null) {
+ $.each($.asv.param_selection_from_flat_idx(benchmark.params, parameter_idx).slice(1), function(i, param_values) {
+ url_params['p-'+benchmark.param_names[i]] = [benchmark.params[i][param_values[0]]];
+ });
+ }
+
+ $.each(jumps, function(i, revs) {
+ var row = $('
');
+
+ var commit_a = $.asv.get_commit_hash(revs[0]);
+ var commit_b = $.asv.get_commit_hash(revs[1]);
+
+ var old_value = revs[2];
+ var new_value = revs[3];
+
+ var factor = new_value / old_value;
+
+ if (commit_a) {
+ url_params.commits = [commit_a + '-' + commit_b];
+ }
+ else {
+ url_params.commits = [commit_b];
+ }
+
+ var benchmark_url = $.asv.format_hash_string({
+ location: [benchmark_basename],
+ params: url_params
+ });
+
+ new_value = $.asv.pretty_unit(new_value, benchmark.unit);
+ old_value = $.asv.pretty_unit(old_value, benchmark.unit);
+
+ var benchmark_link = $('
').attr('href', benchmark_url).text(benchmark_name);
+ row.append($('
').append(benchmark_link));
+
+ var date_fmt = new Date($.asv.main_json.revision_to_date[revs[1]]);
+ row.append($('
').text($.asv.format_date_yyyymmdd_hhmm(date_fmt)));
+
+ var commit_td = $('
');
+
+ if (commit_a) {
+ if ($.asv.main_json.show_commit_url.match(/.*\/\/github.com\//)) {
+ var commit_url = ($.asv.main_json.show_commit_url + '../compare/'
+ + commit_a + '...' + commit_b);
+ commit_td.append(
+ $('
').attr('href', commit_url).text(commit_a + '..' + commit_b));
+ }
+ else {
+ commit_td.append($('
').text(commit_a + '..' + commit_b));
+ }
+ }
+ else {
+ var commit_url = $.asv.main_json.show_commit_url + commit_b;
+ commit_td.append(
+ $('
').attr('href', commit_url).text(commit_b));
+ }
+
+ row.append(commit_td);
+
+ row.append($('
').text(factor.toFixed(2) + 'x'));
+ row.append($('
').text(old_value));
+ row.append($('
').text(new_value));
+
+ /* html5 local storage has limited size, so store hashes
+ rather than potentially long strings */
+ var ignore_key = get_ignore_key(item, revs);
+ all_ignored_keys[ignore_key] = 1;
+
+ var is_ignored = is_key_ignored(ignore_key);
+ var ignore_button = $('
');
+
+ row.attr('id', ignore_key);
+
+ ignore_button.on('click', function(evt) {
+ if (is_key_ignored(ignore_key)) {
+ set_key_ignore_status(ignore_key, false);
+ var item = ignored_table_body.find('#' + ignore_key).detach();
+ ignore_button.text('Ignore');
+ table_body.append(item);
+ }
+ else {
+ set_key_ignore_status(ignore_key, true);
+ var item = table_body.find('#' + ignore_key).detach();
+ ignore_button.text('Unignore');
+ ignored_table_body.append(item);
+ }
+ update_ignore_conf_sample(data, ignored_conf_sample_div, branch);
+ });
+
+ row.append($('
').append(ignore_button));
+
+ if (!is_ignored) {
+ ignore_button.text('Ignore');
+ table_body.append(row);
+ }
+ else {
+ ignore_button.text('Unignore');
+ ignored_table_body.append(row);
+ }
+
+ /* Show a graph as a popup */
+ $.asv.ui.hover_graph(benchmark_link, graph_url, benchmark_basename, parameter_idx, [revs]);
+ });
+ });
+
+ display_table.append(table_body);
+ ignored_table.append(ignored_table_body);
+
+ setup_sort(params, display_table);
+ setup_sort(params, ignored_table);
+ }
+
+ function create_grouped_data_table(display_table, ignored_table, ignored_conf_sample_div,
+ data, params, branch, all_ignored_keys) {
+ var table_head = $('
' +
+ 'Benchmark ' +
+ 'Last date ' +
+ 'Commits ' +
+ 'Factor ' +
+ 'Best ' +
+ 'Current ' +
+ ' ' +
+ ' ');
+
+ display_table.append(table_head);
+ ignored_table.append(table_head.clone());
+
+ var table_body = $('
');
+ var regressions = data['regressions'];
+
+ $.each(regressions, function (i, item) {
+ var benchmark_name = item[0];
+ var graph_url = item[1];
+ var param_dict = item[2];
+ var parameter_idx = item[3];
+ var last_value = item[4];
+ var best_value = item[5];
+ var jumps = item[6]; // [[rev1, rev2, before, after], ...]
+
+ if (jumps === null) {
+ return;
+ }
+
+ if (branch !== null && param_dict['branch'] != branch) {
+ return;
+ }
+
+ var benchmark_basename = benchmark_name.replace(/\(.*/, '');
+ var benchmark = $.asv.main_json.benchmarks[benchmark_basename];
+ var url_params = {};
+
+ $.each(param_dict, function (key, value) {
+ url_params[key] = [value];
+ });
+
+ if (parameter_idx !== null) {
+ $.each($.asv.param_selection_from_flat_idx(benchmark.params, parameter_idx).slice(1), function(i, param_values) {
+ url_params['p-'+benchmark.param_names[i]] = [benchmark.params[i][param_values[0]]];
+ });
+ }
+
+ url_params.commits = [];
+
+ var commit_td = $('
');
+
+ $.each(jumps, function(i, revs) {
+ var commit_a = $.asv.get_commit_hash(revs[0]);
+ var commit_b = $.asv.get_commit_hash(revs[1]);
+
+ if (commit_a) {
+ url_params.commits = url_params.commits.concat([commit_a + '-' + commit_b]);
+ }
+ else {
+ url_params.commits = url_params.commits.concat([commit_b]);
+ }
+
+ if (i > 0) {
+ commit_td.append($('
, '));
+ }
+
+ if (commit_a) {
+ if ($.asv.main_json.show_commit_url.match(/.*\/\/github.com\//)) {
+ var commit_url = ($.asv.main_json.show_commit_url + '../compare/'
+ + commit_a + '...' + commit_b);
+ commit_td.append(
+ $('
').attr('href', commit_url).text(commit_a + '..' + commit_b));
+ }
+ else {
+ commit_td.append($('
').text(commit_a + '..' + commit_b));
+ }
+ }
+ else {
+ var commit_url = $.asv.main_json.show_commit_url + commit_b;
+ commit_td.append(
+ $('
').attr('href', commit_url).text(commit_b));
+ }
+ });
+
+ var row = $('
');
+
+ var benchmark_url = $.asv.format_hash_string({
+ location: [benchmark_basename],
+ params: url_params
+ });
+
+ var benchmark_link = $('
').attr('href', benchmark_url).text(benchmark_name);
+ $.asv.ui.hover_graph(benchmark_link, graph_url, benchmark_basename, parameter_idx, jumps);
+ row.append($('
').append(benchmark_link));
+
+ var date_td = $('
');
+ var date_fmt = new Date($.asv.main_json.revision_to_date[jumps[jumps.length-1][1]]);
+ date_td.text($.asv.format_date_yyyymmdd_hhmm(date_fmt));
+ row.append(date_td);
+
+ row.append(commit_td);
+
+ var factor_td = $('
');
+ row.append(factor_td);
+ var factor = last_value / best_value;
+ factor_td.text(factor.toFixed(2) + 'x');
+
+ var best_td = $('
');
+ best_td.text($.asv.pretty_unit(best_value, benchmark.unit));
+ row.append(best_td);
+
+ var last_td = $('
');
+ last_td.text($.asv.pretty_unit(last_value, benchmark.unit));
+ row.append(last_td);
+
+ table_body.append(row);
+ });
+
+ display_table.append(table_body);
+
+ setup_sort(params, display_table);
+ }
+
+ function get_ignore_key(item, revs) {
+ var benchmark_name = item[0];
+ var ignore_payload = benchmark_name;
+
+ if (revs[0] === null) {
+ ignore_payload = ignore_payload + ',';
+ }
+ else {
+ ignore_payload = (ignore_payload + ','
+ + $.asv.main_json.revision_to_hash[revs[0]]);
+ }
+ ignore_payload = (ignore_payload + ','
+ + $.asv.main_json.revision_to_hash[revs[1]]);
+
+ return ignore_key_prefix + md5(ignore_payload);
+ }
+
+ function is_key_ignored(ignore_key) {
+ if (local_storage_available) {
+ return (ignore_key in localStorage) || (ignore_key in ignored_regressions);
+ }
+ else {
+ return (ignore_key in ignored_regressions);
+ }
+ }
+
+ function set_key_ignore_status(ignore_key, is_ignored) {
+ if (is_ignored) {
+ if (local_storage_available) {
+ try {
+ localStorage[ignore_key] = 1;
+ } catch (err) {
+ /* Out of quota -- we're just going to ignore that */
+ }
+ }
+ ignored_regressions[ignore_key] = 1;
+ }
+ else {
+ if (local_storage_available) {
+ delete localStorage[ignore_key];
+ }
+ delete ignored_regressions[ignore_key];
+ }
+ }
+
+ function update_ignore_conf_sample(data, ignored_conf_sample_div, branch) {
+ var regressions = data['regressions'];
+ var entries = {};
+ var branch_suffix = "";
+
+ if (branch) {
+ branch_suffix = "@" + branch;
+ }
+
+ $.each(regressions, function (i, item) {
+ var param_dict = item[2];
+ if (branch !== null && param_dict['branch'] != branch) {
+ return;
+ }
+
+ $.each(item[6], function (i, revs) {
+ var ignore_key = get_ignore_key(item, revs);
+
+ if (is_key_ignored(ignore_key)) {
+ var benchmark_name = item[0];
+ var benchmark_name_re = (benchmark_name + branch_suffix).replace(/[.?*+^$[\]\\(){}|-]/g, "\\\\$&");
+ var commit = $.asv.get_commit_hash(revs[1]);
+ var entry = " \"^" + benchmark_name_re + "$\": \"" + commit + "\",\n";
+ entries[entry] = 1;
+ }
+ });
+ });
+
+ entries = Object.keys(entries);
+ entries.sort();
+
+ var text = "// asv.conf.json excerpt for ignoring the above permanently\n\n";
+ text += " \"regressions_first_commits\": {\n";
+ $.each(entries, function (i, entry) {
+ text += entry;
+ });
+ text += " }";
+
+ var pre = $('
');
+ pre.text(text);
+ ignored_conf_sample_div.empty();
+ ignored_conf_sample_div.append(pre);
+ }
+
+ function setup_sort(params, table) {
+ table.stupidtable({
+ 'value': function(a, b) {
+ function key(s) {
+ for (var k = 0; k < $.asv.time_units.length; ++k) {
+ var entry = $.asv.time_units[k];
+ var m = s.match('^([0-9.]+)'+entry[0]+'$');
+ if (m) {
+ return parseFloat(m[1]) * entry[2] * 1e-30;
+ }
+ }
+ return 0;
+ }
+ return key(a) - key(b)
+ },
+ 'factor': function(a, b) {
+ return parseFloat(a.replace(/x/, '')) - parseFloat(b.replace(/x/, ''));
+ }
+ });
+
+ table.on('aftertablesort', function (event, data) {
+ update_url({'sort': [data.column], 'dir': [data.direction]}, false);
+ /* Update appearance */
+ table.find('thead th').removeClass('asc');
+ table.find('thead th').removeClass('desc');
+ var th_to_sort = table.find("thead th").eq(parseInt(data.column));
+ if (th_to_sort) {
+ th_to_sort.addClass(data.direction);
+ }
+ });
+
+ if (params.sort && params.dir) {
+ var th_to_sort = table.find("thead th").eq(parseInt(params.sort[0]));
+ th_to_sort.stupidsort(params.dir[0]);
+ }
+ else {
+ var th_to_sort = table.find("thead th").eq(3);
+ th_to_sort.stupidsort("desc");
+ }
+ }
+
+ /*
+ Setup display hooks
+ */
+ $.asv.register_page('regressions', function(params) {
+ $('#regressions-display').show()
+ load_data(params);
+ });
+});
diff --git a/.asv/html/regressions.json b/.asv/html/regressions.json
new file mode 100644
index 00000000..37090c9e
--- /dev/null
+++ b/.asv/html/regressions.json
@@ -0,0 +1 @@
+{"regressions": []}
\ No newline at end of file
diff --git a/.asv/html/regressions.xml b/.asv/html/regressions.xml
new file mode 100644
index 00000000..ce42a890
--- /dev/null
+++ b/.asv/html/regressions.xml
@@ -0,0 +1,2 @@
+
+
tag:corneto.asv,1970-01-01:/9786c7b0ede6801a54a78836c115d06c01b9fcad359ba9686c040c9be8721be8 Airspeed Velocity corneto performance regressions 2024-10-13T23:28:13Z
\ No newline at end of file
diff --git a/.asv/html/summarygrid.js b/.asv/html/summarygrid.js
new file mode 100644
index 00000000..b32747f3
--- /dev/null
+++ b/.asv/html/summarygrid.js
@@ -0,0 +1,136 @@
+'use strict';
+
+$(document).ready(function() {
+ var summary_loaded = false;
+
+ /* Callback a function when an element comes in view */
+ function callback_in_view(element, func) {
+ function handler(evt) {
+ var visible = (
+ $('#summarygrid-display').css('display') != 'none' &&
+ (element.offset().top <= $(window).height() + $(window).scrollTop()) &&
+ (element.offset().top + element.height() >= $(window).scrollTop()));
+ if (visible) {
+ func();
+ $(window).off('scroll', handler);
+ }
+ }
+ $(window).on('scroll', handler);
+ }
+
+ function get_benchmarks_by_groups() {
+ var main_json = $.asv.main_json;
+ var groups = {};
+ $.each(main_json.benchmarks, function(bm_name, bm) {
+ var i = bm_name.indexOf('.');
+ var group = bm_name.slice(0, i);
+ var name = bm_name.slice(i + 1);
+ if (groups[group] === undefined) {
+ groups[group] = [];
+ }
+ groups[group].push(bm_name);
+ });
+ return groups;
+ }
+
+ function benchmark_container(bm) {
+ var container = $(
+ '
');
+ var plot_div = $(
+ '
');
+ var display_name = bm.pretty_name || bm.name.slice(bm.name.indexOf('.') + 1);
+ var name = $('
' + display_name + '
');
+ name.tooltip({
+ title: bm.name,
+ html: true,
+ placement: 'top',
+ container: 'body',
+ animation: false
+ });
+
+ plot_div.tooltip({
+ title: bm.code,
+ html: true,
+ placement: 'bottom',
+ container: 'body',
+ animation: false
+ });
+
+ container.append(name);
+ container.append(plot_div);
+
+ callback_in_view(plot_div, function() {
+ $.asv.load_graph_data(
+ 'graphs/summary/' + bm.name + '.json'
+ ).done(function(data) {
+ var options = {
+ colors: $.asv.colors,
+ series: {
+ lines: {
+ show: true,
+ lineWidth: 2
+ },
+ shadowSize: 0
+ },
+ grid: {
+ borderWidth: 1,
+ margin: 0,
+ labelMargin: 0,
+ axisMargin: 0,
+ minBorderMargin: 0
+ },
+ xaxis: {
+ ticks: [],
+ },
+ yaxis: {
+ ticks: [],
+ min: 0
+ },
+ legend: {
+ show: false
+ }
+ };
+
+ var plot = $.plot(
+ plot_div, [{data: data}], options);
+ }).fail(function() {
+ // TODO: Handle failure
+ });
+ });
+ return container;
+ }
+
+ function make_summary() {
+ var summary_display = $('#summarygrid-display');
+ var main_json = $.asv.main_json;
+ var summary_container = $('
');
+
+ if (summary_loaded) {
+ return;
+ }
+
+ $.each(get_benchmarks_by_groups(), function(group, benchmarks) {
+ var group_container = $('
')
+ group_container.attr('id', 'group-' + group)
+ group_container.append($('
' + group + ' '));
+ summary_display.append(group_container);
+ $.each(benchmarks, function(i, bm_name) {
+ var bm = $.asv.main_json.benchmarks[bm_name];
+ group_container.append(benchmark_container(bm));
+ });
+ });
+
+ summary_display.append(summary_container);
+ $(window).trigger('scroll');
+
+ summary_loaded = true;
+ }
+
+ $.asv.register_page('', function(params) {
+ $('#summarygrid-display').show();
+ $("#title").text("All benchmarks");
+ $('.tooltip').remove();
+ make_summary();
+ });
+});
diff --git a/.asv/html/summarylist.css b/.asv/html/summarylist.css
new file mode 100644
index 00000000..93854336
--- /dev/null
+++ b/.asv/html/summarylist.css
@@ -0,0 +1,50 @@
+#summarylist-body {
+ padding-left: 2em;
+ padding-right: 2em;
+ padding-top: 1em;
+ padding-bottom: 2em;
+}
+
+#summarylist-body table thead th {
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+#summarylist-body table thead th.desc:after {
+ content: ' \2191';
+}
+
+#summarylist-body table thead th.asc:after {
+ content: ' \2193';
+}
+
+#summarylist-body table.ignored {
+ padding-top: 1em;
+ color: #ccc;
+ background-color: #eee;
+}
+
+#summarylist-body table.ignored a {
+ color: #82abda;
+}
+
+#summarylist-body table tbody td.positive-change {
+ background-color: #fdd;
+}
+
+#summarylist-body table tbody td.negative-change {
+ background-color: #dfd;
+}
+
+#summarylist-body table tbody td.value {
+ white-space: nowrap;
+}
+
+#summarylist-body table tbody td.change a {
+ color: black;
+ white-space: nowrap;
+}
+
+#summarylist-body table tbody td.change-date {
+ white-space: nowrap;
+}
diff --git a/.asv/html/summarylist.js b/.asv/html/summarylist.js
new file mode 100644
index 00000000..e5f9e13c
--- /dev/null
+++ b/.asv/html/summarylist.js
@@ -0,0 +1,451 @@
+'use strict';
+
+$(document).ready(function() {
+ /* The state of the parameters in the sidebar. Dictionary mapping
+ strings to values determining the "enabled" configurations. */
+ var state = null;
+ /* Cache of constructed tables, {data_path: table_dom_id} */
+ var table_cache = {};
+ var table_cache_counter = 0;
+
+ function setup_display(state_selection) {
+ var new_state = setup_state(state_selection);
+ var same_state = (state !== null);
+
+ /* Avoid needless UI updates, e.g., on table sort */
+
+ if (same_state) {
+ $.each(state, function (key, value) {
+ if (value != new_state[key]) {
+ same_state = false;
+ }
+ });
+ }
+
+ if (!same_state) {
+ state = new_state;
+ replace_params_ui();
+
+ var filename = $.asv.graph_to_path('summary', state);
+
+ $("#summarylist-body table").hide();
+ $("#summarylist-body .message").remove();
+
+ if (table_cache[filename] !== undefined) {
+ $(table_cache[filename]).show();
+ }
+ else {
+ $("#summarylist-body").append($("
Loading...
"));
+ $.asv.load_graph_data(
+ filename
+ ).done(function (data) {
+ var table = construct_benchmark_table(data);
+ var table_name = 'summarylist-table-' + table_cache_counter;
+ ++table_cache_counter;
+
+ table.attr('id', table_name);
+ table_cache[filename] = '#' + table_name;
+ $("#summarylist-body .message").remove();
+ $("#summarylist-body").append(table);
+ table.show()
+ });
+ }
+ }
+ }
+
+ function update_state_url(key, value) {
+ var info = $.asv.parse_hash_string(window.location.hash);
+ var new_state = get_valid_state(state, key, value);
+
+ $.each($.asv.main_json.params, function(param, values) {
+ if (values.length > 1) {
+ info.params[param] = [new_state[param]];
+ }
+ else if (info.params[param]) {
+ delete info.params[param];
+ }
+ });
+
+ window.location.hash = $.asv.format_hash_string(info);
+ }
+
+ function obj_copy(obj) {
+ var newobj = {};
+ $.each(obj, function(key, val) {
+ newobj[key] = val;
+ });
+ return newobj;
+ }
+
+ function obj_diff(obj1, obj2) {
+ var count = 0;
+ $.each(obj1, function(key, val) {
+ if (obj2[key] != val) {
+ ++count
+ }
+ });
+ return count;
+ }
+
+ function get_valid_state(tmp_state, wanted_key, wanted_value) {
+ /*
+ Get an available state with wanted_key having wanted_value,
+ preferably as a minor modification of tmp_state.
+ */
+ var best_params = null;
+ var best_diff = 1e99;
+ var best_hit = false;
+
+ tmp_state = obj_copy(tmp_state);
+ if (wanted_key !== undefined) {
+ tmp_state[wanted_key] = wanted_value;
+ }
+
+ $.each($.asv.main_json.graph_param_list, function(idx, params) {
+ var diff = obj_diff(tmp_state, params);
+ var hit = (wanted_key === undefined || params[wanted_key] == wanted_value);
+
+ if ((!best_hit && hit) || (hit == best_hit && diff < best_diff)) {
+ best_params = params;
+ best_diff = diff;
+ best_hit = hit;
+ }
+ });
+
+ if (best_params === null) {
+ best_params = $.asv.main_json.graph_param_list[0];
+ }
+
+ return obj_copy(best_params);
+ }
+
+ function setup_state(state_selection) {
+ var index = $.asv.main_json;
+ var state = {};
+
+ state.machine = index.params.machine;
+
+ $.each(index.params, function(param, values) {
+ state[param] = values[0];
+ });
+
+ if (state_selection !== null) {
+ /* Select a specific generic parameter state */
+ $.each(index.params, function(param, values) {
+ if (state_selection[param]) {
+ state[param] = state_selection[param][0];
+ }
+ });
+ }
+
+ return get_valid_state(state);
+ }
+
+ function replace_params_ui() {
+ var index = $.asv.main_json;
+
+ var nav = $('#summarylist-navigation');
+ nav.empty();
+
+ /* Machine selection */
+ $.asv.ui.make_value_selector_panel(nav, 'machine', index.params.machine, function(i, machine, button) {
+ button.text(machine);
+
+ button.on('click', function(evt) {
+ update_state_url('machine', machine);
+ });
+
+ if (state.machine != machine) {
+ button.removeClass('active');
+ }
+ button.removeAttr('data-toggle');
+
+ /* Create tooltips for each machine */
+ var details = [];
+ $.each(index.machines[machine], function(key, val) {
+ details.push(key + ': ' + val);
+ });
+ details = details.join('
');
+
+ button.tooltip({
+ title: details,
+ html: true,
+ placement: 'right',
+ container: 'body',
+ animation: false
+ });
+ });
+
+ /* Generic parameter selectors */
+ $.each(index.params, function(param, values) {
+ if (values.length > 1 && param != 'machine') {
+ $.asv.ui.make_value_selector_panel(nav, param, values, function(i, value, button) {
+ var value_display;
+ if (value === null)
+ value_display = '[none]';
+ else if (!value)
+ value_display = '[default]';
+ else
+ value_display = value;
+
+ button.text(value_display);
+
+ if (state[param] != value) {
+ button.removeClass('active');
+ }
+
+ button.on('click', function(evt) {
+ update_state_url(param, value);
+ });
+ });
+ }
+ });
+
+ $(nav).find(".btn-group").removeAttr("data-toggle");
+
+ $.asv.ui.reflow_value_selector_panels();
+ }
+
+ function construct_benchmark_table(data) {
+ var index = $.asv.main_json;
+
+ /* Form a new table */
+
+ var table = $('
');
+
+ var table_head = $('
' +
+ 'Benchmark ' +
+ 'Value ' +
+ 'Recent change ' +
+ 'Changed at ' +
+ ' ');
+ table.append(table_head);
+
+ var table_body = $('
');
+
+ $.each(data, function(row_idx, row) {
+ var tr = $('
');
+ var name_td = $('
');
+ var name = $('
');
+ var benchmark_url_args = {};
+ var benchmark_full_url;
+ var benchmark_base_url;
+
+ /* Format benchmark url */
+ benchmark_url_args.location = [row.name];
+ benchmark_url_args.params = {};
+ $.each($.asv.main_json.params, function (key, values) {
+ if (values.length > 1) {
+ benchmark_url_args.params[key] = [state[key]];
+ }
+ });
+ benchmark_base_url = $.asv.format_hash_string(benchmark_url_args);
+ if (row.idx !== null) {
+ var benchmark = $.asv.main_json.benchmarks[row.name];
+ $.each($.asv.param_selection_from_flat_idx(benchmark.params, row.idx).slice(1),
+ function(i, param_values) {
+ benchmark_url_args.params['p-'+benchmark.param_names[i]]
+ = [benchmark.params[i][param_values[0]]];
+ });
+ }
+ benchmark_full_url = $.asv.format_hash_string(benchmark_url_args);
+
+ /* Benchmark name column */
+ var bm_link;
+ if (row.idx === null) {
+ bm_link = $('
').attr('href', benchmark_base_url).text(row.pretty_name);
+ name_td.append(bm_link);
+ }
+ else {
+ var basename = row.pretty_name;
+ var args = null;
+ var m = row.pretty_name.match(/(.*)\(.*$/);
+ if (m) {
+ basename = m[1];
+ args = row.pretty_name.slice(basename.length);
+ }
+ bm_link = $('
').attr('href', benchmark_base_url).text(basename);
+ name_td.append(bm_link);
+ if (args) {
+ var bm_idx_link;
+ var graph_url;
+ bm_idx_link = $('
').attr('href', benchmark_full_url).text(' ' + args);
+ name_td.append(bm_idx_link);
+ graph_url = $.asv.graph_to_path(row.name, state);
+ $.asv.ui.hover_graph(bm_idx_link, graph_url, row.name, row.idx, null);
+ }
+ }
+ $.asv.ui.hover_summary_graph(bm_link, row.name);
+
+ /* Value column */
+ var value_td = $('
');
+ if (row.last_value !== null) {
+ var value, err, err_str, sort_value;
+ var unit = $.asv.main_json.benchmarks[row.name].unit;
+ value = $.asv.pretty_unit(row.last_value, unit);
+ if (unit == "seconds") {
+ sort_value = row.last_value * 1e100;
+ }
+ else {
+ sort_value = row.last_value;
+ }
+ var value_span = $('
').text(value);
+
+ err = 100*row.last_err/row.last_value;
+ if (err == err) {
+ err_str = " \u00b1 " + err.toFixed(0.1) + '%';
+ }
+ else {
+ err_str = "";
+ }
+ value_span.attr('data-toggle', 'tooltip');
+ value_span.attr('title', value + err_str);
+ value_td.append(value_span);
+ value_td.attr('data-sort-value', sort_value);
+ }
+ else {
+ value_td.attr('data-sort-value', -1e99);
+ }
+
+ /* Change percentage column */
+ var change_td = $('
');
+ if (row.prev_value !== null) {
+ var text, change_str, change = 0, sort_value = 0;
+ var unit = $.asv.main_json.benchmarks[row.name].unit;
+ change_str = $.asv.pretty_unit(row.last_value - row.prev_value, unit);
+ if (!change_str.match(/^-/)) {
+ change_str = '+' + change_str;
+ }
+ if (row.prev_value != 0) {
+ change = 100 * (row.last_value / row.prev_value - 1);
+ text = change.toFixed(1) + '% (' + change_str + ')';
+ if (change > 0) {
+ text = '+' + text;
+ }
+ sort_value = change;
+ }
+ else {
+ text = ' (' + change_str + ')';
+ }
+ text = text.replace('-', '\u2212');
+
+ var change_commit_a = $.asv.main_json.revision_to_hash[row.change_rev[0]];
+ var change_commit_b = $.asv.main_json.revision_to_hash[row.change_rev[1]];
+ var change_q;
+ if (change_commit_a === undefined) {
+ change_q = '&commits=' + change_commit_b;
+ }
+ else {
+ change_q = '&commits=' + change_commit_a + '-' + change_commit_b;
+ }
+ var change_link = $('
').attr('href', benchmark_full_url + change_q).text(text);
+
+ graph_url = $.asv.graph_to_path(row.name, state);
+ $.asv.ui.hover_graph(change_link, graph_url, row.name, row.idx, [row.change_rev]);
+
+ change_td.append(change_link);
+
+ if (change > 5) {
+ change_td.addClass('positive-change');
+ }
+ else if (change < -5) {
+ change_td.addClass('negative-change');
+ }
+ change_td.attr('data-sort-value', sort_value);
+ }
+ else {
+ change_td.attr('data-sort-value', 0);
+ }
+
+ /* Change date column */
+ var changed_at_td = $('
');
+ if (row.change_rev !== null) {
+ var date = new Date($.asv.main_json.revision_to_date[row.change_rev[1]]);
+ var commit_1 = $.asv.get_commit_hash(row.change_rev[0]);
+ var commit_2 = $.asv.get_commit_hash(row.change_rev[1]);
+ var commit_a = $('
');
+ var span = $('
');
+ if (commit_1) {
+ var commit_url;
+ if ($.asv.main_json.show_commit_url.match(/.*\/\/github.com\//)) {
+ commit_url = ($.asv.main_json.show_commit_url + '../compare/'
+ + commit_1 + '...' + commit_2);
+ }
+ else {
+ commit_url = $.asv.main_json.show_commit_url + commit_2;
+ }
+ commit_a.attr('href', commit_url);
+ commit_a.text(commit_1 + '...' + commit_2);
+ }
+ else {
+ commit_a.attr('href', $.asv.main_json.show_commit_url + commit_2);
+ commit_a.text(commit_2);
+ }
+ span.text($.asv.format_date_yyyymmdd(date) + ' ');
+ span.append(commit_a);
+ changed_at_td.append(span);
+ }
+
+ tr.append(name_td);
+ tr.append(value_td);
+ tr.append(change_td);
+ tr.append(changed_at_td);
+
+ table_body.append(tr);
+ });
+
+ table_body.find('[data-toggle="tooltip"]').tooltip();
+
+ /* Finalize */
+ table.append(table_body);
+ setup_sort(table);
+
+ return table;
+ }
+
+ function setup_sort(table) {
+ var info = $.asv.parse_hash_string(window.location.hash);
+
+ table.stupidtable();
+
+ table.on('aftertablesort', function (event, data) {
+ var info = $.asv.parse_hash_string(window.location.hash);
+ info.params['sort'] = [data.column];
+ info.params['dir'] = [data.direction];
+ window.location.hash = $.asv.format_hash_string(info);
+
+ /* Update appearance */
+ table.find('thead th').removeClass('asc');
+ table.find('thead th').removeClass('desc');
+ var th_to_sort = table.find("thead th").eq(parseInt(data.column));
+ if (th_to_sort) {
+ th_to_sort.addClass(data.direction);
+ }
+ });
+
+ if (info.params.sort && info.params.dir) {
+ var th_to_sort = table.find("thead th").eq(parseInt(info.params.sort[0]));
+ th_to_sort.stupidsort(info.params.dir[0]);
+ }
+ else {
+ var th_to_sort = table.find("thead th").eq(0);
+ th_to_sort.stupidsort("asc");
+ }
+ }
+
+ /*
+ * Entry point
+ */
+ $.asv.register_page('summarylist', function(params) {
+ var state_selection = null;
+
+ if (Object.keys(params).length > 0) {
+ state_selection = params;
+ }
+
+ setup_display(state_selection);
+
+ $('#summarylist-display').show();
+ $("#title").text("List of benchmarks");
+ });
+});
diff --git a/.asv/html/swallow.ico b/.asv/html/swallow.ico
new file mode 100644
index 00000000..b5fcc02b
Binary files /dev/null and b/.asv/html/swallow.ico differ
diff --git a/.asv/html/swallow.png b/.asv/html/swallow.png
new file mode 100644
index 00000000..55228678
Binary files /dev/null and b/.asv/html/swallow.png differ
diff --git a/.asv/results/benchmarks.json b/.asv/results/benchmarks.json
new file mode 100644
index 00000000..e8542afc
--- /dev/null
+++ b/.asv/results/benchmarks.json
@@ -0,0 +1,108 @@
+{
+ "benchmarks.TimeSuite.time_add_edges": {
+ "code": "class TimeSuite:\n def time_add_edges(self):\n self.g = Graph()\n edges = [(i, i+1) for i in range(1000)]\n self.g.add_edges(edges)\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_add_edges",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "1af7f787be95e2a0e1e05a547765bb8692e421bc915e53f592e669eb9bb05968",
+ "warmup_time": -1
+ },
+ "benchmarks.TimeSuite.time_add_single_edge": {
+ "code": "class TimeSuite:\n def time_add_single_edge(self):\n self.g = Graph()\n for i in range(1000):\n self.g.add_edge(f\"a{i}\", f\"b{i}\")\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_add_single_edge",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "04304111145d73ca82f229a6a4780edf47b163e966a038dd7c487f1e1cb60903",
+ "warmup_time": -1
+ },
+ "benchmarks.TimeSuite.time_add_single_vertex": {
+ "code": "class TimeSuite:\n def time_add_single_vertex(self):\n self.g = Graph()\n for _ in range(1000):\n self.g.add_vertex(\"v\")\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_add_single_vertex",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "4a3b5b0cf06e008bda18de1e436f2012dbca673c2f715fc9ccd8345370b525d6",
+ "warmup_time": -1
+ },
+ "benchmarks.TimeSuite.time_bfs": {
+ "code": "class TimeSuite:\n def time_bfs(self):\n self.g.bfs(self.g.V[0])\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_bfs",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "e0618253d522627e7ccaea106d01a90d98637e20f2fd289daba01ded37d4f380",
+ "warmup_time": -1
+ },
+ "benchmarks.TimeSuite.time_bfs_rev": {
+ "code": "class TimeSuite:\n def time_bfs_rev(self):\n self.g.bfs(self.g.V[0], reverse=True)\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_bfs_rev",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "ff455a307cb1070e684b5e69916ec88775a5a5dd87c4408db4fa7f52597fc485",
+ "warmup_time": -1
+ },
+ "benchmarks.TimeSuite.time_in_edges": {
+ "code": "class TimeSuite:\n def time_in_edges(self):\n list([self.g.in_edges(self.g.V[i]) for i in range(self.g.num_vertices)])\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_in_edges",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "73563860d0f8317afde07264ee8069b2bba66a2286d0f19a6ac63d0c8f642f98",
+ "warmup_time": -1
+ },
+ "benchmarks.TimeSuite.time_out_edges": {
+ "code": "class TimeSuite:\n def time_out_edges(self):\n list([self.g.out_edges(self.g.V[i]) for i in range(self.g.num_vertices)])\n\n def setup(self):\n # Create a graph with at least 1000 edges\n self.g = Graph()\n self.num_vertices = 500\n self.num_edges = 5000\n \n # Randomly generate edges for the graph\n for _ in range(self.num_edges):\n v1 = random.randint(0, self.num_vertices - 1)\n v2 = random.randint(0, self.num_vertices - 1)\n self.g.add_edge(v1, v2)",
+ "min_run_count": 2,
+ "name": "benchmarks.TimeSuite.time_out_edges",
+ "number": 0,
+ "param_names": [],
+ "params": [],
+ "repeat": 0,
+ "rounds": 2,
+ "sample_time": 0.01,
+ "type": "time",
+ "unit": "seconds",
+ "version": "b5e832ac34133ed4615c32aa962e3f4a2fe53e5dbcdf510506d4f997de34897c",
+ "warmup_time": -1
+ },
+ "version": 2
+}
\ No newline at end of file
diff --git a/.asv/results/laptop/machine.json b/.asv/results/laptop/machine.json
new file mode 100644
index 00000000..22709cb9
--- /dev/null
+++ b/.asv/results/laptop/machine.json
@@ -0,0 +1,9 @@
+{
+ "arch": "AMD64",
+ "cpu": "11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz",
+ "machine": "laptop",
+ "num_cpu": "8",
+ "os": "Windows 10",
+ "ram": "16GB",
+ "version": 1
+}
\ No newline at end of file
diff --git a/asv.conf.json b/asv.conf.json
new file mode 100644
index 00000000..7ce762e3
--- /dev/null
+++ b/asv.conf.json
@@ -0,0 +1,194 @@
+{
+ // The version of the config file format. Do not change, unless
+ // you know what you are doing.
+ "version": 1,
+
+ // The name of the project being benchmarked
+ "project": "corneto",
+
+ // The project's homepage
+ "project_url": "http://saezlab.github.io/corneto",
+
+ // The URL or local path of the source code repository for the
+ // project being benchmarked
+ "repo": ".",
+
+ // The Python project's subdirectory in your repo. If missing or
+ // the empty string, the project is assumed to be located at the root
+ // of the repository.
+ // "repo_subdir": "",
+
+ // Customizable commands for building the project.
+ // See asv.conf.json documentation.
+ // To build the package using pyproject.toml (PEP518), uncomment the following lines
+ "build_command": [
+ "python -m pip install build",
+ "python -m build",
+ "python -mpip wheel -w {build_cache_dir} {build_dir}"
+ ],
+ // To build the package using setuptools and a setup.py file, uncomment the following lines
+ // "build_command": [
+ // "python setup.py build",
+ // "python -mpip wheel -w {build_cache_dir} {build_dir}"
+ // ],
+
+ // Customizable commands for installing and uninstalling the project.
+ // See asv.conf.json documentation.
+ "install_command": ["in-dir={env_dir} python -mpip install {wheel_file}[highs]"],
+ "uninstall_command": ["return-code=any python -mpip uninstall -y {project}"],
+
+ // List of branches to benchmark. If not provided, defaults to "main"
+ // (for git) or "default" (for mercurial).
+ "branches": ["main", "dev"], // for git
+ // "branches": ["default"], // for mercurial
+
+ // The DVCS being used. If not set, it will be automatically
+ // determined from "repo" by looking at the protocol in the URL
+ // (if remote), or by looking for special directories, such as
+ // ".git" (if local).
+ // "dvcs": "git",
+
+ // The tool to use to create environments. May be "conda",
+ // "virtualenv", "mamba" (above 3.8)
+ // or other value depending on the plugins in use.
+ // If missing or the empty string, the tool will be automatically
+ // determined by looking for tools on the PATH environment
+ // variable.
+ "environment_type": "virtualenv",
+
+ // timeout in seconds for installing any dependencies in environment
+ // defaults to 10 min
+ "install_timeout": 600,
+
+ // the base URL to show a commit for the project.
+ "show_commit_url": "http://github.com/saezlab/corneto/commit/",
+
+ // The Pythons you'd like to test against. If not provided, defaults
+ // to the current version of Python used to run `asv`.
+ // "pythons": ["3.8", "3.12"],
+
+ // The list of conda channel names to be searched for benchmark
+ // dependency packages in the specified order
+ // "conda_channels": ["conda-forge", "defaults"],
+
+ // A conda environment file that is used for environment creation.
+ // "conda_environment_file": "environment.yml",
+
+ // The matrix of dependencies to test. Each key of the "req"
+ // requirements dictionary is the name of a package (in PyPI) and
+ // the values are version numbers. An empty list or empty string
+ // indicates to just test against the default (latest)
+ // version. null indicates that the package is to not be
+ // installed. If the package to be tested is only available from
+ // PyPi, and the 'environment_type' is conda, then you can preface
+ // the package name by 'pip+', and the package will be installed
+ // via pip (with all the conda available packages installed first,
+ // followed by the pip installed packages).
+ //
+ // The ``@env`` and ``@env_nobuild`` keys contain the matrix of
+ // environment variables to pass to build and benchmark commands.
+ // An environment will be created for every combination of the
+ // cartesian product of the "@env" variables in this matrix.
+ // Variables in "@env_nobuild" will be passed to every environment
+ // during the benchmark phase, but will not trigger creation of
+ // new environments. A value of ``null`` means that the variable
+ // will not be set for the current combination.
+ //
+ // "matrix": {
+ // "req": {
+ // "numpy": ["1.6", "1.7"],
+ // "six": ["", null], // test with and without six installed
+ // "pip+emcee": [""] // emcee is only available for install with pip.
+ // },
+ // "env": {"ENV_VAR_1": ["val1", "val2"]},
+ // "env_nobuild": {"ENV_VAR_2": ["val3", null]},
+ // },
+
+ // Combinations of libraries/python versions can be excluded/included
+ // from the set to test. Each entry is a dictionary containing additional
+ // key-value pairs to include/exclude.
+ //
+ // An exclude entry excludes entries where all values match. The
+ // values are regexps that should match the whole string.
+ //
+ // An include entry adds an environment. Only the packages listed
+ // are installed. The 'python' key is required. The exclude rules
+ // do not apply to includes.
+ //
+ // In addition to package names, the following keys are available:
+ //
+ // - python
+ // Python version, as in the *pythons* variable above.
+ // - environment_type
+ // Environment type, as above.
+ // - sys_platform
+ // Platform, as in sys.platform. Possible values for the common
+ // cases: 'linux2', 'win32', 'cygwin', 'darwin'.
+ // - req
+ // Required packages
+ // - env
+ // Environment variables
+ // - env_nobuild
+ // Non-build environment variables
+ //
+ // "exclude": [
+ // {"python": "3.2", "sys_platform": "win32"}, // skip py3.2 on windows
+ // {"environment_type": "conda", "req": {"six": null}}, // don't run without six on conda
+ // {"env": {"ENV_VAR_1": "val2"}}, // skip val2 for ENV_VAR_1
+ // ],
+ //
+ // "include": [
+ // // additional env for python3.12
+ // {"python": "3.12", "req": {"numpy": "1.26"}, "env_nobuild": {"FOO": "123"}},
+ // // additional env if run on windows+conda
+ // {"platform": "win32", "environment_type": "conda", "python": "3.12", "req": {"libpython": ""}},
+ // ],
+
+ // The directory (relative to the current directory) that benchmarks are
+ // stored in. If not provided, defaults to "benchmarks"
+ // "benchmark_dir": "benchmarks",
+
+ // The directory (relative to the current directory) to cache the Python
+ // environments in. If not provided, defaults to "env"
+ "env_dir": ".asv/env",
+
+ // The directory (relative to the current directory) that raw benchmark
+ // results are stored in. If not provided, defaults to "results".
+ "results_dir": ".asv/results",
+
+ // The directory (relative to the current directory) that the html tree
+ // should be written to. If not provided, defaults to "html".
+ "html_dir": ".asv/html",
+
+ // The number of characters to retain in the commit hashes.
+ // "hash_length": 8,
+
+ // `asv` will cache results of the recent builds in each
+ // environment, making them faster to install next time. This is
+ // the number of builds to keep, per environment.
+ // "build_cache_size": 2,
+
+ // The commits after which the regression search in `asv publish`
+ // should start looking for regressions. Dictionary whose keys are
+ // regexps matching to benchmark names, and values corresponding to
+ // the commit (exclusive) after which to start looking for
+ // regressions. The default is to start from the first commit
+ // with results. If the commit is `null`, regression detection is
+ // skipped for the matching benchmark.
+ //
+ // "regressions_first_commits": {
+ // "some_benchmark": "352cdf", // Consider regressions only after this commit
+ // "another_benchmark": null, // Skip regression detection altogether
+ // },
+
+ // The thresholds for relative change in results, after which `asv
+ // publish` starts reporting regressions. Dictionary of the same
+ // form as in ``regressions_first_commits``, with values
+ // indicating the thresholds. If multiple entries match, the
+ // maximum is taken. If no entry matches, the default is 5%.
+ //
+ // "regressions_thresholds": {
+ // "some_benchmark": 0.01, // Threshold of 1%
+ // "another_benchmark": 0.5, // Threshold of 50%
+ // },
+}
diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/benchmarks/benchmarks.py b/benchmarks/benchmarks.py
new file mode 100644
index 00000000..27df855e
--- /dev/null
+++ b/benchmarks/benchmarks.py
@@ -0,0 +1,46 @@
+import random
+from copy import deepcopy
+
+from corneto._graph import Attributes, Graph
+
+
+class TimeSuite:
+
+ def setup(self):
+ # Create a graph with at least 1000 edges
+ self.g = Graph()
+ self.num_vertices = 500
+ self.num_edges = 5000
+
+ # Randomly generate edges for the graph
+ for _ in range(self.num_edges):
+ v1 = random.randint(0, self.num_vertices - 1)
+ v2 = random.randint(0, self.num_vertices - 1)
+ self.g.add_edge(v1, v2)
+
+ def time_add_single_vertex(self):
+ self.g = Graph()
+ for _ in range(1000):
+ self.g.add_vertex("v")
+
+ def time_add_single_edge(self):
+ self.g = Graph()
+ for i in range(1000):
+ self.g.add_edge(f"a{i}", f"b{i}")
+
+ def time_add_edges(self):
+ self.g = Graph()
+ edges = [(i, i+1) for i in range(1000)]
+ self.g.add_edges(edges)
+
+ def time_bfs(self):
+ self.g.bfs(self.g.V[0])
+
+ def time_bfs_rev(self):
+ self.g.bfs(self.g.V[0], reverse=True)
+
+ def time_in_edges(self):
+ list([self.g.in_edges(self.g.V[i]) for i in range(self.g.num_vertices)])
+
+ def time_out_edges(self):
+ list([self.g.out_edges(self.g.V[i]) for i in range(self.g.num_vertices)])
diff --git a/corneto/_graph.py b/corneto/_graph.py
index f68f5463..d87fb698 100644
--- a/corneto/_graph.py
+++ b/corneto/_graph.py
@@ -504,7 +504,7 @@ def plot(self, **kwargs):
# Check if the object is able to produce a MIME bundle
Gv._repr_mimebundle_()
return Gv
- except Exception as e:
+ except (OSError, Exception) as e:
from corneto._settings import LOGGER
from corneto._util import supports_html
diff --git a/corneto/backend/_base.py b/corneto/backend/_base.py
index 865d179b..b001da86 100644
--- a/corneto/backend/_base.py
+++ b/corneto/backend/_base.py
@@ -3,6 +3,7 @@
from copy import copy as shallow_copy
from numbers import Number
from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Tuple, Union
+import warnings
import numpy as np
@@ -727,6 +728,10 @@ def _load(self) -> Any:
def available_solvers(self) -> List[str]:
raise NotImplementedError()
+ @abc.abstractmethod
+ def Constant(self, value: Any, name: Optional[str] = None) -> CSymbol:
+ raise NotImplementedError()
+
@abc.abstractmethod
def Variable(
self,
@@ -1236,6 +1241,12 @@ def Indicators(
suffix_pos="_ipos",
suffix_neg="_ineg",
) -> ProblemDef:
+ # SHow a deprecated
+ warnings.warn(
+ "The Indicators method is deprecated, use Indicator instead",
+ DeprecationWarning,
+ )
+
# Get upper/lower bounds for flow variables
constraints = []
if not (positive or negative):
@@ -1270,7 +1281,10 @@ def Indicators(
return self.Problem(constraints)
def Xor(self, x: CExpression, y: CExpression, varname="_xor"):
- # TODO: Generalize for matrices Xor(X,Y)
+ # Deprecated
+ warnings.warn(
+ "The Xor method is deprecated, use linear_xor instead", DeprecationWarning
+ )
if isinstance(x, CSymbol) and x._vartype != VarType.BINARY:
raise ValueError(f"Variable x has type {x._vartype} instead of BINARY")
if isinstance(y, CSymbol) and y._vartype != VarType.BINARY:
@@ -1374,44 +1388,27 @@ def hstack(self, arg_list: Iterable[CExpression]) -> CExpression:
h = h.hstack(a)
return h
+ def zero_function(self) -> CExpression:
+ return self.Constant(0).sum()
+
class NoBackend(Backend):
def __init__(self) -> None:
self._error = (
"No backend found. You can install one of the "
- "supported backend by `pip install cvxpy` or `pip install picos`."
+ "supported backends by `pip install cvxpy` or `pip install picos`."
)
def __bool__(self) -> bool:
return False
- def _load(self):
- return None
-
- def available_solvers(self):
- return []
-
- def Variable(
- self,
- *args,
- **kwargs,
- ) -> CSymbol:
- raise NotImplementedError(self._error)
-
- def _solve(
- self,
- *args,
- **kwargs,
- ):
- raise NotImplementedError(self._error)
-
- def Constant(self) -> CSymbol:
- raise NotImplementedError(self._error)
-
- def Parameter(self) -> CSymbol:
- raise NotImplementedError(self._error)
-
- def build(self, p: ProblemDef) -> Any:
+ def __getattr__(self, name):
+ """
+ Intercept any attribute or method call that isn't already defined in the Backend class
+ and raise a NotImplementedError.
+ """
+ if hasattr(super(), name):
+ return super().__getattr__(name)
raise NotImplementedError(self._error)
diff --git a/corneto/backend/_cvxpy_backend.py b/corneto/backend/_cvxpy_backend.py
index 28ebe6bd..6ed40e13 100644
--- a/corneto/backend/_cvxpy_backend.py
+++ b/corneto/backend/_cvxpy_backend.py
@@ -89,6 +89,11 @@ def __str__(self) -> str:
def available_solvers(self) -> List[str]:
return cp.installed_solvers()
+ def Constant(self, value: Any, name: Optional[str] = None) -> CSymbol:
+ name = name or _get_unique_name(prefix="const")
+ v = cp.Constant(value, name=name)
+ return CvxpySymbol(v, name, shape=(), variable=False)
+
def Variable(
self,
name: Optional[str] = None,
diff --git a/corneto/backend/_picos_backend.py b/corneto/backend/_picos_backend.py
index fb7b4acf..2d17e9dd 100644
--- a/corneto/backend/_picos_backend.py
+++ b/corneto/backend/_picos_backend.py
@@ -87,7 +87,6 @@ def _hstack(self, other: Any) -> Any:
if len(a_shape) == 1 and len(b_shape) == 1:
a = a.reshaped((1, a_shape[0]))
b = b.reshaped((1, b_shape[0]))
- return a & b
return a & b
def _vstack(self, other: Any) -> Any:
@@ -175,6 +174,11 @@ def available_solvers(self) -> List[str]:
def build(self, p: ProblemDef) -> Any:
raise NotImplementedError()
+ def Constant(self, value: Any, name: Optional[str] = None) -> CSymbol:
+ name = name or _get_unique_name(prefix="const")
+ v = pc.Constant(name, value=value)
+ return PicosSymbol(v, name, shape=(), variable=False)
+
def Variable(
self,
name: Optional[str] = None,
diff --git a/corneto/methods/method.py b/corneto/methods/method.py
index e470df7a..49f9e85e 100644
--- a/corneto/methods/method.py
+++ b/corneto/methods/method.py
@@ -1,23 +1,299 @@
from abc import ABC, abstractmethod
+from typing import Any, Dict, List, Optional, Tuple
+import numpy as np
+
+import corneto as cn
from corneto import DEFAULT_BACKEND
+from corneto._constants import DEFAULT_LB, DEFAULT_UB
from corneto._graph import BaseGraph
+from corneto._settings import sparsify
+from corneto.backend._base import Backend
+from corneto.methods.signal._util import (
+ get_incidence_matrices_of_edges,
+ get_interactions,
+)
+
+
+class GraphData:
+ def __init__(
+ self,
+ vertex_data: Optional[Dict[str, Any]] = None,
+ edge_data: Optional[Dict[int, Any]] = None,
+ **kwargs,
+ ):
+ # Only copy input if it's a dictionary; otherwise, use an empty dictionary
+ self.vertex_data = vertex_data if vertex_data is not None else {}
+ self.edge_data = edge_data if edge_data is not None else {}
+ # Store additional attributes from kwargs
+ self.attributes = {key: value for key, value in kwargs.items()}
-class CornetoMethod(ABC):
- def __init__(self, backend=DEFAULT_BACKEND):
+
+class FlowMethod(ABC):
+ def __init__(
+ self,
+ graph,
+ flow_lower_bound: float = DEFAULT_LB,
+ flow_upper_bound: float = DEFAULT_UB,
+ num_flows: int = 1,
+ shared_flow_bounds: bool = False,
+ backend: Optional[Backend] = None,
+ ):
+ if backend is None:
+ backend = DEFAULT_BACKEND
self._backend = backend
- self._annotated_flow_graph = None
- self.problem = None
+ self._base_graph = graph
+ self._flow_lb = flow_lower_bound
+ self._flow_ub = flow_upper_bound
+ self._num_flows = num_flows
+ self._shared_flow_bounds = shared_flow_bounds
@abstractmethod
- def create_problem(self):
- raise NotImplementedError
+ def preprocess(self, data: List[GraphData]) -> Tuple[BaseGraph, List[GraphData]]:
+ pass
@abstractmethod
- def map_data(self, graph: BaseGraph, data) -> BaseGraph:
- raise NotImplementedError
+ def transform_graph(self, graph: BaseGraph, data: List[GraphData]) -> BaseGraph:
+ pass
@abstractmethod
- def transform_graph(self, graph: BaseGraph) -> BaseGraph:
+ def elementwise_error(self, predicted, expected):
raise NotImplementedError
+
+ @abstractmethod
+ def create_flow_based_problem(
+ self, flow_var, graph: BaseGraph, data: List[GraphData]
+ ):
+ pass
+
+ def build(self, data: List[GraphData]):
+ graph, data = self.preprocess(data)
+ graph = self.transform_graph(self.graph, data)
+ flow_problem = self.backend.Flow(
+ graph,
+ lb=self._flow_lb,
+ ub=self._flow_ub,
+ n_flows=self._num_flows,
+ shared_bounds=self._shared_flow_bounds,
+ )
+ flow_problem += self.create_flow_based_problem(flow_problem, graph, data)
+ # Add the error for each sample
+ for i, d in enumerate(data):
+ output_vertices = d.attributes.get("outputs", set())
+ output_values = list(d.vertex_data.get(v, 0) for v in output_vertices)
+ vertex_indexes = [graph.V.index(key) for key in output_vertices]
+ #error = self.elementwise_error()
+
+ # Getter for the graph
+ @property
+ def graph(self):
+ return self._base_graph
+
+ # getter for backend
+ @property
+ def backend(self):
+ return self._backend
+
+
+class Carnival(FlowMethod):
+ def __init__(
+ self,
+ graph,
+ data,
+ exclusive_vertex_values=True,
+ backend: Optional[Backend] = None,
+ ):
+ super().__init__(graph, backend=backend)
+ self.data = data
+ self.exclusive_vertex_values = exclusive_vertex_values
+
+ def preprocess(self, data: List[GraphData]) -> Tuple[BaseGraph, List[GraphData]]:
+ inputs = set()
+ outputs = set()
+ # Get all inputs and outputs for all samples
+ for sample_data in data:
+ inputs.update(sample_data.attributes.get("inputs", set()))
+ outputs.update(sample_data.attributes.get("outputs", set()))
+
+ if len(inputs) == 0:
+ raise ValueError("No inputs provided. Add `inputs` attribute to GraphData.")
+ if len(outputs) == 0:
+ raise ValueError(
+ "No outputs provided. Add `outputs` attribute to GraphData."
+ )
+
+ # Graph shape before pruning
+ initial_shape = self.graph.shape
+
+ # Compute initial inputs and outputs
+ vertices = set(self.graph.V)
+ pkn_inputs = vertices.intersection(inputs)
+ pkn_outputs = vertices.intersection(outputs)
+
+ inputs_not_in_pkn = inputs - pkn_inputs
+ outputs_not_in_pkn = outputs - pkn_outputs
+
+ # Prune the graph
+ pruned_graph = self.graph.prune(list(pkn_inputs), list(pkn_outputs))
+
+ # Graph shape after pruning
+ pruned_shape = pruned_graph.shape
+
+ pruned_pkn_vertices = set(pruned_graph.V)
+
+ # Reachable inputs/outputs after pruning
+ reachable_inputs = pkn_inputs.intersection(pruned_pkn_vertices)
+ reachable_outputs = pkn_outputs.intersection(pruned_pkn_vertices)
+
+ # Identify removed inputs/outputs
+ non_contributing_inputs = pkn_inputs - reachable_inputs
+ non_reachable_outputs = pkn_outputs - reachable_outputs
+
+ out_data = []
+
+ for sample_data in data:
+ out_vertex_data = {
+ k: v
+ for k, v in sample_data.vertex_data.items()
+ if k in pruned_pkn_vertices
+ }
+ out_edge_data = {
+ k: v for k, v in sample_data.edge_data.items() if k in pruned_graph.E
+ }
+ out_data.append(GraphData(out_vertex_data, out_edge_data))
+
+ # Collect statistics
+ stats = {
+ "initial_shape": initial_shape,
+ "pruned_shape": pruned_shape,
+ "inputs_not_in_pkn": inputs_not_in_pkn,
+ "outputs_not_in_pkn": outputs_not_in_pkn,
+ "non_contributing_inputs": non_contributing_inputs,
+ "non_reachable_outputs": non_reachable_outputs,
+ }
+
+ return pruned_graph, out_data
+
+ def elementwise_error(self, predicted, expected):
+ return (1 - predicted.multiply(np.sign(expected))).multiply(abs(expected))
+
+ def transform_graph(self, graph: BaseGraph, data: List[GraphData]) -> BaseGraph:
+ g = graph.copy()
+ inputs = set()
+ outputs = set()
+ # Get all inputs and outputs for all samples
+ for sample_data in data:
+ inputs.update(sample_data.attributes.get("inputs", set()))
+ outputs.update(sample_data.attributes.get("outputs", set()))
+
+ for v in inputs:
+ g.add_edge(v, ())
+ for v in outputs:
+ g.add_edge((), v)
+
+ return g
+
+ def create_flow_based_problem(
+ self, flow_var, graph: BaseGraph, data: List[GraphData]
+ ):
+ # Get incidence matrices and interactions for the graph
+ P = self.backend.Problem()
+ At, Ah = get_incidence_matrices_of_edges(self.graph)
+ interaction = get_interactions(self.graph)
+
+ # Create binary variables for edge activations and inhibitions
+ Eact = self.backend.Variable(
+ "edge_activates",
+ (self.graph.num_edges, len(self.data)),
+ vartype=cn.VarType.BINARY,
+ )
+ Einh = self.backend.Variable(
+ "edge_inhibits",
+ (self.graph.num_edges, len(self.data)),
+ vartype=cn.VarType.BINARY,
+ )
+
+ # Ensure edges cannot activate and inhibit at the same time
+ P += Eact + Einh <= 1
+
+ # Calculate vertex values based on incoming activations and inhibitions
+ Va = At @ Eact
+ Vi = At @ Einh
+ V = Va - Vi
+
+ if self.exclusive_vertex_values:
+ # Ensure vertices are either active or inactive through different paths
+ P += Va + Vi <= 1
+
+ # Register variables for use in constraints and objectives
+ P.register("vertex_value", V)
+ P.register("vertex_inhibited", Vi)
+ P.register("vertex_activated", Va)
+ P.register("edge_value", Eact - Einh)
+ P.register("edge_has_signal", Eact + Einh)
+
+ # Add acyclic constraints to ensure signal does not propagate in cycles
+ P = self.backend.Acyclic(
+ self.graph, P, indicator_positive_var_name="edge_has_signal"
+ )
+
+ # Identify edges with outgoing connections (heads)
+ edges_with_head = np.flatnonzero(np.sum(np.abs(Ah), axis=0) > 0)
+
+ # Extend flows across all experiments
+ F = flow_var.reshape((Eact.shape[0], 1)) @ np.ones((1, len(self.data)))
+
+ # Ensure signal propagates only where flow exists
+ P += Eact + Einh <= F
+
+ # Sparsify the interaction matrix for computational efficiency
+ Int = sparsify(
+ np.reshape(interaction, (interaction.shape[0], 1))
+ @ np.ones((1, len(self.data)))
+ )
+
+ # Add constraints on activations and inhibitions based on upstream signals
+ sum_upstream_act = (Ah.T @ Va)[edges_with_head, :].multiply(
+ Int[edges_with_head, :] > 0
+ )
+ sum_upstream_inh = (Ah.T @ Vi)[edges_with_head, :].multiply(
+ Int[edges_with_head, :] < 0
+ )
+ P += Eact[edges_with_head, :] <= sum_upstream_act + sum_upstream_inh
+
+ sum_upstream_act = (Ah.T @ Va)[edges_with_head, :].multiply(
+ Int[edges_with_head, :] < 0
+ )
+ sum_upstream_inh = (Ah.T @ Vi)[edges_with_head, :].multiply(
+ Int[edges_with_head, :] > 0
+ )
+ P += Einh[edges_with_head, :] <= sum_upstream_act + sum_upstream_inh
+
+ all_inputs = set()
+ for sample_data in data:
+ all_inputs.update(sample_data.attributes.get("inputs", set()))
+
+ for i, d in enumerate(data):
+ input_vertices = d.attributes.get("inputs", set())
+ input_values = list(d.vertex_data.get(v, 0) for v in input_vertices)
+ vertex_indexes = [graph.V.index(key) for key in input_vertices]
+ for value in input_values:
+ if value not in [0, 1, -1]:
+ raise ValueError("Values for inputs must be 0, 1, or -1")
+
+ P += V[vertex_indexes, i] == input_values
+ # Make sure that in each condition, only the given perturbation can be active
+ # We need to take the incoming flow edges that are not part of the perturbation and block them
+ if len(data) > 1:
+ other_inputs = all_inputs - set(input_vertices)
+ other_input_edges = [
+ idx
+ for v in other_inputs
+ for (idx, _) in graph.in_edges(v)
+ if len(graph.get_edge(idx)[0]) == 0
+ ]
+ if len(other_input_edges) > 0:
+ P += Eact[other_input_edges, i] == 0
+ P += Einh[other_input_edges, i] == 0
+ return P
diff --git a/corneto/utils/_attr.py b/corneto/utils/_attr.py
index 35b88818..c73e047c 100644
--- a/corneto/utils/_attr.py
+++ b/corneto/utils/_attr.py
@@ -3,6 +3,15 @@
class Attr(str, Enum):
+ """Enum class representing predefined attribute names used in the `Attributes` class.
+
+ Attributes:
+ VALUE: Represents the key for a value attribute.
+ EDGE_TYPE: Represents the key for an edge type attribute.
+ SOURCE_ATTR: Represents the key for a source attribute.
+ TARGET_ATTR: Represents the key for a target attribute.
+ CUSTOM_ATTR: Represents the key for a custom attribute.
+ """
VALUE = "__value"
EDGE_TYPE = "__edge_type"
SOURCE_ATTR = "__source_attr"
@@ -11,10 +20,27 @@ class Attr(str, Enum):
class Attributes(dict):
+ """A dictionary-based class to manage attributes.
+
+ Uses reserved attributes used by CORNETO Graphs.
+ """
+
__slots__ = ()
__protected_attrs = set(dir(dict))
def __setattr__(self, __name: str, __value: Any) -> None:
+ """Set an attribute as a dictionary key-value pair.
+
+ Raises an error if the attribute name is a protected dictionary attribute.
+
+ Args:
+ __name (str): The name of the attribute to set.
+ __value (Any): The value to assign to the attribute. If the value is an instance
+ of `Attr`, its value is used.
+
+ Raises:
+ AttributeError: If trying to set a protected attribute.
+ """
if __name in self.__protected_attrs:
raise AttributeError(f"'{__name}' is a protected attribute")
else:
@@ -22,16 +48,44 @@ def __setattr__(self, __name: str, __value: Any) -> None:
__value = __value.value
self.__setitem__(__name, __value)
- def __getattr__(self, __name: str):
+ def __getattr__(self, __name: str) -> Any:
+ """Retrieve the value of an attribute if it exists in the dictionary.
+
+ Args:
+ __name (str): The name of the attribute to retrieve.
+
+ Returns:
+ Any: The value of the requested attribute.
+
+ Raises:
+ AttributeError: If the attribute does not exist.
+ """
if __name in self:
return self.__getitem__(__name)
raise AttributeError(f"{__name} does not exist")
def set_attr(self, key: Attr, value: Any) -> None:
+ """Set an attribute in the dictionary using an `Attr` key.
+
+ Args:
+ key (Attr): The key for the attribute, represented as an `Attr` enum.
+ value (Any): The value to assign to the key. If the value is an enum,
+ its value is used.
+ """
v = value if not isinstance(value, Enum) else value.value
self.__setitem__(key.value, v)
def has_attr(self, key: Attr, value: Optional[Any] = None) -> bool:
+ """Check if a given attribute exists in the dictionary, optionally with a specific value.
+
+ Args:
+ key (Attr): The key for the attribute, represented as an `Attr` enum.
+ value (Optional[Any]): The optional value to check for.
+
+ Returns:
+ bool: `True` if the attribute exists and matches the value (if provided),
+ otherwise `False`.
+ """
if value is None:
return key.value in self
else:
@@ -39,6 +93,15 @@ def has_attr(self, key: Attr, value: Optional[Any] = None) -> bool:
return key.value in self and self[key.value] == v
def get_attr(self, key: Attr, default: Any = None) -> Any:
+ """Retrieve the value of an attribute, or return a default value if not found.
+
+ Args:
+ key (Attr): The key for the attribute, represented as an `Attr` enum.
+ default (Any): The default value to return if the attribute does not exist.
+
+ Returns:
+ Any: The value of the attribute, or the default value if not found.
+ """
if default is not None:
return self.get(key.value, default)
return self[key.value]
diff --git a/docs/guide/intro/my_graph.pkl.xz b/docs/guide/intro/my_graph.pkl.xz
new file mode 100644
index 00000000..d8145fcb
Binary files /dev/null and b/docs/guide/intro/my_graph.pkl.xz differ
diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md
index 2e6e95c9..708d61f8 100644
--- a/docs/tutorials/index.md
+++ b/docs/tutorials/index.md
@@ -1,7 +1,8 @@
# Tutorials
```{toctree}
-:maxdepth: 3
+:maxdepth: 1
context-specific-metabolic-omics.ipynb
+single-sample-carnival-transcriptomics.ipynb
```
diff --git a/docs/tutorials/single-sample-carnival-transcriptomics.ipynb b/docs/tutorials/single-sample-carnival-transcriptomics.ipynb
new file mode 100644
index 00000000..4bbafc67
--- /dev/null
+++ b/docs/tutorials/single-sample-carnival-transcriptomics.ipynb
@@ -0,0 +1,10732 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "943eec30-eca9-499a-9262-e215ca349f64",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Single sample intracellular signalling network inference\n",
+ "\n",
+ "In this notebook we showcase how to use the advanced CARNIVAL implementation available in CORNETO. This implementation extends the capabilities of the original CARNIVAL method by enabling advanced modelling and injection of knowledge for hypothesis generation. We will use a dataset consisting of 6 samples of hepatic stellate cells (HSC) where three of them were activated by the cytokine Transforming growth factor (TGF-β). \n",
+ "\n",
+ "In the first part, we will show how to estimate Transcription Factor activities from gene expression data, following the [Decoupler tutorial](https://decoupler-py.readthedocs.io/en/latest/notebooks/bulk.html) for functional analysis. Then, we will use the CARNIVAL method available in CORNETO to infer a network from TFs to receptors, assuming that we don't really know which treatment was used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "95502198-c8a0-4d71-a5e9-709bad72ec00",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# --- Saezlab tools --- \n",
+ "# https://decoupler-py.readthedocs.io/\n",
+ "import decoupler as dc\n",
+ "# https://omnipathdb.org/\n",
+ "import omnipath as op\n",
+ "# https://saezlab.github.io/\n",
+ "import corneto as cn\n",
+ "\n",
+ "\n",
+ "# --- Additional libs --- \n",
+ "\n",
+ "# Pydeseq for differential expression analysis\n",
+ "from pydeseq2.dds import DeseqDataSet, DefaultInference\n",
+ "from pydeseq2.ds import DeseqStats\n",
+ "\n",
+ "# Additional packages\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import urllib.request\n",
+ "import gzip\n",
+ "import shutil\n",
+ "import tempfile\n",
+ "import os"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "5bb37ac8-1631-4cae-a462-c23ff2ae8171",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "max_time = 300\n",
+ "seed = 0"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "04892cd1-a822-4cfb-ba15-29c647928f92",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " GeneName \n",
+ " DDX11L1 \n",
+ " WASH7P \n",
+ " MIR6859-1 \n",
+ " MIR1302-11 \n",
+ " MIR1302-9 \n",
+ " FAM138A \n",
+ " OR4G4P \n",
+ " OR4G11P \n",
+ " OR4F5 \n",
+ " RP11-34P13.7 \n",
+ " ... \n",
+ " MT-ND4 \n",
+ " MT-TH \n",
+ " MT-TS2 \n",
+ " MT-TL2 \n",
+ " MT-ND5 \n",
+ " MT-ND6 \n",
+ " MT-TE \n",
+ " MT-CYB \n",
+ " MT-TT \n",
+ " MT-TP \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 25_HSCs-Ctrl1 \n",
+ " 0 \n",
+ " 9 \n",
+ " 10 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 33 \n",
+ " ... \n",
+ " 93192 \n",
+ " 342 \n",
+ " 476 \n",
+ " 493 \n",
+ " 54466 \n",
+ " 17184 \n",
+ " 1302 \n",
+ " 54099 \n",
+ " 258 \n",
+ " 475 \n",
+ " \n",
+ " \n",
+ " 26_HSCs-Ctrl2 \n",
+ " 0 \n",
+ " 12 \n",
+ " 14 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 66 \n",
+ " ... \n",
+ " 114914 \n",
+ " 355 \n",
+ " 388 \n",
+ " 436 \n",
+ " 64698 \n",
+ " 21106 \n",
+ " 1492 \n",
+ " 62679 \n",
+ " 253 \n",
+ " 396 \n",
+ " \n",
+ " \n",
+ " 27_HSCs-Ctrl3 \n",
+ " 0 \n",
+ " 14 \n",
+ " 10 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 52 \n",
+ " ... \n",
+ " 155365 \n",
+ " 377 \n",
+ " 438 \n",
+ " 480 \n",
+ " 85650 \n",
+ " 31860 \n",
+ " 2033 \n",
+ " 89559 \n",
+ " 282 \n",
+ " 448 \n",
+ " \n",
+ " \n",
+ " 31_HSCs-TGFb1 \n",
+ " 0 \n",
+ " 11 \n",
+ " 16 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 54 \n",
+ " ... \n",
+ " 110866 \n",
+ " 373 \n",
+ " 441 \n",
+ " 481 \n",
+ " 60325 \n",
+ " 19496 \n",
+ " 1447 \n",
+ " 66283 \n",
+ " 172 \n",
+ " 341 \n",
+ " \n",
+ " \n",
+ " 32_HSCs-TGFb2 \n",
+ " 0 \n",
+ " 5 \n",
+ " 8 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 44 \n",
+ " ... \n",
+ " 45488 \n",
+ " 239 \n",
+ " 331 \n",
+ " 343 \n",
+ " 27442 \n",
+ " 9054 \n",
+ " 624 \n",
+ " 27535 \n",
+ " 96 \n",
+ " 216 \n",
+ " \n",
+ " \n",
+ " 33_HSCs-TGFb3 \n",
+ " 0 \n",
+ " 12 \n",
+ " 5 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 32 \n",
+ " ... \n",
+ " 70704 \n",
+ " 344 \n",
+ " 453 \n",
+ " 497 \n",
+ " 45443 \n",
+ " 13796 \n",
+ " 1077 \n",
+ " 43415 \n",
+ " 192 \n",
+ " 243 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
6 rows × 64253 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ "GeneName DDX11L1 WASH7P MIR6859-1 MIR1302-11 MIR1302-9 FAM138A \\\n",
+ "25_HSCs-Ctrl1 0 9 10 1 0 0 \n",
+ "26_HSCs-Ctrl2 0 12 14 0 0 0 \n",
+ "27_HSCs-Ctrl3 0 14 10 0 0 0 \n",
+ "31_HSCs-TGFb1 0 11 16 0 0 0 \n",
+ "32_HSCs-TGFb2 0 5 8 0 0 0 \n",
+ "33_HSCs-TGFb3 0 12 5 0 0 0 \n",
+ "\n",
+ "GeneName OR4G4P OR4G11P OR4F5 RP11-34P13.7 ... MT-ND4 MT-TH \\\n",
+ "25_HSCs-Ctrl1 0 0 0 33 ... 93192 342 \n",
+ "26_HSCs-Ctrl2 0 0 0 66 ... 114914 355 \n",
+ "27_HSCs-Ctrl3 0 0 0 52 ... 155365 377 \n",
+ "31_HSCs-TGFb1 0 0 0 54 ... 110866 373 \n",
+ "32_HSCs-TGFb2 0 0 0 44 ... 45488 239 \n",
+ "33_HSCs-TGFb3 0 0 0 32 ... 70704 344 \n",
+ "\n",
+ "GeneName MT-TS2 MT-TL2 MT-ND5 MT-ND6 MT-TE MT-CYB MT-TT MT-TP \n",
+ "25_HSCs-Ctrl1 476 493 54466 17184 1302 54099 258 475 \n",
+ "26_HSCs-Ctrl2 388 436 64698 21106 1492 62679 253 396 \n",
+ "27_HSCs-Ctrl3 438 480 85650 31860 2033 89559 282 448 \n",
+ "31_HSCs-TGFb1 441 481 60325 19496 1447 66283 172 341 \n",
+ "32_HSCs-TGFb2 331 343 27442 9054 624 27535 96 216 \n",
+ "33_HSCs-TGFb3 453 497 45443 13796 1077 43415 192 243 \n",
+ "\n",
+ "[6 rows x 64253 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We need to download the dataset, available at GEO GSE151251\n",
+ "url = 'https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE151251&format=file&file=GSE151251%5FHSCs%5FCtrl%2Evs%2EHSCs%5FTGFb%2Ecounts%2Etsv%2Egz'\n",
+ "\n",
+ "adata = None \n",
+ "with tempfile.TemporaryDirectory() as tmpdirname:\n",
+ " # Path for the gzipped file in the temp folder\n",
+ " gz_file_path = os.path.join(tmpdirname, 'counts.txt.gz')\n",
+ " \n",
+ " # Download the file\n",
+ " with urllib.request.urlopen(url) as response:\n",
+ " with open(gz_file_path, 'wb') as out_file:\n",
+ " shutil.copyfileobj(response, out_file)\n",
+ " \n",
+ " # Decompress the file\n",
+ " decompressed_file_path = gz_file_path[:-3] # Removing '.gz' extension\n",
+ " with gzip.open(gz_file_path, 'rb') as f_in:\n",
+ " with open(decompressed_file_path, 'wb') as f_out:\n",
+ " shutil.copyfileobj(f_in, f_out)\n",
+ "\n",
+ " adata = pd.read_csv(decompressed_file_path, index_col=2, sep='\\t').iloc[:, 5:].T\n",
+ "\n",
+ "adata"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed7df83c-ccf2-43ab-95d7-be55d36669be",
+ "metadata": {},
+ "source": [
+ "## Data preprocessing\n",
+ "\n",
+ "We will use AnnData and PyDeseq2 to pre-process the data and compute differential expression between control and tretament"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "0c49ddc4-55d7-49f3-bd40-487c7535fbda",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\pablo\\miniconda3\\envs\\corneto-dev-mini\\Lib\\site-packages\\anndata\\_core\\anndata.py:1756: UserWarning: Variable names are not unique. To make them unique, call `.var_names_make_unique`.\n",
+ " utils.warn_names_duplicates(\"var\")\n",
+ "C:\\Users\\pablo\\miniconda3\\envs\\corneto-dev-mini\\Lib\\site-packages\\anndata\\utils.py:261: UserWarning: Suffix used (-[0-9]+) to deduplicate index values may make index values difficult to interpret. There values with a similar suffixes in the index. Consider using a different delimiter by passing `join={delimiter}`Example key collisions generated by the make_index_unique algorithm: ['SNORD116-1', 'SNORD116-2', 'SNORD116-3', 'SNORD116-4', 'SNORD116-5']\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "AnnData object with n_obs × n_vars = 6 × 64253"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from anndata import AnnData\n",
+ "\n",
+ "adata = AnnData(adata, dtype=np.float32)\n",
+ "adata.var_names_make_unique()\n",
+ "adata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "34ee8218-6f15-4b09-a44d-150970c83c45",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " condition \n",
+ " sample_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 25_HSCs-Ctrl1 \n",
+ " control \n",
+ " 25 \n",
+ " \n",
+ " \n",
+ " 26_HSCs-Ctrl2 \n",
+ " control \n",
+ " 26 \n",
+ " \n",
+ " \n",
+ " 27_HSCs-Ctrl3 \n",
+ " control \n",
+ " 27 \n",
+ " \n",
+ " \n",
+ " 31_HSCs-TGFb1 \n",
+ " treatment \n",
+ " 31 \n",
+ " \n",
+ " \n",
+ " 32_HSCs-TGFb2 \n",
+ " treatment \n",
+ " 32 \n",
+ " \n",
+ " \n",
+ " 33_HSCs-TGFb3 \n",
+ " treatment \n",
+ " 33 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " condition sample_id\n",
+ "25_HSCs-Ctrl1 control 25\n",
+ "26_HSCs-Ctrl2 control 26\n",
+ "27_HSCs-Ctrl3 control 27\n",
+ "31_HSCs-TGFb1 treatment 31\n",
+ "32_HSCs-TGFb2 treatment 32\n",
+ "33_HSCs-TGFb3 treatment 33"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Process treatment information\n",
+ "adata.obs['condition'] = ['control' if '-Ctrl' in sample_id else 'treatment' for sample_id in adata.obs.index]\n",
+ "\n",
+ "# Process sample information\n",
+ "adata.obs['sample_id'] = [sample_id.split('_')[0] for sample_id in adata.obs.index]\n",
+ "\n",
+ "# Visualize metadata\n",
+ "adata.obs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "92c0ad7c-acb6-49b8-b537-0f772a631b9a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "AnnData object with n_obs × n_vars = 6 × 19713\n",
+ " obs: 'condition', 'sample_id'"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Obtain genes that pass the thresholds\n",
+ "genes = dc.filter_by_expr(adata, group='condition', min_count=10, min_total_count=15, large_n=1, min_prop=1)\n",
+ "\n",
+ "# Filter by these genes\n",
+ "adata = adata[:, genes].copy()\n",
+ "adata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "290781e0-acef-440f-a0a6-1ff123d41a8e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Estimation of differential expression\n",
+ "\n",
+ "inference = DefaultInference()\n",
+ "dds = DeseqDataSet(\n",
+ " adata=adata,\n",
+ " design_factors='condition',\n",
+ " refit_cooks=True,\n",
+ " inference=inference,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "96b44f6e-9b7e-4252-a0ec-8b8134361865",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Fitting size factors...\n",
+ "... done in 0.01 seconds.\n",
+ "\n",
+ "Fitting dispersions...\n",
+ "... done in 11.68 seconds.\n",
+ "\n",
+ "Fitting dispersion trend curve...\n",
+ "... done in 1.20 seconds.\n",
+ "\n",
+ "Fitting MAP dispersions...\n",
+ "... done in 10.25 seconds.\n",
+ "\n",
+ "Fitting LFCs...\n",
+ "... done in 5.81 seconds.\n",
+ "\n",
+ "Calculating cook's distance...\n",
+ "... done in 0.03 seconds.\n",
+ "\n",
+ "Replacing 0 outlier genes.\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Compute LFCs\n",
+ "dds.deseq2()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "ec048254-a549-4b29-8da5-f66a0882621b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Running Wald tests...\n",
+ "... done in 2.97 seconds.\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Log2 fold change & Wald test p-value: condition treatment vs control\n",
+ " baseMean log2FoldChange lfcSE stat pvalue \\\n",
+ "GeneName \n",
+ "WASH7P 10.349784 -0.011129 0.651922 -0.017071 0.986380 \n",
+ "MIR6859-1 10.114621 0.000625 0.657581 0.000950 0.999242 \n",
+ "RP11-34P13.7 45.731312 0.078209 0.324512 0.241005 0.809551 \n",
+ "RP11-34P13.8 29.498379 -0.065178 0.393711 -0.165549 0.868512 \n",
+ "CICP27 106.032659 0.150594 0.223024 0.675239 0.499524 \n",
+ "... ... ... ... ... ... \n",
+ "MT-ND6 17914.984474 -0.435304 0.278796 -1.561372 0.118436 \n",
+ "MT-TE 1281.293477 -0.332495 0.288073 -1.154204 0.248416 \n",
+ "MT-CYB 54955.449372 -0.313285 0.286900 -1.091966 0.274848 \n",
+ "MT-TT 204.692221 -0.485882 0.220606 -2.202488 0.027631 \n",
+ "MT-TP 345.049755 -0.460675 0.161701 -2.848936 0.004387 \n",
+ "\n",
+ " padj \n",
+ "GeneName \n",
+ "WASH7P 0.991409 \n",
+ "MIR6859-1 0.999520 \n",
+ "RP11-34P13.7 0.877381 \n",
+ "RP11-34P13.8 0.917121 \n",
+ "CICP27 0.637374 \n",
+ "... ... \n",
+ "MT-ND6 0.211001 \n",
+ "MT-TE 0.380057 \n",
+ "MT-CYB 0.411271 \n",
+ "MT-TT 0.061644 \n",
+ "MT-TP 0.012217 \n",
+ "\n",
+ "[19713 rows x 6 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "stat_res = DeseqStats(\n",
+ " dds,\n",
+ " contrast=[\"condition\", 'treatment', 'control'],\n",
+ " inference=inference\n",
+ ")\n",
+ "\n",
+ "stat_res.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "0f868f1b-faf1-47a0-b14f-1fae209a5697",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " baseMean \n",
+ " log2FoldChange \n",
+ " lfcSE \n",
+ " stat \n",
+ " pvalue \n",
+ " padj \n",
+ " \n",
+ " \n",
+ " GeneName \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " WASH7P \n",
+ " 10.349784 \n",
+ " -0.011129 \n",
+ " 0.651922 \n",
+ " -0.017071 \n",
+ " 0.986380 \n",
+ " 0.991409 \n",
+ " \n",
+ " \n",
+ " MIR6859-1 \n",
+ " 10.114621 \n",
+ " 0.000625 \n",
+ " 0.657581 \n",
+ " 0.000950 \n",
+ " 0.999242 \n",
+ " 0.999520 \n",
+ " \n",
+ " \n",
+ " RP11-34P13.7 \n",
+ " 45.731312 \n",
+ " 0.078209 \n",
+ " 0.324512 \n",
+ " 0.241005 \n",
+ " 0.809551 \n",
+ " 0.877381 \n",
+ " \n",
+ " \n",
+ " RP11-34P13.8 \n",
+ " 29.498379 \n",
+ " -0.065178 \n",
+ " 0.393711 \n",
+ " -0.165549 \n",
+ " 0.868512 \n",
+ " 0.917121 \n",
+ " \n",
+ " \n",
+ " CICP27 \n",
+ " 106.032659 \n",
+ " 0.150594 \n",
+ " 0.223024 \n",
+ " 0.675239 \n",
+ " 0.499524 \n",
+ " 0.637374 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " MT-ND6 \n",
+ " 17914.984474 \n",
+ " -0.435304 \n",
+ " 0.278796 \n",
+ " -1.561372 \n",
+ " 0.118436 \n",
+ " 0.211001 \n",
+ " \n",
+ " \n",
+ " MT-TE \n",
+ " 1281.293477 \n",
+ " -0.332495 \n",
+ " 0.288073 \n",
+ " -1.154204 \n",
+ " 0.248416 \n",
+ " 0.380057 \n",
+ " \n",
+ " \n",
+ " MT-CYB \n",
+ " 54955.449372 \n",
+ " -0.313285 \n",
+ " 0.286900 \n",
+ " -1.091966 \n",
+ " 0.274848 \n",
+ " 0.411271 \n",
+ " \n",
+ " \n",
+ " MT-TT \n",
+ " 204.692221 \n",
+ " -0.485882 \n",
+ " 0.220606 \n",
+ " -2.202488 \n",
+ " 0.027631 \n",
+ " 0.061644 \n",
+ " \n",
+ " \n",
+ " MT-TP \n",
+ " 345.049755 \n",
+ " -0.460675 \n",
+ " 0.161701 \n",
+ " -2.848936 \n",
+ " 0.004387 \n",
+ " 0.012217 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
19713 rows × 6 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " baseMean log2FoldChange lfcSE stat pvalue \\\n",
+ "GeneName \n",
+ "WASH7P 10.349784 -0.011129 0.651922 -0.017071 0.986380 \n",
+ "MIR6859-1 10.114621 0.000625 0.657581 0.000950 0.999242 \n",
+ "RP11-34P13.7 45.731312 0.078209 0.324512 0.241005 0.809551 \n",
+ "RP11-34P13.8 29.498379 -0.065178 0.393711 -0.165549 0.868512 \n",
+ "CICP27 106.032659 0.150594 0.223024 0.675239 0.499524 \n",
+ "... ... ... ... ... ... \n",
+ "MT-ND6 17914.984474 -0.435304 0.278796 -1.561372 0.118436 \n",
+ "MT-TE 1281.293477 -0.332495 0.288073 -1.154204 0.248416 \n",
+ "MT-CYB 54955.449372 -0.313285 0.286900 -1.091966 0.274848 \n",
+ "MT-TT 204.692221 -0.485882 0.220606 -2.202488 0.027631 \n",
+ "MT-TP 345.049755 -0.460675 0.161701 -2.848936 0.004387 \n",
+ "\n",
+ " padj \n",
+ "GeneName \n",
+ "WASH7P 0.991409 \n",
+ "MIR6859-1 0.999520 \n",
+ "RP11-34P13.7 0.877381 \n",
+ "RP11-34P13.8 0.917121 \n",
+ "CICP27 0.637374 \n",
+ "... ... \n",
+ "MT-ND6 0.211001 \n",
+ "MT-TE 0.380057 \n",
+ "MT-CYB 0.411271 \n",
+ "MT-TT 0.061644 \n",
+ "MT-TP 0.012217 \n",
+ "\n",
+ "[19713 rows x 6 columns]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results_df = stat_res.results_df\n",
+ "results_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f3f0ed74-4941-482f-a453-1fcb396ab2e9",
+ "metadata": {},
+ "source": [
+ "## Prior knowledge with Decoupler and Omnipath"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "5fe1c1bc-69a2-4514-8c58-f19688ceaee4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " source \n",
+ " target \n",
+ " weight \n",
+ " PMID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " MYC \n",
+ " TERT \n",
+ " 1 \n",
+ " 10022128;10491298;10606235;10637317;10723141;1... \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " SPI1 \n",
+ " BGLAP \n",
+ " 1 \n",
+ " 10022617 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " SMAD3 \n",
+ " JUN \n",
+ " 1 \n",
+ " 10022869;12374795 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " SMAD4 \n",
+ " JUN \n",
+ " 1 \n",
+ " 10022869;12374795 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " STAT5A \n",
+ " IL2 \n",
+ " 1 \n",
+ " 10022878;11435608;17182565;17911616;22854263;2... \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 43173 \n",
+ " NFKB \n",
+ " hsa-miR-143-3p \n",
+ " 1 \n",
+ " 19472311 \n",
+ " \n",
+ " \n",
+ " 43174 \n",
+ " AP1 \n",
+ " hsa-miR-206 \n",
+ " 1 \n",
+ " 19721712 \n",
+ " \n",
+ " \n",
+ " 43175 \n",
+ " NFKB \n",
+ " hsa-miR-21-5p \n",
+ " 1 \n",
+ " 20813833;22387281 \n",
+ " \n",
+ " \n",
+ " 43176 \n",
+ " NFKB \n",
+ " hsa-miR-224-5p \n",
+ " 1 \n",
+ " 23474441;23988648 \n",
+ " \n",
+ " \n",
+ " 43177 \n",
+ " AP1 \n",
+ " hsa-miR-144 \n",
+ " 1 \n",
+ " 23546882 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
43178 rows × 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source target weight \\\n",
+ "0 MYC TERT 1 \n",
+ "1 SPI1 BGLAP 1 \n",
+ "2 SMAD3 JUN 1 \n",
+ "3 SMAD4 JUN 1 \n",
+ "4 STAT5A IL2 1 \n",
+ "... ... ... ... \n",
+ "43173 NFKB hsa-miR-143-3p 1 \n",
+ "43174 AP1 hsa-miR-206 1 \n",
+ "43175 NFKB hsa-miR-21-5p 1 \n",
+ "43176 NFKB hsa-miR-224-5p 1 \n",
+ "43177 AP1 hsa-miR-144 1 \n",
+ "\n",
+ " PMID \n",
+ "0 10022128;10491298;10606235;10637317;10723141;1... \n",
+ "1 10022617 \n",
+ "2 10022869;12374795 \n",
+ "3 10022869;12374795 \n",
+ "4 10022878;11435608;17182565;17911616;22854263;2... \n",
+ "... ... \n",
+ "43173 19472311 \n",
+ "43174 19721712 \n",
+ "43175 20813833;22387281 \n",
+ "43176 23474441;23988648 \n",
+ "43177 23546882 \n",
+ "\n",
+ "[43178 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Retrieve CollecTRI gene regulatory network (through Omnipath)\n",
+ "collectri = dc.get_collectri(organism='human', split_complexes=False)\n",
+ "collectri"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "c749a42b-ecd9-4f33-acd4-242cb8237d8d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " GeneName \n",
+ " WASH7P \n",
+ " MIR6859-1 \n",
+ " RP11-34P13.7 \n",
+ " RP11-34P13.8 \n",
+ " CICP27 \n",
+ " FO538757.2 \n",
+ " AP006222.2 \n",
+ " RP4-669L17.10 \n",
+ " MTND1P23 \n",
+ " MTND2P28 \n",
+ " ... \n",
+ " MT-ND4 \n",
+ " MT-TH \n",
+ " MT-TS2 \n",
+ " MT-TL2 \n",
+ " MT-ND5 \n",
+ " MT-ND6 \n",
+ " MT-TE \n",
+ " MT-CYB \n",
+ " MT-TT \n",
+ " MT-TP \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " treatment.vs.control \n",
+ " -0.017071 \n",
+ " 0.00095 \n",
+ " 0.241005 \n",
+ " -0.165549 \n",
+ " 0.675239 \n",
+ " -1.645412 \n",
+ " 2.041302 \n",
+ " -0.376843 \n",
+ " -1.994386 \n",
+ " -0.498507 \n",
+ " ... \n",
+ " -1.435973 \n",
+ " 0.754913 \n",
+ " 1.139002 \n",
+ " 1.167032 \n",
+ " -1.242582 \n",
+ " -1.561372 \n",
+ " -1.154204 \n",
+ " -1.091966 \n",
+ " -2.202488 \n",
+ " -2.848936 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1 rows × 19713 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ "GeneName WASH7P MIR6859-1 RP11-34P13.7 RP11-34P13.8 \\\n",
+ "treatment.vs.control -0.017071 0.00095 0.241005 -0.165549 \n",
+ "\n",
+ "GeneName CICP27 FO538757.2 AP006222.2 RP4-669L17.10 \\\n",
+ "treatment.vs.control 0.675239 -1.645412 2.041302 -0.376843 \n",
+ "\n",
+ "GeneName MTND1P23 MTND2P28 ... MT-ND4 MT-TH MT-TS2 \\\n",
+ "treatment.vs.control -1.994386 -0.498507 ... -1.435973 0.754913 1.139002 \n",
+ "\n",
+ "GeneName MT-TL2 MT-ND5 MT-ND6 MT-TE MT-CYB \\\n",
+ "treatment.vs.control 1.167032 -1.242582 -1.561372 -1.154204 -1.091966 \n",
+ "\n",
+ "GeneName MT-TT MT-TP \n",
+ "treatment.vs.control -2.202488 -2.848936 \n",
+ "\n",
+ "[1 rows x 19713 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mat = results_df[['stat']].T.rename(index={'stat': 'treatment.vs.control'})\n",
+ "mat"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "ad5a1f0e-e15d-49b8-bb47-47819e02fd99",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running ulm on mat with 1 samples and 19713 targets for 655 sources.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " ABL1 \n",
+ " AHR \n",
+ " AIRE \n",
+ " AP1 \n",
+ " APEX1 \n",
+ " AR \n",
+ " ARID1A \n",
+ " ARID3A \n",
+ " ARID3B \n",
+ " ARID4A \n",
+ " ... \n",
+ " ZNF362 \n",
+ " ZNF382 \n",
+ " ZNF384 \n",
+ " ZNF395 \n",
+ " ZNF436 \n",
+ " ZNF699 \n",
+ " ZNF76 \n",
+ " ZNF804A \n",
+ " ZNF91 \n",
+ " ZXDC \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " treatment.vs.control \n",
+ " -2.181499 \n",
+ " -1.556123 \n",
+ " -1.824668 \n",
+ " -1.983679 \n",
+ " -2.673171 \n",
+ " 0.235021 \n",
+ " -3.93546 \n",
+ " 0.870591 \n",
+ " 1.649556 \n",
+ " -0.612672 \n",
+ " ... \n",
+ " -0.063138 \n",
+ " 2.123082 \n",
+ " 1.887668 \n",
+ " -1.141122 \n",
+ " 1.571889 \n",
+ " 1.277879 \n",
+ " -0.116911 \n",
+ " 1.92635 \n",
+ " 0.91651 \n",
+ " -2.744753 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1 rows × 655 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ABL1 AHR AIRE AP1 APEX1 \\\n",
+ "treatment.vs.control -2.181499 -1.556123 -1.824668 -1.983679 -2.673171 \n",
+ "\n",
+ " AR ARID1A ARID3A ARID3B ARID4A ... \\\n",
+ "treatment.vs.control 0.235021 -3.93546 0.870591 1.649556 -0.612672 ... \n",
+ "\n",
+ " ZNF362 ZNF382 ZNF384 ZNF395 ZNF436 \\\n",
+ "treatment.vs.control -0.063138 2.123082 1.887668 -1.141122 1.571889 \n",
+ "\n",
+ " ZNF699 ZNF76 ZNF804A ZNF91 ZXDC \n",
+ "treatment.vs.control 1.277879 -0.116911 1.92635 0.91651 -2.744753 \n",
+ "\n",
+ "[1 rows x 655 columns]"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tf_acts, tf_pvals = dc.run_ulm(mat=mat, net=collectri, verbose=True)\n",
+ "tf_acts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "657ee3c1-4ad9-42f5-b566-de15547f5084",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAAINCAYAAABoECdtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABuFklEQVR4nO3dd1hTZ/sH8G8AmWEJIihLQFFw4KgUbBVUVtE6qAUFC6KI1r0VLSgqiNoXV91hWEWxipbqW7eg1j1Q68JRJ1AVBUSQmd8f/HJeYgIEkpBA7s91nesy5zznyXMo3H3Oum8Wl8vlghBCSL0pyXoAhBDSVFEAJYSQBqIASgghDUQBlBBCGogCKCGENBAFUEIIaSAKoIQQ0kAUQAkhpIFUZD2ApqKyshJZWVnQ1tYGi8WS9XAIkQoul4sPHz6gTZs2UFISbX716dMnlJaWSmU8qqqqUFdXl0rfkkABVERZWVkwMzOT9TAIaRQvXryAqalpne0+ffqENhpsvEeFVMZhbGyMf/75R26DKAVQEWlrawOo+sXS0dGR8WgIkY6CggKYmZkxv+91KS0txXtUIEG5HTQlfEWwCJUIyvkHpaWlFECbOt5pu46OTq0B9KvB6Y01JFLNuT/6yXoIzUp9L1NptVCGJktZsmPgVkBKE1uJoQBKCBEbS4UFJQnfG2Bx5f9eA92FJ4SQBpK7ABoUFIShQ4cy/2axWGCxWFBRUYG5uTkmTpyI9+/f8+1jaWnJtOMt1S+Ab926FS4uLtDR0QGLxUJeXl4jHhEhzR+rhZJUFnkn9yP09PREdnY2nj59iu3bt+OPP/7Ajz/+KNAuMjIS2dnZzHLjxg1mW1FRETw9PREWFtaYQyeENHNyfw1UTU0NxsbGAABTU1P4+voiISFBoJ22tjbT7nPTp08HAKSlpUlplIQoNiVlFpSUJHvNUqlS/q+Byn0Are7Jkyc4cuQIWrRoIfXvKikpQUlJCfO5oKBA6t9JCGla5P4U/tChQ2Cz2dDQ0IC1tTXu3r2LefPmCbSbN28e2Gw2s6xbt06s742Ojoauri6z0EP0hNSM1YIllUXeyf0M1NXVFZs2bUJRURG2b9+OzMxMTJkyRaDdnDlzEBQUxHw2NDQU63sXLFiAmTNnMp95DxgTQgiP3AdQLS0t2NjYAADWrVsHV1dXLFmyBEuXLuVrZ2hoyLSTBDU1NaipqUmsP0KaMyUVxbwGKven8J+LiIjA6tWrkZWVJeuhEEL+n6Kewje5AOri4gJ7e3tERUWJvE9OTg4yMjLw6NEjAMDt27eRkZGBd+/eSWuYhBAF0OQCKADMnDkT27Ztw4sXL0Rqv3nzZnTv3h0hISEAgL59+6J79+5ITU2V5jAJURhKyqyq03hJLsryPwNlcblcrqwH0RQUFBRAV1cX+fn5lExEDlEyEckQ9ff88/aH23eGlrJkk4l8rKiA98O/RR6LLMj9TaSmhv6QiSJiKbPAkvCMkQX5n4E2yVN4QgiRBzQDJYSITUlZ8tcslWgGSgghzRfNQJuh2ZuKZD2ERrd6oqash6DQWEossCT8IH1TSKhMAZQQIjaWshJYypI9oWVB/h8QolN4QghpIIkFUF72+BUrVvCtP3jwIFOgKi0tjS9rvIGBAfr374+//vqLb587d+7Ax8eHyTS/Zs0aod/Hy1xfHe87hGWdf/ToEbS1taGnp9fQwySECMG7iSTpRd5JdAaqrq6OmJgYgZIbn3vw4AGys7ORlpaGVq1awdvbG69fv2a2FxUVwcrKCitWrKgxSXJ9lZWVYeTIkfj6668l0h8hhEg0gA4cOBDGxsaIjo6utZ2RkRGMjY3RpUsXLFq0CPn5+bh06RKz/YsvvsCqVavg5+cnsYxIixYtQseOHfH9999LpD9CyP+wWCzmRpLEFglX+ZQGiQZQZWVlREVFYf369Xj58mWd7YuKihAfHw8AUs0yf+rUKfz222/45ZdfRN6npKQEBQUFfAshhFQn8bvww4YNg4ODAyIiIsDhcIS24VXMLCoqApfLRc+ePTFgwIB6fxcvW311FRUVfJ9zc3MRFBSEnTt31ut92ujoaCxZsqTeYyJEEbGUIfFrliz5vwkvnbvwMTExSExMxN27d4VuP3v2LK5fv47du3fDwsICCQkJDZqBurq6IiMjg2/Zvn07X5uQkBCMGjUKffv2rVffCxYsQH5+PrOImvmJEKI4pPIcaN++feHh4YGwsDC+Mhs87dq1g56eHjp06IBPnz5h2LBh+Pvvv+t9vbN6tnqezy8dnDp1CqmpqVi9ejUAgMvlorKyEioqKti6dSuCg4OF9k0Z6QkRnVSSiTSBB+ml9hzoihUr8Mcff+D8+fO1ths9ejQqKyuxceNGqYzjwoULfDPUyMhIaGtrIyMjA8OGDZPKdxKiaFhKSlJZ5J3U3kTq0qUL/P39sX79+lrbKSkpYfr06Vi2bBlCQ0OhqamJ0tJS5vS/tLQUr169QkZGBthsdr3rHnXq1Inv89WrV6GkpITOnTvX74AIIeQzUg3xS5cuhSj5moODg1FWVoYNGzYAALKystC9e3d0794d2dnZWL16Nbp3745x48ZJc7iEkAaS+CNMUni3XhooI72I6pupW5YomQhpqIZmpE/v6wi2imRPaAvLy9HvzCW5/pujZCKEELFJJR9oE7iJRAG0GaLZGCGNgwIoIURsUskH2gSugcr/cwKEECKnaAZKCBEbiyX55zZZLPmf31EAbcbmbS2W9RAaTcx4DVkPQaHRKTwhhDRxr169QkBAAAwMDKCpqQkHBwdcu3ZNat9HM1BCiNik8hhTZf36e//+Pfr06QNXV1f8+eefMDIywuPHj6VagaLRZqCilOD4vBzH5yVAeMuiRYsAVGW2d3V1RevWraGurg4rKyssWrQIZWVlAt9TXFwMfX19tGzZEsXFinNqS4iiiImJgZmZGeLj49G7d29YWlpiwIABsLa2ltp3NokZ6IMHD/jeRODlAG3RogV++OEH9OjRA3p6erh58yZCQkJQWVmJqKgovj7279+Pzp07g8vlIiUlBf7+/o16DIQ0Z9K8Bvp5MvOaMqWlpqbCw8MDI0aMQHp6Otq2bYsff/wRISEhEh1XdU0igBoZGQmdhltZWcHKyor5bGFhgbS0NJw9e1agLYfDQUBAALhcLjgcDgVQQpoIMzMzvs8RERFYvHixQLsnT55g06ZNmDlzJsLCwnD58mVMnToVampq+OGHH6QytiYRQEX16NEjHDlyBMOHD+db//jxY1y4cAEpKSngcrmYPn06njx5whd8P1dSUoKSkhLmM5X0IKRm0kg/x+vvxYsXfGegNeXpraysRK9evZizz+7du+POnTvYtGmT1AJoo96F55XgqL54eXnVuZ+pqSnfPrm5uXzbnZ2doa6ujvbt2+Prr79GZGQk3/a4uDh4eXkx10A9PT0RFxdX63dGR0dDV1eXWT7/vyAhpHHo6OjwLTUFUBMTE9jZ2fGt69SpE54/fy61sTVqABWlBIcwZ8+e5dtHX1+fb3tycjKuX7+OpKQkHD58mMk+D1TVSEpMTERAQACzLiAgAImJiQL1k6qjkh6EiE4e0tn16dMHDx484FuXmZkJCwsLSR4qn0Y9hRelBIcwvBIgNeHNDu3s7FBRUYHx48dj1qxZUFZWxtGjR/Hq1Sv4+vry7VNRUYFjx47VOAOmkh6EiE4eHqSfMWMGnJ2dERUVhe+//x6XL1/G1q1bsXXrVomOq7pm9yA9l8tFWVkZk8iZw+HAz89PYObr7+9fY9VQQkjT88UXX+DAgQPYvXs3OnfujKVLl2LNmjVSvWHcpG8i7dq1Cy1atECXLl2gpqaGa9euYcGCBfD19YWKigrevHmDP/74A6mpqQIlPAIDA+Ht7Y03b96gVatWMjoCQpoHeZiBAsCgQYMwaNAgiY6jNk06gKqoqCAmJgaZmZngcrmwsLDApEmTMGPGDADAjh07oKWlJbTmvKurK7S1tfHrr79i5syZjT10QkgzQCU9RNSUSnrwUDIRUl8NLelxfcRAsFu0kOhYCsvK0OO3E3L9N9ekZ6CkdhRUCJEuCqCEELGxlCSfTIRVQensCCGk2aIZKCFEbPJyF76xUQBt5sI4JXU3agaixtJLD7IkzXfh5Zn8j5AQQuQUzUAJIWJT1FN4ic5Ag4KCwGKxsGLFCr71Bw8eBItV9cP4PMu8gYEB+vfvj7/++qvGfvfs2QMWiyU0oz0AnD9/HsrKyvD09BTYlpubC09PT7Rp0wZqamowMzPD5MmTKT0dIURsEj+FV1dXR0xMDN6/f19ruwcPHiA7OxtpaWlo1aoVvL298fr1a4F2z549w+zZs/H111/X2FdcXBymTJmCc+fOCaSuUlJSwpAhQ5CamorMzEwkJCTgxIkTmDBhQsMOkBAiQB6yMcmCxAPowIEDYWxsjOjo6FrbGRkZwdjYGF26dMGiRYuQn5+PS5cu8bWpqKiAv78/lixZUmPy448fP2Lv3r2YOHEiBg0ahISEBL7t+vr6mDhxInr16gULCwsMGDAAP/74o9Cs9YQQUh8SD6DKysqIiorC+vXrRUpVV1RUhPj4eABVNY6qi4yMRKtWrTB27Nga909OToatrS1sbW0REBCA+Ph41PZ2alZWFlJSUtCvX79ax1VSUoKCggK+hRAiHO8uvKQXeSeVEQ4bNgwODg6IiIiosU31LPOxsbHo2bMnX9KPv/76CxwOB9u2bav1u3i1jgDA09MThYWFOHnypEC7kSNHQlNTE23btoWOjk6diZwpIz0hpC5SC/ExMTFITEzE3bt3hW4/e/Ysrl+/jt27d8PCwgIJCQnMDPTDhw8ICAjAtm3bYGhoWON3PHjwAJcvX4afnx+AquxMvr6+Qst1xMbG4vr16zh48CAeP35cZwYmykhPiOgU9Rqo1B5j6tu3Lzw8PBAWFoagoCCB7bws8x06dMCnT58wbNgw/P3331BTU8Pjx4/x9OlTDB48mGlfWVlZNWAVFTx48ADW1tbgcDgoLy9H27ZtmXZcLhctWrTA+/fv+Up/GBsbw9jYGB07doSBgQG+/vpr/PTTTzAxMRE6fspIT4jo6EF6KVixYgX++OMPnD9/vtZ2o0ePRmVlJTZu3AgA6NixI27fvs2XQf7bb79laiqZmZmhvLwcO3bswM8//8zX7ubNm7CwsMCuXbtq/D7eNdLqVTcJIaS+pPogfZcuXeDv74/169fX2k5JSQnTp0/HsmXLEBoaCk1NTYEM8ryaSLz1Bw8exPv37zF27Fjo6urytf3uu+/A4XAwefJk/Pe//8W///6LL774Amw2G3fv3sXcuXPRp08fWFpaSuxYCVFoLFbVIuk+5ZzU58hLly6t9a44T3BwMMrKyrBhwwaR+uVwOBg4cKBA8AQAHx8fZGRk4Pr169DQ0MC2bdvw1VdfoVOnTpg+fToGDRqEQ4cO1ftYCCGkOspIL6KmmJEeoGQipH4ampH+XugwaKtJNiP9h5IydNpyQK7/5uT/Ki0hhMgpSibSzNHMjDQGugtPCCGkXmgGSggRm6Kms6MAqkCW7CyT9RCkJiJAsjcwCBEFBVBCiNgU9RooBVBCiNhYSpI/5WbJf/ykm0iEENJQchlAX79+jdDQUJibm0NNTQ3Gxsbw8PDAhQsXAACWlpZMSRDea59btmxh9k9ISGBe/QSA7OxsjBo1Cra2tsxro4QQyVHUbExyGUB9fHxw8+ZNJCYmIjMzE6mpqXBxccG7d++YNpGRkcjOzsatW7cwdOhQTJgwAcnJyUL7KykpQatWrbBw4UJ069atsQ6DENLMyd010Ly8PJw7dw5paWlM1ngLCwv07t2br522tjaMjY0BAMuWLcPevXtx8OBB+Pr6CvRpaWmJtWvXAoDQXKGEEDEpKVUtku5TzsndCHlZ6g8ePFivdHPq6uooK5PcYzpU0oMQUhe5C6AqKipISEhAYmIi9PT00KdPH4SFheHWrVtC25eXlyMhIQG3b9/mKwkiLirpQYjoqpcql+Qi7+QugAJV10CzsrKQmpoKDw8PpKWloUePHnwVN+fNmwc2mw0NDQ1MmjQJc+bMQWhoqMTGQCU9CCF1kbtroDzq6upwc3ODm5sbwsPDMW7cOERERDDlQebMmYOgoCBoamrCxMRE4v+3opIehIhOUR+kl/8R/j87Ozt8/PiR+WxoaAgbGxu0adOmSUz1CWnOFPUxJrmbgebm5mLEiBEIDg5G165doa2tjatXr2LlypUYMmRIg/vNyMgAABQWFuLNmzfIyMiAqqoq7OzsJDRyQoiikbsAymaz4ejoiNjYWDx+/BhlZWUwMzNDSEgIwsLCGtxv9+7dmX9fu3YNSUlJsLCwwNOnTyUwakIUHEsKjzE1gXc55S6AqqmpITo6GtHR0TW2qSvoBQUFCZRSpsolhBBJk7sASqSHUr4RqZHGNcsmcA1U/ufIhBAip2gGSggRG4ulBJaEr1lKuj9pkP8REkKInKIZqIJprmU96PqujCmxJH/NsglcA6UASggRG72JRAghpF4kEkBFzSC/Z88egX3t7e3BYrH4EoXwREVFQVlZGStWrBDYlpCQwGRsUVZWhr6+PhwdHREZGYn8/Hy+ttUz2FdfJk2aJInDJ0ThKeqrnBIJoKJkkDczM0N8fDzffhcvXkROTg60tLSE9hsfH4+5c+fWmARZR0cH2dnZePnyJc6fP4/x48djx44dcHBwQFZWFtPuypUryM7OZpbjx48DAEaMGCHuoRNCFJjYAZSXQT4mJgaurq5M9vgFCxbA29ubaefv74/09HS+tHBxcXHw9/eHiorgpdj09HQUFxcjMjISHz9+xJkzZwTasFgsGBsbw8TEBJ06dcLYsWNx/vx5FBYWYu7cuUy7Vq1awdjYmFkOHToEa2trJuM9IURMLBavNKcEFwWYgYqaQb5169bw8PBAYmIiAKCoqAjJyckIDg4W2p7D4WDkyJFo0aIFRo4cCQ6HI9J4jIyM4O/vj9TUVFRUVAhsLy0txc6dOxEcHFxrFifKSE8IqYvYAbQ+GeSDg4ORkJAALpeLffv2wdraGg4ODgLtCgoKsH//fgQEBAAAAgICsG/fPpGDWMeOHfHhwwfk5uYKbDt48CDy8vIE3pX/HGWkJ0R0dA1UDKJkkAcAb29vFBYW4syZM4iLi6tx9pmUlAQrKyumgqaDgwOsrKyE3oQShpc4RNgMk8PhwMvLC23atKm1D8pIT0jTFR0dDRaLJfUS5hJ7jImXQT48PBznz59HUFAQIiIi+NqoqKhg9OjRiIiIwKVLl+Dv7y+0r7i4ONy5cwcqKirMcufOHZFP4+/duwcdHR0YGBjwrX/27BlOnDiBcePG1dmHmpoadHR0+BZCSA14VTklvTTAlStXsHXrVnTt2lXCBylIas+Bfp5Bnic4OBjp6ekYMmQI9PX1Bbbfvn0bV69eRVpaGjIyMpjlzJkzuHLlCv7+++9av/f169dISkrC0KFDofTZf4D4+HgYGRnx3dwihIhPXorKFRYWwt/fH9u2bRMaXyRN7DeR6ptBvlOnTnj79i00NTWF9sfhcNC7d2/07dtXYJuTkxM4HA5iY2MBVJ2q5+TkgMvlIi8vDxcuXEBUVBR0dXUFnh2trKxEfHw8AgMDhd71J4TIp8/vfdRWr2zSpEnw9vbGwIEDsWzZMqmPTexI0pAM8p+fWvPw7pDPmzdP6HYfHx9ER0cjJiYGQNUPlldQTkdHB7a2tggMDMS0adMETrlPnDiB58+f13jdlRAiBilmpP/8Bm5ERAQWL14s0HzPnj24fv06rly5Itlx1ILFpVTtIikoKICuri7y8/Ob9PVQSiZCalPf33Ne+5cxU6CjIdkqtgXFJTCdtx4vXrzgG4uwGeiLFy/Qq1cvHDt2jLn57OLiAgcHB6xZs0ai46qOzmUJIWKTxmNHvP5EuYl77do1vH79Gj179mTWVVRU4MyZM9iwYQNKSkqgrKws0fEBFEAVDs3USHM0YMAA3L59m2/dmDFj0LFjR8ybN08qwROgAEoIkQTe65eS7lNE2tra6Ny5M986LS0tGBgYCKyXJEpnRwghDUQzUAUUuatc1kOQuHB/+lWWKTnMSJ+WliaZcdSCfusIIWKjonKEEELqhWaghBDxyeEpfGOQ+gw0KCgIQ4cO5Vu3b98+qKurY+XKlVi8eLHQlHY8Li4uQt+RLS+vuo6XkpICDw8PGBoagsViISMjQ6CPrVu3wsXFBTo6OmCxWMjLy5PcARJCFFajn8Jv374d/v7+2LBhA1/W+NqEhITwleTIzs5m3mf/+PEj+vTpI7RuEk9RURE8PT1rfLWUECIeXlVOSS/yrlFP4VeuXInw8HAkJSXBx8dH5P00NTVhbGwsdNvo0aMBAE+fPq1xf15OwMa4K0cIURyNFkDnz5+PX375BYcOHcLAgQMb62sbrKSkhK9ECZX0IKQWLJbkaxgpQk0kUfz555+IiYnB77//3qDguXHjRqb2EpvNxqxZs6QwSn5U0oMQUpdGmYF27doVb9++RXh4OL744gtoa2vXa39/f38sXLiQ+aynpyfhEQpasGABZs6cyXwuKCigIEpITZRYkk9n1wTuwjdKAG3bti32798PV1dXeHp64siRI/UKorq6urCxsZHiCAXVlrSVEPIZOoWXLnNzc6Snp+P169dwd3ena4qEkCavUe/Cm5qaIi0tDa6urnB3d8fRo0cBAMXFxQLPb7LZbJFmne/evcPz58+RlZUFAHjw4AEAwNjYmLlzn5OTg5ycHDx69AhAVd0lbW1tmJubo2XLlpI6PEIUljQeO2oKjzE1+gjbtm2L9PR05OXlwc3NDXl5ecjMzET37t35FlEqZwJAamoqunfvzhSK8/PzQ/fu3bF582amzebNm9G9e3eEhIQAAPr27Yvu3bsjNTVV8gdICFEYVNJDRM2lpAdA2ZhIzRpa0iNn60/Q0VCX7FiKP8F4/FK5/puj3zoFRMGGEMmgvyRCiPhYUkgmQnfhCSGk+aIZKCFEbIqaUJkCqAKim0hE4igfKCGEkPqg/20TQsQn47LGsiJ3I6yewT4oKIjJQK+iogJzc3NMnDgR79+/59vH0tJSIGO9qakpgKo3laZMmQJbW1toamrC3NwcU6dORX5+fmMfGiGkmZH7Gainpyfi4+NRXl6Ou3fvIjg4GHl5edi9ezdfu8jISOZNIwBQVlYGAGRlZSErKwurV6+GnZ0dnj17hgkTJiArKwv79u1r1GMhpNlS0GQich9A1dTUmHfaTU1N4evri4SEBIF22traQrPWd+7cGfv372c+W1tbY/ny5QgICEB5eTlTGoQQQuqrSUWPJ0+e4MiRI2jRooVY/fBeDasteFJGekLqQUlJCvlA5e4KowC5H+GhQ4fAZrOhoaEBa2tr3L17F/PmzRNoN2/ePL6s9evWrRPaX25uLpYuXYrQ0NBav5cy0hNC6iL3M1BXV1ds2rQJRUVF2L59OzIzMzFlyhSBdnPmzEFQUBDz2dDQUKBNQUEBvL29YWdnh4iIiFq/lzLSE1IPCnoXXu4DqJaWFpMXdN26dXB1dcWSJUuwdOlSvnaGhoa15g/98OEDPD09wWazceDAgTovA1BGekLqgR6kbxoiIiKwevVqJoGyKAoKCuDu7g5VVVWkpqZCXV2yabcIIYqpyQVQFxcX2NvbIyoqSqT2Hz58gLu7Oz5+/AgOh4OCggImQ31FRYWUR0uIgmCx/ncaL7GFZqBSMXPmTGzbtg0vXryos+21a9dw6dIl3L59GzY2NjAxMWEWUfYnhJCayN010OrPeAp73hMARo0ahVGjRjGfnz59WmN/Li4uoKT7hEiZgj5I3yRnoIQQIg/kbgZKpI9SvxGJowfpCSGE1AdNRQgh4lPQa6AUQBXQ0t3NLyP9TyPpV5k0PvqtI4SIj17lJISQBmJJ4SZSEwig8j9CQgiRUxINoNXLcVSXlpYGFouFvLw8AEBFRQViY2PRtWtXqKurQ09PD15eXvjrr7+YfTZu3Ag9PT2Bt4UmT56MDh06oKioCADw6NEjjBkzBqamplBTU0O7du0wcuRIXL16lW+/w4cPw9HRERoaGjA0NMTw4cMleeiEKDbeTSRJL3Ku0WegXC4Xfn5+iIyMxNSpU3Hv3j2kp6fDzMwMLi4uOHjwIABg4sSJ6N27N8aOHcvse+rUKWzZsgUJCQnQ1NTE1atX0bNnT2RmZmLLli24e/cuDhw4gI4dO2LWrFnMfvv378fo0aMxZswY3Lx5E3/99Rffm0yEENIQjX4NdO/evdi3bx9SU1MxePBgZv3WrVuRm5uLcePGwc3NDVpaWuBwOOjSpQs2b96MUaNGYcyYMZgxYwacnZ3B5XIRFBSE9u3b4+zZs1Cqdv3FwcEB06ZNAwCUl5dj2rRpWLVqFV8wtrW1bbyDJqS5U9CbSI0+wqSkJHTo0IEvePLMmjULubm5OH78OADAzMwMsbGxmDNnDgICAsBms5k8oBkZGbhz5w5mzZrFFzx59PT0AADXr1/Hq1evoKSkhO7du8PExAReXl64c+dOreMsKSlBQUEB30IIIdVJPIDySnBUX7y8vJjtmZmZ6NSpk9B9eeszMzOZdWPGjEHnzp3xxx9/ID4+nkly/PDhQwBAx44dax3PkydPAACLFy/GokWLcOjQIejr66Nfv3549+5djftRSQ9C6oGugUqGq6srMjIy+Jbt27fXqw9WtR/czZs3ce3aNWhqauLs2bPMel6GJVYdP+TKykoAwMKFC+Hj44OePXsiPj4eLBYLv/32W437LViwAPn5+cxCqe8IIZ+T+DXQ6iU4eF6+fMn8u0OHDrh7967Qfe/duwcAaN++PQCgtLQUP/zwA0aOHAk3NzeEhIRg8ODB6NChAzp06MDs4+DgUON4TExMAAB2dnbMOjU1NVhZWeH58+c17kclPQipB0om0jj8/Pzw8OFD/PHHHwLbfv75ZxgYGMDNzQ0AEBkZidzcXKxduxYBAQHw8PDAmDFjUFlZCQcHB9jZ2eHnn39mZpnV8R6Z6tmzJ9TU1PDgwQNmW1lZGZ4+fQoLCwvpHCQhCobLYkllkXcyCaDDhg1DYGAgOBwOnj59ilu3biE0NBSpqanYvn07tLS0cPXqVcTExGD79u3MDaHNmzfj/v37iI2NBYvFQnx8PDIzM9G3b1/897//xZMnT3Dr1i0sX74cQ4YMAQDo6OhgwoQJiIiIwLFjx/DgwQNMnDgRADBixIjGPnxCSDPS6I8xsVgs7N27F2vXrkVsbCwmTZoENTU1ODk54fTp0/jqq69QUlKCwMBAjBkzBp6ensy+xsbGWL9+PcaOHYtBgwahd+/euHr1KpYvX46QkBC8ffsWJiYmcHZ2xpo1a5j9Vq1aBRUVFYwePRrFxcVwdHTEqVOnoK+v39iHT0jzxKuJJOk+5RyLS/UuRFJQUABdXV3k5+dDR0dH1sMRC2VjIjWp7+85r33OH1uho6Up2bF8LILx4PFy/TdHv3UKiIINkTg5eJA+OjoaKSkpuH//PjQ0NODs7IyYmBipvjQj/7e5CCFEBOnp6Zg0aRIuXryI48ePo7y8nClpLi00FSGEiE0ad83r29+RI0f4PsfHx8PIyAjXrl1D3759JTk0BgVQQohc+/w1alGf0c7PzwcAtGzZUirjAiiAKqzmdiOJruvKmBSvgX7+GnVERAQWL15c665cLhczZ87EV199hc6dO0t2XNXQbx0hRHxSLCr34sULvrvwosw+J0+ejFu3buHcuXOSHdNnKIASQuSajo5OvR5jmjJlClJTU3HmzBmYmppKcWSNdBf+9evXCA0Nhbm5OdTU1GBsbAwPDw9ER0eDxWLVuiQkJAAAiouLoa+vj5YtW6K4uBgAkJCQUOf+aWlpyM7OxqhRo2BrawslJSVMnz69MQ6bEMXBexde0ks9cLlcTJ48GSkpKTh16hTatWsnpYP9n0aZgfr4+KCsrAyJiYmwsrLCv//+i5MnT8LOzg7Z2dlMu2nTpqGgoADx8fHMOl1dXQBVWeU7d+4MLpeLlJQU+Pv7w9fXl+9NpeHDh6Nz586IjIxk1rVs2RJZWVlo1aoVFi5ciNjY2EY4YkJIY5s0aRKSkpLw+++/Q1tbGzk5OQCqYoiGhoZUvlPqATQvLw/nzp1DWloa+vXrBwCwsLBA7969BdpqaGigpKQExsbGAts4HA4CAgLA5XLB4XDg7+8PDQ0Nvh+MqqoqNDU1Bfa3tLTE2rVrAQBxcXGSPDxCCOTjMaZNmzYBAFxcXPjWx8fHIygoSEKj4if1AMpLqnzw4EF8+eWXDUoR9/jxY1y4cAEpKSngcrmYPn06njx5AisrKymMuEpJSQlKSkqYz5SRnhD5Jou30qV+DVRFRQUJCQlITEyEnp4e+vTpg7CwMNy6dUvkPuLi4uDl5cVcA/X09JT6TJIy0hNSD7zHmCS9yLlGGaGPjw+ysrKQmpoKDw8PpKWloUePHswNotpUVFQgMTERAQEBzLqAgAAkJiaioqJCamOmjPSEkLo02mNM6urqcHNzg5ubG8LDwzFu3DhERETUeW3i6NGjePXqFXx9ffnWV1RU4NixY3z1liSJMtITIjouSwlcCc8YJd2fNMhshHZ2diK95M/hcODn5ydQZ8nf3x8cDqcRRkoIqZOCFpWT+gw0NzcXI0aMQHBwMLp27QptbW1cvXoVK1euZLLG1+TNmzf4448/kJqaKvA6VmBgILy9vfHmzRu0atWqznFkZGQAAAoLC/HmzRtkZGRAVVWVr1YSIYTUR6PchXd0dERsbCweP36MsrIymJmZISQkBGFhYbXuu2PHDmhpaWHAgAEC21xdXaGtrY1ff/0VM2fOrHMc3bt3Z/597do1JCUlwcLCAk+fPq33MRFC+HEhhVP4JpBtkzLSi6g5ZaQHKJkIEa6hGelfntwLHbaEM9IXFsF0wPdy/TdHv3WEEPFJMZmIPKMAqqBoxkaI+OiviBAiPgWtyin/V2kJIURO0QxUgUUlS+9NrsYW5qss6yEoNHlIJiILFEAJIeKTg7LGsiD/IySEEDlFM1BCiNi4YIELCZ/CS7g/aZCLGWhQUBCGDh3Kt27fvn1QV1fHypUrsXjxYjg4ONS4v4uLi9ByHuXl5SgrK8O8efPQpUsXaGlpoU2bNvjhhx+QlZUl3YMihDR7chFAP7d9+3b4+/tjw4YNmDt3rkj7hISEIDs7m29RUVFBUVERrl+/jp9++gnXr19HSkoKMjMz8e2330r5KAhRHLxsTJJe5J3cncKvXLkS4eHhSEpKgo+Pj8j7CSvlAVTVQzl+/DjfuvXr16N37954/vw5zM3NxR4zIUQxyVUAnT9/Pn755RccOnQIAwcOlNr35Ofng8ViQU9Pr8Y2VNKDkHqgu/Cy9eeffyImJga///57g4Lnxo0bmfpLbDYbs2bNEtru06dPmD9/PkaNGlVrggIq6UEIqYvczEC7du2Kt2/fIjw8HF988QW0tbXrtb+/vz8WLlzIfBY2uywrK4Ofnx8qKyuxcePGWvtbsGABX5q8goICCqKE1IAepJextm3bYv/+/XB1dYWnpyeOHDlSryCqq6sLGxubGreXlZXh+++/xz///INTp07VmR6LSnoQIjoq6SEHzM3NkZ6ejtevX8Pd3V1i1x15wfPhw4c4ceIEDAwMJNIvIUSxyc0MlMfU1BRpaWlwdXWFu7s7jh49CgAoLi5mynLwsNnsWmedAFBeXo7vvvsO169fx6FDh1BRUYGcnBwAQMuWLaGqqiqV4yBEoVA+UPnRtm1bpKenw9XVFW5ubnB2dkZmZiZfWQ4A6NevH9LS0mrt6+XLl0hNTQUAgYfxT58+DRcXFwmOnBCiSOQigAqrD29iYoL79+8zn9esWVPj/rUFUUtLS1DVEkKkTBoPvjeBa6ByEUCJbFAKOELEQwGUECI2SiZCCCGkXmgGSggRm6I+B0oBVMHF7KuU9RAkYt538v/H1qyxIIXHmCTbnTTQbx0hhDQQzUAJIWLjQglcCc/HJN2fNDR4hEFBQWCxWFixYgXf+oMHD4L1/1P5tLQ0oZniFy1aVOt2FovFvC20bds2fP3119DX14e+vj4GDhyIy5cvC4zl84z2PO/evcOUKVNga2sLTU1NmJubY+rUqcjPz2/ooRNCCAAxZ6Dq6uqIiYlBaGgo9PX1a2z34MEDvuQdbDa71u0AYGRkBKAqyI4cORLOzs5MiQ93d3fcuXMHbdu2rXOMWVlZyMrKwurVq2FnZ4dnz55hwoQJyMrKwr59++pzuISQGlA2pgYYOHAgHj16hOjoaKxcubLGdkZGRrUmL65t+65du/g+b9u2Dfv27cPJkyfxww8/1DnGzp07Y//+/cxna2trLF++HAEBASgvL4eKCl3FIIQ0jFgXGZSVlREVFYX169fj5cuXkhpTrYqKilBWVoaWLVs2uI/8/Hzo6OjUGjxLSkpQUFDAtxBChFPUmkhij3DYsGFwcHBAREREjW1MTU35ssXn5ubWut3W1rbGvubPn4+2bds2uORHbm4uli5ditDQ0FrbUUZ6QkhdJHL+GhMTg/79+9dYRuPs2bN8yZE/v176+faaZoYrV67E7t27kZaWBnV19XqPs6CgAN7e3rCzs6s14AOUkZ6Q+lDUVzklEkD79u0LDw8PhIWFISgoSGB7u3btar0GWtd2AFi9ejWioqJw4sQJdO3atd5j/PDhAzw9PcFms3HgwAG0aNGi1vaUkZ4Q0dGbSGJasWIFHBwc0KFDB0l1yVi1ahWWLVuGo0ePolevXvXev6CgAB4eHlBTU0NqamqDZq+EEPI5iQXQLl26wN/fH+vXr6/3vq9fv8anT5/41hkYGKBFixZYuXIlfvrpJyQlJcHS0pJ5PpR3vZQnPz9fIGN9y5Ytoa+vD3d3dxQVFWHnzp18N4RatWoFZWVK6UaIuOgxJglYunQp9u7dW+/9hN00unDhAr788kts3LgRpaWl+O677/i2R0REYPHixczntLQ0gYz1gYGBCAoKwqVLlwBAoPzHP//8A0tLy3qPlxBCAIDFpXTtIikoKICuri7zCFRzQclESHX1/T3ntb977QK0P3tBRlwfCgth19NJrv/m6LeOEEIaiF7DUXA0cyOSoKh34eV/hIQQIqdoBkoIERs9SE8U1sr9Tf9G0lwfOpkijY8CKCFEbFxI4RpoE7jCSAGUECI2RT2Fl/8QTwghItq4cSPatWsHdXV19OzZE2fPnpXq98k0gPLKgrBYLKioqMDc3BwTJ07E+/fvmTaWlpZCS37wSok8ffoULBZL4DVOnoSEBL792Gw2evbsiZSUlMY4REIUQtWrnJLOB1q/GWhycjKmT5+OhQsX4saNG/j666/h5eWF58+fS+mo5WAG6unpiezsbDx9+hTbt2/HH3/8gR9//JGvTWRkJLKzs/mWKVOmiPwdOjo6zH43btyAh4cHvv/+ezx48EDSh0MIkZH//Oc/GDt2LMaNG4dOnTphzZo1MDMzw6ZNm6T2nTIPoGpqajA2NoapqSnc3d3h6+uLY8eO8bXR1taGsbEx36KlpSXyd7BYLGa/9u3bY9myZVBSUsKtW7ckfTiEKCTeNVBJL6IqLS3FtWvX4O7uzrfe3d0d58+fl/ThMuTqJtKTJ09w5MiROnN1iqOiogI7duwAAPTo0aPGdiUlJSgpKWE+U0kPQmTj8789Ybl63759i4qKCrRu3ZpvfevWrZkMbtIg8xnooUOHwGazoaGhAWtra9y9exfz5s3jazNv3jy+kh9sNhtpaWkif0d+fj6zn6qqKiZOnIitW7fC2tq6xn2opAchouOls5P0AgBmZmZ8f4vR0dE1joP12XVTLpcrsE6SZD4DdXV1xaZNm1BUVITt27cjMzNT4PrmnDlzBDLdi1LSmEdbWxvXr18HUFWU7sSJEwgNDYWBgQEGDx4sdB8q6UGIfHjx4gVfNiZhlSIMDQ2hrKwsMNt8/fq1wKxUkmQeQLW0tJg8nevWrYOrqyuWLFmCpUuXMm0MDQ0FcnnWh5KSEt/+Xbt2xbFjxxATE1NjAKWSHoSIjstlgcuV8HOg/9+fjo5OnensVFVV0bNnTxw/fhzDhg1j1h8/fhxDhgyR6Liqk3kA/VxERAS8vLwwceJEtGnTRmrfo6ysjOLiYqn1T4hiUZLCm0P162/mzJkYPXo0evXqBScnJ2zduhXPnz/HhAkTJDyu/5G7AOri4gJ7e3tERUVhw4YNAKoKwn0+NdfU1OT7v5KwR5Ls7OwAVF0H4e1fXFyM48eP4+jRowgPD5fWYRBCGpmvry9yc3OZxx47d+6M//73v7CwsJDad8pdAAWq/k8yZswY5mZSeHi4QLALDQ3F5s2bmc9+fn4C/fzzzz8Aqq5fmpiYAKg6NbewsEBkZKTAzSpCSMPIy6ucP/74o8Bz5NJEJT1E1FxLegCUjYn8T0NLely78TfY2toSHUvhhw/o2b2zXP/NyeUMlDQuCj5EXPIyA21s9JdDCCENRDNQQojYaAZKCCGkXmgGSpqFf+eNlvUQJKJ1zK+yHkKDKOoMlAIoIURs0nwTSZ7RKTwhhDRQvQJo9QzyLVq0gJWVFWbPno2PHz8ybRITE9G7d29oaWlBW1sbffv2xaFDh/j6SUhIgJ6entDv0NPTQ0JCAvP522+/hbm5OdTV1WFiYoLRo0cjKyuL2c7LSP/5EhAQwLSZNm0aevbsCTU1NTg4ONTnkAkhIpB1PlBZqfcMlJdB/smTJ1i2bBk2btyI2bNnAwBmz56N0NBQfP/997h58yYuX76Mr7/+GkOGDGFey6wvV1dX7N27Fw8ePMD+/fvx+PFjfPfddwLtTpw4wZex/pdffmG2cblcBAcHw9fXt0FjIIQQYep9DZSXQR4ARo0ahdOnT+PgwYMIDAzEzz//jHXr1vGlo1u+fDk+ffqEmTNnYsiQIfVOCTdjxgzm3xYWFpg/fz6GDh2KsrIyvsTLBgYGzLg+t27dOgDAmzdvKAs9IVKgqDeRxL4GqqGhgbKyMuzevRtsNhuhoaECbWbNmoWysjLs379frO969+4ddu3aBWdnZ6lmrQeqMtIXFBTwLYQQUp1YAfTy5ctISkrCgAEDkJmZCWtra6iqqgq0a9OmDXR1dZGZmdmg75k3bx60tLRgYGCA58+f4/fffxdo4+zszJex/saNGw36Lh7KSE+I6OgaqIh4JTjU1dXh5OSEvn37Yv369XXuJ05q/Tlz5uDGjRs4duwYlJWV8cMPP+DzHCjJycnIyMhgFl4qu4ZasGAB8vPzmeXFixdi9UcIaX7qfQ2UV4KjRYsWaNOmDXMq3aFDB5w7dw6lpaUCs9CsrCwUFBSgffv2AKoyTBcWFqKiogLKyspMu4qKChQWFkJXV5dvf0NDQxgaGqJDhw7o1KkTzMzMcPHiRTg5OTFtzMzMxMpa/znKSE+I6LiQwnOgzXEGyivBYWFhwXcd0s/PD4WFhdiyZYvAPqtXr0aLFi3g4+MDAOjYsSMqKioETrOvX7+OiooK2Nra1vj9vJln9YqZhBDZqgRLKou8k9ibSE5OTpg2bRrmzJmD0tJS5k75zp07sXbtWqbIPVCVKd7LywvBwcH4z3/+A2trazx+/BgzZ86El5cXc/p9+fJlXL58GV999RX09fXx5MkThIeHw9ramm/2WZdHjx6hsLAQOTk5KC4uRkZGBjMOYddsCSFEFBJ9lXPNmjXo2rUrNm3ahJ9++gksFgs9evTAwYMHBYq37dmzB4sXL8bEiRPx8uVLmJqaYtCgQVi8eDHTRkNDAykpKYiIiMDHjx9hYmICT09P7Nmzp16n1+PGjUN6ejrzuXv37gCqMtZbWlqKdcyEEMV9jIky0ouoOWekbw4omYhkNDQj/ZnrT8BmSzgjfeEH9O1hJdd/c5RMhBAiNkVNJkIBlDQLsp65EcVEAZQQIjYuJH/NsilcW6R0doQQ0kA0AyXNQs6cgLobNQHGq3bKeggNQtdACSGkgRT1MSY6hSeEkAYSK4AGBQVh6NChAuvT0tLAYrGQl5fH/FtfXx+fPn3ia3f58mUmg3x1XC4X27Ztg5OTE3R0dMBms2Fvb49p06bh0aNHAt/38uVLqKqqomPHjgLbnj59irFjx6Jdu3bQ0NCAtbU1IiIiUFpaKs6hE0Kq4Z3CS3qRd402A9XW1saBAwf41sXFxcHc3JxvHZfLxahRozB16lR88803OHbsGG7duoV169ZBQ0MDy5YtE+g7ISEB33//PYqKivDXX3/xbbt//z4qKyuxZcsW3LlzB7Gxsdi8eTPCwsIkf5CEEIXSaNdAAwMDERcXh5EjRwIAiouLsWfPHkydOhVLly5l2iUnJ2PPnj34/fff8e233zLrraysMGDAAIE0dlwuF/Hx8di4cSNMTU3B4XDQp08fZrunpyc8PT35+nnw4AE2bdqE1atXS+twCVEoXACVUuhT3jXaDHT06NE4e/Ysnj9/DgDYv38/LC0t0aNHD752u3fvhq2tLV/wrO7z0/3Tp0+jqKgIAwcOxOjRo7F37158+PCh1rHk5+ejZcuWYhwNIYRIIIDyEixXX7y8vATaGRkZwcvLi6m4GRcXh+DgYIF2mZmZAunspk+fzvRtamrKt43D4cDPzw/Kysqwt7eHjY0NkpOTaxzv48ePsX79ekyYMKHW46KSHoSIjq6BNpCrqytfJviMjAxs375daNvg4GAkJCTgyZMnuHDhAvz9/YW2+3yWuXDhQmRkZCA8PByFhYXM+ry8PKSkpPCVMA4ICEBcXJzQfrOysuDp6YkRI0Zg3LhxtR4XlfQghNRF7GugvATL1b18+VJo22+++QahoaEYO3YsBg8eDAMDA4E27du3x/379/nWtWrVCq1atYKRkRHf+qSkJHz69AmOjo7MOi6Xi8rKSty9e5evrEdWVhZcXV3h5OSErVu31nlcCxYswMyZM5nPBQUFFEQJqQE9B9oIlJWVMXr0aKSlpQk9fQeAkSNH4sGDB0ILx32Ow+Fg1qxZfLPfmzdvwtXVlW8W+urVK7i4uKBHjx6Ij4+HklLdh62mpgYdHR2+hRAinKKewjf6m0hLly7FnDlzhM4+garSICkpKfDz88OCBQvg4eGB1q1b49mzZ0hOTmZqKGVkZOD69evYtWuXwPOfI0eOxMKFCxEdHY03b97AxcUF5ubmWL16Nd68ecO0q6mOPCGEiKLRA6iqqioMDQ1r3M5isZCcnIxt27YhPj4eK1euRFlZGUxNTTFgwAD85z//AVA1+7SzsxP68PzQoUMxceJE/PHHHygoKMCjR4/w6NEjgRtQlEuaEMlQ1FN4ykgvIspIL98omYhkNDQj/ZFLWdBiS/bv4mNhATwd28j13xwlEyGEiK2SW7VIuk95RwGUNAuynrkRxUTZmAghYuNdA5X0Ig2STDBEM1BCiEKpnmDIxsYGf//9N0JCQvDx48d658egAEoIEVtTykgvyQRDFEBJs/B8wnBZD0EqzDenyHoIIuFyqxZJ9wlAIA+Fmpoa1NTUJPpdDU0wRNdACSFyzczMjC8vRXR0tET7FzXBkDAUQAkhYqsESyoLALx48QL5+fnMsmDBAqFjWLx4MVPhoqbl6tWrfPvUJ8GQMBIPoEFBQXwDNjAwgKenJ27duiXQdvz48VBWVsaePXsEtlX/YSgpKaFNmzbw9/fHixcvmDaFhYWwtrbmS/oBVN1l09HRYbJCpaWlYciQITAxMYGWlhYcHBywa9cuCR85IUQaPs9JUdPp++TJk3Hv3r1al86dOzPt65tgSBipzEA9PT2RnZ2N7OxsnDx5EioqKhg0aBBfm6KiIiQnJ2POnDngcDhC+7G3t0d2djZevnyJ5ORk3L59G99//z2znc1mIz4+HuvXr8fZs2cBVL2eOWbMGPTp04f5P8r58+fRtWtX7N+/H7du3UJwcDB++OEH/PHHH9I4fEIUjjwkEzE0NETHjh1rXdTV1QE0LMGQMFK5iaSmpsYk6jA2Nsa8efPQt29fvHnzBq1atQIA/Pbbb7Czs8OCBQtgYmKCp0+fwtLSkn9wKipMP23atEFISAimTp2KgoIC5tWuvn37YsqUKRgzZgxu3ryJbdu2ISMjA3///TfTz+f1j6ZOnYqjR4/iwIEDGDx4sDR+BIQQOZWVlSWxBENSvwZaWFiIXbt2wcbGhi8DE4fDQUBAAHR1dfHNN98gPj6+1n5ycnKQkpICZWVlJiMTT1RUFFq0aIGAgACEhYVh/fr1aNu2ba391XXXjTLSEyI63l14SS/ScOzYMTx69AinTp2CqakpTExMmKW+pBJAq5f50NbWRmpqKpKTk5lp8sOHD3Hx4kX4+voCqMoiHx8fj8pK/rJUt2/fBpvNhqamJkxMTJCWloZJkyZBS0uLr526ujrWrFmDgwcPwsXFhS9DvTD79u3DlStXMGbMmBrbUEZ6QpqnoKAgcLlcoUt9SSWAVi/zcenSJbi7u8PLywvPnj0DUDX79PDwYNLaffPNN/j48SNOnDjB14+trS0yMjJw5coVLF++HA4ODli+fLnQ7+RwONDU1MTt27eRn59f49jS0tIQFBSEbdu2wd7evsZ2CxYs4LvzV/3mFSGEX1N6lVOSpBJAeWU+bGxs0Lt3b3A4HHz8+BHbtm1DRUUFduzYgcOHD0NFRQUqKirQ1NTEu3fvBG4mqaqqwsbGBvb29ggLC4ODgwMmTpwo8H3JyclITU3FuXPnoKurixkzZggdV3p6OgYPHoz//Oc/+OGHH2o9BspIT4joeNmYJL3Iu0Z5E4n3KFJxcTH++9//4sOHD7hx4wbftcz79+/D398fubm5NWar/+mnn9ChQwfMmDGDKYf877//YtKkSVi2bBm6d++OhIQEODk5YcSIEXzVQdPS0jBo0CDExMRg/Pjx0j1gQohCkMoMtKSkBDk5OcjJycG9e/cwZcoUFBYWYvDgweBwOPD29ka3bt3QuXNnZvHx8UGrVq2wc2fNacmsrKwwZMgQhIeHM+tCQ0Nha2vLPAvaq1cvzJ07F+PHj2dO5dPS0uDt7Y2pU6fCx8eHGdu7d++kcfiEKB5pPMLUBGoiSSWAHjlyhLmr5ejoiCtXruC3335Dp06dcPjwYfj4+Ajsw2KxMHz48BqfCeWZNWsWDh8+jEuXLmHHjh04fvw4EhIS+J7jioiIgJ6eHnMqn5CQgKKiIkRHR/PdcRs+vHm+P00IaRxU0kNEVNJDvlEyEcloaEmP39LfQlPCJT2KCgswop+hXP/N0bvwhBDSQJTOjjQLTSXtW3NVPfmHJPuUdzQDJYSQBqIZKCFEbNJMqCzPKICSZuHZ+KGyHoJUWGw9KOshiKQplfSQJDqFJ4SQBqIZKCFEbNJ49bIpvMopsxno69evERoaCnNzcyZ/qIeHBy5cuMC0OX/+PL755hvo6+tDXV0dXbp0wc8//4yKigoAVXn9WrZsiXXr1vH1fenSJbRo0QLHjx8HUPUmkrD0/vfv32+8AyaENDsym4H6+PigrKwMiYmJsLKywr///ouTJ08yr1ceOHAA33//PcaMGYPTp09DT08PJ06cwNy5c3Hx4kXs3bsXbdq0wbp16xAaGgovLy+0b98excXFCAwMxLhx4+Dm5sb3nQ8ePOB7IJeX3JkQIh66idSI8vLycO7cOaSlpaFfv34AAAsLC/Tu3RsA8PHjR4SEhODbb7/lq1Uybtw4tG7dGt9++y327t0LX19fBAQEICUlBUFBQTh79iwWLFiA0tJSrFq1SuB7jYyMoKen1yjHSAhp/mRyCs9Ltnzw4EGUlJQIbD927Bhyc3Mxe/ZsgW2DBw9Ghw4dsHv3bmbd5s2b8fDhQ/j7+2PDhg1ISEgAm80W2Ld79+4wMTHBgAEDcPr0ackeFCEKjPKBNiIVFRUkJCQgMTERenp66NOnD8LCwpjKnZmZmQCATp06Cd2/Y8eOTBugama5dOlS7NmzB+PHj0ffvn352puYmGDr1q3Yv38/UlJSYGtriwEDBuDMmTM1jpFKehBC6iLTa6De3t44e/YsLly4gCNHjmDlypVMKWIANabY53K5YLH+93+niooKJCYmQlNTExcvXkR5eTlUVP53aLa2trC1tWU+Ozk54cWLF1i9erVAsOWJjo7GkiVLxD1MQhRCJaRwF16y3UmFTJ8DVVdXh5ubG8LDw3H+/HkEBQUhIiICHTp0AADcu3dP6H73799H+/btmc+rV6/Gw4cPceXKFWRlZSEqKqrO7/7yyy/x8OHDGrdTSQ9CSF3k6kF6Ozs7fPz4Ee7u7mjZsiV+/vlngTapqal4+PAhRo4cCQC4c+cOIiIisGnTJtjZ2WHz5s1YtmwZczmgJjdu3Ki1Ch+V9CBEdE2pKqckyeQUPjc3FyNGjEBwcDC6du0KbW1tXL16FStXrsSQIUOgpaWFLVu2wM/PD+PHj8fkyZOho6ODkydPYs6cOfjuu+/w/fffo7y8HIGBgRg2bBi+++47AMDQoUMxYsQIBAUF4fLly1BRUcGaNWtgaWkJe3t7lJaWYufOndi/fz/2798vi8MnpNmhx5gaEZvNhqOjI2JjY/H48WOUlZXBzMwMISEhCAsLAwB89913OH36NKKiotC3b18UFxfDxsYGCxcuxPTp08FisRAVFYVXr17h6NGjfP2vX78e9vb2iIqKQnh4OEpLSzF79my8evUKGhoasLe3x+HDh/HNN9/I4vAJIc0EZaQXEWWkl2+UTEQyGpqRnnMsD5paEs5I/7EAY9315PpvTq6ugRJCSFNCyURIs9BU0r41V4p6DZRmoIQQ0kA0AyWEiI1moIQQQuqFZqCkWXgSNEjWQ5Aqq4RDsh5CrbhSSKjcFGagFEAJIWKjmkiEEELqReIBNCgoSGj5jEePHgEAXrx4gbFjx6JNmzZQVVWFhYUFpk2bhtzcXABVmZWcnZ3h4+PD129+fj7MzMywaNEiAMDTp0/5+tfW1oa9vT0mTZokkCQkOzsbo0aNgq2tLZSUlDB9+nRJHzYhCk1R34WXygzU09MT2dnZfEu7du3w5MkT9OrVC5mZmdi9ezcePXqEzZs34+TJk3BycsK7d++grKyMxMREHDlyBLt27WL6nDJlClq2bInw8HC+7zpx4gSys7Nx8+ZNREVF4d69e+jWrRtOnjzJtCkpKUGrVq2wcOFCdOvWTRqHTAhRQFK5BsorEve5SZMmQVVVFceOHYOGhgYAwNzcHN27d4e1tTUWLlyITZs2oX379oiOjsaUKVPg6uqKK1euYM+ePbh8+TJUVVX5+jQwMGC+y8rKCoMHD8aAAQMwduxYPH78GMrKyrC0tMTatWsBAHFxcdI4ZEIUGlXllLJ3797h6NGj+PHHH5ngyWNsbAx/f38kJyczSZSnTJmCbt264YcffsD48eMRHh4OBweHOr9HSUkJ06ZNw7Nnz3Dt2rUGj5cy0hNC6iKVAHro0CGm7hGbzcaIESPw8OFDcLncGst0dOrUCe/fv8ebN28AACwWC5s2bcLJkyfRunVrzJ8/X+Tv79ixI4Cq66QNFR0dDV1dXWYxMzNrcF+ENHd0DVSCXF1dkZGRwSyf120XhjfzrF6qIy4uDpqamvjnn3/w8uVLkb9fWF/1RRnpCSF1kUoA1dLSgo2NDbOYmJjAxsYGLBYLd+/eFbrP/fv3oa+vD0NDQwDAhQsXEBsbi99//x1OTk4YO3ZsjTWSPscrBdKuXbsGHwNlpCdEdE11BlpSUgIHBwewWCxkZGTUe/9GuwZqYGAANzc3bNy4EcXFxXzbcnJysGvXLvj6+oLFYqG4uBiBgYEIDQ3FwIEDsX37dly5cgVbtmyp83sqKyuxbt06tGvXDt27d5fW4RBCquHdRJL0Im1z585FmzZtGrx/oz5Iv2HDBpSUlMDDwwNnzpzBixcvcOTIEbi5uaFt27ZYvnw5AGD+/PmorKxETEwMgKo79T///DPmzJkjcF0zNzcXOTk5ePLkCVJTUzFw4EBcvnwZHA4HysrKTDve5YTCwkK8efMGGRkZNc6GCSHN359//oljx45h9erVDe6jUV/lbN++Pa5evYrFixfD19cXubm5MDY2xtChQxEREYGWLVsiPT0dv/zyC9LS0qClpcXsGxISgn379mHs2LE4ceIEs37gwIEAAE1NTVhYWMDV1RVbt26FjY0N33dXn41eu3YNSUlJsLCwEOtGEyGkijSzMX3+BIyamhrU1NTE6vvff/9FSEgIDh48CE1NzQb3I/EAmpCQUOt2CwsLxMfH17i9X79+KC8vF7qteu0jS0tLka+JAjXXmCeEyLfPn4CJiIjA4sWLG9wfl8tFUFAQJkyYgF69eok1iaJkIoQQsVVWVi2S7hOoev27+k3cmmafixcvxpIlS2rt88qVKzh//jwKCgqwYMECscdIAZQ0C/Ke7o00nKhPwUyePBl+fn61trG0tMSyZctw8eJFgUDcq1cv+Pv7IzExUeSxUQAlhIhNHjLSGxoaMo9B1mbdunVYtmwZ8zkrKwseHh5ITk6Go6Njvb6TAighRKGYm5vzfWaz2QAAa2trmJqa1qsvCqCkWXj8g7eshyB11jsOy3oINZKHGagsUAAlhIitElLIxiTZ7mpU3yd6qqOM9IQQ0kAyD6BBQUEYOnQoAMDFxUVotviDBw/yJQZJSEgAi8WCp6cnX7u8vDywWCykpaUx66pnrVdRUYG5uTlmzpyJkpISaRwOIQqJy+VKZZF3Mg+gDaWiooKTJ0/i9OnTdbaNj49HdnY2/vnnH2zcuBG//vor3104QghpiCZ7DVRLSwvff/895s+fj0uXLtXaVk9Pj8lab2Zmhm+//RbXr19vjGESohAU9SZSk52BAlVvHty+fRv79u0TeZ/MzEycPn263s97EULI55p0AG3Tpg2mTZuGhQsX1vj+PACMHDkSbDYb6urqsLW1hb29fZ2vcVFJD0JEx6383+ucklq4jXUbXgxNOoACwLx58/DmzZtai8XFxsYiIyMDN2/exKFDh5CZmYnRo0fX2i+V9CCE1EWuAqiOjg7y8/MF1ufl5dX4Lqyenh4WLFiAJUuWoKioSGgbY2Nj2NjYwNbWFt7e3liyZAmSk5OZWvXCUEkPQkTXVDPSi0uuAmjHjh1x9epVgfVXrlyBra1tjftNmTIFSkpKTOniuvASLX+eGb86KulBiOiaakZ6ccnVXfgff/wRGzZswKRJkzB+/HhoaGjg+PHj4HA4+PXXX2vcT11dHUuWLMGkSZOEbs/Ly0NOTg4qKyvx8OFDREZGokOHDjVWCCWEEFHIfAZaWVkJFZWqOG5paYmzZ8/i8ePHcHd3xxdffIGEhAQkJCRgxIgRtfYTGBgIKysrodvGjBkDExMTmJqaYuTIkbC3t8eff/7JfC8hRDyKegov8wjy+vVrvvIbPXv2xJEjR2rdJygoCEFBQXzrlJWVcefOHYG2TeFtBkJI0ySzAPr+/XucP38eaWlpmDBhgqyGQQiRAG4lF1wJX7SUdH/SILMAGhwcjCtXrmDWrFkYMmSIrIZBmgl5TvVGmi+ZBdADBw7I6qsJIRImjbvmTWACKvubSIQQ0lTJ/CYSIaTpU9RkIhRASbNAJT1kq7KSi0oJn3NLuj9poFN4QghpIJqBEkLEpqin8BKZgb5+/RqhoaEwNzeHmpoajI2N4eHhgQsXLgCoesOIxWJhz549Avva29uDxWIhISFBYFtUVBSUlZWxYsUKgW28sh4sFgvKysrQ19eHo6MjIiMjBRKSREdH44svvoC2tjaMjIwwdOhQPHjwQBKHTghRYBIJoD4+Prh58yYSExORmZmJ1NRUuLi44N27d0wbMzMzxMfH8+138eJF5OTkQEtLS2i/8fHxmDt3bo2p6nR0dJCdnY2XL1/i/PnzGD9+PHbs2AEHBwdkZWUx7dLT0zFp0iRcvHgRx48fR3l5Odzd3fHx40cJHD0hhF7lbKC8vDycO3cOaWlp6NevHwDAwsICvXv35mvn7++P2NhYvHjxgsmtGRcXB39/f+zYsUOg3/T0dBQXFyMyMhI7duzAmTNn0LdvX742LBaLKdVhYmKCTp06YfDgwbC3t8fcuXOxc+dOABB4NTQ+Ph5GRka4du2aQJ+EECIqsWegbDYbbDYbBw8erLXSZevWreHh4YHExEQAQFFREZKTkxEcHCy0PYfDwciRI9GiRQuMHDkSHA5HpPEYGRnB398fqampqKioENqGd4rfsmXLGvuhjPSEiK6Sy5XKIu/EDqAqKipISEhAYmIi9PT00KdPH4SFheHWrVsCbYODg5GQkAAul4t9+/bB2toaDg4OAu0KCgqwf/9+BAQEAAACAgKwb98+kYNYx44d8eHDB+Tm5gps43K5mDlzJr766it07ty5xj4oIz0hpC4SuwaalZWF1NRUeHh4IC0tDT169BC4MeTt7Y3CwkKcOXMGcXFxNc4+k5KSYGVlhW7dugEAHBwcYGVlJfQmlDC8DEzVa8nzTJ48Gbdu3cLu3btr7YMy0hMiOm6ldBZ5J7HnQNXV1eHm5obw8HCcP38eQUFBiIiI4GujoqKC0aNHIyIiApcuXYK/v7/QvuLi4nDnzh2oqKgwy507d0Q+jb937x50dHRgYGDAt37KlClITU3F6dOnYWpqWmsflJGeENFxwQWXK+EFCnAKXxM7Ozuhd7mDg4ORnp6OIUOGQF9fX2D77du3cfXqVaSlpSEjI4NZzpw5gytXruDvv/+u9Xtfv36NpKQkDB06FEpKVYfH5XIxefJkpKSk4NSpU2jXrp1kDpIQotDEvgufm5uLESNGIDg4GF27doW2tjauXr2KlStXCk1T16lTJ7x9+xaamppC++NwOOjdu7fQu+NOTk7gcDiIjY0FUBUYc3JywOVykZeXhwsXLiAqKgq6urp8z45OmjQJSUlJ+P3336GtrY2cnBwAgK6uLjQ0NMT9ERCi8HhljSXdp7wTO4Cy2Ww4OjoiNjYWjx8/RllZGczMzBASEoKwsDCh+3x+as1TWlqKnTt3Yt68eUK3+/j4IDo6GjExMQCqbjaZmJiAxWJBR0cHtra2CAwMxLRp0/hOuTdt2gQAcHFx4esvPj5eILM9IYSIisWlmhciKSgogK6uLvLz8+l6qByiZCKSUd/fc177uZveQE1Dsn8XJcUFWDmxlVz/zdG78KRZkOdMRaT5ogBKCBEbZaQnhBBSLzQDJYSIjapyEtKE3frGRdZDkImu/02T9RAAUD5QQggh9UQzUEKI2KgmkoTxssXXtPAeYL9x4wZGjBiB1q1bQ11dHR06dEBISAgyMzMBAE+fPhW6Py9T082bNzFy5EiYmZlBQ0MDnTp1wtq1a/nG8unTJwQFBaFLly5QUVHB0KFDpXXYhJAm4vDhw3B0dISGhgYMDQ0xfPjwevchtRlodnY28+/k5GSEh4fzldHQ0NDAoUOH4OPjAw8PD+zatQvW1tZ4/fo1fvvtN/z0009ITk5m2p84cQL29vZ8+wPAtWvX0KpVK+zcuRNmZmZMZnplZWVMnjwZAFBRUQENDQ1MnToV+/fvl9YhE6KweAlAJN2ntOzfvx8hISGIiopC//79weVycfv27Xr3I7UAyssUD1S9c149ezxQlVB5zJgx+Oabb3DgwAFmfbt27eDo6Ii8vDy+/gwMDPj25/k8JZ6VlRUuXLiAlJQUJoBqaWkxr3P+9ddfAn0TQhRHeXk5pk2bhlWrVmHs2LHMeltb23r3JbObSEePHsXbt28xd+5codv19PQa3Hd+fn6t2eYJIZIlzXygn1eGqK3yhSiuX7+OV69eQUlJCd27d4eJiQm8vLxw586devclswD68OFDAFXZ40Xh7OzMlA9hs9m4ceOG0HYXLlzA3r17ERoaKtb4qKQHIfLBzMyMrzpEdHS0WP09efIEALB48WIsWrQIhw4dgr6+Pvr168dXCFMUMrsLX9/rG8nJyejUqRPzWViJjTt37mDIkCEIDw+Hm5ubWOOLjo7GkiVLxOqDEEUhjRpGvP5evHjBl0xETU1NaPvFixfX+Td75coVVP5/3r2FCxfCx8cHQFVmNlNTU/z222/1mnzJLIB26NABAHD//n04OTnV2d7MzAw2NjY1br979y769++PkJAQLFq0SOzxLViwADNnzmQ+FxQUUF0kQmRA1IoQkydPhp+fX61tLC0t8eHDBwBVSd951NTUYGVlhefPn9drbDILoO7u7jA0NMTKlSv5biLx5OXliXwd9M6dO+jfvz8CAwOxfPlyiYxPTU2txv/TEUL4ycNdeENDQxgaGtbZrmfPnlBTU8ODBw/w1VdfAQDKysrw9OlTWFhY1Os7ZRZAtbS0sH37dowYMQLffvstpk6dChsbG7x9+xZ79+7F8+fPRSoid+fOHbi6usLd3R0zZ85kss0rKyujVatWTLu7d++itLQU7969w4cPH5CRkQEAQquCEkLqpyk9SK+jo4MJEyYgIiICZmZmsLCwwKpVqwAAI0aMqFdfMn0TaciQITh//jyio6MxatQo5jS5f//+WLZsmUh9/Pbbb3jz5g127dqFXbt2MestLCzw9OlT5vM333yDZ8+eMZ+7d+8OQLrPmhFC5NOqVauYIpfFxcVwdHTEqVOnhNZpqw1lpBcRZaSXb5RMRDIampF+QswrqWSk3zyvrVz/zVEyEUIIaSBKJkKaBXlJ66aouFwp5ANtAifHNAMlhJAGohkoIURsXCk8SE8zUEIIacZoBkqahZuefWU9BJnoduSMrIcAgGoiEUJIgylqAKVTeEIIaSCZBNCgoCC+8hwGBgbw9PTErVu3kJCQUGc5kLS0NABAaWkpVq1ahR49ekBLSwu6urro1q0bFi1ahKysLOb7oqOj8cUXX0BbWxtGRkYYOnQoX3Z8Qoh4KrnSWeSdzGagnp6eyM7ORnZ2Nk6ePAkVFRUMGjQIvr6+zPrs7Gw4OTkhJCSEb52zszNKSkrg5uaGqKgoBAUF4cyZM7h27RpWrlyJ3NxcrF+/nvmu9PR0TJo0CRcvXsTx48dRXl4Od3d3fPz4UVaHTwhpBmR2DVRNTY0p0WFsbIx58+ahb9++KCws5CvdoaqqCk1NTYFyHitWrMC5c+dw9epV5r12ALCxsYGHhwffIxBHjhzh2zc+Ph5GRka4du0a+vZVzJsPhEiSol4DlYubSIWFhdi1axdsbGxgYGAg0j67d++Gm5sbX/CsjsVi1bhvfn4+ANRa9qOkpISvdABlpCeEfE5mp/CHDh1iynNoa2sjNTUVycnJUFISbUiZmZkCRaCGDRvG9Ons7Cx0Py6Xi5kzZ+Krr75C586da+w/Ojqar4wAJVMmpGa8fKCSXuSdzAKoq6srMjIykJGRgUuXLsHd3R1eXl58Kefq8vksc+PGjcjIyEBwcDCKioqE7jN58mTcunULu3fvrrXvBQsWID8/n1levHgh8rgIIYpBpgmVq5fo6NmzJ3R1dbFt2zaRcoG2b98e9+/f51tnYmICoOZT8ylTpiA1NRVnzpyBqalprf1TRnpCRFdZKfkEyP9fukiuyc1zoCwWC0pKSiguLhap/ciRI3H8+PEaq3NWx+VyMXnyZKSkpODUqVNo166duMMlhFSjqKfwMpuBlpSUMOU33r9/jw0bNqCwsBCDBw8Waf8ZM2bg8OHD6N+/PxYvXoyvv/4a+vr6yMzMxJ9//gllZWWm7aRJk5CUlITff/8d2trazPfq6upCQ0ND8gdHCFEIMgugR44cYU65tbW10bFjR/z2229wcXERaX91dXWcPHkSa9asQXx8PBYsWIDKykq0a9cOXl5emDFjBtN206ZNACDQd3x8PIKCgiRxOIQoNEV9jIlKeoiISnrIN0omIhkNLekREPYYquraEh1L6acP2BllLdd/c3LxHCgh4pKXrESKSlFnoHJzE4kQQpoamoESQsRWCclnpK8EzUAJIaTZohkoaRaOGtjLeghyzSP3jlT7V9RroBRACSFik8aD703hASE6hSeEkAaSSAB9/fo1QkNDYW5uzuT59PDwwIULFwAAlpaWYLFY2LNnj8C+9vb2YLFYSEhIENgWFRUFZWVlrFixQmBb9cz1ysrK0NfXh6OjIyIjI5l0dTybNm1C165doaOjAx0dHTg5OeHPP/+UxKETQlB1ul0p4aUpnMJLJID6+Pjg5s2bSExMRGZmJlJTU+Hi4oJ3794xbczMzBAfH8+338WLF5GTkwMtLS2h/cbHx2Pu3LmIi4sTul1HRwfZ2dl4+fIlzp8/j/Hjx2PHjh1wcHDgK+lhamqKFStW4OrVq7h69Sr69++PIUOG4M4d6V4XIoQ0b2IH0Ly8PJw7dw4xMTFwdXWFhYUFevfujQULFsDb25tp5+/vj/T0dL60cHFxcfD394eKiuCl2PT0dBQXFyMyMhIfP37EmTOCD0qzWCwYGxvDxMQEnTp1wtixY3H+/HkUFhZi7ty5TLvBgwfjm2++QYcOHdChQwcsX74cbDYbFy9eFPfwCSH4300kSS/yTuwAyktgfPDgQb4M7p9r3bo1PDw8kJiYCAAoKipCcnIygoODhbbncDgYOXIkWrRogZEjR4LD4Yg0HiMjI/j7+yM1NRUVFRUC2ysqKrBnzx58/PgRTk5OIvVJCCHCiB1AVVRUkJCQgMTEROjp6aFPnz4ICwvDrVu3BNoGBwcjISEBXC4X+/btg7W1NRwcHATaFRQUYP/+/QgICAAABAQEYN++fSKX1ejYsSM+fPiA3NxcZt3t27fBZrOhpqaGCRMm4MCBA7Czs6uxj5KSEhQUFPAthBDhFDWdncSugWZlZSE1NRUeHh5IS0tDjx49BG4MeXt7o7CwEGfOnEFcXFyNs8+kpCRYWVmhW7duAAAHBwdYWVkJvQklDO8HXz1jva2tLTIyMnDx4kVMnDgRgYGBuHv3bo19UEkPQkhdJPYYk7q6Otzc3BAeHo7z588jKCgIERERfG1UVFQwevRoRERE4NKlS/D39xfaV1xcHO7cuQMVFRVmuXPnjsin8ffu3YOOjg5fgTpVVVXY2NigV69eiI6ORrdu3bB27doa+6CSHoSIjltZKZVF3kntQXo7OzscPHhQYH1wcDBWr14NX19f6OvrC2y/ffs2rl69irS0NL7SHHl5eejbty/+/vvvWovBvX79GklJSRg6dGitBeq4XG6t12yppAchouM9eiTpPuWd2AE0NzcXI0aMQHBwMLp27QptbW1cvXoVK1euxJAhQwTad+rUCW/fvoWmpqbQ/jgcDnr37i20XruTkxM4HA5iY2MBVAXBnJwccLlc5OXl4cKFC4iKioKuri7fs6NhYWHw8vKCmZkZPnz4gD179iAtLU2gXjwhhNSH2AGUzWbD0dERsbGxePz4McrKymBmZoaQkBCEhYUJ3aem2u+lpaXYuXMn5s2bJ3S7j48PoqOjERMTA6DqZpOJiQlYLBZ0dHRga2uLwMBATJs2jS8B67///ovRo0cjOzsburq66Nq1K44cOQI3Nzcxj54QAijuq5yUkV5ElJFevlEykdqJmkykoRnph066hRZqks1IX1byAQd/6SrXf3OUTIQQIjbKxkRIEybtdG2kecnMzMScOXPw119/obS0FF26dMGyZcvg6upar34oGxMhRGxN7VVOb29vlJeX49SpU7h27RocHBwwaNAgpuS5qCiAEkIUytu3b/Ho0SPMnz8fXbt2Rfv27bFixQoUFRXVO8EQncITQsRWiUpUciX74Hslqvr7/DVqcZ/RNjAwQKdOnbBjxw706NEDampq2LJlC1q3bo2ePXvWqy8KoKRZONzCVtZDaBK8yx5IpV9upeRv+vDi8eevUUdERGDx4sUN7pfFYuH48eMYMmQItLW1oaSkhNatW+PIkSPQ09OrV190Ck8IkWsvXrzge616wYIFQtstXryYSbJe03L16lVwuVz8+OOPMDIywtmzZ3H58mUMGTIEgwYNQnZ2dr3GRjNQQojYpPkYE6+SRF0mT54MPz+/WttYWlri1KlTOHToEN6/f8/0u3HjRhw/fhyJiYmYP3++yGMUewYaFBQEFouFCRMmCGz78ccfwWKxEBgYiIEDB8LDw0OgzcaNG6Grq4vnz58DAA4dOgQXFxdoa2tDU1MTX3zxhdByHwCwf/9+uLi4QFdXF2w2G127dkVkZCSTCb8+ZT8IIU2boaEhOnbsWOuirq6OoqIiABDIlaGkpITKeiYwkcgpvJmZGfbs2YPi4mJm3adPn7B7926Ym5uDxWIhPj4ely5dwpYtW5g2//zzD+bNm4e1a9fC3Nwc69evx5AhQ+Ds7IxLly7h1q1b8PPzw4QJEzB79my+71y4cCF8fX3xxRdf4M8//8Tff/+Nn3/+GTdv3sSvv/7KtBO17AchpOGaUj5QJycn6OvrIzAwEDdv3mSeCf3nn3/4qmiIQiKn8D169MCTJ0+QkpLCpKhLSUmBmZkZrKysAFQF2bVr12Ly5Mlwd3eHpaUlxo4diwEDBiAoKAgvXrzArFmzMH36dERFRTF9z5o1C6qqqpg6dSpGjBgBR0dHXL58GVFRUVizZg2mTZvGtLW0tISbmxvy8vKYdbyyHwCY0h+DBw+Gvb095s6di507d0riR0AIaSIMDQ1x5MgRLFy4EP3790dZWRns7e3x+++/MzmIRSWxm0hjxozhKxonLGFyYGAgBgwYgDFjxmDDhg34+++/sXXrVgDAvn37UFZWJjDTBIDQ0FCw2Wzs3r0bALBr1y6w2Wz8+OOPQsdS1520usp+AJSRnpD6qKyslMoiLb169cLRo0eRm5uLgoICXLhwAV5eXvXuR2IBdPTo0Th37hyePn2KZ8+e4a+//mJKclS3detW3L17F9OnT8eWLVtgZGQEoOrVKl1dXZiYmAjso6qqCisrK2RmZgIAHj58CCsrK7Ro0aLB4xVW9qM6ykhPCKmLxAKooaEhvL29kZiYiPj4eHh7e8PQ0FCgnZGREcaPH49OnTph2LBhIvfP5XKZEh3V/91Qwsp+VEcZ6QkRXVN7lVNSJPoYU3BwMCZPngwA+OWXX2r+0v8v01Fdhw4dkJ+fj6ysLLRp04ZvW2lpKZ48eYL+/fszbc+dO4eysrIGz0KFlf2ojjLSEyI6LrcSXAm/iSTp/qRBog/Se3p6orS0FKWlpUIfWaqNj48PVFRU8PPPPwts27x5Mz5+/IiRI0cCAEaNGoXCwkJs3LhRaF/VbyIJI2rZD0IIqY1EZ6DKysq4d+8e8+/6MDc3x8qVKzF79myoq6tj9OjRaNGiBX7//XeEhYVh1qxZcHR0BAA4Ojpi7ty5mDVrFl69eoVhw4ahTZs2ePToETZv3oyvvvqKuTsvatkPQkjDUT5QCREnc/SMGTNgbW2N1atXY+3ataioqIC9vT02bdqEMWPG8LWNiYlBz5498csvv2Dz5s2orKyEtbU1vvvuOwQGBjLtRC37QQgh9UUlPUREJT3kGyUTEU1dyUQaWtJj4Mi/oKLKltQwAQDlpYU4sbuPXP/N0bvwpFmQVpYhQmpDAZQQIrZKrhTygSraXXhCCFEkNAMlhIiN7sIT0oTRTSTRSeN6MZdbCa6E311XuAfpCSFEkdAMlBAiNkU9hW8SM9DXr18jNDQU5ubmUFNTg7GxMTw8PHDhwgUAVXlAeZnnNTQ00LFjR6xatYovIevTp0+F1kgRljGKEEJE0SRmoD4+PigrK0NiYiKsrKzw77//4uTJk0zpDgCIjIxESEgIPn36hBMnTmDixInQ0dFBaGgoX18nTpyAvb0981lDQ6PRjoOQ5kpRk4nIfQDNy8vDuXPnkJaWhn79+gEALCws0Lt3b7522traTOb5cePGYdOmTTh27JhAADUwMGDaEUKIOOT+FJ7NZoPNZuPgwYMoKSmpsz2Xy0VaWhru3bsnVsJlykhPiOgqK4HKSq6EF1kfVd3kPoCqqKggISEBiYmJ0NPTQ58+fRAWFoZbt27xtZs3bx7YbDbU1NTg6uoKLpeLqVOnCvTn7OzMBGU2m40bN24I/V7KSE8IqYvcB1Cg6hpoVlYWUlNT4eHhgbS0NPTo0YOv3PGcOXOQkZGB9PR0uLq6YuHChXB2dhboKzk5GRkZGcxiZ2cn9DspIz0houNWVkplkXdyfw2UR11dHW5ubnBzc0N4eDjGjRuHiIgIBAUFAagqKWJjYwMbGxvs378fNjY2+PLLLzFw4EC+fszMzGBjY1Pn91FGekJIXZrEDFQYOzs7fPz4Ueg2fX19TJkyBbNnz5ZabWlCyP8oak0kuQ+gubm56N+/P3bu3Ilbt27hn3/+wW+//YaVK1diyJAhNe43adIkPHjwAPv372/E0RKimHiPMUl6kXdyfwrPZrPh6OiI2NhYPH78GGVlZTAzM0NISAjCwsJq3K9Vq1YYPXo0Fi9ejOHDhzfiiAkhioIy0ouIMtLLN0omIrrakok0NCP9l15/QqWFliSHifKyj7j4p5dc/83J/Sk8IYTIK7k/hSdEFFTSQ7ak8dgRPcbUjPCudNAbSaQ54/1+1/fKXkW58CdixCGNPiWNAqiIPnz4AAD0RhJRCB8+fICurm6d7VRVVWFsbIyrJ7+XyjiMjY2hqqoqlb4lgW4iiaiyshJZWVngcrkwNzfHixcv5PbCtqgKCgpgZmbW5I+FjkNyuFwuPnz4gDZt2kBJSbRbJJ8+fUJpaalUxqOqqgp1dXWp9C0JNAMVkZKSEkxNTZlTHB0dnSb9x1pdczkWOg7JEGXmWZ26urpcBzlporvwhBDSQBRACSGkgSiA1pOamhoiIiKaRaKR5nIsdBxEVugmEiGENBDNQAkhpIEogBJCSANRACWEkAaiAEoIIQ1EAbQeli9fDmdnZ2hqakJPT09om+fPn2Pw4MHQ0tKCoaEhpk6dKrW3NCTJ0tISLBaLb5k/f76sh1WnjRs3ol27dlBXV0fPnj1x9uxZWQ+p3hYvXizws6fS200DvYlUD6WlpRgxYgScnJzA4XAEtldUVMDb2xutWrXCuXPnkJubi8DAQHC5XKxfv14GI66fyMhIhISEMJ/ZbLYMR1O35ORkTJ8+HRs3bkSfPn2wZcsWeHl54e7duzA3N5f18OrF3t4eJ06cYD4rKyvLcDREZFxSb/Hx8VxdXV2B9f/973+5SkpK3FevXjHrdu/ezVVTU+Pm5+c34gjrz8LCghsbGyvrYdRL7969uRMmTOBb17FjR+78+fNlNKKGiYiI4Hbr1k3WwyANQKfwEnThwgV07twZbdq0YdZ5eHigpKQE165dk+HIRBMTEwMDAwM4ODhg+fLlcn3pobS0FNeuXYO7uzvfend3d5w/f15Go2q4hw8fok2bNmjXrh38/Pzw5MkTWQ+JiIBO4SUoJycHrVu35lunr68PVVVV5OTkyGhUopk2bRp69OgBfX19XL58GQsWLMA///yD7du3y3poQr19+xYVFRUCP+/WrVvL/c/6c46OjtixYwc6dOiAf//9F8uWLYOzszPu3LkDAwMDWQ+P1ELhZ6DCLuB/vly9elXk/lgslsA6LpcrdL201efYZsyYgX79+qFr164YN24cNm/eDA6Hg9zc3EYfd318/nOV1c9aHF5eXvDx8UGXLl0wcOBAHD58GACQmJgo45GRuij8DHTy5Mnw8/OrtY2lpaVIfRkbG+PSpUt8696/f4+ysjKBmVJjEOfYvvzySwDAo0eP5HIWZGhoCGVlZYHZ5uvXr2Xys5YkLS0tdOnSBQ8fPpT1UEgdFD6AGhoawtDQUCJ9OTk5Yfny5cjOzoaJiQkA4NixY1BTU0PPnj0l8h31Ic6x3bhxAwCY45A3qqqq6NmzJ44fP45hw4Yx648fP44hQ4bIcGTiKykpwb179/D111/LeiikDgofQOvj+fPnePfuHZ4/f46KigpkZGQAAGxsbMBms+Hu7g47OzuMHj0aq1atwrt37zB79myEhITIdaLfCxcu4OLFi3B1dYWuri6uXLmCGTNm4Ntvv5Xrx4FmzpyJ0aNHo1evXnBycsLWrVvx/PlzTJgwQdZDq5fZs2dj8ODBMDc3x+vXr7Fs2TIUFBQgMDBQ1kMjdZH1YwBNSWBgIBeAwHL69GmmzbNnz7je3t5cDQ0NbsuWLbmTJ0/mfvr0SXaDFsG1a9e4jo6OXF1dXa66ujrX1taWGxERwf348aOsh1anX375hWthYcFVVVXl9ujRg5ueni7rIdWbr68v18TEhNuiRQtumzZtuMOHD+feuXNH1sMiIqB0doQQ0kAKfxeeEEIaigIoIYQ0EAVQQghpIAqghBDSQBRACSGkgSiAEkJIA1EAJYSQBqIASuRKQkJCjdn+hUlLSwOLxUJeXp7UxkRITSiAErGdP38eysrK8PT0rNd+lpaWWLNmDd86X19fZGZmityHs7MzsrOzoaurC6D+AZgQcVAAJWKLi4vDlClTcO7cOTx//lysvjQ0NGBkZCRye1VVVRgbGze5FHakeaAASsTy8eNH7N27FxMnTsSgQYOQkJDAtz01NRW9evWCuro6DA0NMXz4cACAi4sLnj17hhkzZjC5SQH+GeSDBw/AYrFw//59vj7/85//wNLSElwul+8UPi0tDWPGjEF+fj7T5+LFixEZGYkuXboIjL1nz54IDw+X/A+FKAwKoEQsycnJsLW1ha2tLQICAhAfHw9eeoXDhw9j+PDh8Pb2xo0bN3Dy5En06tULAJCSkgJTU1NERkYiOzsb2dnZAn3b2tqiZ8+e2LVrF9/6pKQkjBo1SmDW6ezsjDVr1kBHR4fpc/bs2QgODsbdu3dx5coVpu2tW7dw48YNBAUFSfgnQhQJBVAiFg6Hg4CAAACAp6cnCgsLcfLkSQBVZaD9/PywZMkSdOrUCd26dUNYWBgAoGXLllBWVoa2tjaMjY1rLOPr7++PpKQk5nNmZiauXbvGfGd1qqqq0NXVZcoCGxsbg81mw9TUFB4eHoiPj2faxsfHo1+/frCyspLYz4IoHgqgpMEePHiAy5cvM1nvVVRU4Ovri7i4OABARkYGBgwYINZ3+Pn54dmzZ7h48SIAYNeuXXBwcICdnV29+gkJCcHu3bvx6dMnlJWVYdeuXQgODhZrbIRQQmXSYBwOB+Xl5Wjbti2zjsvlokWLFnj//j00NDTE/g4TExO4uroiKSkJX375JXbv3o3Q0NB69zN48GCoqanhwIEDUFNTQ0lJCXx8fMQeH1FsNAMlDVJeXo4dO3bg559/RkZGBrPcvHkTFhYW2LVrF7p27cqczgujqqqKioqKOr/L398fycnJuHDhAh4/flxrnaea+lRRUUFgYCDi4+MRHx8PPz8/aGpqinawhNSAZqCkQQ4dOoT3799j7NixzDOYPN999x04HA5iY2MxYMAAWFtbw8/PD+Xl5fjzzz8xd+5cAFXPgZ45cwZ+fn5QU1OrsX7T8OHDMXHiREycOBGurq58M97PWVpaMtdhu3XrBk1NTSZQjhs3Dp06dQIA/PXXX5L4MRAFRzNQ0iAcDgcDBw4UCJ4A4OPjg4yMDOjo6OC3335DamoqHBwc0L9/f76qpZGRkXj69Cmsra3RqlWrGr9LR0cHgwcPxs2bN+Hv71/ruJydnTFhwgT4+vqiVatWWLlyJbOtffv2cHZ2hq2tLRwdHRtw1ITwo5IeRGFwuVx07NgRoaGhmDlzpqyHQ5oBOoUnCuH169f49ddf8erVK4wZM0bWwyHNBAVQohBat24NQ0NDbN26Ffr6+rIeDmkmKIAShUBXqog00E0kQghpIAqghBDSQBRACSGkgSiAEkJIA1EAJYSQBqIASgghDUQBlBBCGogCKCGENBAFUEIIaaD/A1iWdrsllD0eAAAAAElFTkSuQmCC",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "dc.plot_barplot(\n",
+ " acts=tf_acts,\n",
+ " contrast='treatment.vs.control',\n",
+ " top=25,\n",
+ " vertical=True,\n",
+ " figsize=(3, 6)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "65226927-8da1-4555-88c1-c213f7ac46d4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1201"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We obtain ligand-receptor interactions from Omnipath, and we keep only the receptors\n",
+ "# This is our list of a prior potential receptors from which we will infer the network\n",
+ "unique_receptors = set(op.interactions.LigRecExtra.get(genesymbols=True)[\"target_genesymbol\"].values.tolist())\n",
+ "len(unique_receptors)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "6b6634d6-09b3-486e-984a-b382c20d41f8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "df_de_receptors = results_df.loc[results_df.index.intersection(unique_receptors)]\n",
+ "df_de_receptors = df_de_receptors.sort_values(by=\"stat\", ascending=False)\n",
+ "df_de_receptors.plot.scatter(x=\"log2FoldChange\", y=\"stat\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "2ceda357-2783-457e-a6ab-091b02630650",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " baseMean \n",
+ " log2FoldChange \n",
+ " lfcSE \n",
+ " stat \n",
+ " pvalue \n",
+ " padj \n",
+ " \n",
+ " \n",
+ " GeneName \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " CDH6 \n",
+ " 28262.296983 \n",
+ " 3.019806 \n",
+ " 0.077417 \n",
+ " 39.007075 \n",
+ " 0.000000e+00 \n",
+ " 0.000000e+00 \n",
+ " \n",
+ " \n",
+ " CRLF1 \n",
+ " 7919.672343 \n",
+ " 3.341644 \n",
+ " 0.087997 \n",
+ " 37.974317 \n",
+ " 0.000000e+00 \n",
+ " 0.000000e+00 \n",
+ " \n",
+ " \n",
+ " FZD8 \n",
+ " 2719.781498 \n",
+ " 3.843015 \n",
+ " 0.102696 \n",
+ " 37.421427 \n",
+ " 1.751855e-306 \n",
+ " 1.817595e-303 \n",
+ " \n",
+ " \n",
+ " CDH2 \n",
+ " 7111.507547 \n",
+ " 2.809461 \n",
+ " 0.081929 \n",
+ " 34.291273 \n",
+ " 1.058818e-257 \n",
+ " 6.138964e-255 \n",
+ " \n",
+ " \n",
+ " DYSF \n",
+ " 441.449511 \n",
+ " 4.593250 \n",
+ " 0.182207 \n",
+ " 25.208911 \n",
+ " 3.198723e-140 \n",
+ " 5.680759e-138 \n",
+ " \n",
+ " \n",
+ " INHBA \n",
+ " 24329.359641 \n",
+ " 2.598613 \n",
+ " 0.104321 \n",
+ " 24.909787 \n",
+ " 5.828479e-137 \n",
+ " 9.655193e-135 \n",
+ " \n",
+ " \n",
+ " CELSR1 \n",
+ " 492.324435 \n",
+ " 3.517315 \n",
+ " 0.154495 \n",
+ " 22.766506 \n",
+ " 9.849205e-115 \n",
+ " 1.303070e-112 \n",
+ " \n",
+ " \n",
+ " PDGFC \n",
+ " 5481.167075 \n",
+ " 1.894857 \n",
+ " 0.083811 \n",
+ " 22.608707 \n",
+ " 3.558087e-113 \n",
+ " 4.676039e-111 \n",
+ " \n",
+ " \n",
+ " VDR \n",
+ " 1450.304353 \n",
+ " 2.555007 \n",
+ " 0.116782 \n",
+ " 21.878467 \n",
+ " 4.166147e-106 \n",
+ " 4.977410e-104 \n",
+ " \n",
+ " \n",
+ " HHIP \n",
+ " 379.064034 \n",
+ " 6.005841 \n",
+ " 0.287374 \n",
+ " 20.899036 \n",
+ " 5.463696e-97 \n",
+ " 5.439689e-95 \n",
+ " \n",
+ " \n",
+ " IGF1 \n",
+ " 361.189076 \n",
+ " 6.462656 \n",
+ " 0.311795 \n",
+ " 20.727232 \n",
+ " 1.967869e-95 \n",
+ " 1.910966e-93 \n",
+ " \n",
+ " \n",
+ " NPTN \n",
+ " 12640.971164 \n",
+ " 1.418676 \n",
+ " 0.079355 \n",
+ " 17.877480 \n",
+ " 1.766413e-71 \n",
+ " 1.095010e-69 \n",
+ " \n",
+ " \n",
+ " EFNB2 \n",
+ " 3320.076805 \n",
+ " 1.560331 \n",
+ " 0.087847 \n",
+ " 17.761861 \n",
+ " 1.395299e-70 \n",
+ " 8.385834e-69 \n",
+ " \n",
+ " \n",
+ " ITGB3 \n",
+ " 6530.314159 \n",
+ " 1.364767 \n",
+ " 0.078772 \n",
+ " 17.325469 \n",
+ " 3.022208e-67 \n",
+ " 1.673505e-65 \n",
+ " \n",
+ " \n",
+ " TGFB1 \n",
+ " 8948.243694 \n",
+ " 1.335271 \n",
+ " 0.077618 \n",
+ " 17.203057 \n",
+ " 2.518840e-66 \n",
+ " 1.367876e-64 \n",
+ " \n",
+ " \n",
+ " IL21R \n",
+ " 259.221468 \n",
+ " 3.227903 \n",
+ " 0.192097 \n",
+ " 16.803541 \n",
+ " 2.298997e-63 \n",
+ " 1.180212e-61 \n",
+ " \n",
+ " \n",
+ " ITGA1 \n",
+ " 26223.832504 \n",
+ " 1.310351 \n",
+ " 0.079830 \n",
+ " 16.414270 \n",
+ " 1.511887e-60 \n",
+ " 7.251541e-59 \n",
+ " \n",
+ " \n",
+ " FAP \n",
+ " 7231.157483 \n",
+ " 1.750901 \n",
+ " 0.115188 \n",
+ " 15.200426 \n",
+ " 3.513274e-52 \n",
+ " 1.413412e-50 \n",
+ " \n",
+ " \n",
+ " EGF \n",
+ " 144.262044 \n",
+ " 3.733301 \n",
+ " 0.251634 \n",
+ " 14.836246 \n",
+ " 8.540295e-50 \n",
+ " 3.194589e-48 \n",
+ " \n",
+ " \n",
+ " ITGA11 \n",
+ " 12471.033668 \n",
+ " 3.673199 \n",
+ " 0.250314 \n",
+ " 14.674378 \n",
+ " 9.407359e-49 \n",
+ " 3.390261e-47 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " baseMean log2FoldChange lfcSE stat pvalue \\\n",
+ "GeneName \n",
+ "CDH6 28262.296983 3.019806 0.077417 39.007075 0.000000e+00 \n",
+ "CRLF1 7919.672343 3.341644 0.087997 37.974317 0.000000e+00 \n",
+ "FZD8 2719.781498 3.843015 0.102696 37.421427 1.751855e-306 \n",
+ "CDH2 7111.507547 2.809461 0.081929 34.291273 1.058818e-257 \n",
+ "DYSF 441.449511 4.593250 0.182207 25.208911 3.198723e-140 \n",
+ "INHBA 24329.359641 2.598613 0.104321 24.909787 5.828479e-137 \n",
+ "CELSR1 492.324435 3.517315 0.154495 22.766506 9.849205e-115 \n",
+ "PDGFC 5481.167075 1.894857 0.083811 22.608707 3.558087e-113 \n",
+ "VDR 1450.304353 2.555007 0.116782 21.878467 4.166147e-106 \n",
+ "HHIP 379.064034 6.005841 0.287374 20.899036 5.463696e-97 \n",
+ "IGF1 361.189076 6.462656 0.311795 20.727232 1.967869e-95 \n",
+ "NPTN 12640.971164 1.418676 0.079355 17.877480 1.766413e-71 \n",
+ "EFNB2 3320.076805 1.560331 0.087847 17.761861 1.395299e-70 \n",
+ "ITGB3 6530.314159 1.364767 0.078772 17.325469 3.022208e-67 \n",
+ "TGFB1 8948.243694 1.335271 0.077618 17.203057 2.518840e-66 \n",
+ "IL21R 259.221468 3.227903 0.192097 16.803541 2.298997e-63 \n",
+ "ITGA1 26223.832504 1.310351 0.079830 16.414270 1.511887e-60 \n",
+ "FAP 7231.157483 1.750901 0.115188 15.200426 3.513274e-52 \n",
+ "EGF 144.262044 3.733301 0.251634 14.836246 8.540295e-50 \n",
+ "ITGA11 12471.033668 3.673199 0.250314 14.674378 9.407359e-49 \n",
+ "\n",
+ " padj \n",
+ "GeneName \n",
+ "CDH6 0.000000e+00 \n",
+ "CRLF1 0.000000e+00 \n",
+ "FZD8 1.817595e-303 \n",
+ "CDH2 6.138964e-255 \n",
+ "DYSF 5.680759e-138 \n",
+ "INHBA 9.655193e-135 \n",
+ "CELSR1 1.303070e-112 \n",
+ "PDGFC 4.676039e-111 \n",
+ "VDR 4.977410e-104 \n",
+ "HHIP 5.439689e-95 \n",
+ "IGF1 1.910966e-93 \n",
+ "NPTN 1.095010e-69 \n",
+ "EFNB2 8.385834e-69 \n",
+ "ITGB3 1.673505e-65 \n",
+ "TGFB1 1.367876e-64 \n",
+ "IL21R 1.180212e-61 \n",
+ "ITGA1 7.251541e-59 \n",
+ "FAP 1.413412e-50 \n",
+ "EGF 3.194589e-48 \n",
+ "ITGA11 3.390261e-47 "
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We will take the top 20 receptors that increased the expression after treatment\n",
+ "df_top_receptors = df_de_receptors.head(20)\n",
+ "df_top_receptors"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4071c630-59d4-4928-b2f1-283eba931d06",
+ "metadata": {},
+ "source": [
+ "## Inferring intracellular signalling network with CARNIVAL and CORNETO\n",
+ "\n",
+ "CORNETO is a unified framework for knowledge-driven network inference. It includes a very flexible implementation of CARNIVAL that expands its original capabilities. We will see how to use it under different assumptions to extract a network from a prior knowledge network and a set of potential receptors + our estimated TFs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "3b2b7222-cc3c-4981-aa82-1f17ee546214",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [],
+ "text/plain": []
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Installed version: v1.0.0.dev1 (latest: v1.0.0.dev0) Available backends: CVXPY v1.5.3 Default backend (corneto.opt): CVXPY Installed solvers: GUROBI, SCIP, SCIPY Graphviz version: v0.20.3 Installed path: C:\\Users\\pablo\\Documents\\work\\projects\\corneto\\corneto Repository: https://github.com/saezlab/corneto \n",
+ "
\n",
+ " \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "cn.info()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "653e2ae6-a86a-4433-aca9-e783662e0848",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " source \n",
+ " target \n",
+ " source_genesymbol \n",
+ " target_genesymbol \n",
+ " is_directed \n",
+ " is_stimulation \n",
+ " is_inhibition \n",
+ " consensus_direction \n",
+ " consensus_stimulation \n",
+ " consensus_inhibition \n",
+ " curation_effort \n",
+ " references \n",
+ " sources \n",
+ " n_sources \n",
+ " n_primary_sources \n",
+ " n_references \n",
+ " references_stripped \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " Q13976 \n",
+ " Q13507 \n",
+ " PRKG1 \n",
+ " TRPC3 \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " 9 \n",
+ " HPRD:14983059;KEA:14983059;ProtMapper:14983059... \n",
+ " HPRD;HPRD_KEA;HPRD_MIMP;KEA;MIMP;PhosphoPoint;... \n",
+ " 15 \n",
+ " 8 \n",
+ " 2 \n",
+ " 14983059;16331690 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Q13976 \n",
+ " Q9HCX4 \n",
+ " PRKG1 \n",
+ " TRPC7 \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " 3 \n",
+ " SIGNOR:21402151;TRIP:21402151;iPTMnet:21402151 \n",
+ " SIGNOR;TRIP;iPTMnet \n",
+ " 3 \n",
+ " 3 \n",
+ " 1 \n",
+ " 21402151 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Q13438 \n",
+ " Q9HBA0 \n",
+ " OS9 \n",
+ " TRPV4 \n",
+ " True \n",
+ " True \n",
+ " True \n",
+ " True \n",
+ " True \n",
+ " True \n",
+ " 3 \n",
+ " HPRD:17932042;SIGNOR:17932042;TRIP:17932042 \n",
+ " HPRD;SIGNOR;TRIP \n",
+ " 3 \n",
+ " 3 \n",
+ " 1 \n",
+ " 17932042 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " P18031 \n",
+ " Q9H1D0 \n",
+ " PTPN1 \n",
+ " TRPV6 \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " 11 \n",
+ " DEPOD:15894168;DEPOD:17197020;HPRD:15894168;In... \n",
+ " DEPOD;HPRD;IntAct;Lit-BM-17;SIGNOR;SPIKE_LC;TRIP \n",
+ " 7 \n",
+ " 6 \n",
+ " 2 \n",
+ " 15894168;17197020 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " P63244 \n",
+ " Q9BX84 \n",
+ " RACK1 \n",
+ " TRPM6 \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " True \n",
+ " 2 \n",
+ " SIGNOR:18258429;TRIP:18258429 \n",
+ " SIGNOR;TRIP \n",
+ " 2 \n",
+ " 2 \n",
+ " 1 \n",
+ " 18258429 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source target source_genesymbol target_genesymbol is_directed \\\n",
+ "0 Q13976 Q13507 PRKG1 TRPC3 True \n",
+ "1 Q13976 Q9HCX4 PRKG1 TRPC7 True \n",
+ "2 Q13438 Q9HBA0 OS9 TRPV4 True \n",
+ "3 P18031 Q9H1D0 PTPN1 TRPV6 True \n",
+ "4 P63244 Q9BX84 RACK1 TRPM6 True \n",
+ "\n",
+ " is_stimulation is_inhibition consensus_direction consensus_stimulation \\\n",
+ "0 False True True False \n",
+ "1 True False True True \n",
+ "2 True True True True \n",
+ "3 False True True False \n",
+ "4 False True True False \n",
+ "\n",
+ " consensus_inhibition curation_effort \\\n",
+ "0 True 9 \n",
+ "1 False 3 \n",
+ "2 True 3 \n",
+ "3 True 11 \n",
+ "4 True 2 \n",
+ "\n",
+ " references \\\n",
+ "0 HPRD:14983059;KEA:14983059;ProtMapper:14983059... \n",
+ "1 SIGNOR:21402151;TRIP:21402151;iPTMnet:21402151 \n",
+ "2 HPRD:17932042;SIGNOR:17932042;TRIP:17932042 \n",
+ "3 DEPOD:15894168;DEPOD:17197020;HPRD:15894168;In... \n",
+ "4 SIGNOR:18258429;TRIP:18258429 \n",
+ "\n",
+ " sources n_sources \\\n",
+ "0 HPRD;HPRD_KEA;HPRD_MIMP;KEA;MIMP;PhosphoPoint;... 15 \n",
+ "1 SIGNOR;TRIP;iPTMnet 3 \n",
+ "2 HPRD;SIGNOR;TRIP 3 \n",
+ "3 DEPOD;HPRD;IntAct;Lit-BM-17;SIGNOR;SPIKE_LC;TRIP 7 \n",
+ "4 SIGNOR;TRIP 2 \n",
+ "\n",
+ " n_primary_sources n_references references_stripped \n",
+ "0 8 2 14983059;16331690 \n",
+ "1 3 1 21402151 \n",
+ "2 3 1 17932042 \n",
+ "3 6 2 15894168;17197020 \n",
+ "4 2 1 18258429 "
+ ]
+ },
+ "execution_count": 58,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We get only interactions from SIGNOR http://signor.uniroma2.it/\n",
+ "pkn = op.interactions.OmniPath.get(databases=['SIGNOR'], genesymbols=True)\n",
+ "pkn = pkn[pkn.consensus_direction==True]\n",
+ "pkn.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "1a040ca9-e406-4f04-82d6-aae294de7eff",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " source_genesymbol \n",
+ " interaction \n",
+ " target_genesymbol \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " PRKG1 \n",
+ " -1 \n",
+ " TRPC3 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " PRKG1 \n",
+ " 1 \n",
+ " TRPC7 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " OS9 \n",
+ " 0 \n",
+ " TRPV4 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " PTPN1 \n",
+ " -1 \n",
+ " TRPV6 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " RACK1 \n",
+ " -1 \n",
+ " TRPM6 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 61579 \n",
+ " DTNBP1 \n",
+ " 1 \n",
+ " WASF2 \n",
+ " \n",
+ " \n",
+ " 61580 \n",
+ " CDK1 \n",
+ " 1 \n",
+ " KMT5A \n",
+ " \n",
+ " \n",
+ " 61581 \n",
+ " PIM2 \n",
+ " 1 \n",
+ " CDKN1A \n",
+ " \n",
+ " \n",
+ " 61582 \n",
+ " AKT1 \n",
+ " 1 \n",
+ " WNK1 \n",
+ " \n",
+ " \n",
+ " 61583 \n",
+ " PRKCA \n",
+ " 1 \n",
+ " CSPG4 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
60903 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source_genesymbol interaction target_genesymbol\n",
+ "0 PRKG1 -1 TRPC3\n",
+ "1 PRKG1 1 TRPC7\n",
+ "2 OS9 0 TRPV4\n",
+ "3 PTPN1 -1 TRPV6\n",
+ "4 RACK1 -1 TRPM6\n",
+ "... ... ... ...\n",
+ "61579 DTNBP1 1 WASF2\n",
+ "61580 CDK1 1 KMT5A\n",
+ "61581 PIM2 1 CDKN1A\n",
+ "61582 AKT1 1 WNK1\n",
+ "61583 PRKCA 1 CSPG4\n",
+ "\n",
+ "[60903 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pkn[\"interaction\"] = pkn[\"is_stimulation\"].astype(int) - pkn[\"is_inhibition\"].astype(int)\n",
+ "sel_pkn = pkn[[\"source_genesymbol\", \"interaction\", \"target_genesymbol\"]]\n",
+ "sel_pkn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "99849f5d-f449-40ae-94af-01d01bcd2240",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(5436, 60020)"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We create the CORNETO graph by importing the edges and interaction\n",
+ "G = cn.Graph.from_sif_tuples([(r[0], r[1], r[2]) for _, r in sel_pkn.iterrows() if r[1] != 0])\n",
+ "G.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "634cac48-79f5-4812-a7bb-8ef37df7bcf9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " treatment.vs.control \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " SRF \n",
+ " 7.421123 \n",
+ " \n",
+ " \n",
+ " MYOCD \n",
+ " 7.372481 \n",
+ " \n",
+ " \n",
+ " SMAD3 \n",
+ " 7.190940 \n",
+ " \n",
+ " \n",
+ " BTG2 \n",
+ " 6.206934 \n",
+ " \n",
+ " \n",
+ " TCF21 \n",
+ " 6.183177 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " SPI1 \n",
+ " -5.427345 \n",
+ " \n",
+ " \n",
+ " NR4A3 \n",
+ " -5.749818 \n",
+ " \n",
+ " \n",
+ " HIF3A \n",
+ " -5.882730 \n",
+ " \n",
+ " \n",
+ " NR1H4 \n",
+ " -6.081834 \n",
+ " \n",
+ " \n",
+ " IRF1 \n",
+ " -9.395861 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
84 rows × 1 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " treatment.vs.control\n",
+ "SRF 7.421123\n",
+ "MYOCD 7.372481\n",
+ "SMAD3 7.190940\n",
+ "BTG2 6.206934\n",
+ "TCF21 6.183177\n",
+ "... ...\n",
+ "SPI1 -5.427345\n",
+ "NR4A3 -5.749818\n",
+ "HIF3A -5.882730\n",
+ "NR1H4 -6.081834\n",
+ "IRF1 -9.395861\n",
+ "\n",
+ "[84 rows x 1 columns]"
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# As measurements, we take the estimated TFs, we will filter out TFs with p-val > 0.001\n",
+ "significant_tfs = tf_acts[tf_pvals <= 0.001].T.dropna().sort_values(by=\"treatment.vs.control\", ascending=False)\n",
+ "significant_tfs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "83c01323-be92-456e-bb46-c79d5147f40a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'SRF': 7.4211225509643555,\n",
+ " 'MYOCD': 7.372481346130371,\n",
+ " 'SMAD3': 7.190939903259277,\n",
+ " 'BTG2': 6.206934452056885,\n",
+ " 'SMAD2': 5.634183883666992,\n",
+ " 'JUNB': 5.632753849029541,\n",
+ " 'HMGA2': 4.937854766845703,\n",
+ " 'POU3F1': 4.921204090118408,\n",
+ " 'RORA': 4.765202045440674,\n",
+ " 'SMAD4': 4.588079452514648,\n",
+ " 'MEF2A': 4.287934303283691,\n",
+ " 'FOSL1': 3.938856363296509,\n",
+ " 'SOX4': 3.9252400398254395,\n",
+ " 'NCOA1': 3.8250725269317627,\n",
+ " 'SFPQ': 3.7440223693847656,\n",
+ " 'FOSB': 3.7315196990966797,\n",
+ " 'SP7': 3.6977312564849854,\n",
+ " 'HBP1': 3.6794629096984863,\n",
+ " 'CREB3': 3.632990837097168,\n",
+ " 'ASXL1': 3.574924945831299,\n",
+ " 'MEIS2': 3.4930355548858643,\n",
+ " 'TAL1': 3.354771852493286,\n",
+ " 'HOXC8': 3.347809314727783,\n",
+ " 'DLX5': 3.3378002643585205,\n",
+ " 'DLX2': -3.2941677570343018,\n",
+ " 'CDX2': -3.2988994121551514,\n",
+ " 'MAFA': -3.310776472091675,\n",
+ " 'STAT5A': -3.430389165878296,\n",
+ " 'RXRB': -3.4593443870544434,\n",
+ " 'MSX2': -3.5386831760406494,\n",
+ " 'SMAD6': -3.5516138076782227,\n",
+ " 'CEBPA': -3.59158992767334,\n",
+ " 'PLAGL1': -3.6208605766296387,\n",
+ " 'RELA': -3.63592267036438,\n",
+ " 'TP53': -3.6599860191345215,\n",
+ " 'NKX2-1': -3.6630992889404297,\n",
+ " 'NFKB1': -3.842646598815918,\n",
+ " 'CEBPB': -3.861898422241211,\n",
+ " 'WWTR1': -3.9853055477142334,\n",
+ " 'SMAD5': -4.020087242126465,\n",
+ " 'VHL': -4.030272483825684,\n",
+ " 'CIITA': -4.151106834411621,\n",
+ " 'NFKBIB': -4.1750593185424805,\n",
+ " 'REL': -4.184780120849609,\n",
+ " 'PITX3': -4.216534614562988,\n",
+ " 'PITX1': -4.358892440795898,\n",
+ " 'MECP2': -4.400153160095215,\n",
+ " 'TGIF1': -4.501400470733643,\n",
+ " 'MECOM': -4.5638203620910645,\n",
+ " 'IRF3': -4.733184814453125,\n",
+ " 'RELB': -4.848578453063965,\n",
+ " 'NFE2L2': -4.937533378601074,\n",
+ " 'STAT1': -5.215514659881592,\n",
+ " 'HOXC6': -5.283187389373779,\n",
+ " 'IRF2': -5.291377544403076,\n",
+ " 'KLF11': -5.293704509735107,\n",
+ " 'SMAD7': -5.3725266456604,\n",
+ " 'SPI1': -5.427344799041748,\n",
+ " 'NR4A3': -5.749818325042725,\n",
+ " 'HIF3A': -5.882729530334473,\n",
+ " 'NR1H4': -6.081834316253662,\n",
+ " 'IRF1': -9.39586067199707}"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We keep only the ones in the PKN graph\n",
+ "measurements = significant_tfs.loc[significant_tfs.index.intersection(G.V)].to_dict()[\"treatment.vs.control\"]\n",
+ "measurements"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "id": "8f644411-e8c8-4072-b62e-230adea6eb08",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'CDH6': 0,\n",
+ " 'CRLF1': 0,\n",
+ " 'FZD8': 0,\n",
+ " 'CDH2': 0,\n",
+ " 'INHBA': 0,\n",
+ " 'VDR': 0,\n",
+ " 'IGF1': 0,\n",
+ " 'EFNB2': 0,\n",
+ " 'ITGB3': 0,\n",
+ " 'TGFB1': 0,\n",
+ " 'IL21R': 0,\n",
+ " 'EGF': 0,\n",
+ " 'ITGA11': 0}"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We will infer the direction, so for the inputs, we use a value of 0 (=unknown direction)\n",
+ "inputs = {k: 0 for k in df_top_receptors.index.intersection(G.V).values}\n",
+ "inputs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "7f5b695a-e965-4e3d-8f7c-55efda9b2eb1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(958, 3279)"
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We prune the network from inputs (receptors) to TFs to improve the performance.\n",
+ "# The pruning step removes only parts of the network that cannot be reached from the pre-selected receptors\n",
+ "from corneto.methods.carnival import preprocess_graph\n",
+ "Gp, inputs_p, measurements_p = preprocess_graph(G, inputs, measurements)\n",
+ "Gp.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "id": "cab88e0f-333a-463a-942a-86aefea03be4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vertices = Gp.V"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "id": "a94e21f6-14a8-4f01-804a-73b88eda11ba",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'vertex_inhibited': Variable((958,), vertex_inhibited, boolean=True),\n",
+ " 'edge_activating': Variable((3279,), edge_activating, boolean=True),\n",
+ " 'edge_inhibiting': Variable((3279,), edge_inhibiting, boolean=True),\n",
+ " 'vertex_activated': Variable((958,), vertex_activated, boolean=True),\n",
+ " 'vertex_position': Variable((958,), vertex_position),\n",
+ " 'vertex_values': Expression(AFFINE, UNKNOWN, (958,)),\n",
+ " 'edge_values': Expression(AFFINE, UNKNOWN, (3279,))}"
+ ]
+ },
+ "execution_count": 75,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from corneto.methods.carnival import milp_carnival\n",
+ "\n",
+ "# We create a CARNIVAL problem\n",
+ "P = milp_carnival(Gp, inputs_p, measurements_p, beta_weight=0.2)\n",
+ "\n",
+ "# The CARNIVAL problem contains useful variables that we will estimate from the data \n",
+ "P.expr"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "id": "3b32b7e6-e5d1-458d-9b52-cc5eb44323c7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'APC_AXIN1_GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R2A', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'CTNNB1', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'CSNK1D', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'AKAP12', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'RARG', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'ERBB2', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'APC_AXIN1_GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R2A', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'CTNNB1', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'CSNK1D', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'AKAP12', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'RARG', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'ERBB2', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM \n",
+ "\n",
+ "ATM \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7 \n",
+ "\n",
+ "FBXW7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->FBXW7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1 \n",
+ "\n",
+ "ABL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->ABL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2 \n",
+ "\n",
+ "CHEK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->CHEK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7->CUL1_RBX1_SKP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2 \n",
+ "\n",
+ "HIPK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->HIPK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN \n",
+ "\n",
+ "PRKN \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->PRKN \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPB \n",
+ "\n",
+ "CEBPB \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->CEBPB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK2 \n",
+ "\n",
+ "JAK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->JAK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MECP2 \n",
+ "\n",
+ "MECP2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->MECP2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1 \n",
+ "\n",
+ "HMGA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->HMGA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1 \n",
+ "\n",
+ "MAPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN \n",
+ "\n",
+ "JUN \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->JUN \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RORA \n",
+ "\n",
+ "RORA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->RORA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300 \n",
+ "\n",
+ "EP300 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->EP300 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT5A \n",
+ "\n",
+ "STAT5A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->STAT5A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAFA \n",
+ "\n",
+ "MAFA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->MAFA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1 \n",
+ "\n",
+ "SPI1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN->SPI1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2 \n",
+ "\n",
+ "NFKB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELB \n",
+ "\n",
+ "RELB \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2->RELB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11 \n",
+ "\n",
+ "TRIP11 \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA \n",
+ "\n",
+ "THRA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11->THRA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARG \n",
+ "\n",
+ "RARG \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA->RARG \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD \n",
+ "\n",
+ "MYOCD \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRF \n",
+ "\n",
+ "SRF \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD->SRF \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53 \n",
+ "\n",
+ "TP53 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53->NFKB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1 \n",
+ "\n",
+ "RB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1->TRIP11 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1 \n",
+ "\n",
+ "TBK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "REL \n",
+ "\n",
+ "REL \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->REL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF3 \n",
+ "\n",
+ "IRF3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->IRF3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1 \n",
+ "\n",
+ "NFKB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA \n",
+ "\n",
+ "RELA \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1->RELA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1 \n",
+ "\n",
+ "EGR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->EGR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA \n",
+ "\n",
+ "PPP2CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->ATM \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->MAPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->RB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2 \n",
+ "\n",
+ "TRAF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->TRAF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1 \n",
+ "\n",
+ "TICAM1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2->TICAM1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1 \n",
+ "\n",
+ "SMURF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6 \n",
+ "\n",
+ "SMAD6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD6 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD5 \n",
+ "\n",
+ "SMAD5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7 \n",
+ "\n",
+ "MAP3K7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6->MAP3K7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1 \n",
+ "\n",
+ "USF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FOSL1 \n",
+ "\n",
+ "FOSL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1->FOSL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7 \n",
+ "\n",
+ "SMAD7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->SMAD7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14 \n",
+ "\n",
+ "MAPK14 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEF2A \n",
+ "\n",
+ "MEF2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->MEF2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUNB \n",
+ "\n",
+ "JUNB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->JUNB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5 \n",
+ "\n",
+ "DLX5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->DLX5 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3 \n",
+ "\n",
+ "SMAD3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SMAD3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B \n",
+ "\n",
+ "GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SP7 \n",
+ "\n",
+ "SP7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SP7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDX2 \n",
+ "\n",
+ "CDX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HBP1 \n",
+ "\n",
+ "HBP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->HBP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PITX1 \n",
+ "\n",
+ "PITX1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1->PITX1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL \n",
+ "\n",
+ "VHL \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL->TP53 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1 \n",
+ "\n",
+ "NCOA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ASXL1 \n",
+ "\n",
+ "ASXL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1->ASXL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IGF1 \n",
+ "\n",
+ "IGF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "APC_AXIN1_GSK3B \n",
+ "\n",
+ "APC_AXIN1_GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "IGF1->APC_AXIN1_GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CSNK1D \n",
+ "\n",
+ "CSNK1D \n",
+ " \n",
+ "\n",
+ "\n",
+ "APC_AXIN1_GSK3B->CSNK1D \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MSX2 \n",
+ "\n",
+ "MSX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5->MSX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA \n",
+ "\n",
+ "PRKCA \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFE2L2 \n",
+ "\n",
+ "NFE2L2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NFE2L2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NR1H4 \n",
+ "\n",
+ "NR1H4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NR1H4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1->TBK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA \n",
+ "\n",
+ "PPP1CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7->PPP1CA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TAL1 \n",
+ "\n",
+ "TAL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1->TAL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1 \n",
+ "\n",
+ "STAT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF2 \n",
+ "\n",
+ "IRF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1->IRF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1 \n",
+ "\n",
+ "TGFB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R2A \n",
+ "\n",
+ "PPP2R2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1->PPP2R2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R2A->PPP2CA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NKX2-1 \n",
+ "\n",
+ "NKX2-1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->NKX2-1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MYOCD \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->NFKB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SFPQ \n",
+ "\n",
+ "SFPQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->SFPQ \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CIITA \n",
+ "\n",
+ "CIITA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CIITA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA \n",
+ "\n",
+ "CEBPA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CEBPA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2 \n",
+ "\n",
+ "SMAD2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD4 \n",
+ "\n",
+ "SMAD4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2->SMAD4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON \n",
+ "\n",
+ "CDON \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON->MAPK14 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2->VHL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH6 \n",
+ "\n",
+ "CDH6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CTNNB1 \n",
+ "\n",
+ "CTNNB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH6->CTNNB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4 \n",
+ "\n",
+ "KLF4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CTNNB1->KLF4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1 \n",
+ "\n",
+ "CDK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA2 \n",
+ "\n",
+ "HMGA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "AKAP12 \n",
+ "\n",
+ "AKAP12 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->AKAP12 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "WWTR1 \n",
+ "\n",
+ "WWTR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CSNK1D->WWTR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIF3A \n",
+ "\n",
+ "HIF3A \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN->HIF3A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKBIB \n",
+ "\n",
+ "NFKBIB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7->NFKBIB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "AKAP12->PRKCA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK2->STAT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1->SMURF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEIS2 \n",
+ "\n",
+ "MEIS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4->MEIS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA \n",
+ "\n",
+ "INHBA \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B \n",
+ "\n",
+ "ACVR2B \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA->ACVR2B \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B->SMAD2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RXRB \n",
+ "\n",
+ "RXRB \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARG->RXRB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA->USF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2 \n",
+ "\n",
+ "CDH2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2->CDON \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGF \n",
+ "\n",
+ "EGF \n",
+ " \n",
+ "\n",
+ "\n",
+ "ERBB2 \n",
+ "\n",
+ "ERBB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGF->ERBB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ERBB2->CDK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3 \n",
+ "\n",
+ "MAPK3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA->MAPK3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->NCOA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "POU3F1 \n",
+ "\n",
+ "POU3F1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1->POU3F1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We first run CARNIVAL using all selected receptors.\n",
+ "# We find the value for the variables using the solver GUROBI\n",
+ "# (needs to be installed with a valid license, academic licenses are free)\n",
+ "# TimeLimit and Seed are GUROBI specific parameters\n",
+ "P.solve(solver=\"GUROBI\", Seed=seed);\n",
+ "\n",
+ "# We extract the selected edges\n",
+ "G_sol = Gp.edge_subgraph(np.flatnonzero(P.expr.edge_values.value))\n",
+ "\n",
+ "# We plot generating custom drawing attributes\n",
+ "values = P.expr.vertex_values.value\n",
+ "vertex_values = {v: values[i] for i, v in enumerate(Gp.V)}\n",
+ "vertex_sol_values = [vertex_values[v] for v in G_sol.V]\n",
+ "G_sol.plot(custom_vertex_attr=cn.pl.create_graphviz_vertex_attributes(G_sol.V, vertex_sol_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "id": "f37de568-afd8-4c83-a4d0-9d36ed258afa",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10.373496770858765\n",
+ "88.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print the values of the objectives:\n",
+ "# - First objective is error (non-fited TFs). \n",
+ "# - Second objective is number of interactions\n",
+ "for o in P.objectives:\n",
+ " print(o.value)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "id": "89140b57-43da-4150-b71f-25956ccad4dd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The CARNIVAL problem can be manipulated for hypothesis exploration.\n",
+ "# For example, we will say that only 1 of the provided receptors has to be selected, at most.\n",
+ "P = milp_carnival(Gp, inputs_p, measurements_p, beta_weight=0.2)\n",
+ "idx_receptors = [vertices.index(k) for k in inputs_p.keys()]\n",
+ "protein_selected = P.expr.vertex_activated + P.expr.vertex_inhibited\n",
+ "P += sum(protein_selected[idx_receptors]) == 1\n",
+ "P.solve(solver=\"GUROBI\", TimeLimit=max_time, Seed=seed);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "id": "538e1d57-3c9f-4513-a89f-0138454ce23e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'CDKN1A', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'KHSRP', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'PDPK1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MUC1', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'APC_AXIN1_GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'CSNK1D', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'RARB', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'CDKN1A', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'KHSRP', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'PDPK1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MUC1', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'APC_AXIN1_GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'CSNK1D', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'RARB', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM \n",
+ "\n",
+ "ATM \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7 \n",
+ "\n",
+ "FBXW7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->FBXW7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1 \n",
+ "\n",
+ "ABL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->ABL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300 \n",
+ "\n",
+ "EP300 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->EP300 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2 \n",
+ "\n",
+ "CHEK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->CHEK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7->CUL1_RBX1_SKP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDKN1A \n",
+ "\n",
+ "CDKN1A \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1 \n",
+ "\n",
+ "CDK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDKN1A->CDK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA2 \n",
+ "\n",
+ "HMGA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1 \n",
+ "\n",
+ "HMGA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14 \n",
+ "\n",
+ "MAPK14 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDKN1A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KHSRP \n",
+ "\n",
+ "KHSRP \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->KHSRP \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUNB \n",
+ "\n",
+ "JUNB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->JUNB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B \n",
+ "\n",
+ "GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5 \n",
+ "\n",
+ "DLX5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->DLX5 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SP7 \n",
+ "\n",
+ "SP7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SP7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDX2 \n",
+ "\n",
+ "CDX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HBP1 \n",
+ "\n",
+ "HBP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->HBP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC \n",
+ "\n",
+ "SRC \n",
+ " \n",
+ "\n",
+ "\n",
+ "KHSRP->SRC \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2 \n",
+ "\n",
+ "HIPK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->HIPK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN \n",
+ "\n",
+ "PRKN \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->PRKN \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53 \n",
+ "\n",
+ "TP53 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->TP53 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MECP2 \n",
+ "\n",
+ "MECP2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->MECP2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2 \n",
+ "\n",
+ "NFKB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELB \n",
+ "\n",
+ "RELB \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2->RELB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11 \n",
+ "\n",
+ "TRIP11 \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA \n",
+ "\n",
+ "THRA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11->THRA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARB \n",
+ "\n",
+ "RARB \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA->RARB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD \n",
+ "\n",
+ "MYOCD \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRF \n",
+ "\n",
+ "SRF \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD->SRF \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53->NFKB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1 \n",
+ "\n",
+ "RB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1->TRIP11 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1 \n",
+ "\n",
+ "MAPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RORA \n",
+ "\n",
+ "RORA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->RORA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAFA \n",
+ "\n",
+ "MAFA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->MAFA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "APC_AXIN1_GSK3B \n",
+ "\n",
+ "APC_AXIN1_GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->APC_AXIN1_GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2 \n",
+ "\n",
+ "SMAD2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEF2A \n",
+ "\n",
+ "MEF2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2->MEF2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1 \n",
+ "\n",
+ "TBK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "REL \n",
+ "\n",
+ "REL \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->REL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF3 \n",
+ "\n",
+ "IRF3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->IRF3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1 \n",
+ "\n",
+ "NFKB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA \n",
+ "\n",
+ "RELA \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1->RELA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1 \n",
+ "\n",
+ "EGR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->EGR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN \n",
+ "\n",
+ "JUN \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->JUN \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PDPK1 \n",
+ "\n",
+ "PDPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC->PDPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA \n",
+ "\n",
+ "PPP2CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC->PPP2CA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1 \n",
+ "\n",
+ "STAT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC->STAT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT5A \n",
+ "\n",
+ "STAT5A \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC->STAT5A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA \n",
+ "\n",
+ "PRKCA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PDPK1->PRKCA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->ATM \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->RB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->MAPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2 \n",
+ "\n",
+ "TRAF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->TRAF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1 \n",
+ "\n",
+ "TICAM1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2->TICAM1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1 \n",
+ "\n",
+ "SMURF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6 \n",
+ "\n",
+ "SMAD6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD6 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD5 \n",
+ "\n",
+ "SMAD5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7 \n",
+ "\n",
+ "MAP3K7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6->MAP3K7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1 \n",
+ "\n",
+ "USF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FOSL1 \n",
+ "\n",
+ "FOSL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1->FOSL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PITX1 \n",
+ "\n",
+ "PITX1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1->PITX1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3 \n",
+ "\n",
+ "SMAD3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD4 \n",
+ "\n",
+ "SMAD4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->SMAD4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NKX2-1 \n",
+ "\n",
+ "NKX2-1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->NKX2-1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA \n",
+ "\n",
+ "CEBPA \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->CEBPA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPB \n",
+ "\n",
+ "CEBPB \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->CEBPB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MYOCD \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->NFKB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MUC1 \n",
+ "\n",
+ "MUC1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MUC1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SFPQ \n",
+ "\n",
+ "SFPQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->SFPQ \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CIITA \n",
+ "\n",
+ "CIITA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CIITA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4 \n",
+ "\n",
+ "KLF4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MUC1->KLF4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1 \n",
+ "\n",
+ "NCOA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ASXL1 \n",
+ "\n",
+ "ASXL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1->ASXL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MSX2 \n",
+ "\n",
+ "MSX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5->MSX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFE2L2 \n",
+ "\n",
+ "NFE2L2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NFE2L2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NR1H4 \n",
+ "\n",
+ "NR1H4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NR1H4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1->TBK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7 \n",
+ "\n",
+ "SMAD7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->SMAD7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA \n",
+ "\n",
+ "PPP1CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7->PPP1CA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1 \n",
+ "\n",
+ "SPI1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN->SPI1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TAL1 \n",
+ "\n",
+ "TAL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1->TAL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF2 \n",
+ "\n",
+ "IRF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1->IRF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON \n",
+ "\n",
+ "CDON \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON->MAPK14 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL \n",
+ "\n",
+ "VHL \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2->VHL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CSNK1D \n",
+ "\n",
+ "CSNK1D \n",
+ " \n",
+ "\n",
+ "\n",
+ "APC_AXIN1_GSK3B->CSNK1D \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "WWTR1 \n",
+ "\n",
+ "WWTR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CSNK1D->WWTR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIF3A \n",
+ "\n",
+ "HIF3A \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN->HIF3A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKBIB \n",
+ "\n",
+ "NFKBIB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7->NFKBIB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3 \n",
+ "\n",
+ "MAPK3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->NCOA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PML \n",
+ "\n",
+ "PML \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->PML \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PML->SMAD2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PML->SMAD3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA->USF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1->SMURF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEIS2 \n",
+ "\n",
+ "MEIS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4->MEIS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "POU3F1 \n",
+ "\n",
+ "POU3F1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1->POU3F1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2 \n",
+ "\n",
+ "CDH2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2->CDON \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA->MAPK3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RXRB \n",
+ "\n",
+ "RXRB \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARB->RXRB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 79,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We extract the edges that have some signal (edge_values != 0)\n",
+ "# We select the sub-graph from the processed PKN\n",
+ "G_sol = Gp.edge_subgraph(np.flatnonzero(P.expr.edge_values.value))\n",
+ "\n",
+ "# We plot generating custom drawing attributes\n",
+ "values = P.expr.vertex_values.value\n",
+ "vertex_values = {v: values[i] for i, v in enumerate(Gp.V)}\n",
+ "vertex_sol_values = [vertex_values[v] for v in G_sol.V]\n",
+ "G_sol.plot(custom_vertex_attr=cn.pl.create_graphviz_vertex_attributes(G_sol.V, vertex_sol_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "id": "7c0cba49-68d4-4c30-99f9-684c4f346979",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10.373496770858765\n",
+ "88.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print the values of the objectives:\n",
+ "# - First objective is error (non-fited TFs). \n",
+ "# - Second objective is number of interactions\n",
+ "for o in P.objectives:\n",
+ " print(o.value)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1a182f07-2ca6-4d4e-9e78-f9d655444750",
+ "metadata": {},
+ "source": [
+ "## Adding more knowledge\n",
+ "\n",
+ "We can add more prior knowledge to the CARNIVAL problem. For example, we are going to penalise genes that are lowly abundant, according to the average basal gene expression levels. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 101,
+ "id": "f38f62f5-ff99-4c4c-8281-b6dc4856ba58",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " baseMean \n",
+ " log2FoldChange \n",
+ " lfcSE \n",
+ " stat \n",
+ " pvalue \n",
+ " padj \n",
+ " \n",
+ " \n",
+ " GeneName \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " TRIM17 \n",
+ " 53.443434 \n",
+ " -0.689125 \n",
+ " 0.300338 \n",
+ " -2.294499 \n",
+ " 0.021762 \n",
+ " 0.050210 \n",
+ " \n",
+ " \n",
+ " NLGN3 \n",
+ " 32.581601 \n",
+ " -0.895798 \n",
+ " 0.390573 \n",
+ " -2.293545 \n",
+ " 0.021817 \n",
+ " 0.050307 \n",
+ " \n",
+ " \n",
+ " RP11-1109F11.3 \n",
+ " 11.672715 \n",
+ " -1.587070 \n",
+ " 0.692036 \n",
+ " -2.293336 \n",
+ " 0.021829 \n",
+ " 0.050323 \n",
+ " \n",
+ " \n",
+ " RP11-661A12.5 \n",
+ " 15.285895 \n",
+ " -1.297808 \n",
+ " 0.566496 \n",
+ " -2.290938 \n",
+ " 0.021967 \n",
+ " 0.050602 \n",
+ " \n",
+ " \n",
+ " RP11-77K12.7 \n",
+ " 25.489581 \n",
+ " -0.991542 \n",
+ " 0.432922 \n",
+ " -2.290350 \n",
+ " 0.022001 \n",
+ " 0.050661 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " GDPD1 \n",
+ " 74.892252 \n",
+ " 0.000326 \n",
+ " 0.262746 \n",
+ " 0.001241 \n",
+ " 0.999010 \n",
+ " 0.999415 \n",
+ " \n",
+ " \n",
+ " RP11-452K12.7 \n",
+ " 49.986985 \n",
+ " -0.000259 \n",
+ " 0.302890 \n",
+ " -0.000855 \n",
+ " 0.999317 \n",
+ " 0.999520 \n",
+ " \n",
+ " \n",
+ " MIR6859-1 \n",
+ " 10.114621 \n",
+ " 0.000625 \n",
+ " 0.657581 \n",
+ " 0.000950 \n",
+ " 0.999242 \n",
+ " 0.999520 \n",
+ " \n",
+ " \n",
+ " RP11-463C8.4 \n",
+ " 48.479410 \n",
+ " -0.000280 \n",
+ " 0.305891 \n",
+ " -0.000916 \n",
+ " 0.999269 \n",
+ " 0.999520 \n",
+ " \n",
+ " \n",
+ " AIF1L \n",
+ " 11.870434 \n",
+ " -0.000351 \n",
+ " 0.619997 \n",
+ " -0.000566 \n",
+ " 0.999549 \n",
+ " 0.999599 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
3750 rows × 6 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " baseMean log2FoldChange lfcSE stat pvalue \\\n",
+ "GeneName \n",
+ "TRIM17 53.443434 -0.689125 0.300338 -2.294499 0.021762 \n",
+ "NLGN3 32.581601 -0.895798 0.390573 -2.293545 0.021817 \n",
+ "RP11-1109F11.3 11.672715 -1.587070 0.692036 -2.293336 0.021829 \n",
+ "RP11-661A12.5 15.285895 -1.297808 0.566496 -2.290938 0.021967 \n",
+ "RP11-77K12.7 25.489581 -0.991542 0.432922 -2.290350 0.022001 \n",
+ "... ... ... ... ... ... \n",
+ "GDPD1 74.892252 0.000326 0.262746 0.001241 0.999010 \n",
+ "RP11-452K12.7 49.986985 -0.000259 0.302890 -0.000855 0.999317 \n",
+ "MIR6859-1 10.114621 0.000625 0.657581 0.000950 0.999242 \n",
+ "RP11-463C8.4 48.479410 -0.000280 0.305891 -0.000916 0.999269 \n",
+ "AIF1L 11.870434 -0.000351 0.619997 -0.000566 0.999549 \n",
+ "\n",
+ " padj \n",
+ "GeneName \n",
+ "TRIM17 0.050210 \n",
+ "NLGN3 0.050307 \n",
+ "RP11-1109F11.3 0.050323 \n",
+ "RP11-661A12.5 0.050602 \n",
+ "RP11-77K12.7 0.050661 \n",
+ "... ... \n",
+ "GDPD1 0.999415 \n",
+ "RP11-452K12.7 0.999520 \n",
+ "MIR6859-1 0.999520 \n",
+ "RP11-463C8.4 0.999520 \n",
+ "AIF1L 0.999599 \n",
+ "\n",
+ "[3750 rows x 6 columns]"
+ ]
+ },
+ "execution_count": 101,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_lowly_abundant_genes = results_df[(results_df.baseMean <= results_df.baseMean.quantile(0.25)) & (results_df.padj >= 0.05)]\n",
+ "df_lowly_abundant_genes.sort_values(by=\"padj\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 103,
+ "id": "fd4b32f4-aa01-488f-b6b8-52d50882a3b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "({'CARD11',\n",
+ " 'DCC',\n",
+ " 'DLX2',\n",
+ " 'ERBB3',\n",
+ " 'FERMT3',\n",
+ " 'GHR',\n",
+ " 'HOXC8',\n",
+ " 'INPP5D',\n",
+ " 'ITGB4',\n",
+ " 'MAF',\n",
+ " 'MSX1',\n",
+ " 'NOXO1',\n",
+ " 'PARD6A',\n",
+ " 'PLEKHG6',\n",
+ " 'PSTPIP1',\n",
+ " 'PTPN22',\n",
+ " 'RPS6KA5',\n",
+ " 'TEC',\n",
+ " 'TIAM1'},\n",
+ " 19)"
+ ]
+ },
+ "execution_count": 103,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lowly_abundant_genes = set(Gp.V).intersection(df_lowly_abundant_genes.index.tolist())\n",
+ "lowly_abundant_genes, len(lowly_abundant_genes)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "id": "201455a9-04be-4558-98ff-377721cc413b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0.01, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0.01, 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0.01, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.01,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0.01, 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0.01, 0. , 0.01, 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0.01, 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n",
+ " 0. ])"
+ ]
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Now we will add a penalty to avoid selecting lowly expressed genes\n",
+ "vertices = Gp.V\n",
+ "penalties = np.zeros(Gp.num_vertices)\n",
+ "penalties[[vertices.index(v) for v in lowly_abundant_genes.intersection(vertices)]] = 0.01\n",
+ "penalties"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 105,
+ "id": "25208669-b019-4ec8-afe8-4d1cda41cd14",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\pablo\\miniconda3\\envs\\corneto-dev-mini\\Lib\\site-packages\\cvxpy\\problems\\problem.py:158: UserWarning: Objective contains too many subexpressions. Consider vectorizing your CVXPY code to speed up compilation.\n",
+ " warnings.warn(\"Objective contains too many subexpressions. \"\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Create the carnival problem\n",
+ "P = milp_carnival(Gp, inputs_p, measurements_p, beta_weight=0.2)\n",
+ "\n",
+ "# We penalize the inclusion of lowly expressed genes:\n",
+ "# protein_selected is just the sum of the binary variables vertex activated and vertex inhibited, defined in carnival.\n",
+ "# these variables are mutually exclusive, so the sum is at most 1, meaning that the vertex was selected, either activated (+1) or inhibited (-1)\n",
+ "protein_selected = P.expr.vertex_activated + P.expr.vertex_inhibited\n",
+ "\n",
+ "# We multiply the vector variable of selected proteins and the penalties to\n",
+ "# sum the total cost: sum (v1 * penalty1 + v2 * penalty2, + v3 ...) and we add this as an objective\n",
+ "penalty_vertices = protein_selected @ penalties \n",
+ "P.add_objectives(penalty_vertices)\n",
+ "\n",
+ "# Select only 1 receptor\n",
+ "protein_selected = P.expr.vertex_activated + P.expr.vertex_inhibited\n",
+ "#P += sum(protein_selected[idx_receptors]) == 1\n",
+ "\n",
+ "P.solve(solver=\"GUROBI\", Seed=seed, TimeLimit=max_time);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 106,
+ "id": "a4c0f22c-748e-457e-9223-8c83f5829897",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'APC_AXIN1_GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R2A', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'CTNNB1', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'PTPRR', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'CSNK1D', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'ERBB2', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'RARB', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'APC_AXIN1_GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R2A', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'CTNNB1', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'PTPRR', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'CSNK1D', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'ERBB2', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'RARB', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM \n",
+ "\n",
+ "ATM \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7 \n",
+ "\n",
+ "FBXW7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->FBXW7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1 \n",
+ "\n",
+ "ABL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->ABL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2 \n",
+ "\n",
+ "CHEK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->CHEK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7->CUL1_RBX1_SKP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA \n",
+ "\n",
+ "PRKCA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53 \n",
+ "\n",
+ "TP53 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->TP53 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFE2L2 \n",
+ "\n",
+ "NFE2L2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NFE2L2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NR1H4 \n",
+ "\n",
+ "NR1H4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NR1H4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2 \n",
+ "\n",
+ "NFKB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53->NFKB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2 \n",
+ "\n",
+ "HIPK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->HIPK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN \n",
+ "\n",
+ "PRKN \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->PRKN \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MECP2 \n",
+ "\n",
+ "MECP2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->MECP2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELB \n",
+ "\n",
+ "RELB \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2->RELB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11 \n",
+ "\n",
+ "TRIP11 \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA \n",
+ "\n",
+ "THRA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11->THRA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARB \n",
+ "\n",
+ "RARB \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA->RARB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1 \n",
+ "\n",
+ "PHLPP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1->PRKCA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD \n",
+ "\n",
+ "MYOCD \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRF \n",
+ "\n",
+ "SRF \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD->SRF \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1 \n",
+ "\n",
+ "RB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1->TRIP11 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1 \n",
+ "\n",
+ "MAPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RORA \n",
+ "\n",
+ "RORA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->RORA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300 \n",
+ "\n",
+ "EP300 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->EP300 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PTPRR \n",
+ "\n",
+ "PTPRR \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->PTPRR \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT5A \n",
+ "\n",
+ "STAT5A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->STAT5A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAFA \n",
+ "\n",
+ "MAFA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->MAFA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2 \n",
+ "\n",
+ "SMAD2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEF2A \n",
+ "\n",
+ "MEF2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2->MEF2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1 \n",
+ "\n",
+ "TBK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "REL \n",
+ "\n",
+ "REL \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->REL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF3 \n",
+ "\n",
+ "IRF3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->IRF3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA \n",
+ "\n",
+ "PPP2CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->ATM \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->RB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->MAPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2 \n",
+ "\n",
+ "TRAF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->TRAF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1 \n",
+ "\n",
+ "TICAM1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2->TICAM1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1 \n",
+ "\n",
+ "SMURF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6 \n",
+ "\n",
+ "SMAD6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD6 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD5 \n",
+ "\n",
+ "SMAD5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7 \n",
+ "\n",
+ "MAP3K7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6->MAP3K7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1 \n",
+ "\n",
+ "USF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FOSL1 \n",
+ "\n",
+ "FOSL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1->FOSL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7 \n",
+ "\n",
+ "SMAD7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->SMAD7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14 \n",
+ "\n",
+ "MAPK14 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUNB \n",
+ "\n",
+ "JUNB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->JUNB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3 \n",
+ "\n",
+ "SMAD3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SMAD3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5 \n",
+ "\n",
+ "DLX5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->DLX5 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B \n",
+ "\n",
+ "GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SP7 \n",
+ "\n",
+ "SP7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SP7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDX2 \n",
+ "\n",
+ "CDX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HBP1 \n",
+ "\n",
+ "HBP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->HBP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA \n",
+ "\n",
+ "RELA \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1 \n",
+ "\n",
+ "EGR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->EGR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN \n",
+ "\n",
+ "JUN \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->JUN \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PITX1 \n",
+ "\n",
+ "PITX1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1->PITX1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD4 \n",
+ "\n",
+ "SMAD4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->SMAD4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NKX2-1 \n",
+ "\n",
+ "NKX2-1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->NKX2-1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPB \n",
+ "\n",
+ "CEBPB \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->CEBPB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1 \n",
+ "\n",
+ "NCOA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ASXL1 \n",
+ "\n",
+ "ASXL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1->ASXL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IGF1 \n",
+ "\n",
+ "IGF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "APC_AXIN1_GSK3B \n",
+ "\n",
+ "APC_AXIN1_GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "IGF1->APC_AXIN1_GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CSNK1D \n",
+ "\n",
+ "CSNK1D \n",
+ " \n",
+ "\n",
+ "\n",
+ "APC_AXIN1_GSK3B->CSNK1D \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MSX2 \n",
+ "\n",
+ "MSX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5->MSX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1->TBK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA \n",
+ "\n",
+ "PPP1CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7->PPP1CA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1 \n",
+ "\n",
+ "SPI1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN->SPI1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TAL1 \n",
+ "\n",
+ "TAL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1->TAL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1 \n",
+ "\n",
+ "STAT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF2 \n",
+ "\n",
+ "IRF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1->IRF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1 \n",
+ "\n",
+ "TGFB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R2A \n",
+ "\n",
+ "PPP2R2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1->PPP2R2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R2A->PPP2CA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->PHLPP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MYOCD \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->RELA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SFPQ \n",
+ "\n",
+ "SFPQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->SFPQ \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1 \n",
+ "\n",
+ "NFKB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->NFKB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CIITA \n",
+ "\n",
+ "CIITA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CIITA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA \n",
+ "\n",
+ "CEBPA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CEBPA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL \n",
+ "\n",
+ "VHL \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2->VHL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH6 \n",
+ "\n",
+ "CDH6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CTNNB1 \n",
+ "\n",
+ "CTNNB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH6->CTNNB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4 \n",
+ "\n",
+ "KLF4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CTNNB1->KLF4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1 \n",
+ "\n",
+ "CDK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA2 \n",
+ "\n",
+ "HMGA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1 \n",
+ "\n",
+ "HMGA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PTPRR->MAPK14 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "WWTR1 \n",
+ "\n",
+ "WWTR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CSNK1D->WWTR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIF3A \n",
+ "\n",
+ "HIF3A \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN->HIF3A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IL21R \n",
+ "\n",
+ "IL21R \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK1 \n",
+ "\n",
+ "JAK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "IL21R->JAK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK1->STAT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKBIB \n",
+ "\n",
+ "NFKBIB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7->NFKBIB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1->SMURF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEIS2 \n",
+ "\n",
+ "MEIS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4->MEIS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA \n",
+ "\n",
+ "INHBA \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B \n",
+ "\n",
+ "ACVR2B \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA->ACVR2B \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B->SMAD2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA->USF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "POU3F1 \n",
+ "\n",
+ "POU3F1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1->POU3F1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGF \n",
+ "\n",
+ "EGF \n",
+ " \n",
+ "\n",
+ "\n",
+ "ERBB2 \n",
+ "\n",
+ "ERBB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGF->ERBB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ERBB2->CDK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3 \n",
+ "\n",
+ "MAPK3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA->MAPK3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->NCOA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RXRB \n",
+ "\n",
+ "RXRB \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARB->RXRB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 106,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "G_sol = Gp.edge_subgraph(np.flatnonzero(P.expr.edge_values.value))\n",
+ "values = P.expr.vertex_values.value\n",
+ "vertex_values = {v: values[i] for i, v in enumerate(Gp.V)}\n",
+ "vertex_sol_values = [vertex_values[v] for v in G_sol.V]\n",
+ "G_sol.plot(custom_vertex_attr=cn.pl.create_graphviz_vertex_attributes(G_sol.V, vertex_sol_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "id": "897bd341-948d-4026-a17a-b0b6b6796f4d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10.373496770858765\n",
+ "88.0\n",
+ "0.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print the values of the objectives:\n",
+ "for o in P.objectives:\n",
+ " print(o.value)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "id": "16795952-fb4a-4490-b418-6439fbf5ae5d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(949, 3261)"
+ ]
+ },
+ "execution_count": 108,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Now we are going to force that only TGFB1 (active)\n",
+ "Gp, inputs_p, measurements_p = preprocess_graph(G, {\"TGFB1\": 1}, measurements)\n",
+ "Gp.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 109,
+ "id": "56fab499-da46-4387-8b53-04f2a050d7b1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "P = milp_carnival(Gp, inputs_p, measurements_p, beta_weight=0.2)\n",
+ "P.solve(solver=\"GUROBI\", Seed=seed, TimeLimit=max_time);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 110,
+ "id": "73530ad5-a8b8-41fb-b8ba-087c8ecb592a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10.373496770858765\n",
+ "90.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Same error but +2 edges were included to explain the TFs\n",
+ "for o in P.objectives:\n",
+ " print(o.value)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 111,
+ "id": "170e8316-5307-48de-8ba5-5a69091ac237",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Warning: node 'CDKN1A', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'DUSP16', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MUC1', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'AURKA', graph '%3' size too small for label\n",
+ "Warning: node 'LATS2', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'KHSRP', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'PIK3CA_PIK3R1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'RARG', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n",
+ "Warning: node 'CDKN1A', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'DUSP16', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MUC1', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'AURKA', graph '%3' size too small for label\n",
+ "Warning: node 'LATS2', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'KHSRP', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'PIK3CA_PIK3R1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'PPP1CA', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'RARG', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "CDKN1A \n",
+ "\n",
+ "CDKN1A \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1 \n",
+ "\n",
+ "CDK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDKN1A->CDK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53 \n",
+ "\n",
+ "TP53 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->TP53 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA2 \n",
+ "\n",
+ "HMGA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11 \n",
+ "\n",
+ "TRIP11 \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA \n",
+ "\n",
+ "THRA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11->THRA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARG \n",
+ "\n",
+ "RARG \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA->RARG \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1 \n",
+ "\n",
+ "ABL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2 \n",
+ "\n",
+ "HIPK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->HIPK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN \n",
+ "\n",
+ "PRKN \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->PRKN \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPB \n",
+ "\n",
+ "CEBPB \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->CEBPB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MECP2 \n",
+ "\n",
+ "MECP2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->MECP2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1 \n",
+ "\n",
+ "HMGA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->HMGA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1 \n",
+ "\n",
+ "MAPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN \n",
+ "\n",
+ "JUN \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->JUN \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RORA \n",
+ "\n",
+ "RORA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->RORA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DUSP16 \n",
+ "\n",
+ "DUSP16 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->DUSP16 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT5A \n",
+ "\n",
+ "STAT5A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->STAT5A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAFA \n",
+ "\n",
+ "MAFA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->MAFA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1 \n",
+ "\n",
+ "SPI1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN->SPI1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1 \n",
+ "\n",
+ "PHLPP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA \n",
+ "\n",
+ "PRKCA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1->PRKCA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFE2L2 \n",
+ "\n",
+ "NFE2L2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NFE2L2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NR1H4 \n",
+ "\n",
+ "NR1H4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NR1H4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD \n",
+ "\n",
+ "MYOCD \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRF \n",
+ "\n",
+ "SRF \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD->SRF \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2 \n",
+ "\n",
+ "NFKB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53->NFKB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELB \n",
+ "\n",
+ "RELB \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2->RELB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1 \n",
+ "\n",
+ "RB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1->TRIP11 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1 \n",
+ "\n",
+ "TBK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "REL \n",
+ "\n",
+ "REL \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->REL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF3 \n",
+ "\n",
+ "IRF3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->IRF3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA \n",
+ "\n",
+ "PPP2CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->MAPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->RB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2 \n",
+ "\n",
+ "TRAF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->TRAF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM \n",
+ "\n",
+ "ATM \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->ATM \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1 \n",
+ "\n",
+ "TICAM1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2->TICAM1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1 \n",
+ "\n",
+ "SMURF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6 \n",
+ "\n",
+ "SMAD6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD6 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD5 \n",
+ "\n",
+ "SMAD5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7 \n",
+ "\n",
+ "MAP3K7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6->MAP3K7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14 \n",
+ "\n",
+ "MAPK14 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DUSP16->MAPK14 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDKN1A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUNB \n",
+ "\n",
+ "JUNB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->JUNB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEF2A \n",
+ "\n",
+ "MEF2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->MEF2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B \n",
+ "\n",
+ "GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5 \n",
+ "\n",
+ "DLX5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->DLX5 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3 \n",
+ "\n",
+ "SMAD3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SMAD3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SP7 \n",
+ "\n",
+ "SP7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SP7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDX2 \n",
+ "\n",
+ "CDX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HBP1 \n",
+ "\n",
+ "HBP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->HBP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1 \n",
+ "\n",
+ "USF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FOSL1 \n",
+ "\n",
+ "FOSL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1->FOSL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA \n",
+ "\n",
+ "RELA \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1 \n",
+ "\n",
+ "EGR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->EGR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PITX1 \n",
+ "\n",
+ "PITX1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1->PITX1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->PHLPP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MYOCD \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->RELA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MUC1 \n",
+ "\n",
+ "MUC1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MUC1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SFPQ \n",
+ "\n",
+ "SFPQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->SFPQ \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1 \n",
+ "\n",
+ "NFKB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->NFKB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CIITA \n",
+ "\n",
+ "CIITA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CIITA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA \n",
+ "\n",
+ "CEBPA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CEBPA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4 \n",
+ "\n",
+ "KLF4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MUC1->KLF4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1 \n",
+ "\n",
+ "NCOA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ASXL1 \n",
+ "\n",
+ "ASXL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1->ASXL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MSX2 \n",
+ "\n",
+ "MSX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5->MSX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD4 \n",
+ "\n",
+ "SMAD4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->SMAD4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NKX2-1 \n",
+ "\n",
+ "NKX2-1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->NKX2-1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TAL1 \n",
+ "\n",
+ "TAL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1->TAL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1 \n",
+ "\n",
+ "STAT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF2 \n",
+ "\n",
+ "IRF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1->IRF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->ABL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300 \n",
+ "\n",
+ "EP300 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->EP300 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2 \n",
+ "\n",
+ "CHEK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->CHEK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7 \n",
+ "\n",
+ "FBXW7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->FBXW7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7 \n",
+ "\n",
+ "SMAD7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->SMAD7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA \n",
+ "\n",
+ "PPP1CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7->PPP1CA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1->TBK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "AURKA \n",
+ "\n",
+ "AURKA \n",
+ " \n",
+ "\n",
+ "\n",
+ "LATS2 \n",
+ "\n",
+ "LATS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "AURKA->LATS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "WWTR1 \n",
+ "\n",
+ "WWTR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "LATS2->WWTR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL \n",
+ "\n",
+ "VHL \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2->VHL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC \n",
+ "\n",
+ "SRC \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC->PPP2CA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRC->STAT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIF3A \n",
+ "\n",
+ "HIF3A \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN->HIF3A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKBIB \n",
+ "\n",
+ "NFKBIB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7->NFKBIB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "AKT1 \n",
+ "\n",
+ "AKT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KHSRP \n",
+ "\n",
+ "KHSRP \n",
+ " \n",
+ "\n",
+ "\n",
+ "AKT1->KHSRP \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KHSRP->SRC \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3 \n",
+ "\n",
+ "MAPK3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->NCOA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PML \n",
+ "\n",
+ "PML \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->PML \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2 \n",
+ "\n",
+ "SMAD2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PML->SMAD2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7->CUL1_RBX1_SKP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1->SMURF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PIK3CA_PIK3R1 \n",
+ "\n",
+ "PIK3CA_PIK3R1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PIK3CA_PIK3R1->AKT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1 \n",
+ "\n",
+ "TGFB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1->PIK3CA_PIK3R1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEIS2 \n",
+ "\n",
+ "MEIS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4->MEIS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA->AURKA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP1CA->MAPK3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA->USF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RXRB \n",
+ "\n",
+ "RXRB \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARG->RXRB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "POU3F1 \n",
+ "\n",
+ "POU3F1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1->POU3F1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 111,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "G_sol = Gp.edge_subgraph(np.flatnonzero(P.expr.edge_values.value))\n",
+ "values = P.expr.vertex_values.value\n",
+ "vertex_values = {v: values[i] for i, v in enumerate(Gp.V)}\n",
+ "vertex_sol_values = [vertex_values[v] for v in G_sol.V]\n",
+ "G_sol.plot(custom_vertex_attr=cn.pl.create_graphviz_vertex_attributes(G_sol.V, vertex_sol_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 112,
+ "id": "6380c9af-ef90-4bb7-8337-9b6981d5c5ea",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Biasing the networks towards activatory interactions\n",
+ "\n",
+ "# Create the carnival problem with Beta = 0 (to not equally penalise all interactions)\n",
+ "#Gp, inputs_p, measurements_p = preprocess_graph(G, {\"TGFB1\": 0}, measurements)\n",
+ "Gp, inputs_p, measurements_p = preprocess_graph(G, inputs, measurements)\n",
+ "P = milp_carnival(Gp, inputs_p, measurements_p, beta_weight=0)\n",
+ "\n",
+ "# Bias towards activations, by penalizing only inhibitions\n",
+ "P.add_objectives(P.expr.edge_inhibiting.sum(), weights=0.2)\n",
+ "\n",
+ "# Much smaller penalty for activations, since we only want to penalise them\n",
+ "# slightly to avoid having spurious interactions. However, inhibitions are\n",
+ "# penalised 20x more than activations (weight 0.2 vs 0.01)\n",
+ "P.add_objectives(P.expr.edge_activating.sum(), weights=0.01)\n",
+ "\n",
+ "P.solve(solver=\"GUROBI\", TimeLimit=max_time, Seed=seed);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 113,
+ "id": "b0e07155-d54f-4e4a-8ba3-a4384aef0d8a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R5C', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'PTPN7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAP2K1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCQ', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'CTNNB1', graph '%3' size too small for label\n",
+ "Warning: node 'LATS2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'STAT6', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'GATA2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'ERBB2', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'RARB', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R5C', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'PTPN7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAP2K1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCQ', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'CTNNB1', graph '%3' size too small for label\n",
+ "Warning: node 'LATS2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'STAT6', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'GATA2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'ERBB2', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'RARB', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM \n",
+ "\n",
+ "ATM \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7 \n",
+ "\n",
+ "FBXW7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->FBXW7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1 \n",
+ "\n",
+ "ABL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->ABL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2 \n",
+ "\n",
+ "CHEK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->CHEK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7->CUL1_RBX1_SKP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1 \n",
+ "\n",
+ "MAPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R5C \n",
+ "\n",
+ "PPP2R5C \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->PPP2R5C \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RORA \n",
+ "\n",
+ "RORA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->RORA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300 \n",
+ "\n",
+ "EP300 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->EP300 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT5A \n",
+ "\n",
+ "STAT5A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->STAT5A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAFA \n",
+ "\n",
+ "MAFA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->MAFA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA \n",
+ "\n",
+ "PPP2CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R5C->PPP2CA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2 \n",
+ "\n",
+ "HIPK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->HIPK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN \n",
+ "\n",
+ "PRKN \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->PRKN \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPB \n",
+ "\n",
+ "CEBPB \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->CEBPB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MECP2 \n",
+ "\n",
+ "MECP2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->MECP2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PTPN7 \n",
+ "\n",
+ "PTPN7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PTPN7->MAPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2 \n",
+ "\n",
+ "NFKB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELB \n",
+ "\n",
+ "RELB \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2->RELB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11 \n",
+ "\n",
+ "TRIP11 \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA \n",
+ "\n",
+ "THRA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11->THRA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARB \n",
+ "\n",
+ "RARB \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA->RARB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1 \n",
+ "\n",
+ "PHLPP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA \n",
+ "\n",
+ "PRKCA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1->PRKCA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STK4 \n",
+ "\n",
+ "STK4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1->STK4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFE2L2 \n",
+ "\n",
+ "NFE2L2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NFE2L2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KIT \n",
+ "\n",
+ "KIT \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->KIT \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NR1H4 \n",
+ "\n",
+ "NR1H4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NR1H4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD \n",
+ "\n",
+ "MYOCD \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRF \n",
+ "\n",
+ "SRF \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD->SRF \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53 \n",
+ "\n",
+ "TP53 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53->NFKB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1 \n",
+ "\n",
+ "RB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1->TRIP11 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1 \n",
+ "\n",
+ "CDK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP2K1 \n",
+ "\n",
+ "MAP2K1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->MAP2K1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA2 \n",
+ "\n",
+ "HMGA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1 \n",
+ "\n",
+ "HMGA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3 \n",
+ "\n",
+ "MAPK3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP2K1->MAPK3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2 \n",
+ "\n",
+ "SMAD2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEF2A \n",
+ "\n",
+ "MEF2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2->MEF2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1 \n",
+ "\n",
+ "TBK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "REL \n",
+ "\n",
+ "REL \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->REL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->ATM \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->RB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2 \n",
+ "\n",
+ "TRAF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->TRAF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA \n",
+ "\n",
+ "RELA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->RELA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF3 \n",
+ "\n",
+ "IRF3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->IRF3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1 \n",
+ "\n",
+ "TICAM1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2->TICAM1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1 \n",
+ "\n",
+ "SMURF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6 \n",
+ "\n",
+ "SMAD6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD6 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD5 \n",
+ "\n",
+ "SMAD5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7 \n",
+ "\n",
+ "MAP3K7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6->MAP3K7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "LCK \n",
+ "\n",
+ "LCK \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCQ \n",
+ "\n",
+ "PRKCQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "LCK->PRKCQ \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "FOSL1 \n",
+ "\n",
+ "FOSL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCQ->FOSL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->PTPN7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->LCK \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1 \n",
+ "\n",
+ "NCOA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->NCOA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7 \n",
+ "\n",
+ "SMAD7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->SMAD7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14 \n",
+ "\n",
+ "MAPK14 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUNB \n",
+ "\n",
+ "JUNB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->JUNB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5 \n",
+ "\n",
+ "DLX5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->DLX5 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B \n",
+ "\n",
+ "GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SP7 \n",
+ "\n",
+ "SP7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SP7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GATA2 \n",
+ "\n",
+ "GATA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GATA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDX2 \n",
+ "\n",
+ "CDX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HBP1 \n",
+ "\n",
+ "HBP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->HBP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "LATS2 \n",
+ "\n",
+ "LATS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STK4->LATS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1 \n",
+ "\n",
+ "EGR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->EGR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PITX1 \n",
+ "\n",
+ "PITX1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1->PITX1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL \n",
+ "\n",
+ "VHL \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL->TP53 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3 \n",
+ "\n",
+ "SMAD3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD4 \n",
+ "\n",
+ "SMAD4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->SMAD4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NKX2-1 \n",
+ "\n",
+ "NKX2-1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->NKX2-1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ASXL1 \n",
+ "\n",
+ "ASXL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1->ASXL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MSX2 \n",
+ "\n",
+ "MSX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5->MSX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1->TBK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1 \n",
+ "\n",
+ "STAT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF2 \n",
+ "\n",
+ "IRF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1->IRF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->PHLPP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MYOCD \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SFPQ \n",
+ "\n",
+ "SFPQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->SFPQ \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1 \n",
+ "\n",
+ "NFKB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->NFKB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CIITA \n",
+ "\n",
+ "CIITA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CIITA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA \n",
+ "\n",
+ "CEBPA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CEBPA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON \n",
+ "\n",
+ "CDON \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON->MAPK14 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2->VHL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH6 \n",
+ "\n",
+ "CDH6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CTNNB1 \n",
+ "\n",
+ "CTNNB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH6->CTNNB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4 \n",
+ "\n",
+ "KLF4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CTNNB1->KLF4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "WWTR1 \n",
+ "\n",
+ "WWTR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "LATS2->WWTR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT6 \n",
+ "\n",
+ "STAT6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT6->STAT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK2 \n",
+ "\n",
+ "JAK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KIT->JAK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK2->STAT6 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIF3A \n",
+ "\n",
+ "HIF3A \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN->HIF3A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKBIB \n",
+ "\n",
+ "NFKBIB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7->NFKBIB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1->SMURF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEIS2 \n",
+ "\n",
+ "MEIS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4->MEIS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA \n",
+ "\n",
+ "INHBA \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B \n",
+ "\n",
+ "ACVR2B \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA->ACVR2B \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B->SMAD2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B->SMAD3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1 \n",
+ "\n",
+ "SPI1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GATA2->SPI1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TAL1 \n",
+ "\n",
+ "TAL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1->TAL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "POU3F1 \n",
+ "\n",
+ "POU3F1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1->POU3F1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2 \n",
+ "\n",
+ "CDH2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2->CDON \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGF \n",
+ "\n",
+ "EGF \n",
+ " \n",
+ "\n",
+ "\n",
+ "ERBB2 \n",
+ "\n",
+ "ERBB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGF->ERBB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ERBB2->CDK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RXRB \n",
+ "\n",
+ "RXRB \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARB->RXRB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 113,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "G_sol = Gp.edge_subgraph(np.flatnonzero(P.expr.edge_values.value))\n",
+ "values = P.expr.vertex_values.value\n",
+ "vertex_values = {v: values[i] for i, v in enumerate(Gp.V)}\n",
+ "vertex_sol_values = [vertex_values[v] for v in G_sol.V]\n",
+ "G_sol.plot(custom_vertex_attr=cn.pl.create_graphviz_vertex_attributes(G_sol.V, vertex_sol_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 114,
+ "id": "50f2269f-5cc0-4572-be18-46887726d191",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10.373496770858765\n",
+ "48.0\n",
+ "44.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 48 inhibitory interactions and 44 activations\n",
+ "for o in P.objectives:\n",
+ " print(o.value)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3249fa12-4cda-4b79-9964-21137acb480e",
+ "metadata": {},
+ "source": [
+ "We have explored different approaches and assumptions to recover a signalling network from TF activities and a list of potential receptors. Although changes in gene expression for signalling proteins are not always predictive of signalling cascades—hence the use of CARNIVAL as a footprint-based method to bridge the gaps between receptors and TFs—we can introduce a slight bias in the network towards signalling proteins whose gene expression has changed significantly after treatment. These changes, while indirect, may still provide valuable cues. In a manner similar to how we penalised low-abundance genes, we will now prioritize the inclusion of upregulated genes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 139,
+ "id": "aca3c182-9eba-4e7b-bb69-e9b55cd332c3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['ABL1', 'AHR', 'AIRE', 'AP1', 'APEX1', 'AR', 'ARID1A', 'ARID3A',\n",
+ " 'ARID3B', 'ARID4A',\n",
+ " ...\n",
+ " 'ZNF362', 'ZNF382', 'ZNF384', 'ZNF395', 'ZNF436', 'ZNF699', 'ZNF76',\n",
+ " 'ZNF804A', 'ZNF91', 'ZXDC'],\n",
+ " dtype='object', length=655)"
+ ]
+ },
+ "execution_count": 139,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tf_acts.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 140,
+ "id": "4ec4d220-c63d-466a-a524-967b09fc19f5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "NUAK1 -40.581591\n",
+ "CDH6 -39.007075\n",
+ "FZD8 -37.421427\n",
+ "CDH2 -34.291273\n",
+ "STK38L -30.552887\n",
+ " ... \n",
+ "IL6R 21.833188\n",
+ "MAP3K5 21.883284\n",
+ "CASP1 23.060970\n",
+ "IL1R1 24.058471\n",
+ "TNFRSF1B 25.812839\n",
+ "Name: stat, Length: 627, dtype: float64"
+ ]
+ },
+ "execution_count": 140,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Since the problem minimises error, we change sign. Upregulated genes get negative score\n",
+ "# so if they are selected, the error decreases. The opposite for downregulated genes\n",
+ "df_gene_scores = (-results_df.loc[results_df.index.intersection(Gp.V).difference(tf_acts.columns)].stat)\n",
+ "dict_scores = df_gene_scores.to_dict()\n",
+ "\n",
+ "df_gene_scores.sort_values()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 141,
+ "id": "796cf5b1-25d4-4807-9679-e9bf04a4b475",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3045.9775260752576"
+ ]
+ },
+ "execution_count": 141,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Now we will add a penalty to avoid selecting lowly expressed genes\n",
+ "vertices = Gp.V\n",
+ "scores = np.array([dict_scores.get(v,0) for v in vertices])\n",
+ "np.sum(np.abs(scores))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "id": "90eb8df5-a39d-4ebc-a508-6e75d90617bb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\pablo\\miniconda3\\envs\\corneto-dev-mini\\Lib\\site-packages\\cvxpy\\problems\\problem.py:158: UserWarning: Objective contains too many subexpressions. Consider vectorizing your CVXPY code to speed up compilation.\n",
+ " warnings.warn(\"Objective contains too many subexpressions. \"\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Create the carnival problem\n",
+ "P = milp_carnival(Gp, inputs_p, measurements_p, beta_weight=0.2)\n",
+ "vertex_selected = P.expr.vertex_activated + P.expr.vertex_inhibited\n",
+ "total_score = vertex_selected @ scores \n",
+ "P.add_objectives(total_score, weights=1e-3)\n",
+ "P.solve(solver=\"GUROBI\", Seed=seed, TimeLimit=max_time);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 143,
+ "id": "bd7dcb88-bc2b-4131-b102-25dfd7d31921",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'CDKN1A', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAP2K1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MUC1', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R2A', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'RARG', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'LATS1', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n",
+ "Warning: node 'FBXW7', graph '%3' size too small for label\n",
+ "Warning: node 'CDKN1A', graph '%3' size too small for label\n",
+ "Warning: node 'HIPK2', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK1', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB2', graph '%3' size too small for label\n",
+ "Warning: node 'TRIP11', graph '%3' size too small for label\n",
+ "Warning: node 'THRA', graph '%3' size too small for label\n",
+ "Warning: node 'PHLPP1', graph '%3' size too small for label\n",
+ "Warning: node 'PRKCA', graph '%3' size too small for label\n",
+ "Warning: node 'MYOCD', graph '%3' size too small for label\n",
+ "Warning: node 'MAP2K1', graph '%3' size too small for label\n",
+ "Warning: node 'RORA', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2CA', graph '%3' size too small for label\n",
+ "Warning: node 'TRAF2', graph '%3' size too small for label\n",
+ "Warning: node 'SMURF1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD6', graph '%3' size too small for label\n",
+ "Warning: node 'FOSL1', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK14', graph '%3' size too small for label\n",
+ "Warning: node 'MEF2A', graph '%3' size too small for label\n",
+ "Warning: node 'MAPK3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD3', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD4', graph '%3' size too small for label\n",
+ "Warning: node 'GSK3B', graph '%3' size too small for label\n",
+ "Warning: node 'MUC1', graph '%3' size too small for label\n",
+ "Warning: node 'NCOA1', graph '%3' size too small for label\n",
+ "Warning: node 'ASXL1', graph '%3' size too small for label\n",
+ "Warning: node 'MSX2', graph '%3' size too small for label\n",
+ "Warning: node 'NFE2L2', graph '%3' size too small for label\n",
+ "Warning: node 'TICAM1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD7', graph '%3' size too small for label\n",
+ "Warning: node 'STAT1', graph '%3' size too small for label\n",
+ "Warning: node 'TGFB1', graph '%3' size too small for label\n",
+ "Warning: node 'PPP2R2A', graph '%3' size too small for label\n",
+ "Warning: node 'NKX2-1', graph '%3' size too small for label\n",
+ "Warning: node 'PITX1', graph '%3' size too small for label\n",
+ "Warning: node 'CDON', graph '%3' size too small for label\n",
+ "Warning: node 'CHEK2', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA2', graph '%3' size too small for label\n",
+ "Warning: node 'STAT5A', graph '%3' size too small for label\n",
+ "Warning: node 'MECP2', graph '%3' size too small for label\n",
+ "Warning: node 'NFKB1', graph '%3' size too small for label\n",
+ "Warning: node 'MAFA', graph '%3' size too small for label\n",
+ "Warning: node 'HIF3A', graph '%3' size too small for label\n",
+ "Warning: node 'MAP3K7', graph '%3' size too small for label\n",
+ "Warning: node 'NFKBIB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPB', graph '%3' size too small for label\n",
+ "Warning: node 'CUL1_RBX1_SKP1', graph '%3' size too small for label\n",
+ "Warning: node 'MEIS2', graph '%3' size too small for label\n",
+ "Warning: node 'INHBA', graph '%3' size too small for label\n",
+ "Warning: node 'ACVR2B', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD2', graph '%3' size too small for label\n",
+ "Warning: node 'RARG', graph '%3' size too small for label\n",
+ "Warning: node 'RXRB', graph '%3' size too small for label\n",
+ "Warning: node 'CEBPA', graph '%3' size too small for label\n",
+ "Warning: node 'HMGA1', graph '%3' size too small for label\n",
+ "Warning: node 'LATS1', graph '%3' size too small for label\n",
+ "Warning: node 'POU3F1', graph '%3' size too small for label\n",
+ "Warning: node 'WWTR1', graph '%3' size too small for label\n",
+ "Warning: node 'SMAD5', graph '%3' size too small for label\n",
+ "Warning: node 'NR1H4', graph '%3' size too small for label\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM \n",
+ "\n",
+ "ATM \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7 \n",
+ "\n",
+ "FBXW7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->FBXW7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1 \n",
+ "\n",
+ "ABL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->ABL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300 \n",
+ "\n",
+ "EP300 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->EP300 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2 \n",
+ "\n",
+ "CHEK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ATM->CHEK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ "\n",
+ "CUL1_RBX1_SKP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FBXW7->CUL1_RBX1_SKP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDKN1A \n",
+ "\n",
+ "CDKN1A \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1 \n",
+ "\n",
+ "CDK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDKN1A->CDK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53 \n",
+ "\n",
+ "TP53 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->TP53 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP2K1 \n",
+ "\n",
+ "MAP2K1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->MAP2K1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA2 \n",
+ "\n",
+ "HMGA2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1 \n",
+ "\n",
+ "HMGA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDK1->HMGA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2 \n",
+ "\n",
+ "HIPK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->HIPK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1 \n",
+ "\n",
+ "RB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->RB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN \n",
+ "\n",
+ "PRKN \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->PRKN \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPB \n",
+ "\n",
+ "CEBPB \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->CEBPB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK2 \n",
+ "\n",
+ "JAK2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ABL1->JAK2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MECP2 \n",
+ "\n",
+ "MECP2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIPK2->MECP2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1 \n",
+ "\n",
+ "MAPK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN \n",
+ "\n",
+ "JUN \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->JUN \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RORA \n",
+ "\n",
+ "RORA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->RORA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT5A \n",
+ "\n",
+ "STAT5A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->STAT5A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAFA \n",
+ "\n",
+ "MAFA \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK1->MAFA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1 \n",
+ "\n",
+ "SPI1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUN->SPI1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2 \n",
+ "\n",
+ "NFKB2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELB \n",
+ "\n",
+ "RELB \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB2->RELB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11 \n",
+ "\n",
+ "TRIP11 \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA \n",
+ "\n",
+ "THRA \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRIP11->THRA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARG \n",
+ "\n",
+ "RARG \n",
+ " \n",
+ "\n",
+ "\n",
+ "THRA->RARG \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1 \n",
+ "\n",
+ "PHLPP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA \n",
+ "\n",
+ "PRKCA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1->PRKCA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STK4 \n",
+ "\n",
+ "STK4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PHLPP1->STK4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFE2L2 \n",
+ "\n",
+ "NFE2L2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NFE2L2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NR1H4 \n",
+ "\n",
+ "NR1H4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKCA->NR1H4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD \n",
+ "\n",
+ "MYOCD \n",
+ " \n",
+ "\n",
+ "\n",
+ "SRF \n",
+ "\n",
+ "SRF \n",
+ " \n",
+ "\n",
+ "\n",
+ "MYOCD->SRF \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TP53->NFKB2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RB1->TRIP11 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3 \n",
+ "\n",
+ "MAPK3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP2K1->MAPK3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1 \n",
+ "\n",
+ "TBK1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "REL \n",
+ "\n",
+ "REL \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->REL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF3 \n",
+ "\n",
+ "IRF3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TBK1->IRF3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA \n",
+ "\n",
+ "PPP2CA \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->ATM \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->MAPK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2 \n",
+ "\n",
+ "TRAF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2CA->TRAF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1 \n",
+ "\n",
+ "TICAM1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "TRAF2->TICAM1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1 \n",
+ "\n",
+ "SMURF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6 \n",
+ "\n",
+ "SMAD6 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD6 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD5 \n",
+ "\n",
+ "SMAD5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMURF1->SMAD5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7 \n",
+ "\n",
+ "MAP3K7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD6->MAP3K7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1 \n",
+ "\n",
+ "USF1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "FOSL1 \n",
+ "\n",
+ "FOSL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "USF1->FOSL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14 \n",
+ "\n",
+ "MAPK14 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEF2A \n",
+ "\n",
+ "MEF2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->MEF2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JUNB \n",
+ "\n",
+ "JUNB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->JUNB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3 \n",
+ "\n",
+ "SMAD3 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SMAD3 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B \n",
+ "\n",
+ "GSK3B \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->GSK3B \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5 \n",
+ "\n",
+ "DLX5 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->DLX5 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SP7 \n",
+ "\n",
+ "SP7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->SP7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDX2 \n",
+ "\n",
+ "CDX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->CDX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HBP1 \n",
+ "\n",
+ "HBP1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK14->HBP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1 \n",
+ "\n",
+ "NCOA1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAPK3->NCOA1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "LATS1 \n",
+ "\n",
+ "LATS1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STK4->LATS1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA \n",
+ "\n",
+ "RELA \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1 \n",
+ "\n",
+ "EGR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "RELA->EGR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PITX1 \n",
+ "\n",
+ "PITX1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EGR1->PITX1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD4 \n",
+ "\n",
+ "SMAD4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->SMAD4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NKX2-1 \n",
+ "\n",
+ "NKX2-1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD3->NKX2-1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CDKN1A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->PHLPP1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MYOCD \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MUC1 \n",
+ "\n",
+ "MUC1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->MUC1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SFPQ \n",
+ "\n",
+ "SFPQ \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->SFPQ \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKB1 \n",
+ "\n",
+ "NFKB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->NFKB1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CIITA \n",
+ "\n",
+ "CIITA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CIITA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA \n",
+ "\n",
+ "CEBPA \n",
+ " \n",
+ "\n",
+ "\n",
+ "GSK3B->CEBPA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4 \n",
+ "\n",
+ "KLF4 \n",
+ " \n",
+ "\n",
+ "\n",
+ "MUC1->KLF4 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "ASXL1 \n",
+ "\n",
+ "ASXL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "NCOA1->ASXL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MSX2 \n",
+ "\n",
+ "MSX2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "DLX5->MSX2 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->RELA \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD7 \n",
+ "\n",
+ "SMAD7 \n",
+ " \n",
+ "\n",
+ "\n",
+ "EP300->SMAD7 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TICAM1->TBK1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TAL1 \n",
+ "\n",
+ "TAL1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "SPI1->TAL1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1 \n",
+ "\n",
+ "STAT1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "IRF2 \n",
+ "\n",
+ "IRF2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "STAT1->IRF2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1 \n",
+ "\n",
+ "TGFB1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R2A \n",
+ "\n",
+ "PPP2R2A \n",
+ " \n",
+ "\n",
+ "\n",
+ "TGFB1->PPP2R2A \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "PPP2R2A->PPP2CA \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON \n",
+ "\n",
+ "CDON \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDON->MAPK14 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "VHL \n",
+ "\n",
+ "VHL \n",
+ " \n",
+ "\n",
+ "\n",
+ "CHEK2->VHL \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "HIF3A \n",
+ "\n",
+ "HIF3A \n",
+ " \n",
+ "\n",
+ "\n",
+ "PRKN->HIF3A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "NFKBIB \n",
+ "\n",
+ "NFKBIB \n",
+ " \n",
+ "\n",
+ "\n",
+ "MAP3K7->NFKBIB \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "JAK2->STAT1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CUL1_RBX1_SKP1->SMURF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "MEIS2 \n",
+ "\n",
+ "MEIS2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "KLF4->MEIS2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA \n",
+ "\n",
+ "INHBA \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B \n",
+ "\n",
+ "ACVR2B \n",
+ " \n",
+ "\n",
+ "\n",
+ "INHBA->ACVR2B \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "SMAD2 \n",
+ "\n",
+ "SMAD2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "ACVR2B->SMAD2 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "RXRB \n",
+ "\n",
+ "RXRB \n",
+ " \n",
+ "\n",
+ "\n",
+ "RARG->RXRB \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CEBPA->USF1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "POU3F1 \n",
+ "\n",
+ "POU3F1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "HMGA1->POU3F1 \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2 \n",
+ "\n",
+ "CDH2 \n",
+ " \n",
+ "\n",
+ "\n",
+ "CDH2->CDON \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "WWTR1 \n",
+ "\n",
+ "WWTR1 \n",
+ " \n",
+ "\n",
+ "\n",
+ "LATS1->WWTR1 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 143,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "G_sol = Gp.edge_subgraph(np.flatnonzero(P.expr.edge_values.value))\n",
+ "values = P.expr.vertex_values.value\n",
+ "vertex_values = {v: values[i] for i, v in enumerate(Gp.V)}\n",
+ "vertex_sol_values = [vertex_values[v] for v in G_sol.V]\n",
+ "G_sol.plot(custom_vertex_attr=cn.pl.create_graphviz_vertex_attributes(G_sol.V, vertex_sol_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 144,
+ "id": "aa10a36a-de26-467a-9cdd-2b4392b504c8",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10.373496770858765\n",
+ "88.0\n",
+ "-245.81810302737185\n"
+ ]
+ }
+ ],
+ "source": [
+ "for o in P.objectives:\n",
+ " print(o.value)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.15"
+ },
+ "mystnb": {
+ "execution_mode": "off"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/poetry.lock b/poetry.lock
index 38e19842..d983d5d1 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -42,13 +42,13 @@ files = [
[[package]]
name = "anyio"
-version = "4.4.0"
+version = "4.6.2"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
optional = false
python-versions = ">=3.8"
files = [
- {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"},
- {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"},
+ {file = "anyio-4.6.2-py3-none-any.whl", hash = "sha256:6caec6b1391f6f6d7b2ef2258d2902d36753149f67478f7df4be8e54d03a8f54"},
+ {file = "anyio-4.6.2.tar.gz", hash = "sha256:f72a7bb3dd0752b3bd8b17a844a019d7fbf6ae218c588f4f9ba1b2f600b12347"},
]
[package.dependencies]
@@ -58,9 +58,9 @@ sniffio = ">=1.1"
typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""}
[package.extras]
-doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
-test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
-trio = ["trio (>=0.23)"]
+doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
+test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"]
+trio = ["trio (>=0.26.1)"]
[[package]]
name = "appdirs"
@@ -102,6 +102,109 @@ six = ">=1.12.0"
astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
+[[package]]
+name = "asv"
+version = "0.6.4"
+description = "Airspeed Velocity: A simple Python history benchmarking tool"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "asv-0.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e32b4cc435bdb6f2ef83d8092e977962f6fa20471542d6341e596324d350cbea"},
+ {file = "asv-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fdfb9090623fc45cbeb77ab40b394779794083c155128e3d320fa06af2e0fdf5"},
+ {file = "asv-0.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dfee8a415f4b5da0be4bedf4c9cb3b041c2148d28d2327cf3b54f9cb565cefd"},
+ {file = "asv-0.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abc13331bb8bb1880dbc33e75175ae90bca439038a1f7e246528481ecebd15dd"},
+ {file = "asv-0.6.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b67eec004f8218bba25dcdbdda2e6676dd6c4ac3e97a80b691b27dcfbfbda38d"},
+ {file = "asv-0.6.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aef14496a34552308d054db71181bfb1ca45d7ef29028747d388be9f00a5b45c"},
+ {file = "asv-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:0c8931e7a8aeda75f90b3ac422cbb7c46a5ce50d8c0a8e821cdf3e4d0705dd76"},
+ {file = "asv-0.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74666c5896b4aec92b4a12cf9aa7494dec3398bb9ea602a9f8dc1656b53e8e10"},
+ {file = "asv-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26166a7bd7fe05b5a8507247d1a7ab1dfc4256414b0505d124a7b9d46a618a1c"},
+ {file = "asv-0.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe6161c5616f5aed936947866b6376e09c937d628aa81115b3c72e90a151c1f9"},
+ {file = "asv-0.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d6122b5e86bf9071b9ff7136672d50da0d460dfc958f43429843f7a3cd3e86a"},
+ {file = "asv-0.6.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:79554f125033ecbcb599cd704b4b5b525d254e5e05b1dd24bab3bbd83ae5502e"},
+ {file = "asv-0.6.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2e80f39501628fd4cac972f08fa4c9b8e211a86fc43dd6e58c95d106cbaf54e7"},
+ {file = "asv-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:363dfdee98cc072e6a1468137eed640985e48ccbb11c175d04ee420f05459872"},
+ {file = "asv-0.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:244b71778f91aa6672e1f16feb9eecac78ef7cee95228ef8f0315a2e2deecfed"},
+ {file = "asv-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3e798b275de2889748d43d42305bfce68c015a3e38ae935d231835cb836fef73"},
+ {file = "asv-0.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d064c5ac1ab18efc62467f65ed4989a2e2ac1a4d21886119fa0ef0f91d548438"},
+ {file = "asv-0.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51e5862bdac0f1fe11886bdd40b30a9691a65cb7feac40f0676fe9206d5bb43"},
+ {file = "asv-0.6.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46a7ca838e8c49109c43b1cda0eb64abc5e0a045538da718abe981d115ed47aa"},
+ {file = "asv-0.6.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5f722178c7e36b797f764c837fc03c462f68c8f2cba5145b2e64119e46231ff"},
+ {file = "asv-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:f972ca71316d46a0242eb69e53dadfeab1e4d0546773b0f722462f97b3e5fbd9"},
+ {file = "asv-0.6.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e8c728707d417268560d1e1a5cb0b638c10b346648b3338ca4dce373c0a0608b"},
+ {file = "asv-0.6.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cfe2796c87960c90809a891e0805df7017fea58b86a739fbc901de9703f7685"},
+ {file = "asv-0.6.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb74b1726280422c22e69010ede8bbd13309408b046d93af2ef199728d5f341a"},
+ {file = "asv-0.6.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2223db773e31ffb4583f44ab8adbe3676e41db8d08e9ca59a9b95c7c26954133"},
+ {file = "asv-0.6.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7426c1d7c18c7f19689b0f060e77d7dce8ff32697e194aca236a8c100bf8b78"},
+ {file = "asv-0.6.4-cp37-cp37m-win_amd64.whl", hash = "sha256:7d792a650e2f6bcab7c0f4278b305ee8cc9a16479dc7297bafbd5197a553d812"},
+ {file = "asv-0.6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e396f602966c92e21e34c2a46f2be5161b0c4c1e3e87397e04a848e62a3c90b"},
+ {file = "asv-0.6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:14788182ab143e7c7af755b83c34887873a0bde6faa3b263a9f732247a4ae84f"},
+ {file = "asv-0.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59ff949fae7c4b006aa94f46c9a9c02d9b79b1b836a6e3fcc5da633a2ab60aa2"},
+ {file = "asv-0.6.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27fcce30845de881a58ee98eb9b51e3deb520356ee8423bf471585e62c7c2a60"},
+ {file = "asv-0.6.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea066af743856d983fbd1973788032ef98cc28dc8e821ee065d25a3af4b791a0"},
+ {file = "asv-0.6.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa248b4ad640310fd6d1a8265ee2672d6dbf019b32569a37a01aece49fe72d1b"},
+ {file = "asv-0.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:9419c426b441df380ff35f08a5323b73def19e17a13bee7a12ef0cbabbe8640b"},
+ {file = "asv-0.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:755f2ec48b8277f68be6ba6325c16d76665a9807245ac4f40bb223cf266701bf"},
+ {file = "asv-0.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8091787fd5219dc63e1c8dc2786da5f9ad5302b15b22c70cf14ee76bc20b3443"},
+ {file = "asv-0.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff89881dc7036f3fb4e50fb23dfef6768ae9651daf2efff18bd487339ab1f14"},
+ {file = "asv-0.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b22bbe5a8bcea54b9d71bd02e78a814b1bfe7edeec171b1ecdeea839b78735a2"},
+ {file = "asv-0.6.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:76b7ee6d6c63825065b5b250271d0576d39cc610674a128f5a39cc040b6a7d86"},
+ {file = "asv-0.6.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:758d9982f6be463711dca19dda59bc51a2fee27ab2494132f453d92f3c121d43"},
+ {file = "asv-0.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:9a16c3b8d533cc6a05a9a217a03c631b738047fca711c95aa3f07e4a83723198"},
+ {file = "asv-0.6.4-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0305e9eee21f71c3d3f8b046beb35e571f6dd7ed2fcd0e8405f8a208bcd3228a"},
+ {file = "asv-0.6.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6cd23fa20edf8cb30354fda3388a8835a15158e21559c86f0d997e5d30dbf91"},
+ {file = "asv-0.6.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7424d2dbfcb98aa3c099311100ceb9aabfd83fed0b41420f70f142852ed392a"},
+ {file = "asv-0.6.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7f4b95583cf379015d35b747a1bb4df99c05dd4107d6081b2cf4a577f4caeca"},
+ {file = "asv-0.6.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e54b3e7c6a22af2ac779bf2767dcb6ee09760d9c4272b73e4d63a5ed938145d8"},
+ {file = "asv-0.6.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f34b1568d353d6cddcfa074eba0aaaa82b29540df10614cf66f43930ba7827c1"},
+ {file = "asv-0.6.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ccfbbc4f12e145ffb7a653275d75d54f72768f1ff1fdb300e0603dbf33deaf6"},
+ {file = "asv-0.6.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:64637299bcbd7743da0140d8a19a732c33d9e41d28aa4db0bf1e58e12eb8b4e4"},
+ {file = "asv-0.6.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bad0f37940c5ad7c39d81eecfc3c515f55c51bbca094e0efda4d70c74363532b"},
+ {file = "asv-0.6.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfc9f90a7dd45f042f947f4c3a3d98ee591f5ac7d1751b541632e5f14fc35c54"},
+ {file = "asv-0.6.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:356fbc8abf3f4c2b13bc37af78f08c008f1ef4320549e44c02a5a3f6a783f892"},
+ {file = "asv-0.6.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:647a6ba8f6e9a23455aabc7a6365aa1feeeb82a6bf99696e0bc964aebe337730"},
+ {file = "asv-0.6.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:80c791206e7c01b5883e8facd7ef27432a01fd1cbc4977d38f7bfe08ee98150a"},
+ {file = "asv-0.6.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc49bb48295a4b1d902590b87e7920ee51e95d72bcf1c44d83303dfbecc68e2"},
+ {file = "asv-0.6.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:022723563d770b43c50615e4b18d1ad861c00fcd91343bfbd51d21bfff708d4c"},
+ {file = "asv-0.6.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:71d2ba7b16c462b92cd36c2a4d07753bb6c995149a830ce1d4246f6061bf3f1d"},
+ {file = "asv-0.6.4.tar.gz", hash = "sha256:1d124184171cfe106e3e57ac04e3221b8d4571c9bd6ca2c6498a8c7407339df1"},
+]
+
+[package.dependencies]
+asv-runner = ">=v0.2.1"
+build = "*"
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+json5 = "*"
+pympler = {version = "*", markers = "platform_python_implementation != \"PyPy\""}
+pyyaml = {version = "*", markers = "platform_python_implementation != \"PyPy\""}
+tabulate = "*"
+tomli = {version = "*", markers = "python_version < \"3.11\""}
+virtualenv = "*"
+
+[package.extras]
+dev = ["isort (>=5.11.5)", "ruff"]
+doc = ["sphinx", "sphinx-bootstrap-theme"]
+hg = ["python-hglib"]
+plugs = ["asv-bench-memray"]
+test = ["feedparser", "filelock", "flaky", "numpy", "pytest", "pytest-rerunfailures", "pytest-rerunfailures (>=10.0)", "pytest-timeout", "pytest-xdist", "python-hglib", "rpy2", "scipy", "selenium", "virtualenv"]
+virtualenv = ["packaging", "virtualenv"]
+
+[[package]]
+name = "asv-runner"
+version = "0.2.1"
+description = "Core Python benchmark code for ASV"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "asv_runner-0.2.1-py3-none-any.whl", hash = "sha256:655d466208ce311768071f5003a61611481b24b3ad5ac41fb8a6374197e647e9"},
+ {file = "asv_runner-0.2.1.tar.gz", hash = "sha256:945dd301a06fa9102f221b1e9ddd048f5ecd863796d4c8cd487f5577fe0db66d"},
+]
+
+[package.dependencies]
+importlib-metadata = "*"
+
+[package.extras]
+docs = ["furo", "myst-parser (>=2)", "sphinx", "sphinx-autobuild", "sphinx-autodoc2 (>=0.4.2)", "sphinx-contributors", "sphinx-copybutton", "sphinx-design", "sphinxcontrib-spelling"]
+
[[package]]
name = "attrs"
version = "24.2.0"
@@ -156,6 +259,31 @@ charset-normalizer = ["charset-normalizer"]
html5lib = ["html5lib"]
lxml = ["lxml"]
+[[package]]
+name = "build"
+version = "1.2.2.post1"
+description = "A simple, correct Python build frontend"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5"},
+ {file = "build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "os_name == \"nt\""}
+importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""}
+packaging = ">=19.1"
+pyproject_hooks = "*"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+
+[package.extras]
+docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"]
+test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"]
+typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"]
+uv = ["uv (>=0.1.18)"]
+virtualenv = ["virtualenv (>=20.0.35)"]
+
[[package]]
name = "certifi"
version = "2024.8.30"
@@ -259,101 +387,116 @@ files = [
[[package]]
name = "charset-normalizer"
-version = "3.3.2"
+version = "3.4.0"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7.0"
files = [
- {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"},
- {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"},
- {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"},
- {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"},
- {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"},
- {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"},
- {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"},
- {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
+ {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
+ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
]
[[package]]
@@ -393,13 +536,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "cobra"
-version = "0.29.0"
+version = "0.29.1"
description = "COBRApy is a package for constraint-based modeling of metabolic networks."
optional = false
python-versions = "*"
files = [
- {file = "cobra-0.29.0-py2.py3-none-any.whl", hash = "sha256:9a9bc4ed1a027c22c5fd4fed111cce7606cda3cdfc44587483c35714ba4dd9f0"},
- {file = "cobra-0.29.0.tar.gz", hash = "sha256:56d2b832aa86b1f3853647e0eb24aaeac25908fd147737edb23313934485e863"},
+ {file = "cobra-0.29.1-py2.py3-none-any.whl", hash = "sha256:734df889e751171c12ee9c5ec6f2567f47f9997e183822d4290776aa650c9593"},
+ {file = "cobra-0.29.1.tar.gz", hash = "sha256:47cd4fe80eb329ed75ccfb7ecbaac6275e986685392d52922bc8ad3cbc599674"},
]
[package.dependencies]
@@ -691,33 +834,37 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"]
[[package]]
name = "debugpy"
-version = "1.8.5"
+version = "1.8.7"
description = "An implementation of the Debug Adapter Protocol for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"},
- {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"},
- {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"},
- {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"},
- {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"},
- {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"},
- {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"},
- {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"},
- {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"},
- {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"},
- {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"},
- {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"},
- {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"},
- {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"},
- {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"},
- {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"},
- {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"},
- {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"},
- {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"},
- {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"},
- {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"},
- {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"},
+ {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"},
+ {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"},
+ {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"},
+ {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"},
+ {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"},
+ {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"},
+ {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"},
+ {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"},
+ {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"},
+ {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"},
+ {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"},
+ {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"},
+ {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"},
+ {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"},
+ {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"},
+ {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"},
+ {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"},
+ {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"},
+ {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"},
+ {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"},
+ {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"},
+ {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"},
+ {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"},
+ {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"},
+ {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"},
+ {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"},
]
[[package]]
@@ -759,13 +906,13 @@ files = [
[[package]]
name = "distlib"
-version = "0.3.8"
+version = "0.3.9"
description = "Distribution utilities"
optional = false
python-versions = "*"
files = [
- {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"},
- {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"},
+ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
+ {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
]
[[package]]
@@ -855,18 +1002,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc
[[package]]
name = "filelock"
-version = "3.16.0"
+version = "3.16.1"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.8"
files = [
- {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"},
- {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"},
+ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"},
+ {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"},
]
[package.extras]
-docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"]
+docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"]
typing = ["typing-extensions (>=4.12.2)"]
[[package]]
@@ -887,53 +1034,59 @@ pyflakes = ">=3.2.0,<3.3.0"
[[package]]
name = "fonttools"
-version = "4.53.1"
+version = "4.54.1"
description = "Tools to manipulate font files"
optional = false
python-versions = ">=3.8"
files = [
- {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"},
- {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"},
- {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"},
- {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"},
- {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"},
- {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"},
- {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"},
- {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"},
- {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"},
- {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"},
- {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"},
- {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"},
- {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"},
- {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"},
- {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"},
- {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"},
- {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"},
- {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"},
- {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"},
- {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"},
- {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"},
- {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"},
- {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"},
- {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"},
- {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"},
- {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"},
- {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"},
- {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"},
- {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"},
- {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"},
- {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"},
- {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"},
- {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"},
- {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"},
- {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"},
- {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"},
- {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"},
- {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"},
- {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"},
- {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"},
- {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"},
- {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"},
+ {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"},
+ {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"},
+ {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"},
+ {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"},
+ {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"},
+ {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"},
+ {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"},
+ {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"},
+ {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"},
+ {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"},
+ {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"},
+ {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"},
+ {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"},
+ {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"},
+ {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"},
+ {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"},
+ {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"},
+ {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"},
+ {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"},
+ {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"},
+ {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"},
+ {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"},
+ {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"},
+ {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"},
+ {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"},
+ {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"},
+ {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"},
+ {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"},
+ {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"},
+ {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"},
+ {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"},
+ {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"},
+ {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"},
+ {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"},
+ {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"},
+ {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"},
+ {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"},
+ {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"},
+ {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"},
+ {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"},
+ {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"},
+ {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"},
+ {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"},
+ {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"},
+ {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"},
+ {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"},
+ {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"},
+ {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"},
]
[package.extras]
@@ -979,77 +1132,84 @@ test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"]
[[package]]
name = "greenlet"
-version = "3.1.0"
+version = "3.1.1"
description = "Lightweight in-process concurrent programming"
optional = false
python-versions = ">=3.7"
files = [
- {file = "greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"},
- {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"},
- {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"},
- {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"},
- {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"},
- {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"},
- {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"},
- {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"},
- {file = "greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"},
- {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"},
- {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"},
- {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"},
- {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"},
- {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"},
- {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"},
- {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"},
- {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"},
- {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"},
- {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"},
- {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"},
- {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"},
- {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"},
- {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"},
- {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"},
- {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"},
- {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"},
- {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"},
- {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"},
- {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"},
- {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"},
- {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"},
- {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"},
- {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"},
- {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"},
- {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"},
- {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"},
- {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"},
- {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"},
- {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"},
- {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"},
- {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"},
- {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"},
- {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"},
- {file = "greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"},
- {file = "greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"},
- {file = "greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"},
- {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"},
- {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"},
- {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"},
- {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"},
- {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"},
- {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"},
- {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"},
- {file = "greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"},
- {file = "greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"},
- {file = "greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"},
- {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"},
- {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"},
- {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"},
- {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"},
- {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"},
- {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"},
- {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"},
- {file = "greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"},
- {file = "greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"},
- {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"},
+ {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"},
+ {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"},
+ {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"},
+ {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"},
+ {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"},
+ {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"},
+ {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"},
+ {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"},
+ {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"},
+ {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"},
+ {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"},
+ {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"},
+ {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"},
+ {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"},
+ {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"},
+ {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"},
+ {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"},
+ {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"},
+ {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"},
+ {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"},
+ {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"},
+ {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"},
+ {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"},
+ {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"},
+ {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"},
+ {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"},
+ {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"},
+ {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"},
+ {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"},
+ {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"},
+ {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"},
+ {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"},
+ {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"},
]
[package.extras]
@@ -1069,13 +1229,13 @@ files = [
[[package]]
name = "httpcore"
-version = "1.0.5"
+version = "1.0.6"
description = "A minimal low-level HTTP client."
optional = false
python-versions = ">=3.8"
files = [
- {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"},
- {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"},
+ {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"},
+ {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"},
]
[package.dependencies]
@@ -1086,7 +1246,7 @@ h11 = ">=0.13,<0.15"
asyncio = ["anyio (>=4.0,<5.0)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
-trio = ["trio (>=0.22.0,<0.26.0)"]
+trio = ["trio (>=0.22.0,<1.0)"]
[[package]]
name = "httpx"
@@ -1314,6 +1474,17 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
+[[package]]
+name = "json5"
+version = "0.9.25"
+description = "A Python implementation of the JSON5 data format."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"},
+ {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"},
+]
+
[[package]]
name = "jsonschema"
version = "4.23.0"
@@ -1337,13 +1508,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
[[package]]
name = "jsonschema-specifications"
-version = "2023.12.1"
+version = "2024.10.1"
description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"},
- {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"},
+ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"},
+ {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"},
]
[package.dependencies]
@@ -1378,13 +1549,13 @@ testing = ["coverage", "ipykernel", "jupytext", "matplotlib", "nbdime", "nbforma
[[package]]
name = "jupyter-client"
-version = "8.6.2"
+version = "8.6.3"
description = "Jupyter protocol implementation and client libraries"
optional = false
python-versions = ">=3.8"
files = [
- {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"},
- {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"},
+ {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"},
+ {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"},
]
[package.dependencies]
@@ -1579,71 +1750,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
[[package]]
name = "markupsafe"
-version = "2.1.5"
+version = "3.0.1"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
files = [
- {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"},
- {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"},
- {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"},
- {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"},
- {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"},
- {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"},
- {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"},
- {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"},
+ {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"},
]
[[package]]
@@ -1784,13 +1956,13 @@ tests = ["pytest (>=4.6)"]
[[package]]
name = "myst-nb"
-version = "1.1.1"
+version = "1.1.2"
description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser."
optional = false
python-versions = ">=3.9"
files = [
- {file = "myst_nb-1.1.1-py3-none-any.whl", hash = "sha256:8b8f9085287d948eef46cb3764aafc21915e0e981882b8c742719f5b1a84c36f"},
- {file = "myst_nb-1.1.1.tar.gz", hash = "sha256:74227c11f76d03494f43b7788659b161b94f4dedef230a2912412bc8c3c9e553"},
+ {file = "myst_nb-1.1.2-py3-none-any.whl", hash = "sha256:9b7034e5d62640cb6daf03f9ca16ef45d0462fced27944c77aa3f98c7cdcd566"},
+ {file = "myst_nb-1.1.2.tar.gz", hash = "sha256:961b4005657029ca89892a4c75edbf0856c54ceaf6172368b46bf7676c1f7700"},
]
[package.dependencies]
@@ -1807,8 +1979,8 @@ typing-extensions = "*"
[package.extras]
code-style = ["pre-commit"]
-rtd = ["alabaster", "altair", "bokeh", "coconut (>=1.4.3,<3.1.0)", "ipykernel (>=5.5,<7.0)", "ipywidgets", "jupytext (>=1.11.2,<1.16.0)", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme (>=0.3)", "sphinx-copybutton", "sphinx-design (>=0.4.0,<0.5.0)", "sphinxcontrib-bibtex", "sympy"]
-testing = ["beautifulsoup4", "coverage (>=6.4,<8.0)", "ipykernel (>=5.5,<7.0)", "ipython (!=8.1.0,<8.17)", "ipywidgets (>=8)", "jupytext (>=1.11.2,<1.16.0)", "matplotlib (==3.7.*)", "nbdime", "numpy", "pandas (==1.5.*)", "pyarrow", "pytest (>=7.1,<8.0)", "pytest-cov (>=3,<5)", "pytest-param-files (>=0.3.3,<0.4.0)", "pytest-regressions", "sympy (>=1.10.1)"]
+rtd = ["alabaster", "altair", "bokeh", "coconut (>=1.4.3)", "ipykernel (>=5.5)", "ipywidgets", "jupytext (>=1.11.2)", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme (>=0.3)", "sphinx-copybutton", "sphinx-design", "sphinxcontrib-bibtex", "sympy"]
+testing = ["beautifulsoup4", "coverage (>=6.4)", "ipykernel (>=5.5)", "ipython (!=8.1.0)", "ipywidgets (>=8)", "jupytext (>=1.11.2)", "matplotlib (==3.7.*)", "nbdime", "numpy", "pandas", "pyarrow", "pytest", "pytest-cov (>=3)", "pytest-param-files", "pytest-regressions", "sympy (>=1.10.1)"]
[[package]]
name = "myst-parser"
@@ -1993,45 +2165,50 @@ development = ["black", "isort", "tox"]
[[package]]
name = "osqp"
-version = "0.6.7.post1"
+version = "0.6.7.post3"
description = "OSQP: The Operator Splitting QP Solver"
optional = false
python-versions = "*"
files = [
- {file = "osqp-0.6.7.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:14d221c049c2f1495a91d6683a3b0319f23d0c3e81b3aa5102e4b377ca002980"},
- {file = "osqp-0.6.7.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b0bd72d95d6b97ab8273cdd08c1304dfeb6071e038a0b2d34fa2aebd16cfbec5"},
- {file = "osqp-0.6.7.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4980f2ad0814898396a3ea522f46d199a3412bd3b191065d4ba6837e9cc4c1"},
- {file = "osqp-0.6.7.post1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e99469b7986f9042925d3082cd6d02cdf012a32483603b64a713f0275de413bb"},
- {file = "osqp-0.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:ab6e42c8af7c82f5b4b4b989a623151dca98e7bd6c131454edc8cf5cde2b3aa9"},
- {file = "osqp-0.6.7.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d01d6b03628b851107671d7c785df147acea6865f090290a04e38ed250d8b829"},
- {file = "osqp-0.6.7.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7082c852edc9afc63ba7b073bb2e559093b4df4eb24efff7b2f898241a83071c"},
- {file = "osqp-0.6.7.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9f104c9710d8e51cded15ac9b2b9bc77bc265e70c891c671c1935e4b85b0810"},
- {file = "osqp-0.6.7.post1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44ae75ed6a5c6aba415b8d11963cec2b9ac4d7f1897067e9e095b60e81136022"},
- {file = "osqp-0.6.7.post1-cp311-cp311-win_amd64.whl", hash = "sha256:117c30affdab60f5872d758c5ad82f5deb029b4fa84fea54bd04b8e7d884c5f6"},
- {file = "osqp-0.6.7.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ed3c98cb31296368a72145875ceab3fb3e3497fdb820a185bf6b9ee39a3d5762"},
- {file = "osqp-0.6.7.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:98fdee4065b9f65c37f63532ba8e11e7efddce3eb9a8b62961bf1a9b62105e0a"},
- {file = "osqp-0.6.7.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20bf96fbf7d51abb95ab75e20508e37b1217cb467fc9cc9f73a584fbf1d5fc88"},
- {file = "osqp-0.6.7.post1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a41a9765be0ef1817ebfdcff10018f792e5452a5af3f2864ea44d7cb22e663"},
- {file = "osqp-0.6.7.post1-cp312-cp312-win_amd64.whl", hash = "sha256:fd56c7e82a6af11d96a549bb07d224359bcd148d4aae9180b8944d20eecd461b"},
- {file = "osqp-0.6.7.post1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a3b1cc48d69150c6dd25cbd7a250425d075365094bfd093f24fab8bdf23bf66b"},
- {file = "osqp-0.6.7.post1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b80e7e6c582fd9c0b1b6e8490482682d53f0c1268ee37b35e6bceac32df0aa56"},
- {file = "osqp-0.6.7.post1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1466ab570c268c070bf3199f3daf071d0a05edb3d26d44d761d209dd3e210fd6"},
- {file = "osqp-0.6.7.post1-cp36-cp36m-win_amd64.whl", hash = "sha256:de48f0343c58430074e42a4f4a965e045c67bf5723f951cc27f33e68d9e9d507"},
- {file = "osqp-0.6.7.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:39c170af5371e0eb9c96b814a65f18c79689e1b45d844bb88b0c025026f22db2"},
- {file = "osqp-0.6.7.post1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1102ffb0debe74ae1c4e6afb45309a7bcf309c2a731916ea529d8ac823321c0"},
- {file = "osqp-0.6.7.post1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ca79f1ae9b99bc0eb75adf8a372765c4e6e55480f1d9d504fca25e8afd923a"},
- {file = "osqp-0.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:ad149ac44adc2afc7627fa711daaf36ac7e87c723f90fca0e0db9f5b2634c374"},
- {file = "osqp-0.6.7.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1bdfd9b13c4dfe6e4c5c3b89007b1ec4264a8bab6af87bc780a860ea38469e65"},
- {file = "osqp-0.6.7.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d01f38e1eef93932987ec71d4e6bd99498a66ac84542a5d32fe61b6588a18200"},
- {file = "osqp-0.6.7.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1647cf184fd29b1984267fbefe747e12c2a62aa862145af9548cd5f4611acd3c"},
- {file = "osqp-0.6.7.post1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e37b23b794c4d229d44fb97424c760ed6bdf1ec1723466cfb4b952c9a37d56fc"},
- {file = "osqp-0.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:1cdbb56533954497228a086b3f6b7cfd68d44b18b74558d866ed24763e0f089a"},
- {file = "osqp-0.6.7.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d8073ca5bbfdca0707a680ae43e1d2e24c26985eb8a4167bd8886b6e5f5e462"},
- {file = "osqp-0.6.7.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5eb4dd5cc8f7cf1b8196572e7b952158b0f9c3e844e5adba397dd1757236fb86"},
- {file = "osqp-0.6.7.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c35a68c26e57f4b6d04fba9e995b7d4c75f34f9b3aaca86f72cd71ce92da8a79"},
- {file = "osqp-0.6.7.post1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e153385dad35e0e5b28a3ef593ec65d28eb180b3f65711b35b9113ebba6ef7c"},
- {file = "osqp-0.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:85c278e833659ef79af9621cdf16acb220b8347c0dfad9c0a39b6319fb718e0f"},
- {file = "osqp-0.6.7.post1.tar.gz", hash = "sha256:554aa10dca8481978b4d334e28201f24ed18f294c5a84350ce2022a8b78f4d72"},
+ {file = "osqp-0.6.7.post3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f751ca1332b480753cfe3c08bf14ca66259bf69679b572e1f8095ad3e26b201d"},
+ {file = "osqp-0.6.7.post3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1b30df65f2d938452e3bd2ca11388b5b16ec7406daedfc4b9dce3747c282e44"},
+ {file = "osqp-0.6.7.post3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e1c4550853a5f1e0a90ae7ccbee1cb990f34f98514911955ad14841613110dd"},
+ {file = "osqp-0.6.7.post3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cce816af77b28fc5eff1a4e6d8d25d0653f48275e6e2814bd5f1767181e715"},
+ {file = "osqp-0.6.7.post3-cp310-cp310-win_amd64.whl", hash = "sha256:78a1d63b36876996a7125e061145280949334d667060a20895c5d1f183c70242"},
+ {file = "osqp-0.6.7.post3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b1a1dcd869fd6ac501e06262c21483a3691b6281e4f3f65af6951330958b89ca"},
+ {file = "osqp-0.6.7.post3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46b93d1110dc0ad311f6691c4df9ee41cbbde5ffc0d8c8d520d4555bf5d8765b"},
+ {file = "osqp-0.6.7.post3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5209104d6fe3ace4fdbf9ace08caa2cba9de1e7ccd5f56279a346c235917138b"},
+ {file = "osqp-0.6.7.post3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfefa07740e9fb1c574cdc836e5afe2600b73c0c12089955d4ae6587c55f0eb"},
+ {file = "osqp-0.6.7.post3-cp311-cp311-win_amd64.whl", hash = "sha256:c48c91dfba02ce11e8b8f5d401ec5b67a316782bfdf4f53ca753e49907f7387f"},
+ {file = "osqp-0.6.7.post3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:023af06764f7aba9c64536ecb7204019906bb7e78237f335f82b404f16623eef"},
+ {file = "osqp-0.6.7.post3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4cec7cb5bf1615c4129277275dc08e20a037372a874cff35eb891b4b35a463de"},
+ {file = "osqp-0.6.7.post3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb882ab24b97b14843b7c71d2474fb8b415bafc8dd60aa94870c2ef338c20bfb"},
+ {file = "osqp-0.6.7.post3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:502fde0ae710cef1e6418fb8d26efef9597d1dcba877489a1c2eb9c3eb2ff2e9"},
+ {file = "osqp-0.6.7.post3-cp312-cp312-win_amd64.whl", hash = "sha256:468588cfb690becba4d1f460c2a53e75530584e3efcf2caed59f5219032e6888"},
+ {file = "osqp-0.6.7.post3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cee478eedf9cfad11ff9c27ef0b1e032506a16888b8b874f622816cf8749db7f"},
+ {file = "osqp-0.6.7.post3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5dd739c4c6c91e40d2e3ea2bb78c635c897e07697ab24a46d3a5d197e254b0f3"},
+ {file = "osqp-0.6.7.post3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:002f280f23d15ad3c6386a868688f0b17c90dba13d0f7f8da1c833a14fc4d7f8"},
+ {file = "osqp-0.6.7.post3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a2922fe8cb666964cf01b643da81eadf4bb435139a5f042d5bb6dcb87496778"},
+ {file = "osqp-0.6.7.post3-cp313-cp313-win_amd64.whl", hash = "sha256:acb219e941f5248da5de3ee9b70e6a5aaddf5f3989dffd1d4c03b0f7b1dfa17b"},
+ {file = "osqp-0.6.7.post3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d12757f9594f87219820aa7ae06ce7800fef9ea52828b7d1970016d6c9749b5f"},
+ {file = "osqp-0.6.7.post3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:565205e0dbe5b6ac1dcd7eee8d2e9c4ba5d88b7aaaa522140cdb7d197a9275bb"},
+ {file = "osqp-0.6.7.post3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34974c8441260e8952f63a17b0461da9b554a3ed9122042dd0f2e0a4c19e9732"},
+ {file = "osqp-0.6.7.post3-cp36-cp36m-win_amd64.whl", hash = "sha256:01d99ced6f43d0d10fa0f01631c5b0a27aca44a5e4743b7ce9a174fcfebfde6e"},
+ {file = "osqp-0.6.7.post3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d54837f762b17cb77aa16be3e85cc424cb93fd4ec84f5cbb14f9c0520191fecf"},
+ {file = "osqp-0.6.7.post3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c353997ebe57cd8252bd5d7100d997086ab0524b946dc49a4e4d4a774752ee9"},
+ {file = "osqp-0.6.7.post3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c37552731443295b629999c6d100f76310a2cd368503095af6165e2f52993d"},
+ {file = "osqp-0.6.7.post3-cp37-cp37m-win_amd64.whl", hash = "sha256:2c3c31712c60d0421178040a6ee9644318fb579bd83375af4ffd9d5d7c9d2d2e"},
+ {file = "osqp-0.6.7.post3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb3c73386d18be58097115f5f8623860d5736c5b956eb54e492b91380cab549e"},
+ {file = "osqp-0.6.7.post3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27396891b4c52baae44d9aef4ad2abf7da9a19946c5cbdd163f96a55de02515f"},
+ {file = "osqp-0.6.7.post3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb39a937c5fbfe935cebc21c9ef51434cabe5a6f415a775b8a0939c39aa31671"},
+ {file = "osqp-0.6.7.post3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:204857fdd4100ad0d487cac4e9c1698843440ec49c1d49b03aa369588cd2db65"},
+ {file = "osqp-0.6.7.post3-cp38-cp38-win_amd64.whl", hash = "sha256:4981c0f2b28bce3731d614953da11b4dd30106ea3e4d7d0a5f7dd3a93270934a"},
+ {file = "osqp-0.6.7.post3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e605e3ec1547a23be16ea52ade3157d4e2e7935472dd9c0c089a9c6b3463be"},
+ {file = "osqp-0.6.7.post3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:82f14aaf099be0888b47e50699006c16107b30f53a7bc27070075d56d23c822c"},
+ {file = "osqp-0.6.7.post3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7938f6e4fe2b8b9737b4b7b0dda48bf0f11c14104b79c07ce0b1fe475f4e1308"},
+ {file = "osqp-0.6.7.post3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298617772814480fce4610ea1f3abac3deac3ffdc978b0df4916f1021d128c66"},
+ {file = "osqp-0.6.7.post3-cp39-cp39-win_amd64.whl", hash = "sha256:894e65b8e4c81f0ef069af6b2ec398881aafe4dd265869b1647ee18a2a9393b1"},
+ {file = "osqp-0.6.7.post3.tar.gz", hash = "sha256:b0c5e0a721f21c9724097a4fd50108304d296468d124e16f34ac67046f7020e1"},
]
[package.dependencies]
@@ -2055,40 +2232,53 @@ files = [
[[package]]
name = "pandas"
-version = "2.2.2"
+version = "2.2.3"
description = "Powerful data structures for data analysis, time series, and statistics"
optional = false
python-versions = ">=3.9"
files = [
- {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"},
- {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"},
- {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"},
- {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"},
- {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"},
- {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"},
- {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"},
- {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"},
- {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"},
- {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"},
- {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"},
- {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"},
- {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"},
- {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"},
- {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"},
- {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"},
- {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"},
- {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"},
- {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"},
- {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"},
- {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"},
- {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"},
- {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"},
- {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"},
- {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"},
- {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"},
- {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"},
- {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"},
- {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"},
+ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
+ {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
+ {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
+ {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
+ {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
+ {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
+ {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
+ {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
+ {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
+ {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
+ {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
+ {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
+ {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
+ {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
+ {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
+ {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
+ {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
+ {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
+ {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
+ {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
+ {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
+ {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
+ {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
+ {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
+ {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
+ {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
+ {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
+ {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
+ {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
+ {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
+ {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
+ {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
+ {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
+ {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
+ {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
]
[package.dependencies]
@@ -2268,13 +2458,13 @@ xmp = ["defusedxml"]
[[package]]
name = "platformdirs"
-version = "4.3.3"
+version = "4.3.6"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.8"
files = [
- {file = "platformdirs-4.3.3-py3-none-any.whl", hash = "sha256:50a5450e2e84f44539718293cbb1da0a0885c9d14adf21b77bae4e66fc99d9b5"},
- {file = "platformdirs-4.3.3.tar.gz", hash = "sha256:d4e0b7d8ec176b341fb03cb11ca12d0276faa8c485f9cd218f613840463fc2c0"},
+ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
+ {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
]
[package.extras]
@@ -2331,13 +2521,13 @@ virtualenv = ">=20.10.0"
[[package]]
name = "prompt-toolkit"
-version = "3.0.47"
+version = "3.0.48"
description = "Library for building powerful interactive command lines in Python"
optional = false
python-versions = ">=3.7.0"
files = [
- {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"},
- {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"},
+ {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"},
+ {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"},
]
[package.dependencies]
@@ -2455,18 +2645,18 @@ files = [
[[package]]
name = "pydantic"
-version = "2.9.1"
+version = "2.9.2"
description = "Data validation using Python type hints"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"},
- {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"},
+ {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"},
+ {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"},
]
[package.dependencies]
annotated-types = ">=0.6.0"
-pydantic-core = "2.23.3"
+pydantic-core = "2.23.4"
typing-extensions = [
{version = ">=4.12.2", markers = "python_version >= \"3.13\""},
{version = ">=4.6.1", markers = "python_version < \"3.13\""},
@@ -2478,100 +2668,100 @@ timezone = ["tzdata"]
[[package]]
name = "pydantic-core"
-version = "2.23.3"
+version = "2.23.4"
description = "Core functionality for Pydantic validation and serialization"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"},
- {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"},
- {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"},
- {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"},
- {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"},
- {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"},
- {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"},
- {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"},
- {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"},
- {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"},
- {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"},
- {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"},
- {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"},
- {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"},
- {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"},
- {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"},
- {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"},
- {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"},
- {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"},
- {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"},
- {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"},
- {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"},
- {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"},
- {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"},
- {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"},
- {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"},
- {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"},
- {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"},
- {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"},
- {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"},
- {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"},
- {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"},
- {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"},
- {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"},
- {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"},
- {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"},
- {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"},
- {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"},
- {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"},
- {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"},
- {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"},
- {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"},
- {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"},
- {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"},
- {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"},
- {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"},
- {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"},
- {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"},
- {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"},
- {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"},
- {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"},
- {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"},
- {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"},
- {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"},
- {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"},
- {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"},
- {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"},
- {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"},
- {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"},
- {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"},
- {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"},
- {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"},
- {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"},
- {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"},
- {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"},
- {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"},
- {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"},
- {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"},
- {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"},
- {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"},
- {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"},
- {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"},
- {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"},
- {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"},
- {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"},
+ {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"},
+ {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"},
+ {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"},
+ {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"},
+ {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"},
+ {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"},
+ {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"},
+ {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"},
+ {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"},
+ {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"},
+ {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"},
+ {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"},
+ {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"},
]
[package.dependencies]
@@ -2647,20 +2837,45 @@ files = [
[package.extras]
windows-terminal = ["colorama (>=0.4.6)"]
+[[package]]
+name = "pympler"
+version = "1.1"
+description = "A development tool to measure, monitor and analyze the memory behavior of Python objects."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "Pympler-1.1-py3-none-any.whl", hash = "sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506"},
+ {file = "pympler-1.1.tar.gz", hash = "sha256:1eaa867cb8992c218430f1708fdaccda53df064144d1c5656b1e6f1ee6000424"},
+]
+
+[package.dependencies]
+pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""}
+
[[package]]
name = "pyparsing"
-version = "3.1.4"
+version = "3.2.0"
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
optional = false
-python-versions = ">=3.6.8"
+python-versions = ">=3.9"
files = [
- {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"},
- {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"},
+ {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"},
+ {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"},
]
[package.extras]
diagrams = ["jinja2", "railroad-diagrams"]
+[[package]]
+name = "pyproject-hooks"
+version = "1.2.0"
+description = "Wrappers to call pyproject.toml-based build backend hooks."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"},
+ {file = "pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8"},
+]
+
[[package]]
name = "pyscipopt"
version = "5.1.1"
@@ -2801,25 +3016,29 @@ files = [
[[package]]
name = "pywin32"
-version = "306"
+version = "308"
description = "Python for Window Extensions"
optional = false
python-versions = "*"
files = [
- {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"},
- {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"},
- {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"},
- {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"},
- {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"},
- {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"},
- {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"},
- {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"},
- {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"},
- {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"},
- {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"},
- {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"},
- {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"},
- {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"},
+ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"},
+ {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"},
+ {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"},
+ {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"},
+ {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"},
+ {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"},
+ {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"},
+ {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"},
+ {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"},
+ {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"},
+ {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"},
+ {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"},
+ {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"},
+ {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"},
+ {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"},
+ {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"},
+ {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"},
+ {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"},
]
[[package]]
@@ -3090,18 +3309,19 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "rich"
-version = "13.8.1"
+version = "13.9.2"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
optional = false
-python-versions = ">=3.7.0"
+python-versions = ">=3.8.0"
files = [
- {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"},
- {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"},
+ {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"},
+ {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"},
]
[package.dependencies]
markdown-it-py = ">=2.2.0"
pygments = ">=2.13.0,<3.0.0"
+typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""}
[package.extras]
jupyter = ["ipywidgets (>=7.5.1,<9)"]
@@ -3913,13 +4133,13 @@ files = [
[[package]]
name = "sympy"
-version = "1.13.2"
+version = "1.13.3"
description = "Computer algebra system (CAS) in Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"},
- {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"},
+ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"},
+ {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"},
]
[package.dependencies]
@@ -3944,13 +4164,13 @@ widechars = ["wcwidth"]
[[package]]
name = "tomli"
-version = "2.0.1"
+version = "2.0.2"
description = "A lil' TOML parser"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
- {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+ {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
+ {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
]
[[package]]
@@ -4001,13 +4221,13 @@ files = [
[[package]]
name = "tzdata"
-version = "2024.1"
+version = "2024.2"
description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
files = [
- {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"},
- {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"},
+ {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
+ {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
]
[[package]]
@@ -4029,13 +4249,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "virtualenv"
-version = "20.26.4"
+version = "20.26.6"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.7"
files = [
- {file = "virtualenv-20.26.4-py3-none-any.whl", hash = "sha256:48f2695d9809277003f30776d155615ffc11328e6a0a8c1f0ec80188d7874a55"},
- {file = "virtualenv-20.26.4.tar.gz", hash = "sha256:c17f4e0f3e6036e9f26700446f85c76ab11df65ff6d8a9cbfad9f71aabfcf23c"},
+ {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"},
+ {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"},
]
[package.dependencies]
@@ -4085,4 +4305,4 @@ picos = ["picos"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.9"
-content-hash = "22fd23528ef58b83e0c5f4932c2b22ff17795263c3dea5cad100bd314d38e179"
+content-hash = "4dc372e3bd23f03830d3e0a534b6bf490516aa436014b8cc86c2791fbfcd0d81"
diff --git a/pyproject.toml b/pyproject.toml
index 97c78791..a7684d39 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -57,9 +57,10 @@ pytest = "^8.1.1"
flake8 = "^7.0.0"
pre-commit = "^3.7.0"
pydocstyle = "^6.3.0"
+asv = "^0.6.4"
[tool.poetry.extras]
-highs = ["cvxpy-base"]
+highs = ["cvxpy-base", "scipy"]
picos = ["picos"]
os = ["cvxpy-base", "scipy", "pyscipopt"]
@@ -69,6 +70,7 @@ fix = true
[tool.ruff.lint]
ignore-init-module-imports = true
select = ["E", "F", "W", "I", "D", "RUF"]
+ignore = ["D101","D102"]
[tool.ruff.lint.flake8-quotes]
docstring-quotes = "double"
diff --git a/tests/test_backend.py b/tests/test_backend.py
index 76ba3524..72549a31 100644
--- a/tests/test_backend.py
+++ b/tests/test_backend.py
@@ -550,6 +550,12 @@ def test_indexing_axis1(backend):
assert np.isclose(np.sum(np.sum(X.value[:, idx])), 6.0)
+def test_zero_function(backend):
+ assert backend.zero_function().value == 0
+ # TODO: Fix this for picos, as it returns (1,1)
+ #assert backend.zero_function().shape == ()
+
+
def test_undirected_flow(backend):
g = Graph()
g.add_edges([((), "A"), ("A", "B"), ("A", "C"), ("B", "D"), ("C", "D"), ("D", ())])