Update docs

docs
Alinson S. Xavier 10 months ago
parent 184af2a869
commit 112963c178

@ -1,4 +1,4 @@
# Sphinx build info version 1 # Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 5d2632d2fbe792265ca773e6a51b93f0 config: 7db92125069190747434f1095b430195
tags: d77d1c0d9ca2f4c8421862c7c5a0d620 tags: d77d1c0d9ca2f4c8421862c7c5a0d620

@ -45,16 +45,10 @@
"- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n", "- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n",
"- Julia version, compatible with the JuMP modeling language.\n", "- Julia version, compatible with the JuMP modeling language.\n",
"\n", "\n",
"In this tutorial, we will demonstrate how to use and install the Python/Gurobipy version of the package. The first step is to install Python 3.8+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n", "In this tutorial, we will demonstrate how to use and install the Python/Gurobipy version of the package. The first step is to install Python 3.9+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n",
"\n", "\n",
"```\n", "```\n",
"$ pip install MIPLearn==0.4\n", "$ pip install MIPLearn~=0.4\n",
"```\n",
"\n",
"In addition to MIPLearn itself, we will also install Gurobi 10.0, a state-of-the-art commercial MILP solver. This step also install a demo license for Gurobi, which should able to solve the small optimization problems in this tutorial. A license is required for solving larger-scale problems.\n",
"\n",
"```\n",
"$ pip install 'gurobipy>=10,<10.1'\n",
"```" "```"
] ]
}, },

@ -45,16 +45,10 @@
"- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n", "- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n",
"- Julia version, compatible with the JuMP modeling language.\n", "- Julia version, compatible with the JuMP modeling language.\n",
"\n", "\n",
"In this tutorial, we will demonstrate how to use and install the Python/Pyomo version of the package. The first step is to install Python 3.8+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n", "In this tutorial, we will demonstrate how to use and install the Python/Pyomo version of the package. The first step is to install Python 3.9+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n",
"\n", "\n",
"```\n", "```\n",
"$ pip install MIPLearn==0.4\n", "$ pip install MIPLearn~=0.4\n",
"```\n",
"\n",
"In addition to MIPLearn itself, we will also install Gurobi 10.0, a state-of-the-art commercial MILP solver. This step also install a demo license for Gurobi, which should able to solve the small optimization problems in this tutorial. A license is required for solving larger-scale problems.\n",
"\n",
"```\n",
"$ pip install 'gurobipy>=10,<10.1'\n",
"```" "```"
] ]
}, },

@ -4,7 +4,7 @@
* *
* Sphinx stylesheet -- basic theme. * Sphinx stylesheet -- basic theme.
* *
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
@ -130,7 +130,7 @@ ul.search li a {
font-weight: bold; font-weight: bold;
} }
ul.search li p.context { ul.search li div.context {
color: #888; color: #888;
margin: 2px 0 0 30px; margin: 2px 0 0 30px;
text-align: left; text-align: left;
@ -222,7 +222,7 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */ /* -- general body styles --------------------------------------------------- */
div.body { div.body {
min-width: 360px; min-width: 450px;
max-width: 800px; max-width: 800px;
} }
@ -237,8 +237,14 @@ a.headerlink {
visibility: hidden; visibility: hidden;
} }
a:visited { a.brackets:before,
color: #551A8B; span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
} }
h1:hover > a.headerlink, h1:hover > a.headerlink,
@ -329,16 +335,12 @@ p.sidebar-title {
font-weight: bold; font-weight: bold;
} }
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote { div.admonition, div.topic, blockquote {
clear: left; clear: left;
} }
/* -- topics ---------------------------------------------------------------- */ /* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic { div.topic {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 7px; padding: 7px;
@ -377,8 +379,6 @@ div.body p.centered {
div.sidebar > :last-child, div.sidebar > :last-child,
aside.sidebar > :last-child, aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child, div.topic > :last-child,
div.admonition > :last-child { div.admonition > :last-child {
margin-bottom: 0; margin-bottom: 0;
@ -386,8 +386,6 @@ div.admonition > :last-child {
div.sidebar::after, div.sidebar::after,
aside.sidebar::after, aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after, div.topic::after,
div.admonition::after, div.admonition::after,
blockquote::after { blockquote::after {
@ -430,6 +428,10 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa; border-bottom: 1px solid #aaa;
} }
table.footnote td, table.footnote th {
border: 0 !important;
}
th { th {
text-align: left; text-align: left;
padding-right: 5px; padding-right: 5px;
@ -506,63 +508,6 @@ table.hlist td {
vertical-align: top; vertical-align: top;
} }
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */ /* -- other body styles ----------------------------------------------------- */
@ -613,26 +558,19 @@ ul.simple p {
margin-bottom: 0; margin-bottom: 0;
} }
aside.footnote > span, dl.footnote > dt,
div.citation > span { dl.citation > dt {
float: left; float: left;
margin-right: 0.5em;
} }
aside.footnote > span:last-of-type,
div.citation > span:last-of-type { dl.footnote > dd,
padding-right: 0.5em; dl.citation > dd {
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em; margin-bottom: 0em;
} }
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after { dl.footnote > dd:after,
dl.citation > dd:after {
content: ""; content: "";
clear: both; clear: both;
} }
@ -649,6 +587,10 @@ dl.field-list > dt {
padding-right: 5px; padding-right: 5px;
} }
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd { dl.field-list > dd {
padding-left: 0.5em; padding-left: 0.5em;
margin-top: 0em; margin-top: 0em;
@ -674,16 +616,6 @@ dd {
margin-left: 30px; margin-left: 30px;
} }
.sig dd {
margin-top: 0px;
margin-bottom: 0px;
}
.sig dl {
margin-top: 0px;
margin-bottom: 0px;
}
dl > dd:last-child, dl > dd:last-child,
dl > dd:last-child > :last-child { dl > dd:last-child > :last-child {
margin-bottom: 0; margin-bottom: 0;
@ -702,6 +634,14 @@ dl.glossary dt {
font-size: 1.1em; font-size: 1.1em;
} }
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified { .versionmodified {
font-style: italic; font-style: italic;
} }
@ -742,9 +682,8 @@ dl.glossary dt {
.classifier:before { .classifier:before {
font-style: normal; font-style: normal;
margin: 0 0.5em; margin: 0.5em;
content: ":"; content: ":";
display: inline-block;
} }
abbr, acronym { abbr, acronym {
@ -752,14 +691,6 @@ abbr, acronym {
cursor: help; cursor: help;
} }
.translated {
background-color: rgba(207, 255, 207, 0.2)
}
.untranslated {
background-color: rgba(255, 207, 207, 0.2)
}
/* -- code displays --------------------------------------------------------- */ /* -- code displays --------------------------------------------------------- */
pre { pre {
@ -776,7 +707,6 @@ span.pre {
-ms-hyphens: none; -ms-hyphens: none;
-webkit-hyphens: none; -webkit-hyphens: none;
hyphens: none; hyphens: none;
white-space: nowrap;
} }
div[class*="highlight-"] { div[class*="highlight-"] {
@ -840,12 +770,8 @@ div.code-block-caption code {
table.highlighttable td.linenos, table.highlighttable td.linenos,
span.linenos, span.linenos,
div.highlight span.gp { /* gp: Generic.Prompt */ div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none; user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
} }
div.code-block-caption span.caption-number { div.code-block-caption span.caption-number {
@ -860,6 +786,16 @@ div.literal-block-wrapper {
margin: 1em 0; margin: 1em 0;
} }
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code { code.xref, a code {
background-color: transparent; background-color: transparent;
font-weight: bold; font-weight: bold;

@ -2,155 +2,320 @@
* doctools.js * doctools.js
* ~~~~~~~~~~~ * ~~~~~~~~~~~
* *
* Base JavaScript utilities for all Sphinx HTML documentation. * Sphinx JavaScript utilities for all documentation.
* *
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
"use strict";
/**
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ * select a different prefix for underscore
"TEXTAREA", */
"INPUT", $u = _.noConflict();
"SELECT",
"BUTTON", /**
]); * make the code below compatible with browsers without
* an installed firebug like debugger
const _ready = (callback) => { if (!window.console || !console.firebug) {
if (document.readyState !== "loading") { var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
callback(); "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
} else { "profile", "profileEnd"];
document.addEventListener("DOMContentLoaded", callback); window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
} }
return result;
}; };
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/** /**
* Small JavaScript module for the documentation. * Small JavaScript module for the documentation.
*/ */
const Documentation = { var Documentation = {
init: () => {
Documentation.initDomainIndexTable(); init : function() {
Documentation.initOnKeyListeners(); this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
this.initOnKeyListeners();
}
}, },
/** /**
* i18n support * i18n support
*/ */
TRANSLATIONS: {}, TRANSLATIONS : {},
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE: "unknown", LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions // gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext) // can safely bound to a different name (_ = Documentation.gettext)
gettext: (string) => { gettext : function(string) {
const translated = Documentation.TRANSLATIONS[string]; var translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) { if (typeof translated === 'undefined')
case "undefined": return string;
return string; // no translation return (typeof translated === 'string') ? translated : translated[0];
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
}, },
ngettext: (singular, plural, n) => { ngettext : function(singular, plural, n) {
const translated = Documentation.TRANSLATIONS[singular]; var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined") if (typeof translated === 'undefined')
return translated[Documentation.PLURAL_EXPR(n)]; return (n == 1) ? singular : plural;
return n === 1 ? singular : plural; return translated[Documentation.PLURALEXPR(n)];
}, },
addTranslations: (catalog) => { addTranslations : function(catalog) {
Object.assign(Documentation.TRANSLATIONS, catalog.messages); for (var key in catalog.messages)
Documentation.PLURAL_EXPR = new Function( this.TRANSLATIONS[key] = catalog.messages[key];
"n", this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
`return (${catalog.plural_expr})` this.LOCALE = catalog.locale;
);
Documentation.LOCALE = catalog.locale;
}, },
/** /**
* helper function to focus on search bar * add context elements like header anchor links
*/ */
focusSearchBar: () => { addContextElements : function() {
document.querySelectorAll("input[name=q]")[0]?.focus(); $('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
}, },
/** /**
* Initialise the domain index toggle buttons * workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/ */
initDomainIndexTable: () => { fixFirefoxAnchorBug : function() {
const toggler = (el) => { if (document.location.hash && $.browser.mozilla)
const idNumber = el.id.substr(7); window.setTimeout(function() {
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); document.location.href += '';
if (el.src.substr(-9) === "minus.png") { }, 10);
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; },
toggledRows.forEach((el) => (el.style.display = "none"));
} else { /**
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; * highlight the search words provided in the url in the text
toggledRows.forEach((el) => (el.style.display = "")); */
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
} }
}; window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
const togglerElements = document.querySelectorAll("img.toggler"); /**
togglerElements.forEach((el) => * init the domain index toggle buttons
el.addEventListener("click", (event) => toggler(event.currentTarget)) */
); initIndexTable : function() {
togglerElements.forEach((el) => (el.style.display = "")); var togglers = $('img.toggler').click(function() {
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
}, },
initOnKeyListeners: () => { /**
// only install a listener if it is really needed * helper function to hide the search marks again
if ( */
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && hideSearchWords : function() {
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS $('#searchbox .highlight-link').fadeOut(300);
) $('span.highlighted').removeClass('highlighted');
return; },
document.addEventListener("keydown", (event) => { /**
// bail for input elements * make the url absolute
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; */
// bail with special keys makeURL : function(relativeURL) {
if (event.altKey || event.ctrlKey || event.metaKey) return; return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
if (!event.shiftKey) {
switch (event.key) { /**
case "ArrowLeft": * get the current relative url
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; */
getCurrentURL : function() {
const prevLink = document.querySelector('link[rel="prev"]'); var path = document.location.pathname;
if (prevLink && prevLink.href) { var parts = path.split(/\//);
window.location.href = prevLink.href; $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
event.preventDefault(); if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
$(document).keydown(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box, textarea, dropdown or button
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
&& activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
&& !event.shiftKey) {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
} }
break; case 39: // right
case "ArrowRight": var nextHref = $('link[rel="next"]').prop('href');
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; if (nextHref) {
window.location.href = nextHref;
const nextLink = document.querySelector('link[rel="next"]'); return false;
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
} }
break;
} }
} }
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
}); });
}, }
}; };
// quick alias for translations // quick alias for translations
const _ = Documentation.gettext; _ = Documentation.gettext;
_ready(Documentation.init); $(document).ready(function() {
Documentation.init();
});

@ -1,13 +1,12 @@
const DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '0.4', VERSION: '0.4',
LANGUAGE: 'en', LANGUAGE: 'None',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
BUILDER: 'dirhtml', BUILDER: 'dirhtml',
FILE_SUFFIX: '.html', FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html', LINK_SUFFIX: '.html',
HAS_SOURCE: true, HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt', SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: true, NAVIGATION_WITH_KEYS: true
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
}; };

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -5,12 +5,12 @@
* This script contains the language-specific data used by searchtools.js, * This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter. * namely the list of stopwords, stemmer, scorer and splitter.
* *
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
/* Non-minified version is copied as a separate JS file, is available */ /* Non-minified version is copied as a separate JS file, is available */
@ -197,3 +197,101 @@ var Stemmer = function() {
} }
} }
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}

@ -22,6 +22,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ .highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
.highlight .gd { color: #a40000 } /* Generic.Deleted */ .highlight .gd { color: #a40000 } /* Generic.Deleted */
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #ef2929 } /* Generic.Error */ .highlight .gr { color: #ef2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .gi { color: #00A000 } /* Generic.Inserted */

@ -4,24 +4,22 @@
* *
* Sphinx JavaScript utilities for the full-text search. * Sphinx JavaScript utilities for the full-text search.
* *
* :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
"use strict";
/** if (!Scorer) {
* Simple result scoring code. /**
*/ * Simple result scoring code.
if (typeof Scorer === "undefined") { */
var Scorer = { var Scorer = {
// Implement the following function to further tweak the score for each result // Implement the following function to further tweak the score for each result
// The function takes a result array [docname, title, anchor, descr, score, filename] // The function takes a result array [filename, title, anchor, descr, score]
// and returns the new score. // and returns the new score.
/* /*
score: result => { score: function(result) {
const [docname, title, anchor, descr, score, filename] = result return result[4];
return score
}, },
*/ */
@ -30,11 +28,9 @@ if (typeof Scorer === "undefined") {
// or matches in the last dotted part of the object name // or matches in the last dotted part of the object name
objPartialMatch: 6, objPartialMatch: 6,
// Additive scores depending on the priority of the object // Additive scores depending on the priority of the object
objPrio: { objPrio: {0: 15, // used to be importantResults
0: 15, // used to be importantResults 1: 5, // used to be objectResults
1: 5, // used to be objectResults 2: -5}, // used to be unimportantResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping. // Used when the priority is not in the mapping.
objPrioDefault: 0, objPrioDefault: 0,
@ -43,503 +39,452 @@ if (typeof Scorer === "undefined") {
partialTitle: 7, partialTitle: 7,
// query found in terms // query found in terms
term: 5, term: 5,
partialTerm: 2, partialTerm: 2
}; };
} }
const _removeChildren = (element) => { if (!splitQuery) {
while (element && element.lastChild) element.removeChild(element.lastChild); function splitQuery(query) {
}; return query.split(/\s+/);
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _displayItem = (item, searchTerms, highlightTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const contentRoot = document.documentElement.dataset.content_root;
const [docName, title, anchor, descr, score, _filename] = item;
let listItem = document.createElement("li");
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = contentRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = contentRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
} }
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + anchor;
linkEl.dataset.score = score;
linkEl.innerHTML = title;
if (descr) {
listItem.appendChild(document.createElement("span")).innerHTML =
" (" + descr + ")";
// highlight search terms in the description
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
}
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms)
);
// highlight search terms in the summary
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = _(
`Search finished, found ${resultCount} page(s) matching the search query.`
);
};
const _displayNextItem = (
results,
resultCount,
searchTerms,
highlightTerms,
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), searchTerms, highlightTerms);
setTimeout(
() => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
} }
/** /**
* Search Module * Search Module
*/ */
const Search = { var Search = {
_index: null,
_queued_query: null, _index : null,
_pulse_status: -1, _queued_query : null,
_pulse_status : -1,
htmlToText: (htmlString) => {
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); htmlToText : function(htmlString) {
htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); var virtualDocument = document.implementation.createHTMLDocument('virtual');
const docContent = htmlElement.querySelector('[role="main"]'); var htmlElement = $(htmlString, virtualDocument);
if (docContent !== undefined) return docContent.textContent; htmlElement.find('.headerlink').remove();
console.warn( docContent = htmlElement.find('[role=main]')[0];
"Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." if(docContent === undefined) {
); console.warn("Content block not found. Sphinx search tries to obtain it " +
return ""; "via '[role=main]'. Could you check your theme or template.");
return "";
}
return docContent.textContent || docContent.innerText;
}, },
init: () => { init : function() {
const query = new URLSearchParams(window.location.search).get("q"); var params = $.getQueryParameters();
document if (params.q) {
.querySelectorAll('input[name="q"]') var query = params.q[0];
.forEach((el) => (el.value = query)); $('input[name="q"]')[0].value = query;
if (query) Search.performSearch(query); this.performSearch(query);
}
}, },
loadIndex: (url) => loadIndex : function(url) {
(document.body.appendChild(document.createElement("script")).src = url), $.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex: (index) => { setIndex : function(index) {
Search._index = index; var q;
if (Search._queued_query !== null) { this._index = index;
const query = Search._queued_query; if ((q = this._queued_query) !== null) {
Search._queued_query = null; this._queued_query = null;
Search.query(query); Search.query(q);
} }
}, },
hasIndex: () => Search._index !== null, hasIndex : function() {
return this._index !== null;
deferQuery: (query) => (Search._queued_query = query), },
stopPulse: () => (Search._pulse_status = -1), deferQuery : function(query) {
this._queued_query = query;
},
startPulse: () => { stopPulse : function() {
if (Search._pulse_status >= 0) return; this._pulse_status = 0;
},
const pulse = () => { startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
Search._pulse_status = (Search._pulse_status + 1) % 4; Search._pulse_status = (Search._pulse_status + 1) % 4;
Search.dots.innerText = ".".repeat(Search._pulse_status); var dotString = '';
if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); for (i = 0; i < Search._pulse_status; i++)
}; dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
pulse(); pulse();
}, },
/** /**
* perform a search for something (or wait until index is loaded) * perform a search for something (or wait until index is loaded)
*/ */
performSearch: (query) => { performSearch : function(query) {
// create the required interface elements // create the required interface elements
const searchText = document.createElement("h2"); this.out = $('#search-results');
searchText.textContent = _("Searching"); this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
const searchSummary = document.createElement("p"); this.dots = $('<span></span>').appendTo(this.title);
searchSummary.classList.add("search-summary"); this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
searchSummary.innerText = ""; this.output = $('<ul class="search"/>').appendTo(this.out);
const searchList = document.createElement("ul");
searchList.classList.add("search"); $('#search-progress').text(_('Preparing search...'));
this.startPulse();
const out = document.getElementById("search-results");
Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick! // index already loaded, the browser was quick!
if (Search.hasIndex()) Search.query(query); if (this.hasIndex())
else Search.deferQuery(query); this.query(query);
else
this.deferQuery(query);
}, },
/** /**
* execute search (requires search index to be loaded) * execute search (requires search index to be loaded)
*/ */
query: (query) => { query : function(query) {
const filenames = Search._index.filenames; var i;
const docNames = Search._index.docnames;
const titles = Search._index.titles; // stem the searchterms and add them to the correct list
const allTitles = Search._index.alltitles; var stemmer = new Stemmer();
const indexEntries = Search._index.indexentries; var searchterms = [];
var excluded = [];
// stem the search terms and add them to the correct list var hlterms = [];
const stemmer = new Stemmer(); var tmp = splitQuery(query);
const searchTerms = new Set(); var objectterms = [];
const excludedTerms = new Set(); for (i = 0; i < tmp.length; i++) {
const highlightTerms = new Set(); if (tmp[i] !== "") {
const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); objectterms.push(tmp[i].toLowerCase());
splitQuery(query.trim()).forEach((queryTerm) => { }
const queryTermLower = queryTerm.toLowerCase();
// maybe skip this "word"
// stopwords array is from language_data.js
if (
stopwords.indexOf(queryTermLower) !== -1 ||
queryTerm.match(/^\d+$/)
)
return;
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word // stem the word
let word = stemmer.stemWord(queryTermLower); var word = stemmer.stemWord(tmp[i].toLowerCase());
// prevent stemmer from cutting word smaller than two chars
if(word.length < 3 && tmp[i].length >= 3) {
word = tmp[i];
}
var toAppend;
// select the correct list // select the correct list
if (word[0] === "-") excludedTerms.add(word.substr(1)); if (word[0] == '-') {
toAppend = excluded;
word = word.substr(1);
}
else { else {
searchTerms.add(word); toAppend = searchterms;
highlightTerms.add(queryTermLower); hlterms.push(tmp[i].toLowerCase());
} }
}); // only add if not already in the list
if (!$u.contains(toAppend, word))
if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js toAppend.push(word);
localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
} }
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug("SEARCH: searching for:"); // console.debug('SEARCH: searching for:');
// console.info("required: ", [...searchTerms]); // console.info('required: ', searchterms);
// console.info("excluded: ", [...excludedTerms]); // console.info('excluded: ', excluded);
// array of [docname, title, anchor, descr, score, filename]
let results = [];
_removeChildren(document.getElementById("search-progress"));
const queryLower = query.toLowerCase();
for (const [title, foundTitles] of Object.entries(allTitles)) {
if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
for (const [file, id] of foundTitles) {
let score = Math.round(100 * queryLower.length / title.length)
results.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
score,
filenames[file],
]);
}
}
}
// search for explicit entries in index directives // prepare search
for (const [entry, foundEntries] of Object.entries(indexEntries)) { var terms = this._index.terms;
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { var titleterms = this._index.titleterms;
for (const [file, id] of foundEntries) {
let score = Math.round(100 * queryLower.length / entry.length) // array of [filename, title, anchor, descr, score]
results.push([ var results = [];
docNames[file], $('#search-progress').empty();
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
]);
}
}
}
// lookup as object // lookup as object
objectTerms.forEach((term) => for (i = 0; i < objectterms.length; i++) {
results.push(...Search.performObjectSearch(term, objectTerms)) var others = [].concat(objectterms.slice(0, i),
); objectterms.slice(i+1, objectterms.length));
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
// lookup as search terms in fulltext // lookup as search terms in fulltext
results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
// let the scorer override scores with a custom scoring function // let the scorer override scores with a custom scoring function
if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); if (Scorer.score) {
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
// now sort the results by score (in opposite order of appearance, since the // now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then // display function below uses pop() to retrieve items) and then
// alphabetically // alphabetically
results.sort((a, b) => { results.sort(function(a, b) {
const leftScore = a[4]; var left = a[4];
const rightScore = b[4]; var right = b[4];
if (leftScore === rightScore) { if (left > right) {
return 1;
} else if (left < right) {
return -1;
} else {
// same score: sort alphabetically // same score: sort alphabetically
const leftTitle = a[1].toLowerCase(); left = a[1].toLowerCase();
const rightTitle = b[1].toLowerCase(); right = b[1].toLowerCase();
if (leftTitle === rightTitle) return 0; return (left > right) ? -1 : ((left < right) ? 1 : 0);
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
} }
return leftScore > rightScore ? 1 : -1;
}); });
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
results = results.reverse();
// for debugging // for debugging
//Search.lastresults = results.slice(); // a copy //Search.lastresults = results.slice(); // a copy
// console.info("search results:", Search.lastresults); //console.info('search results:', Search.lastresults);
// print the results // print the results
_displayNextItem(results, results.length, searchTerms, highlightTerms); var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li></li>');
var requestUrl = "";
var linkUrl = "";
if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
}
listItem.append($('<a/>').attr('href',
linkUrl +
highlightstring + item[2]).html(item[1]));
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.ajax({url: requestUrl,
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}});
} else {
// no source available, just display title
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
}, },
/** /**
* search for object names * search for object names
*/ */
performObjectSearch: (object, objectTerms) => { performObjectSearch : function(object, otherterms) {
const filenames = Search._index.filenames; var filenames = this._index.filenames;
const docNames = Search._index.docnames; var docnames = this._index.docnames;
const objects = Search._index.objects; var objects = this._index.objects;
const objNames = Search._index.objnames; var objnames = this._index.objnames;
const titles = Search._index.titles; var titles = this._index.titles;
const results = []; var i;
var results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4] for (var prefix in objects) {
const fullname = (prefix ? prefix + "." : "") + name; for (var name in objects[prefix]) {
const fullnameLower = fullname.toLowerCase(); var fullname = (prefix ? prefix + '.' : '') + name;
if (fullnameLower.indexOf(object) < 0) return; var fullnameLower = fullname.toLowerCase()
if (fullnameLower.indexOf(object) > -1) {
let score = 0; var score = 0;
const parts = fullnameLower.split("."); var parts = fullnameLower.split('.');
// check for different match types: exact matches of full name or
// check for different match types: exact matches of full name or // "last name" (i.e. last dotted part)
// "last name" (i.e. last dotted part) if (fullnameLower == object || parts[parts.length - 1] == object) {
if (fullnameLower === object || parts.slice(-1)[0] === object) score += Scorer.objNameMatch;
score += Scorer.objNameMatch; // matches in last name
else if (parts.slice(-1)[0].indexOf(object) > -1) } else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch; // matches in last name score += Scorer.objPartialMatch;
}
const objName = objNames[match[1]][2]; var match = objects[prefix][name];
const title = titles[match[0]]; var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be // If more than one term searched for, we require other words to be
// found in the name/title/description // found in the name/title/description
const otherTerms = new Set(objectTerms); if (otherterms.length > 0) {
otherTerms.delete(object); var haystack = (prefix + ' ' + name + ' ' +
if (otherTerms.size > 0) { objname + ' ' + title).toLowerCase();
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); var allfound = true;
if ( for (i = 0; i < otherterms.length; i++) {
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) if (haystack.indexOf(otherterms[i]) == -1) {
) allfound = false;
return; break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3];
if (anchor === '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) {
score += Scorer.objPrio[match[2]];
} else {
score += Scorer.objPrioDefault;
}
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
}
} }
}
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results; return results;
}, },
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
*/
escapeRegExp : function(string) {
return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
},
/** /**
* search for full-text terms in the index * search for full-text terms in the index
*/ */
performTermsSearch: (searchTerms, excludedTerms) => { performTermsSearch : function(searchterms, excluded, terms, titleterms) {
// prepare search var docnames = this._index.docnames;
const terms = Search._index.terms; var filenames = this._index.filenames;
const titleTerms = Search._index.titleterms; var titles = this._index.titles;
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const scoreMap = new Map(); var i, j, file;
const fileMap = new Map(); var fileMap = {};
var scoreMap = {};
var results = [];
// perform the search on the required terms // perform the search on the required terms
searchTerms.forEach((word) => { for (i = 0; i < searchterms.length; i++) {
const files = []; var word = searchterms[i];
const arr = [ var files = [];
{ files: terms[word], score: Scorer.term }, var _o = [
{ files: titleTerms[word], score: Scorer.title }, {files: terms[word], score: Scorer.term},
{files: titleterms[word], score: Scorer.title}
]; ];
// add support for partial matches // add support for partial matches
if (word.length > 2) { if (word.length > 2) {
const escapedWord = _escapeRegExp(word); var word_regex = this.escapeRegExp(word);
Object.keys(terms).forEach((term) => { for (var w in terms) {
if (term.match(escapedWord) && !terms[word]) if (w.match(word_regex) && !terms[word]) {
arr.push({ files: terms[term], score: Scorer.partialTerm }); _o.push({files: terms[w], score: Scorer.partialTerm})
}); }
Object.keys(titleTerms).forEach((term) => { }
if (term.match(escapedWord) && !titleTerms[word]) for (var w in titleterms) {
arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); if (w.match(word_regex) && !titleterms[word]) {
}); _o.push({files: titleterms[w], score: Scorer.partialTitle})
}
}
} }
// no match but word was a required one // no match but word was a required one
if (arr.every((record) => record.files === undefined)) return; if ($u.every(_o, function(o){return o.files === undefined;})) {
break;
}
// found search word in contents // found search word in contents
arr.forEach((record) => { $u.each(_o, function(o) {
if (record.files === undefined) return; var _files = o.files;
if (_files === undefined)
let recordFiles = record.files; return
if (recordFiles.length === undefined) recordFiles = [recordFiles];
files.push(...recordFiles); if (_files.length === undefined)
_files = [_files];
// set score for the word in each file files = files.concat(_files);
recordFiles.forEach((file) => {
if (!scoreMap.has(file)) scoreMap.set(file, {}); // set score for the word in each file to Scorer.term
scoreMap.get(file)[word] = record.score; for (j = 0; j < _files.length; j++) {
}); file = _files[j];
if (!(file in scoreMap))
scoreMap[file] = {};
scoreMap[file][word] = o.score;
}
}); });
// create the mapping // create the mapping
files.forEach((file) => { for (j = 0; j < files.length; j++) {
if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) file = files[j];
fileMap.get(file).push(word); if (file in fileMap && fileMap[file].indexOf(word) === -1)
else fileMap.set(file, [word]); fileMap[file].push(word);
}); else
}); fileMap[file] = [word];
}
}
// now check if the files don't contain excluded terms // now check if the files don't contain excluded terms
const results = []; for (file in fileMap) {
for (const [file, wordList] of fileMap) { var valid = true;
// check if all requirements are matched
// as search terms with length < 3 are discarded // check if all requirements are matched
const filteredTermCount = [...searchTerms].filter( var filteredTermCount = // as search terms with length < 3 are discarded: ignore
(term) => term.length > 2 searchterms.filter(function(term){return term.length > 2}).length
).length;
if ( if (
wordList.length !== searchTerms.size && fileMap[file].length != searchterms.length &&
wordList.length !== filteredTermCount fileMap[file].length != filteredTermCount
) ) continue;
continue;
// ensure that none of the excluded terms is in the search result // ensure that none of the excluded terms is in the search result
if ( for (i = 0; i < excluded.length; i++) {
[...excludedTerms].some( if (terms[excluded[i]] == file ||
(term) => titleterms[excluded[i]] == file ||
terms[term] === file || $u.contains(terms[excluded[i]] || [], file) ||
titleTerms[term] === file || $u.contains(titleterms[excluded[i]] || [], file)) {
(terms[term] || []).includes(file) || valid = false;
(titleTerms[term] || []).includes(file) break;
) }
) }
break;
// select one (max) score for the file. // if we have still a valid result we can add it to the result list
const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); if (valid) {
// add result to the result list // select one (max) score for the file.
results.push([ // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
docNames[file], var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
titles[file], results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
"", }
null,
score,
filenames[file],
]);
} }
return results; return results;
}, },
@ -547,28 +492,31 @@ const Search = {
/** /**
* helper function to return a node containing the * helper function to return a node containing the
* search summary for a given text. keywords is a list * search summary for a given text. keywords is a list
* of stemmed words. * of stemmed words, hlwords is the list of normal, unstemmed
* words. the first one is used to find the occurrence, the
* latter for highlighting it.
*/ */
makeSearchSummary: (htmlText, keywords) => { makeSearchSummary : function(htmlText, keywords, hlwords) {
const text = Search.htmlToText(htmlText); var text = Search.htmlToText(htmlText);
if (text === "") return null; var textLower = text.toLowerCase();
var start = 0;
const textLower = text.toLowerCase(); $.each(keywords, function() {
const actualStartPosition = [...keywords] var i = textLower.indexOf(this.toLowerCase());
.map((k) => textLower.indexOf(k.toLowerCase())) if (i > -1)
.filter((i) => i > -1) start = i;
.slice(-1)[0]; });
const startWithContext = Math.max(actualStartPosition - 120, 0); start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
const top = startWithContext === 0 ? "" : "..."; $.trim(text.substr(start, 240)) +
const tail = startWithContext + 240 < text.length ? "..." : ""; ((start + 240 - text.length) ? '...' : '');
var rv = $('<div class="context"></div>').text(excerpt);
let summary = document.createElement("p"); $.each(hlwords, function() {
summary.classList.add("context"); rv = rv.highlightText(this, 'highlighted');
summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; });
return rv;
return summary; }
},
}; };
_ready(Search.init); $(document).ready(function() {
Search.init();
});

@ -1,154 +0,0 @@
/* Highlighting utilities for Sphinx HTML documentation. */
"use strict";
const SPHINX_HIGHLIGHT_ENABLED = true
/**
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0 &&
!parent.classList.contains(className) &&
!parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
const rest = document.createTextNode(val.substr(pos + text.length));
parent.insertBefore(
span,
parent.insertBefore(
rest,
node.nextSibling
)
);
node.nodeValue = val.substr(0, pos);
/* There may be more occurrences of search term in this node. So call this
* function recursively on the remaining fragment.
*/
_highlight(rest, addItems, text, className);
if (isInSVG) {
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect"
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
};
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target)
);
};
/**
* Small JavaScript module for the documentation.
*/
const SphinxHighlight = {
/**
* highlight the search words provided in localstorage in the text
*/
highlightSearchWords: () => {
if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
// get and clear terms from localstorage
const url = new URL(window.location);
const highlight =
localStorage.getItem("sphinx_highlight_terms")
|| url.searchParams.get("highlight")
|| "";
localStorage.removeItem("sphinx_highlight_terms")
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
// get individual terms from highlight string
const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
if (terms.length === 0) return; // nothing to do
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">' +
'<a href="javascript:SphinxHighlight.hideSearchWords()">' +
_("Hide Search Matches") +
"</a></p>"
)
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
localStorage.removeItem("sphinx_highlight_terms")
},
initEscapeListener: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
SphinxHighlight.hideSearchWords();
event.preventDefault();
}
});
},
};
_ready(() => {
/* Do not call highlightSearchWords() when we are on the search page.
* It will highlight words from the *previous* search query.
*/
if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
SphinxHighlight.initEscapeListener();
});

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>11. Collectors &amp; Extractors &#8212; MIPLearn 0.4</title> <title>11. Collectors &amp; Extractors &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,17 +22,18 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="12. Components" href="../components/" /> <link rel="next" title="12. Components" href="../components/" />
@ -64,7 +65,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -91,7 +92,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -123,7 +124,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -225,226 +226,26 @@
<a class="reference internal nav-link" href="#module-miplearn.classifiers.minprob"> <a class="reference internal nav-link" href="#module-miplearn.classifiers.minprob">
11.1. miplearn.classifiers.minprob 11.1. miplearn.classifiers.minprob
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.minprob.MinProbabilityClassifier">
<code class="docutils literal notranslate">
<span class="pre">
MinProbabilityClassifier
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.fit">
<code class="docutils literal notranslate">
<span class="pre">
MinProbabilityClassifier.fit()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.predict">
<code class="docutils literal notranslate">
<span class="pre">
MinProbabilityClassifier.predict()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.set_fit_request">
<code class="docutils literal notranslate">
<span class="pre">
MinProbabilityClassifier.set_fit_request()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.set_predict_request">
<code class="docutils literal notranslate">
<span class="pre">
MinProbabilityClassifier.set_predict_request()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.classifiers.singleclass"> <a class="reference internal nav-link" href="#module-miplearn.classifiers.singleclass">
11.2. miplearn.classifiers.singleclass 11.2. miplearn.classifiers.singleclass
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.singleclass.SingleClassFix">
<code class="docutils literal notranslate">
<span class="pre">
SingleClassFix
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.singleclass.SingleClassFix.fit">
<code class="docutils literal notranslate">
<span class="pre">
SingleClassFix.fit()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.singleclass.SingleClassFix.predict">
<code class="docutils literal notranslate">
<span class="pre">
SingleClassFix.predict()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.singleclass.SingleClassFix.set_fit_request">
<code class="docutils literal notranslate">
<span class="pre">
SingleClassFix.set_fit_request()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.classifiers.singleclass.SingleClassFix.set_predict_request">
<code class="docutils literal notranslate">
<span class="pre">
SingleClassFix.set_predict_request()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.collectors.basic"> <a class="reference internal nav-link" href="#module-miplearn.collectors.basic">
11.3. miplearn.collectors.basic 11.3. miplearn.collectors.basic
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.collectors.basic.BasicCollector">
<code class="docutils literal notranslate">
<span class="pre">
BasicCollector
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.collectors.basic.BasicCollector.collect">
<code class="docutils literal notranslate">
<span class="pre">
BasicCollector.collect()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.extractors.fields"> <a class="reference internal nav-link" href="#module-miplearn.extractors.fields">
11.4. miplearn.extractors.fields 11.4. miplearn.extractors.fields
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.fields.H5FieldsExtractor">
<code class="docutils literal notranslate">
<span class="pre">
H5FieldsExtractor
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.fields.H5FieldsExtractor.get_constr_features">
<code class="docutils literal notranslate">
<span class="pre">
H5FieldsExtractor.get_constr_features()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.fields.H5FieldsExtractor.get_instance_features">
<code class="docutils literal notranslate">
<span class="pre">
H5FieldsExtractor.get_instance_features()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.fields.H5FieldsExtractor.get_var_features">
<code class="docutils literal notranslate">
<span class="pre">
H5FieldsExtractor.get_var_features()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.extractors.AlvLouWeh2017"> <a class="reference internal nav-link" href="#module-miplearn.extractors.AlvLouWeh2017">
11.5. miplearn.extractors.AlvLouWeh2017 11.5. miplearn.extractors.AlvLouWeh2017
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor">
<code class="docutils literal notranslate">
<span class="pre">
AlvLouWeh2017Extractor
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_constr_features">
<code class="docutils literal notranslate">
<span class="pre">
AlvLouWeh2017Extractor.get_constr_features()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_instance_features">
<code class="docutils literal notranslate">
<span class="pre">
AlvLouWeh2017Extractor.get_instance_features()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_var_features">
<code class="docutils literal notranslate">
<span class="pre">
AlvLouWeh2017Extractor.get_var_features()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
</ul> </ul>
@ -457,32 +258,32 @@
<div> <div>
<section id="collectors-extractors"> <div class="section" id="collectors-extractors">
<h1><span class="section-number">11. </span>Collectors &amp; Extractors<a class="headerlink" href="#collectors-extractors" title="Link to this heading"></a></h1> <h1><span class="section-number">11. </span>Collectors &amp; Extractors<a class="headerlink" href="#collectors-extractors" title="Permalink to this headline"></a></h1>
<section id="module-miplearn.classifiers.minprob"> <div class="section" id="module-miplearn.classifiers.minprob">
<span id="miplearn-classifiers-minprob"></span><h2><span class="section-number">11.1. </span>miplearn.classifiers.minprob<a class="headerlink" href="#module-miplearn.classifiers.minprob" title="Link to this heading"></a></h2> <span id="miplearn-classifiers-minprob"></span><h2><span class="section-number">11.1. </span>miplearn.classifiers.minprob<a class="headerlink" href="#module-miplearn.classifiers.minprob" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.classifiers.minprob.MinProbabilityClassifier"> <dt id="miplearn.classifiers.minprob.MinProbabilityClassifier">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.classifiers.minprob.</span></span><span class="sig-name descname"><span class="pre">MinProbabilityClassifier</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">base_clf:</span> <span class="pre">~typing.Any,</span> <span class="pre">thresholds:</span> <span class="pre">~typing.List[float],</span> <span class="pre">clone_fn:</span> <span class="pre">~typing.Callable[[~typing.Any],</span> <span class="pre">~typing.Any]</span> <span class="pre">=</span> <span class="pre">&lt;function</span> <span class="pre">clone&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.classifiers.minprob.</span></code><code class="sig-name descname"><span class="pre">MinProbabilityClassifier</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">base_clf:</span> <span class="pre">Any,</span> <span class="pre">thresholds:</span> <span class="pre">List[float],</span> <span class="pre">clone_fn:</span> <span class="pre">Callable[[Any],</span> <span class="pre">Any]</span> <span class="pre">=</span> <span class="pre">&lt;function</span> <span class="pre">clone&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">BaseEstimator</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">sklearn.base.BaseEstimator</span></code></p>
<p>Meta-classifier that returns NaN for predictions made by a base classifier that <p>Meta-classifier that returns NaN for predictions made by a base classifier that
have probability below a given threshold. More specifically, this meta-classifier have probability below a given threshold. More specifically, this meta-classifier
calls base_clf.predict_proba and compares the result against the provided calls base_clf.predict_proba and compares the result against the provided
thresholds. If the probability for one of the classes is above its threshold, thresholds. If the probability for one of the classes is above its threshold,
the meta-classifier returns that prediction. Otherwise, it returns NaN.</p> the meta-classifier returns that prediction. Otherwise, it returns NaN.</p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.minprob.MinProbabilityClassifier.fit"> <dt id="miplearn.classifiers.minprob.MinProbabilityClassifier.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">y</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">y</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.minprob.MinProbabilityClassifier.predict"> <dt id="miplearn.classifiers.minprob.MinProbabilityClassifier.predict">
<span class="sig-name descname"><span class="pre">predict</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.predict" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">predict</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.predict" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.minprob.MinProbabilityClassifier.set_fit_request"> <dt id="miplearn.classifiers.minprob.MinProbabilityClassifier.set_fit_request">
<span class="sig-name descname"><span class="pre">set_fit_request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#miplearn.classifiers.minprob.MinProbabilityClassifier" title="miplearn.classifiers.minprob.MinProbabilityClassifier"><span class="pre">MinProbabilityClassifier</span></a></span></span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.set_fit_request" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_fit_request</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">bool</span><span class="p"><span class="pre">,</span> </span><span class="pre">None</span><span class="p"><span class="pre">,</span> </span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="#miplearn.classifiers.minprob.MinProbabilityClassifier" title="miplearn.classifiers.minprob.MinProbabilityClassifier"><span class="pre">miplearn.classifiers.minprob.MinProbabilityClassifier</span></a><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.set_fit_request" title="Permalink to this definition"></a></dt>
<dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">fit</span></code> method.</p> <dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">fit</span></code> method.</p>
<p>Note that this method is only relevant if <p>Note that this method is only relevant if
<code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>). <code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>).
@ -508,21 +309,21 @@ sub-estimator of a meta-estimator, e.g. used inside a
<code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p> <code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p>
</div> </div>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">fit</span></code>.</p> <dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">fit</span></code>.</p>
</dd> </dd>
<dt class="field-even">Returns<span class="colon">:</span></dt> <dt class="field-even">Returns</dt>
<dd class="field-even"><p><strong>self</strong> The updated object.</p> <dd class="field-even"><p><strong>self</strong> The updated object.</p>
</dd> </dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt> <dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>object</p> <dd class="field-odd"><p>object</p>
</dd> </dd>
</dl> </dl>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.minprob.MinProbabilityClassifier.set_predict_request"> <dt id="miplearn.classifiers.minprob.MinProbabilityClassifier.set_predict_request">
<span class="sig-name descname"><span class="pre">set_predict_request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#miplearn.classifiers.minprob.MinProbabilityClassifier" title="miplearn.classifiers.minprob.MinProbabilityClassifier"><span class="pre">MinProbabilityClassifier</span></a></span></span><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.set_predict_request" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_predict_request</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">bool</span><span class="p"><span class="pre">,</span> </span><span class="pre">None</span><span class="p"><span class="pre">,</span> </span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="#miplearn.classifiers.minprob.MinProbabilityClassifier" title="miplearn.classifiers.minprob.MinProbabilityClassifier"><span class="pre">miplearn.classifiers.minprob.MinProbabilityClassifier</span></a><a class="headerlink" href="#miplearn.classifiers.minprob.MinProbabilityClassifier.set_predict_request" title="Permalink to this definition"></a></dt>
<dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">predict</span></code> method.</p> <dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">predict</span></code> method.</p>
<p>Note that this method is only relevant if <p>Note that this method is only relevant if
<code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>). <code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>).
@ -548,13 +349,13 @@ sub-estimator of a meta-estimator, e.g. used inside a
<code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p> <code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p>
</div> </div>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">predict</span></code>.</p> <dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">predict</span></code>.</p>
</dd> </dd>
<dt class="field-even">Returns<span class="colon">:</span></dt> <dt class="field-even">Returns</dt>
<dd class="field-even"><p><strong>self</strong> The updated object.</p> <dd class="field-even"><p><strong>self</strong> The updated object.</p>
</dd> </dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt> <dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>object</p> <dd class="field-odd"><p>object</p>
</dd> </dd>
</dl> </dl>
@ -562,31 +363,31 @@ sub-estimator of a meta-estimator, e.g. used inside a
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.classifiers.singleclass"> <div class="section" id="module-miplearn.classifiers.singleclass">
<span id="miplearn-classifiers-singleclass"></span><h2><span class="section-number">11.2. </span>miplearn.classifiers.singleclass<a class="headerlink" href="#module-miplearn.classifiers.singleclass" title="Link to this heading"></a></h2> <span id="miplearn-classifiers-singleclass"></span><h2><span class="section-number">11.2. </span>miplearn.classifiers.singleclass<a class="headerlink" href="#module-miplearn.classifiers.singleclass" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.classifiers.singleclass.SingleClassFix"> <dt id="miplearn.classifiers.singleclass.SingleClassFix">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.classifiers.singleclass.</span></span><span class="sig-name descname"><span class="pre">SingleClassFix</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">base_clf:</span> <span class="pre">~sklearn.base.BaseEstimator</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">clone_fn:</span> <span class="pre">~typing.Callable</span> <span class="pre">=</span> <span class="pre">&lt;function</span> <span class="pre">clone&gt;</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.classifiers.singleclass.</span></code><code class="sig-name descname"><span class="pre">SingleClassFix</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">base_clf:</span> <span class="pre">sklearn.base.BaseEstimator</span></em>, <em class="sig-param"><span class="pre">clone_fn:</span> <span class="pre">Callable</span> <span class="pre">=</span> <span class="pre">&lt;function</span> <span class="pre">clone&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">BaseEstimator</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">sklearn.base.BaseEstimator</span></code></p>
<p>Some sklearn classifiers, such as logistic regression, have issues with datasets <p>Some sklearn classifiers, such as logistic regression, have issues with datasets
that contain a single class. This meta-classifier fixes the issue. If the that contain a single class. This meta-classifier fixes the issue. If the
training data contains a single class, this meta-classifier always returns that training data contains a single class, this meta-classifier always returns that
class as a prediction. Otherwise, it fits the provided base classifier, class as a prediction. Otherwise, it fits the provided base classifier,
and returns its predictions instead.</p> and returns its predictions instead.</p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.singleclass.SingleClassFix.fit"> <dt id="miplearn.classifiers.singleclass.SingleClassFix.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">y</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">y</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.singleclass.SingleClassFix.predict"> <dt id="miplearn.classifiers.singleclass.SingleClassFix.predict">
<span class="sig-name descname"><span class="pre">predict</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.predict" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">predict</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.predict" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.singleclass.SingleClassFix.set_fit_request"> <dt id="miplearn.classifiers.singleclass.SingleClassFix.set_fit_request">
<span class="sig-name descname"><span class="pre">set_fit_request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#miplearn.classifiers.singleclass.SingleClassFix" title="miplearn.classifiers.singleclass.SingleClassFix"><span class="pre">SingleClassFix</span></a></span></span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.set_fit_request" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_fit_request</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">bool</span><span class="p"><span class="pre">,</span> </span><span class="pre">None</span><span class="p"><span class="pre">,</span> </span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="#miplearn.classifiers.singleclass.SingleClassFix" title="miplearn.classifiers.singleclass.SingleClassFix"><span class="pre">miplearn.classifiers.singleclass.SingleClassFix</span></a><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.set_fit_request" title="Permalink to this definition"></a></dt>
<dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">fit</span></code> method.</p> <dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">fit</span></code> method.</p>
<p>Note that this method is only relevant if <p>Note that this method is only relevant if
<code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>). <code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>).
@ -612,21 +413,21 @@ sub-estimator of a meta-estimator, e.g. used inside a
<code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p> <code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p>
</div> </div>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">fit</span></code>.</p> <dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">fit</span></code>.</p>
</dd> </dd>
<dt class="field-even">Returns<span class="colon">:</span></dt> <dt class="field-even">Returns</dt>
<dd class="field-even"><p><strong>self</strong> The updated object.</p> <dd class="field-even"><p><strong>self</strong> The updated object.</p>
</dd> </dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt> <dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>object</p> <dd class="field-odd"><p>object</p>
</dd> </dd>
</dl> </dl>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.classifiers.singleclass.SingleClassFix.set_predict_request"> <dt id="miplearn.classifiers.singleclass.SingleClassFix.set_predict_request">
<span class="sig-name descname"><span class="pre">set_predict_request</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#miplearn.classifiers.singleclass.SingleClassFix" title="miplearn.classifiers.singleclass.SingleClassFix"><span class="pre">SingleClassFix</span></a></span></span><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.set_predict_request" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_predict_request</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">bool</span><span class="p"><span class="pre">,</span> </span><span class="pre">None</span><span class="p"><span class="pre">,</span> </span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'$UNCHANGED$'</span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="#miplearn.classifiers.singleclass.SingleClassFix" title="miplearn.classifiers.singleclass.SingleClassFix"><span class="pre">miplearn.classifiers.singleclass.SingleClassFix</span></a><a class="headerlink" href="#miplearn.classifiers.singleclass.SingleClassFix.set_predict_request" title="Permalink to this definition"></a></dt>
<dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">predict</span></code> method.</p> <dd><p>Request metadata passed to the <code class="docutils literal notranslate"><span class="pre">predict</span></code> method.</p>
<p>Note that this method is only relevant if <p>Note that this method is only relevant if
<code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>). <code class="docutils literal notranslate"><span class="pre">enable_metadata_routing=True</span></code> (see <code class="xref py py-func docutils literal notranslate"><span class="pre">sklearn.set_config()</span></code>).
@ -652,13 +453,13 @@ sub-estimator of a meta-estimator, e.g. used inside a
<code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p> <code class="xref py py-class docutils literal notranslate"><span class="pre">Pipeline</span></code>. Otherwise it has no effect.</p>
</div> </div>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">predict</span></code>.</p> <dd class="field-odd"><p><strong>x</strong> (<em>str</em><em>, </em><em>True</em><em>, </em><em>False</em><em>, or </em><em>None</em><em>, </em><em>default=sklearn.utils.metadata_routing.UNCHANGED</em>) Metadata routing for <code class="docutils literal notranslate"><span class="pre">x</span></code> parameter in <code class="docutils literal notranslate"><span class="pre">predict</span></code>.</p>
</dd> </dd>
<dt class="field-even">Returns<span class="colon">:</span></dt> <dt class="field-even">Returns</dt>
<dd class="field-even"><p><strong>self</strong> The updated object.</p> <dd class="field-even"><p><strong>self</strong> The updated object.</p>
</dd> </dd>
<dt class="field-odd">Return type<span class="colon">:</span></dt> <dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>object</p> <dd class="field-odd"><p>object</p>
</dd> </dd>
</dl> </dl>
@ -666,64 +467,64 @@ sub-estimator of a meta-estimator, e.g. used inside a
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.collectors.basic"> <div class="section" id="module-miplearn.collectors.basic">
<span id="miplearn-collectors-basic"></span><h2><span class="section-number">11.3. </span>miplearn.collectors.basic<a class="headerlink" href="#module-miplearn.collectors.basic" title="Link to this heading"></a></h2> <span id="miplearn-collectors-basic"></span><h2><span class="section-number">11.3. </span>miplearn.collectors.basic<a class="headerlink" href="#module-miplearn.collectors.basic" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.collectors.basic.BasicCollector"> <dt id="miplearn.collectors.basic.BasicCollector">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.collectors.basic.</span></span><span class="sig-name descname"><span class="pre">BasicCollector</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">skip_lp</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">write_mps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.collectors.basic.BasicCollector" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.collectors.basic.</span></code><code class="sig-name descname"><span class="pre">BasicCollector</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">skip_lp</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">write_mps</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.collectors.basic.BasicCollector" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.collectors.basic.BasicCollector.collect"> <dt id="miplearn.collectors.basic.BasicCollector.collect">
<span class="sig-name descname"><span class="pre">collect</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filenames</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">build_model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n_jobs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">progress</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.collectors.basic.BasicCollector.collect" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">collect</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filenames</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">build_model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Callable</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n_jobs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">progress</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.collectors.basic.BasicCollector.collect" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.extractors.fields"> <div class="section" id="module-miplearn.extractors.fields">
<span id="miplearn-extractors-fields"></span><h2><span class="section-number">11.4. </span>miplearn.extractors.fields<a class="headerlink" href="#module-miplearn.extractors.fields" title="Link to this heading"></a></h2> <span id="miplearn-extractors-fields"></span><h2><span class="section-number">11.4. </span>miplearn.extractors.fields<a class="headerlink" href="#module-miplearn.extractors.fields" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.extractors.fields.H5FieldsExtractor"> <dt id="miplearn.extractors.fields.H5FieldsExtractor">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.extractors.fields.</span></span><span class="sig-name descname"><span class="pre">H5FieldsExtractor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">instance_fields</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_fields</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constr_fields</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.extractors.fields.</span></code><code class="sig-name descname"><span class="pre">H5FieldsExtractor</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">instance_fields</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_fields</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constr_fields</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">FeaturesExtractor</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.extractors.abstract.FeaturesExtractor</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.extractors.fields.H5FieldsExtractor.get_constr_features"> <dt id="miplearn.extractors.fields.H5FieldsExtractor.get_constr_features">
<span class="sig-name descname"><span class="pre">get_constr_features</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor.get_constr_features" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_constr_features</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor.get_constr_features" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.extractors.fields.H5FieldsExtractor.get_instance_features"> <dt id="miplearn.extractors.fields.H5FieldsExtractor.get_instance_features">
<span class="sig-name descname"><span class="pre">get_instance_features</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor.get_instance_features" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_instance_features</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor.get_instance_features" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.extractors.fields.H5FieldsExtractor.get_var_features"> <dt id="miplearn.extractors.fields.H5FieldsExtractor.get_var_features">
<span class="sig-name descname"><span class="pre">get_var_features</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor.get_var_features" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_var_features</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.extractors.fields.H5FieldsExtractor.get_var_features" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.extractors.AlvLouWeh2017"> <div class="section" id="module-miplearn.extractors.AlvLouWeh2017">
<span id="miplearn-extractors-alvlouweh2017"></span><h2><span class="section-number">11.5. </span>miplearn.extractors.AlvLouWeh2017<a class="headerlink" href="#module-miplearn.extractors.AlvLouWeh2017" title="Link to this heading"></a></h2> <span id="miplearn-extractors-alvlouweh2017"></span><h2><span class="section-number">11.5. </span>miplearn.extractors.AlvLouWeh2017<a class="headerlink" href="#module-miplearn.extractors.AlvLouWeh2017" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor"> <dt id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.extractors.AlvLouWeh2017.</span></span><span class="sig-name descname"><span class="pre">AlvLouWeh2017Extractor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">with_m1</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">with_m2</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">with_m3</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.extractors.AlvLouWeh2017.</span></code><code class="sig-name descname"><span class="pre">AlvLouWeh2017Extractor</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">with_m1</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">with_m2</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">with_m3</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">FeaturesExtractor</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.extractors.abstract.FeaturesExtractor</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_constr_features"> <dt id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_constr_features">
<span class="sig-name descname"><span class="pre">get_constr_features</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_constr_features" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_constr_features</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_constr_features" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_instance_features"> <dt id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_instance_features">
<span class="sig-name descname"><span class="pre">get_instance_features</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_instance_features" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_instance_features</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_instance_features" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_var_features"> <dt id="miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_var_features">
<span class="sig-name descname"><span class="pre">get_var_features</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_var_features" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_var_features</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.extractors.AlvLouWeh2017.AlvLouWeh2017Extractor.get_var_features" title="Permalink to this definition"></a></dt>
<dd><dl class="simple"> <dd><dl class="simple">
<dt>Computes static variable features described in:</dt><dd><p>Alvarez, A. M., Louveaux, Q., &amp; Wehenkel, L. (2017). A machine learning-based <dt>Computes static variable features described in:</dt><dd><p>Alvarez, A. M., Louveaux, Q., &amp; Wehenkel, L. (2017). A machine learning-based
approximation of strong branching. INFORMS Journal on Computing, 29(1), approximation of strong branching. INFORMS Journal on Computing, 29(1),
@ -734,8 +535,8 @@ approximation of strong branching. INFORMS Journal on Computing, 29(1),
</dd></dl> </dd></dl>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>12. Components &#8212; MIPLearn 0.4</title> <title>12. Components &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,17 +22,18 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="13. Solvers" href="../solvers/" /> <link rel="next" title="13. Solvers" href="../solvers/" />
@ -64,7 +65,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -91,7 +92,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -123,7 +124,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -225,292 +226,26 @@
<a class="reference internal nav-link" href="#module-miplearn.components.primal.actions"> <a class="reference internal nav-link" href="#module-miplearn.components.primal.actions">
12.1. miplearn.components.primal.actions 12.1. miplearn.components.primal.actions
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.EnforceProximity">
<code class="docutils literal notranslate">
<span class="pre">
EnforceProximity
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.EnforceProximity.perform">
<code class="docutils literal notranslate">
<span class="pre">
EnforceProximity.perform()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.FixVariables">
<code class="docutils literal notranslate">
<span class="pre">
FixVariables
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.FixVariables.perform">
<code class="docutils literal notranslate">
<span class="pre">
FixVariables.perform()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.PrimalComponentAction">
<code class="docutils literal notranslate">
<span class="pre">
PrimalComponentAction
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.PrimalComponentAction.perform">
<code class="docutils literal notranslate">
<span class="pre">
PrimalComponentAction.perform()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.SetWarmStart">
<code class="docutils literal notranslate">
<span class="pre">
SetWarmStart
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.actions.SetWarmStart.perform">
<code class="docutils literal notranslate">
<span class="pre">
SetWarmStart.perform()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.components.primal.expert"> <a class="reference internal nav-link" href="#module-miplearn.components.primal.expert">
12.2. miplearn.components.primal.expert 12.2. miplearn.components.primal.expert
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.expert.ExpertPrimalComponent">
<code class="docutils literal notranslate">
<span class="pre">
ExpertPrimalComponent
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.expert.ExpertPrimalComponent.before_mip">
<code class="docutils literal notranslate">
<span class="pre">
ExpertPrimalComponent.before_mip()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.expert.ExpertPrimalComponent.fit">
<code class="docutils literal notranslate">
<span class="pre">
ExpertPrimalComponent.fit()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.components.primal.indep"> <a class="reference internal nav-link" href="#module-miplearn.components.primal.indep">
12.3. miplearn.components.primal.indep 12.3. miplearn.components.primal.indep
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent">
<code class="docutils literal notranslate">
<span class="pre">
IndependentVarsPrimalComponent
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent.before_mip">
<code class="docutils literal notranslate">
<span class="pre">
IndependentVarsPrimalComponent.before_mip()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent.fit">
<code class="docutils literal notranslate">
<span class="pre">
IndependentVarsPrimalComponent.fit()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.components.primal.joint"> <a class="reference internal nav-link" href="#module-miplearn.components.primal.joint">
12.4. miplearn.components.primal.joint 12.4. miplearn.components.primal.joint
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.joint.JointVarsPrimalComponent">
<code class="docutils literal notranslate">
<span class="pre">
JointVarsPrimalComponent
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.joint.JointVarsPrimalComponent.before_mip">
<code class="docutils literal notranslate">
<span class="pre">
JointVarsPrimalComponent.before_mip()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.joint.JointVarsPrimalComponent.fit">
<code class="docutils literal notranslate">
<span class="pre">
JointVarsPrimalComponent.fit()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.components.primal.mem"> <a class="reference internal nav-link" href="#module-miplearn.components.primal.mem">
12.5. miplearn.components.primal.mem 12.5. miplearn.components.primal.mem
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.MemorizingPrimalComponent">
<code class="docutils literal notranslate">
<span class="pre">
MemorizingPrimalComponent
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.MemorizingPrimalComponent.before_mip">
<code class="docutils literal notranslate">
<span class="pre">
MemorizingPrimalComponent.before_mip()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.MemorizingPrimalComponent.fit">
<code class="docutils literal notranslate">
<span class="pre">
MemorizingPrimalComponent.fit()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.MergeTopSolutions">
<code class="docutils literal notranslate">
<span class="pre">
MergeTopSolutions
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.MergeTopSolutions.construct">
<code class="docutils literal notranslate">
<span class="pre">
MergeTopSolutions.construct()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.SelectTopSolutions">
<code class="docutils literal notranslate">
<span class="pre">
SelectTopSolutions
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.SelectTopSolutions.construct">
<code class="docutils literal notranslate">
<span class="pre">
SelectTopSolutions.construct()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.SolutionConstructor">
<code class="docutils literal notranslate">
<span class="pre">
SolutionConstructor
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.components.primal.mem.SolutionConstructor.construct">
<code class="docutils literal notranslate">
<span class="pre">
SolutionConstructor.construct()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
</ul> </ul>
@ -523,138 +258,138 @@
<div> <div>
<section id="components"> <div class="section" id="components">
<h1><span class="section-number">12. </span>Components<a class="headerlink" href="#components" title="Link to this heading"></a></h1> <h1><span class="section-number">12. </span>Components<a class="headerlink" href="#components" title="Permalink to this headline"></a></h1>
<section id="module-miplearn.components.primal.actions"> <div class="section" id="module-miplearn.components.primal.actions">
<span id="miplearn-components-primal-actions"></span><h2><span class="section-number">12.1. </span>miplearn.components.primal.actions<a class="headerlink" href="#module-miplearn.components.primal.actions" title="Link to this heading"></a></h2> <span id="miplearn-components-primal-actions"></span><h2><span class="section-number">12.1. </span>miplearn.components.primal.actions<a class="headerlink" href="#module-miplearn.components.primal.actions" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.EnforceProximity"> <dt id="miplearn.components.primal.actions.EnforceProximity">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></span><span class="sig-name descname"><span class="pre">EnforceProximity</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">tol</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.actions.EnforceProximity" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></code><code class="sig-name descname"><span class="pre">EnforceProximity</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">tol</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.actions.EnforceProximity" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><code class="xref py py-class docutils literal notranslate"><span class="pre">PrimalComponentAction</span></code></a></p> <dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.components.primal.actions.PrimalComponentAction</span></code></a></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.EnforceProximity.perform"> <dt id="miplearn.components.primal.actions.EnforceProximity.perform">
<span class="sig-name descname"><span class="pre">perform</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.actions.EnforceProximity.perform" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">perform</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.actions.EnforceProximity.perform" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.FixVariables"> <dt id="miplearn.components.primal.actions.FixVariables">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></span><span class="sig-name descname"><span class="pre">FixVariables</span></span><a class="headerlink" href="#miplearn.components.primal.actions.FixVariables" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></code><code class="sig-name descname"><span class="pre">FixVariables</span></code><a class="headerlink" href="#miplearn.components.primal.actions.FixVariables" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><code class="xref py py-class docutils literal notranslate"><span class="pre">PrimalComponentAction</span></code></a></p> <dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.components.primal.actions.PrimalComponentAction</span></code></a></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.FixVariables.perform"> <dt id="miplearn.components.primal.actions.FixVariables.perform">
<span class="sig-name descname"><span class="pre">perform</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.actions.FixVariables.perform" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">perform</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.actions.FixVariables.perform" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.PrimalComponentAction"> <dt id="miplearn.components.primal.actions.PrimalComponentAction">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></span><span class="sig-name descname"><span class="pre">PrimalComponentAction</span></span><a class="headerlink" href="#miplearn.components.primal.actions.PrimalComponentAction" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></code><code class="sig-name descname"><span class="pre">PrimalComponentAction</span></code><a class="headerlink" href="#miplearn.components.primal.actions.PrimalComponentAction" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ABC</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">abc.ABC</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.PrimalComponentAction.perform"> <dt id="miplearn.components.primal.actions.PrimalComponentAction.perform">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">perform</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.actions.PrimalComponentAction.perform" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">perform</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.actions.PrimalComponentAction.perform" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.SetWarmStart"> <dt id="miplearn.components.primal.actions.SetWarmStart">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></span><span class="sig-name descname"><span class="pre">SetWarmStart</span></span><a class="headerlink" href="#miplearn.components.primal.actions.SetWarmStart" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.actions.</span></code><code class="sig-name descname"><span class="pre">SetWarmStart</span></code><a class="headerlink" href="#miplearn.components.primal.actions.SetWarmStart" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><code class="xref py py-class docutils literal notranslate"><span class="pre">PrimalComponentAction</span></code></a></p> <dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.components.primal.actions.PrimalComponentAction</span></code></a></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.actions.SetWarmStart.perform"> <dt id="miplearn.components.primal.actions.SetWarmStart.perform">
<span class="sig-name descname"><span class="pre">perform</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.actions.SetWarmStart.perform" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">perform</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.actions.SetWarmStart.perform" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.components.primal.expert"> <div class="section" id="module-miplearn.components.primal.expert">
<span id="miplearn-components-primal-expert"></span><h2><span class="section-number">12.2. </span>miplearn.components.primal.expert<a class="headerlink" href="#module-miplearn.components.primal.expert" title="Link to this heading"></a></h2> <span id="miplearn-components-primal-expert"></span><h2><span class="section-number">12.2. </span>miplearn.components.primal.expert<a class="headerlink" href="#module-miplearn.components.primal.expert" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.expert.ExpertPrimalComponent"> <dt id="miplearn.components.primal.expert.ExpertPrimalComponent">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.expert.</span></span><span class="sig-name descname"><span class="pre">ExpertPrimalComponent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">action</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><span class="pre">PrimalComponentAction</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.expert.ExpertPrimalComponent" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.expert.</span></code><code class="sig-name descname"><span class="pre">ExpertPrimalComponent</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">action</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><span class="pre">miplearn.components.primal.actions.PrimalComponentAction</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.expert.ExpertPrimalComponent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.expert.ExpertPrimalComponent.before_mip"> <dt id="miplearn.components.primal.expert.ExpertPrimalComponent.before_mip">
<span class="sig-name descname"><span class="pre">before_mip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.expert.ExpertPrimalComponent.before_mip" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">before_mip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.expert.ExpertPrimalComponent.before_mip" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.expert.ExpertPrimalComponent.fit"> <dt id="miplearn.components.primal.expert.ExpertPrimalComponent.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.expert.ExpertPrimalComponent.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.expert.ExpertPrimalComponent.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.components.primal.indep"> <div class="section" id="module-miplearn.components.primal.indep">
<span id="miplearn-components-primal-indep"></span><h2><span class="section-number">12.3. </span>miplearn.components.primal.indep<a class="headerlink" href="#module-miplearn.components.primal.indep" title="Link to this heading"></a></h2> <span id="miplearn-components-primal-indep"></span><h2><span class="section-number">12.3. </span>miplearn.components.primal.indep<a class="headerlink" href="#module-miplearn.components.primal.indep" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.indep.IndependentVarsPrimalComponent"> <dt id="miplearn.components.primal.indep.IndependentVarsPrimalComponent">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.indep.</span></span><span class="sig-name descname"><span class="pre">IndependentVarsPrimalComponent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">base_clf:</span> <span class="pre">~typing.Any,</span> <span class="pre">extractor:</span> <span class="pre">~miplearn.extractors.abstract.FeaturesExtractor,</span> <span class="pre">action:</span> <span class="pre">~miplearn.components.primal.actions.PrimalComponentAction,</span> <span class="pre">clone_fn:</span> <span class="pre">~typing.Callable[[~typing.Any],</span> <span class="pre">~typing.Any]</span> <span class="pre">=</span> <span class="pre">&lt;function</span> <span class="pre">clone&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.indep.</span></code><code class="sig-name descname"><span class="pre">IndependentVarsPrimalComponent</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">base_clf:</span> <span class="pre">Any,</span> <span class="pre">extractor:</span> <span class="pre">miplearn.extractors.abstract.FeaturesExtractor,</span> <span class="pre">action:</span> <span class="pre">miplearn.components.primal.actions.PrimalComponentAction,</span> <span class="pre">clone_fn:</span> <span class="pre">Callable[[Any],</span> <span class="pre">Any]</span> <span class="pre">=</span> <span class="pre">&lt;function</span> <span class="pre">clone&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.indep.IndependentVarsPrimalComponent.before_mip"> <dt id="miplearn.components.primal.indep.IndependentVarsPrimalComponent.before_mip">
<span class="sig-name descname"><span class="pre">before_mip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent.before_mip" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">before_mip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent.before_mip" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.indep.IndependentVarsPrimalComponent.fit"> <dt id="miplearn.components.primal.indep.IndependentVarsPrimalComponent.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.indep.IndependentVarsPrimalComponent.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.components.primal.joint"> <div class="section" id="module-miplearn.components.primal.joint">
<span id="miplearn-components-primal-joint"></span><h2><span class="section-number">12.4. </span>miplearn.components.primal.joint<a class="headerlink" href="#module-miplearn.components.primal.joint" title="Link to this heading"></a></h2> <span id="miplearn-components-primal-joint"></span><h2><span class="section-number">12.4. </span>miplearn.components.primal.joint<a class="headerlink" href="#module-miplearn.components.primal.joint" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.joint.JointVarsPrimalComponent"> <dt id="miplearn.components.primal.joint.JointVarsPrimalComponent">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.joint.</span></span><span class="sig-name descname"><span class="pre">JointVarsPrimalComponent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">clf</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Any</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">extractor</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FeaturesExtractor</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">action</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><span class="pre">PrimalComponentAction</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.joint.JointVarsPrimalComponent" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.joint.</span></code><code class="sig-name descname"><span class="pre">JointVarsPrimalComponent</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">clf</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Any</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">extractor</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">miplearn.extractors.abstract.FeaturesExtractor</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">action</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><span class="pre">miplearn.components.primal.actions.PrimalComponentAction</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.joint.JointVarsPrimalComponent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.joint.JointVarsPrimalComponent.before_mip"> <dt id="miplearn.components.primal.joint.JointVarsPrimalComponent.before_mip">
<span class="sig-name descname"><span class="pre">before_mip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.joint.JointVarsPrimalComponent.before_mip" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">before_mip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.joint.JointVarsPrimalComponent.before_mip" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.joint.JointVarsPrimalComponent.fit"> <dt id="miplearn.components.primal.joint.JointVarsPrimalComponent.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.joint.JointVarsPrimalComponent.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.joint.JointVarsPrimalComponent.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.components.primal.mem"> <div class="section" id="module-miplearn.components.primal.mem">
<span id="miplearn-components-primal-mem"></span><h2><span class="section-number">12.5. </span>miplearn.components.primal.mem<a class="headerlink" href="#module-miplearn.components.primal.mem" title="Link to this heading"></a></h2> <span id="miplearn-components-primal-mem"></span><h2><span class="section-number">12.5. </span>miplearn.components.primal.mem<a class="headerlink" href="#module-miplearn.components.primal.mem" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.MemorizingPrimalComponent"> <dt id="miplearn.components.primal.mem.MemorizingPrimalComponent">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></span><span class="sig-name descname"><span class="pre">MemorizingPrimalComponent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">clf</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Any</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">extractor</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FeaturesExtractor</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constructor</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#miplearn.components.primal.mem.SolutionConstructor" title="miplearn.components.primal.mem.SolutionConstructor"><span class="pre">SolutionConstructor</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">action</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><span class="pre">PrimalComponentAction</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.mem.MemorizingPrimalComponent" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></code><code class="sig-name descname"><span class="pre">MemorizingPrimalComponent</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">clf</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Any</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">extractor</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">miplearn.extractors.abstract.FeaturesExtractor</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constructor</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#miplearn.components.primal.mem.SolutionConstructor" title="miplearn.components.primal.mem.SolutionConstructor"><span class="pre">miplearn.components.primal.mem.SolutionConstructor</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">action</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="#miplearn.components.primal.actions.PrimalComponentAction" title="miplearn.components.primal.actions.PrimalComponentAction"><span class="pre">miplearn.components.primal.actions.PrimalComponentAction</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.mem.MemorizingPrimalComponent" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Component that memorizes all solutions seen during training, then fits a <p>Component that memorizes all solutions seen during training, then fits a
single classifier to predict which of the memorized solutions should be single classifier to predict which of the memorized solutions should be
provided to the solver. Optionally combines multiple memorized solutions provided to the solver. Optionally combines multiple memorized solutions
into a single, partial one.</p> into a single, partial one.</p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.MemorizingPrimalComponent.before_mip"> <dt id="miplearn.components.primal.mem.MemorizingPrimalComponent.before_mip">
<span class="sig-name descname"><span class="pre">before_mip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.mem.MemorizingPrimalComponent.before_mip" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">before_mip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">test_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../solvers/#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.mem.MemorizingPrimalComponent.before_mip" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.MemorizingPrimalComponent.fit"> <dt id="miplearn.components.primal.mem.MemorizingPrimalComponent.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.components.primal.mem.MemorizingPrimalComponent.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">train_h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.components.primal.mem.MemorizingPrimalComponent.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.MergeTopSolutions"> <dt id="miplearn.components.primal.mem.MergeTopSolutions">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></span><span class="sig-name descname"><span class="pre">MergeTopSolutions</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thresholds</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.mem.MergeTopSolutions" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></code><code class="sig-name descname"><span class="pre">MergeTopSolutions</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thresholds</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.mem.MergeTopSolutions" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.mem.SolutionConstructor" title="miplearn.components.primal.mem.SolutionConstructor"><code class="xref py py-class docutils literal notranslate"><span class="pre">SolutionConstructor</span></code></a></p> <dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.mem.SolutionConstructor" title="miplearn.components.primal.mem.SolutionConstructor"><code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.components.primal.mem.SolutionConstructor</span></code></a></p>
<p>Warm start construction strategy that first selects the top k solutions, <p>Warm start construction strategy that first selects the top k solutions,
then merges them into a single solution.</p> then merges them into a single solution.</p>
<p>To merge the solutions, the strategy first computes the mean optimal value of each <p>To merge the solutions, the strategy first computes the mean optimal value of each
@ -662,37 +397,37 @@ decision variable, then: (i) sets the variable to zero if the mean is below
thresholds[0]; (ii) sets the variable to one if the mean is above thresholds[1]; thresholds[0]; (ii) sets the variable to one if the mean is above thresholds[1];
(iii) leaves the variable free otherwise.</p> (iii) leaves the variable free otherwise.</p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.MergeTopSolutions.construct"> <dt id="miplearn.components.primal.mem.MergeTopSolutions.construct">
<span class="sig-name descname"><span class="pre">construct</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">y_proba</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solutions</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.components.primal.mem.MergeTopSolutions.construct" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">construct</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">y_proba</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solutions</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.components.primal.mem.MergeTopSolutions.construct" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.SelectTopSolutions"> <dt id="miplearn.components.primal.mem.SelectTopSolutions">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></span><span class="sig-name descname"><span class="pre">SelectTopSolutions</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.mem.SelectTopSolutions" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></code><code class="sig-name descname"><span class="pre">SelectTopSolutions</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.components.primal.mem.SelectTopSolutions" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.mem.SolutionConstructor" title="miplearn.components.primal.mem.SolutionConstructor"><code class="xref py py-class docutils literal notranslate"><span class="pre">SolutionConstructor</span></code></a></p> <dd><p>Bases: <a class="reference internal" href="#miplearn.components.primal.mem.SolutionConstructor" title="miplearn.components.primal.mem.SolutionConstructor"><code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.components.primal.mem.SolutionConstructor</span></code></a></p>
<p>Warm start construction strategy that selects and returns the top k solutions.</p> <p>Warm start construction strategy that selects and returns the top k solutions.</p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.SelectTopSolutions.construct"> <dt id="miplearn.components.primal.mem.SelectTopSolutions.construct">
<span class="sig-name descname"><span class="pre">construct</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">y_proba</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solutions</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.components.primal.mem.SelectTopSolutions.construct" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">construct</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">y_proba</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solutions</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.components.primal.mem.SelectTopSolutions.construct" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.SolutionConstructor"> <dt id="miplearn.components.primal.mem.SolutionConstructor">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></span><span class="sig-name descname"><span class="pre">SolutionConstructor</span></span><a class="headerlink" href="#miplearn.components.primal.mem.SolutionConstructor" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.components.primal.mem.</span></code><code class="sig-name descname"><span class="pre">SolutionConstructor</span></code><a class="headerlink" href="#miplearn.components.primal.mem.SolutionConstructor" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ABC</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">abc.ABC</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.components.primal.mem.SolutionConstructor.construct"> <dt id="miplearn.components.primal.mem.SolutionConstructor.construct">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">construct</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">y_proba</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solutions</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span></span></span><a class="headerlink" href="#miplearn.components.primal.mem.SolutionConstructor.construct" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">construct</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">y_proba</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solutions</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">numpy.ndarray</span><a class="headerlink" href="#miplearn.components.primal.mem.SolutionConstructor.construct" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>14. Helpers &#8212; MIPLearn 0.4</title> <title>14. Helpers &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,17 +22,18 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="prev" title="13. Solvers" href="../solvers/" /> <link rel="prev" title="13. Solvers" href="../solvers/" />
@ -63,7 +64,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -90,7 +91,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -122,7 +123,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -224,134 +225,11 @@
<a class="reference internal nav-link" href="#module-miplearn.io"> <a class="reference internal nav-link" href="#module-miplearn.io">
14.1. miplearn.io 14.1. miplearn.io
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.io.gzip">
<code class="docutils literal notranslate">
<span class="pre">
gzip()
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.io.read_pkl_gz">
<code class="docutils literal notranslate">
<span class="pre">
read_pkl_gz()
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.io.write_pkl_gz">
<code class="docutils literal notranslate">
<span class="pre">
write_pkl_gz()
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.h5"> <a class="reference internal nav-link" href="#module-miplearn.h5">
14.2. miplearn.h5 14.2. miplearn.h5
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File">
<code class="docutils literal notranslate">
<span class="pre">
H5File
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.close">
<code class="docutils literal notranslate">
<span class="pre">
H5File.close()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.get_array">
<code class="docutils literal notranslate">
<span class="pre">
H5File.get_array()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.get_bytes">
<code class="docutils literal notranslate">
<span class="pre">
H5File.get_bytes()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.get_scalar">
<code class="docutils literal notranslate">
<span class="pre">
H5File.get_scalar()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.get_sparse">
<code class="docutils literal notranslate">
<span class="pre">
H5File.get_sparse()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.put_array">
<code class="docutils literal notranslate">
<span class="pre">
H5File.put_array()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.put_bytes">
<code class="docutils literal notranslate">
<span class="pre">
H5File.put_bytes()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.put_scalar">
<code class="docutils literal notranslate">
<span class="pre">
H5File.put_scalar()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.h5.H5File.put_sparse">
<code class="docutils literal notranslate">
<span class="pre">
H5File.put_sparse()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
</ul> </ul>
@ -364,81 +242,81 @@
<div> <div>
<section id="helpers"> <div class="section" id="helpers">
<h1><span class="section-number">14. </span>Helpers<a class="headerlink" href="#helpers" title="Link to this heading"></a></h1> <h1><span class="section-number">14. </span>Helpers<a class="headerlink" href="#helpers" title="Permalink to this headline"></a></h1>
<section id="module-miplearn.io"> <div class="section" id="module-miplearn.io">
<span id="miplearn-io"></span><h2><span class="section-number">14.1. </span>miplearn.io<a class="headerlink" href="#module-miplearn.io" title="Link to this heading"></a></h2> <span id="miplearn-io"></span><h2><span class="section-number">14.1. </span>miplearn.io<a class="headerlink" href="#module-miplearn.io" title="Permalink to this headline"></a></h2>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.io.gzip"> <dt id="miplearn.io.gzip">
<span class="sig-prename descclassname"><span class="pre">miplearn.io.</span></span><span class="sig-name descname"><span class="pre">gzip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.io.gzip" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.io.</span></code><code class="sig-name descname"><span class="pre">gzip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.io.gzip" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.io.read_pkl_gz"> <dt id="miplearn.io.read_pkl_gz">
<span class="sig-prename descclassname"><span class="pre">miplearn.io.</span></span><span class="sig-name descname"><span class="pre">read_pkl_gz</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Any</span></span></span><a class="headerlink" href="#miplearn.io.read_pkl_gz" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.io.</span></code><code class="sig-name descname"><span class="pre">read_pkl_gz</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">Any</span><a class="headerlink" href="#miplearn.io.read_pkl_gz" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.io.write_pkl_gz"> <dt id="miplearn.io.write_pkl_gz">
<span class="sig-prename descclassname"><span class="pre">miplearn.io.</span></span><span class="sig-name descname"><span class="pre">write_pkl_gz</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">objs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dirname</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n_jobs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">progress</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#miplearn.io.write_pkl_gz" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.io.</span></code><code class="sig-name descname"><span class="pre">write_pkl_gz</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">objs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dirname</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n_jobs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">progress</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.io.write_pkl_gz" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</section> </div>
<section id="module-miplearn.h5"> <div class="section" id="module-miplearn.h5">
<span id="miplearn-h5"></span><h2><span class="section-number">14.2. </span>miplearn.h5<a class="headerlink" href="#module-miplearn.h5" title="Link to this heading"></a></h2> <span id="miplearn-h5"></span><h2><span class="section-number">14.2. </span>miplearn.h5<a class="headerlink" href="#module-miplearn.h5" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.h5.H5File"> <dt id="miplearn.h5.H5File">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.h5.</span></span><span class="sig-name descname"><span class="pre">H5File</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mode</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'r+'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.h5.H5File" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.h5.</span></code><code class="sig-name descname"><span class="pre">H5File</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mode</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'r+'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.h5.H5File" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.close"> <dt id="miplearn.h5.H5File.close">
<span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.close" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">close</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.h5.H5File.close" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.get_array"> <dt id="miplearn.h5.H5File.get_array">
<span class="sig-name descname"><span class="pre">get_array</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">ndarray</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.get_array" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_array</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">numpy.ndarray</span><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.h5.H5File.get_array" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.get_bytes"> <dt id="miplearn.h5.H5File.get_bytes">
<span class="sig-name descname"><span class="pre">get_bytes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bytes</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">bytearray</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.get_bytes" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_bytes</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">bytes</span><span class="p"><span class="pre">,</span> </span><span class="pre">bytearray</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.h5.H5File.get_bytes" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.get_scalar"> <dt id="miplearn.h5.H5File.get_scalar">
<span class="sig-name descname"><span class="pre">get_scalar</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Any</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.get_scalar" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_scalar</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.h5.H5File.get_scalar" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.get_sparse"> <dt id="miplearn.h5.H5File.get_sparse">
<span class="sig-name descname"><span class="pre">get_sparse</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">coo_matrix</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.get_sparse" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">get_sparse</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">scipy.sparse._coo.coo_matrix</span><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.h5.H5File.get_sparse" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.put_array"> <dt id="miplearn.h5.H5File.put_array">
<span class="sig-name descname"><span class="pre">put_array</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.put_array" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">put_array</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">numpy.ndarray</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.h5.H5File.put_array" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.put_bytes"> <dt id="miplearn.h5.H5File.put_bytes">
<span class="sig-name descname"><span class="pre">put_bytes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bytes</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">bytearray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.put_bytes" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">put_bytes</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">bytes</span><span class="p"><span class="pre">,</span> </span><span class="pre">bytearray</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.h5.H5File.put_bytes" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.put_scalar"> <dt id="miplearn.h5.H5File.put_scalar">
<span class="sig-name descname"><span class="pre">put_scalar</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Any</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.put_scalar" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">put_scalar</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Any</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.h5.H5File.put_scalar" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.h5.H5File.put_sparse"> <dt id="miplearn.h5.H5File.put_sparse">
<span class="sig-name descname"><span class="pre">put_sparse</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">coo_matrix</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.h5.H5File.put_sparse" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">put_sparse</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">scipy.sparse._coo.coo_matrix</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.h5.H5File.put_sparse" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>10. Benchmark Problems &#8212; MIPLearn 0.4</title> <title>10. Benchmark Problems &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,17 +22,18 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="11. Collectors &amp; Extractors" href="../collectors/" /> <link rel="next" title="11. Collectors &amp; Extractors" href="../collectors/" />
@ -64,7 +65,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -91,7 +92,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -123,7 +124,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -225,237 +226,46 @@
<a class="reference internal nav-link" href="#module-miplearn.problems.binpack"> <a class="reference internal nav-link" href="#module-miplearn.problems.binpack">
10.1. miplearn.problems.binpack 10.1. miplearn.problems.binpack
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.binpack.BinPackData">
<code class="docutils literal notranslate">
<span class="pre">
BinPackData
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.binpack.BinPackGenerator">
<code class="docutils literal notranslate">
<span class="pre">
BinPackGenerator
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.binpack.BinPackGenerator.generate">
<code class="docutils literal notranslate">
<span class="pre">
BinPackGenerator.generate()
</span>
</code>
</a>
</li>
</ul>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.binpack.build_binpack_model_gurobipy">
<code class="docutils literal notranslate">
<span class="pre">
build_binpack_model_gurobipy()
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.multiknapsack"> <a class="reference internal nav-link" href="#module-miplearn.problems.multiknapsack">
10.2. miplearn.problems.multiknapsack 10.2. miplearn.problems.multiknapsack
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.multiknapsack.MultiKnapsackData">
<code class="docutils literal notranslate">
<span class="pre">
MultiKnapsackData
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.multiknapsack.MultiKnapsackGenerator">
<code class="docutils literal notranslate">
<span class="pre">
MultiKnapsackGenerator
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.multiknapsack.build_multiknapsack_model_gurobipy">
<code class="docutils literal notranslate">
<span class="pre">
build_multiknapsack_model_gurobipy()
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.pmedian"> <a class="reference internal nav-link" href="#module-miplearn.problems.pmedian">
10.3. miplearn.problems.pmedian 10.3. miplearn.problems.pmedian
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.pmedian.PMedianData">
<code class="docutils literal notranslate">
<span class="pre">
PMedianData
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.pmedian.PMedianGenerator">
<code class="docutils literal notranslate">
<span class="pre">
PMedianGenerator
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.pmedian.build_pmedian_model_gurobipy">
<code class="docutils literal notranslate">
<span class="pre">
build_pmedian_model_gurobipy()
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.setcover"> <a class="reference internal nav-link" href="#module-miplearn.problems.setcover">
10.4. miplearn.problems.setcover 10.4. miplearn.problems.setcover
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.setcover.SetCoverData">
<code class="docutils literal notranslate">
<span class="pre">
SetCoverData
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.setpack"> <a class="reference internal nav-link" href="#module-miplearn.problems.setpack">
10.5. miplearn.problems.setpack 10.5. miplearn.problems.setpack
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.setpack.SetPackData">
<code class="docutils literal notranslate">
<span class="pre">
SetPackData
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.stab"> <a class="reference internal nav-link" href="#module-miplearn.problems.stab">
10.6. miplearn.problems.stab 10.6. miplearn.problems.stab
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.stab.MaxWeightStableSetData">
<code class="docutils literal notranslate">
<span class="pre">
MaxWeightStableSetData
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.stab.MaxWeightStableSetGenerator">
<code class="docutils literal notranslate">
<span class="pre">
MaxWeightStableSetGenerator
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.tsp"> <a class="reference internal nav-link" href="#module-miplearn.problems.tsp">
10.7. miplearn.problems.tsp 10.7. miplearn.problems.tsp
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.tsp.TravelingSalesmanData">
<code class="docutils literal notranslate">
<span class="pre">
TravelingSalesmanData
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.tsp.TravelingSalesmanGenerator">
<code class="docutils literal notranslate">
<span class="pre">
TravelingSalesmanGenerator
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.uc"> <a class="reference internal nav-link" href="#module-miplearn.problems.uc">
10.8. miplearn.problems.uc 10.8. miplearn.problems.uc
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.uc.UnitCommitmentData">
<code class="docutils literal notranslate">
<span class="pre">
UnitCommitmentData
</span>
</code>
</a>
</li>
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.uc.build_uc_model_gurobipy">
<code class="docutils literal notranslate">
<span class="pre">
build_uc_model_gurobipy()
</span>
</code>
</a>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.problems.vertexcover"> <a class="reference internal nav-link" href="#module-miplearn.problems.vertexcover">
10.9. miplearn.problems.vertexcover 10.9. miplearn.problems.vertexcover
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.problems.vertexcover.MinWeightVertexCoverData">
<code class="docutils literal notranslate">
<span class="pre">
MinWeightVertexCoverData
</span>
</code>
</a>
</li>
</ul>
</li> </li>
</ul> </ul>
@ -468,16 +278,16 @@
<div> <div>
<section id="benchmark-problems"> <div class="section" id="benchmark-problems">
<h1><span class="section-number">10. </span>Benchmark Problems<a class="headerlink" href="#benchmark-problems" title="Link to this heading"></a></h1> <h1><span class="section-number">10. </span>Benchmark Problems<a class="headerlink" href="#benchmark-problems" title="Permalink to this headline"></a></h1>
<section id="module-miplearn.problems.binpack"> <div class="section" id="module-miplearn.problems.binpack">
<span id="miplearn-problems-binpack"></span><h2><span class="section-number">10.1. </span>miplearn.problems.binpack<a class="headerlink" href="#module-miplearn.problems.binpack" title="Link to this heading"></a></h2> <span id="miplearn-problems-binpack"></span><h2><span class="section-number">10.1. </span>miplearn.problems.binpack<a class="headerlink" href="#module-miplearn.problems.binpack" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.binpack.BinPackData"> <dt id="miplearn.problems.binpack.BinPackData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.binpack.</span></span><span class="sig-name descname"><span class="pre">BinPackData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sizes</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacity</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.binpack.BinPackData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.binpack.</span></code><code class="sig-name descname"><span class="pre">BinPackData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sizes</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacity</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.binpack.BinPackData" title="Permalink to this definition"></a></dt>
<dd><p>Data for the bin packing problem.</p> <dd><p>Data for the bin packing problem.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>sizes</strong> (<em>numpy.ndarray</em>) Sizes of the items</p></li> <li><p><strong>sizes</strong> (<em>numpy.ndarray</em>) Sizes of the items</p></li>
<li><p><strong>capacity</strong> (<em>int</em>) Capacity of the bin</p></li> <li><p><strong>capacity</strong> (<em>int</em>) Capacity of the bin</p></li>
@ -487,8 +297,8 @@
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.binpack.BinPackGenerator"> <dt id="miplearn.problems.binpack.BinPackGenerator">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.binpack.</span></span><span class="sig-name descname"><span class="pre">BinPackGenerator</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sizes</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacity</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sizes_jitter</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacity_jitter</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fix_items</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.binpack.BinPackGenerator" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.binpack.</span></code><code class="sig-name descname"><span class="pre">BinPackGenerator</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sizes</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacity</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sizes_jitter</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacity_jitter</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fix_items</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.binpack.BinPackGenerator" title="Permalink to this definition"></a></dt>
<dd><p>Random instance generator for the bin packing problem.</p> <dd><p>Random instance generator for the bin packing problem.</p>
<p>If <cite>fix_items=False</cite>, the class samples the user-provided probability distributions <p>If <cite>fix_items=False</cite>, the class samples the user-provided probability distributions
n, sizes and capacity to decide, respectively, the number of items, the sizes of n, sizes and capacity to decide, respectively, the number of items, the sizes of
@ -502,7 +312,7 @@ beta</cite>, where <cite>B</cite> is the reference bin capacity and <cite>beta</
<cite>capacity_jitter</cite>. The number of items remains the same across all generated <cite>capacity_jitter</cite>. The number of items remains the same across all generated
instances.</p> instances.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>n</strong> Probability distribution for the number of items.</p></li> <li><p><strong>n</strong> Probability distribution for the number of items.</p></li>
<li><p><strong>sizes</strong> Probability distribution for the item sizes.</p></li> <li><p><strong>sizes</strong> Probability distribution for the item sizes.</p></li>
@ -515,11 +325,11 @@ If <cite>False</cite>, generates completely different instances.</p></li>
</dd> </dd>
</dl> </dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.problems.binpack.BinPackGenerator.generate"> <dt id="miplearn.problems.binpack.BinPackGenerator.generate">
<span class="sig-name descname"><span class="pre">generate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n_samples</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#miplearn.problems.binpack.BinPackData" title="miplearn.problems.binpack.BinPackData"><span class="pre">BinPackData</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#miplearn.problems.binpack.BinPackGenerator.generate" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">generate</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n_samples</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">List</span><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#miplearn.problems.binpack.BinPackData" title="miplearn.problems.binpack.BinPackData"><span class="pre">miplearn.problems.binpack.BinPackData</span></a><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.problems.binpack.BinPackGenerator.generate" title="Permalink to this definition"></a></dt>
<dd><p>Generates random instances.</p> <dd><p>Generates random instances.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>n_samples</strong> Number of samples to generate.</p> <dd class="field-odd"><p><strong>n_samples</strong> Number of samples to generate.</p>
</dd> </dd>
</dl> </dl>
@ -528,20 +338,20 @@ If <cite>False</cite>, generates completely different instances.</p></li>
</dd></dl> </dd></dl>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.problems.binpack.build_binpack_model_gurobipy"> <dt id="miplearn.problems.binpack.build_binpack_model_gurobipy">
<span class="sig-prename descclassname"><span class="pre">miplearn.problems.binpack.</span></span><span class="sig-name descname"><span class="pre">build_binpack_model_gurobipy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#miplearn.problems.binpack.BinPackData" title="miplearn.problems.binpack.BinPackData"><span class="pre">BinPackData</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">GurobiModel</span></a></span></span><a class="headerlink" href="#miplearn.problems.binpack.build_binpack_model_gurobipy" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.problems.binpack.</span></code><code class="sig-name descname"><span class="pre">build_binpack_model_gurobipy</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><a class="reference internal" href="#miplearn.problems.binpack.BinPackData" title="miplearn.problems.binpack.BinPackData"><span class="pre">miplearn.problems.binpack.BinPackData</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">miplearn.solvers.gurobi.GurobiModel</span></a><a class="headerlink" href="#miplearn.problems.binpack.build_binpack_model_gurobipy" title="Permalink to this definition"></a></dt>
<dd><p>Converts bin packing problem data into a concrete Gurobipy model.</p> <dd><p>Converts bin packing problem data into a concrete Gurobipy model.</p>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.problems.multiknapsack"> <div class="section" id="module-miplearn.problems.multiknapsack">
<span id="miplearn-problems-multiknapsack"></span><h2><span class="section-number">10.2. </span>miplearn.problems.multiknapsack<a class="headerlink" href="#module-miplearn.problems.multiknapsack" title="Link to this heading"></a></h2> <span id="miplearn-problems-multiknapsack"></span><h2><span class="section-number">10.2. </span>miplearn.problems.multiknapsack<a class="headerlink" href="#module-miplearn.problems.multiknapsack" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.multiknapsack.MultiKnapsackData"> <dt id="miplearn.problems.multiknapsack.MultiKnapsackData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.multiknapsack.</span></span><span class="sig-name descname"><span class="pre">MultiKnapsackData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prices</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacities</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.multiknapsack.MultiKnapsackData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.multiknapsack.</span></code><code class="sig-name descname"><span class="pre">MultiKnapsackData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prices</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacities</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.multiknapsack.MultiKnapsackData" title="Permalink to this definition"></a></dt>
<dd><p>Data for the multi-dimensional knapsack problem</p> <dd><p>Data for the multi-dimensional knapsack problem</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>prices</strong> (<em>numpy.ndarray</em>) Item prices.</p></li> <li><p><strong>prices</strong> (<em>numpy.ndarray</em>) Item prices.</p></li>
<li><p><strong>capacities</strong> (<em>numpy.ndarray</em>) Knapsack capacities.</p></li> <li><p><strong>capacities</strong> (<em>numpy.ndarray</em>) Knapsack capacities.</p></li>
@ -552,8 +362,8 @@ If <cite>False</cite>, generates completely different instances.</p></li>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.multiknapsack.MultiKnapsackGenerator"> <dt id="miplearn.problems.multiknapsack.MultiKnapsackGenerator">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.multiknapsack.</span></span><span class="sig-name descname"><span class="pre">MultiKnapsackGenerator</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">m:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">w:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">K:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">u:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">alpha:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fix_w:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">w_jitter:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p_jitter:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">round:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.multiknapsack.MultiKnapsackGenerator" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.multiknapsack.</span></code><code class="sig-name descname"><span class="pre">MultiKnapsackGenerator</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">n:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">m:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">w:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">K:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">u:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">alpha:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">fix_w:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">False</span></em>, <em class="sig-param"><span class="pre">w_jitter:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">p_jitter:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">round:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.multiknapsack.MultiKnapsackGenerator" title="Permalink to this definition"></a></dt>
<dd><p>Random instance generator for the multi-dimensional knapsack problem.</p> <dd><p>Random instance generator for the multi-dimensional knapsack problem.</p>
<p>Instances have a random number of items (or variables) and a random number of <p>Instances have a random number of items (or variables) and a random number of
knapsacks (or constraints), as specified by the provided probability knapsacks (or constraints), as specified by the provided probability
@ -582,7 +392,7 @@ will be calculated as above, but using these perturbed weights instead.</p>
nearest integer number. If <cite>round=False</cite> is provided, this rounding will be nearest integer number. If <cite>round=False</cite> is provided, this rounding will be
disabled.</p> disabled.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>n</strong> (<em>rv_discrete</em>) Probability distribution for the number of items (or variables).</p></li> <li><p><strong>n</strong> (<em>rv_discrete</em>) Probability distribution for the number of items (or variables).</p></li>
<li><p><strong>m</strong> (<em>rv_discrete</em>) Probability distribution for the number of knapsacks (or constraints).</p></li> <li><p><strong>m</strong> (<em>rv_discrete</em>) Probability distribution for the number of knapsacks (or constraints).</p></li>
@ -601,20 +411,20 @@ integer.</p></li>
</dd></dl> </dd></dl>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.problems.multiknapsack.build_multiknapsack_model_gurobipy"> <dt id="miplearn.problems.multiknapsack.build_multiknapsack_model_gurobipy">
<span class="sig-prename descclassname"><span class="pre">miplearn.problems.multiknapsack.</span></span><span class="sig-name descname"><span class="pre">build_multiknapsack_model_gurobipy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#miplearn.problems.multiknapsack.MultiKnapsackData" title="miplearn.problems.multiknapsack.MultiKnapsackData"><span class="pre">MultiKnapsackData</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">GurobiModel</span></a></span></span><a class="headerlink" href="#miplearn.problems.multiknapsack.build_multiknapsack_model_gurobipy" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.problems.multiknapsack.</span></code><code class="sig-name descname"><span class="pre">build_multiknapsack_model_gurobipy</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><a class="reference internal" href="#miplearn.problems.multiknapsack.MultiKnapsackData" title="miplearn.problems.multiknapsack.MultiKnapsackData"><span class="pre">miplearn.problems.multiknapsack.MultiKnapsackData</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">miplearn.solvers.gurobi.GurobiModel</span></a><a class="headerlink" href="#miplearn.problems.multiknapsack.build_multiknapsack_model_gurobipy" title="Permalink to this definition"></a></dt>
<dd><p>Converts multi-knapsack problem data into a concrete Gurobipy model.</p> <dd><p>Converts multi-knapsack problem data into a concrete Gurobipy model.</p>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.problems.pmedian"> <div class="section" id="module-miplearn.problems.pmedian">
<span id="miplearn-problems-pmedian"></span><h2><span class="section-number">10.3. </span>miplearn.problems.pmedian<a class="headerlink" href="#module-miplearn.problems.pmedian" title="Link to this heading"></a></h2> <span id="miplearn-problems-pmedian"></span><h2><span class="section-number">10.3. </span>miplearn.problems.pmedian<a class="headerlink" href="#module-miplearn.problems.pmedian" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.pmedian.PMedianData"> <dt id="miplearn.problems.pmedian.PMedianData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.pmedian.</span></span><span class="sig-name descname"><span class="pre">PMedianData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">distances</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">demands</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacities</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.pmedian.PMedianData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.pmedian.</span></code><code class="sig-name descname"><span class="pre">PMedianData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">distances</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">demands</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacities</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.pmedian.PMedianData" title="Permalink to this definition"></a></dt>
<dd><p>Data for the capacitated p-median problem</p> <dd><p>Data for the capacitated p-median problem</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>distances</strong> (<em>numpy.ndarray</em>) Matrix of distances between customer i and facility j.</p></li> <li><p><strong>distances</strong> (<em>numpy.ndarray</em>) Matrix of distances between customer i and facility j.</p></li>
<li><p><strong>demands</strong> (<em>numpy.ndarray</em>) Customer demands.</p></li> <li><p><strong>demands</strong> (<em>numpy.ndarray</em>) Customer demands.</p></li>
@ -626,8 +436,8 @@ integer.</p></li>
</dd></dl> </dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.pmedian.PMedianGenerator"> <dt id="miplearn.problems.pmedian.PMedianGenerator">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.pmedian.</span></span><span class="sig-name descname"><span class="pre">PMedianGenerator</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">y:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">demands:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacities:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">distances_jitter:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">demands_jitter:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">capacities_jitter:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fixed:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.pmedian.PMedianGenerator" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.pmedian.</span></code><code class="sig-name descname"><span class="pre">PMedianGenerator</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">x:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">y:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">n:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">p:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">demands:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">capacities:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">distances_jitter:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">demands_jitter:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">capacities_jitter:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">fixed:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.pmedian.PMedianGenerator" title="Permalink to this definition"></a></dt>
<dd><p>Random generator for the capacitated p-median problem.</p> <dd><p>Random generator for the capacitated p-median problem.</p>
<p>This class first decides the number of customers and the parameter <cite>p</cite> by <p>This class first decides the number of customers and the parameter <cite>p</cite> by
sampling the provided <cite>n</cite> and <cite>p</cite> distributions, respectively. Then, for each sampling the provided <cite>n</cite> and <cite>p</cite> distributions, respectively. Then, for each
@ -645,7 +455,7 @@ capacities are multiplied by factors sampled from the distributions
result is a list of instances that have the same set of customers, but slightly result is a list of instances that have the same set of customers, but slightly
different demands, capacities and distances.</p> different demands, capacities and distances.</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt> <dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple"> <dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> Probability distribution for the x-coordinate of the points.</p></li> <li><p><strong>x</strong> Probability distribution for the x-coordinate of the points.</p></li>
<li><p><strong>y</strong> Probability distribution for the y-coordinate of the points.</p></li> <li><p><strong>y</strong> Probability distribution for the y-coordinate of the points.</p></li>
@ -663,38 +473,38 @@ different demands, capacities and distances.</p>
</dd></dl> </dd></dl>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.problems.pmedian.build_pmedian_model_gurobipy"> <dt id="miplearn.problems.pmedian.build_pmedian_model_gurobipy">
<span class="sig-prename descclassname"><span class="pre">miplearn.problems.pmedian.</span></span><span class="sig-name descname"><span class="pre">build_pmedian_model_gurobipy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#miplearn.problems.pmedian.PMedianData" title="miplearn.problems.pmedian.PMedianData"><span class="pre">PMedianData</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">GurobiModel</span></a></span></span><a class="headerlink" href="#miplearn.problems.pmedian.build_pmedian_model_gurobipy" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.problems.pmedian.</span></code><code class="sig-name descname"><span class="pre">build_pmedian_model_gurobipy</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><a class="reference internal" href="#miplearn.problems.pmedian.PMedianData" title="miplearn.problems.pmedian.PMedianData"><span class="pre">miplearn.problems.pmedian.PMedianData</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">miplearn.solvers.gurobi.GurobiModel</span></a><a class="headerlink" href="#miplearn.problems.pmedian.build_pmedian_model_gurobipy" title="Permalink to this definition"></a></dt>
<dd><p>Converts capacitated p-median data into a concrete Gurobipy model.</p> <dd><p>Converts capacitated p-median data into a concrete Gurobipy model.</p>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.problems.setcover"> <div class="section" id="module-miplearn.problems.setcover">
<span id="miplearn-problems-setcover"></span><h2><span class="section-number">10.4. </span>miplearn.problems.setcover<a class="headerlink" href="#module-miplearn.problems.setcover" title="Link to this heading"></a></h2> <span id="miplearn-problems-setcover"></span><h2><span class="section-number">10.4. </span>miplearn.problems.setcover<a class="headerlink" href="#module-miplearn.problems.setcover" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.setcover.SetCoverData"> <dt id="miplearn.problems.setcover.SetCoverData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.setcover.</span></span><span class="sig-name descname"><span class="pre">SetCoverData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">costs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">incidence_matrix</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.setcover.SetCoverData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.setcover.</span></code><code class="sig-name descname"><span class="pre">SetCoverData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">costs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">incidence_matrix</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.setcover.SetCoverData" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</section> </div>
<section id="module-miplearn.problems.setpack"> <div class="section" id="module-miplearn.problems.setpack">
<span id="miplearn-problems-setpack"></span><h2><span class="section-number">10.5. </span>miplearn.problems.setpack<a class="headerlink" href="#module-miplearn.problems.setpack" title="Link to this heading"></a></h2> <span id="miplearn-problems-setpack"></span><h2><span class="section-number">10.5. </span>miplearn.problems.setpack<a class="headerlink" href="#module-miplearn.problems.setpack" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.setpack.SetPackData"> <dt id="miplearn.problems.setpack.SetPackData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.setpack.</span></span><span class="sig-name descname"><span class="pre">SetPackData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">costs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">incidence_matrix</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.setpack.SetPackData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.setpack.</span></code><code class="sig-name descname"><span class="pre">SetPackData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">costs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">incidence_matrix</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.setpack.SetPackData" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</section> </div>
<section id="module-miplearn.problems.stab"> <div class="section" id="module-miplearn.problems.stab">
<span id="miplearn-problems-stab"></span><h2><span class="section-number">10.6. </span>miplearn.problems.stab<a class="headerlink" href="#module-miplearn.problems.stab" title="Link to this heading"></a></h2> <span id="miplearn-problems-stab"></span><h2><span class="section-number">10.6. </span>miplearn.problems.stab<a class="headerlink" href="#module-miplearn.problems.stab" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.stab.MaxWeightStableSetData"> <dt id="miplearn.problems.stab.MaxWeightStableSetData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.stab.</span></span><span class="sig-name descname"><span class="pre">MaxWeightStableSetData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">graph</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">networkx.classes.graph.Graph</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.stab.MaxWeightStableSetData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.stab.</span></code><code class="sig-name descname"><span class="pre">MaxWeightStableSetData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">graph</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">networkx.classes.graph.Graph</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.stab.MaxWeightStableSetData" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.stab.MaxWeightStableSetGenerator"> <dt id="miplearn.problems.stab.MaxWeightStableSetGenerator">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.stab.</span></span><span class="sig-name descname"><span class="pre">MaxWeightStableSetGenerator</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">w:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fix_graph:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.stab.MaxWeightStableSetGenerator" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.stab.</span></code><code class="sig-name descname"><span class="pre">MaxWeightStableSetGenerator</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">w:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">n:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">p:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">fix_graph:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.stab.MaxWeightStableSetGenerator" title="Permalink to this definition"></a></dt>
<dd><p>Random instance generator for the Maximum-Weight Stable Set Problem.</p> <dd><p>Random instance generator for the Maximum-Weight Stable Set Problem.</p>
<p>The generator has two modes of operation. When <cite>fix_graph=True</cite> is provided, <p>The generator has two modes of operation. When <cite>fix_graph=True</cite> is provided,
one random Erdős-Rényi graph $G_{n,p}$ is generated in the constructor, where $n$ one random Erdős-Rényi graph $G_{n,p}$ is generated in the constructor, where $n$
@ -705,31 +515,31 @@ user-provided probability distribution <cite>w</cite>.</p>
remaining parameters are sampled in the same way.</p> remaining parameters are sampled in the same way.</p>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.problems.tsp"> <div class="section" id="module-miplearn.problems.tsp">
<span id="miplearn-problems-tsp"></span><h2><span class="section-number">10.7. </span>miplearn.problems.tsp<a class="headerlink" href="#module-miplearn.problems.tsp" title="Link to this heading"></a></h2> <span id="miplearn-problems-tsp"></span><h2><span class="section-number">10.7. </span>miplearn.problems.tsp<a class="headerlink" href="#module-miplearn.problems.tsp" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.tsp.TravelingSalesmanData"> <dt id="miplearn.problems.tsp.TravelingSalesmanData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.tsp.</span></span><span class="sig-name descname"><span class="pre">TravelingSalesmanData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n_cities</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">distances</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.tsp.TravelingSalesmanData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.tsp.</span></code><code class="sig-name descname"><span class="pre">TravelingSalesmanData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">n_cities</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">int</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">distances</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.tsp.TravelingSalesmanData" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.tsp.TravelingSalesmanGenerator"> <dt id="miplearn.problems.tsp.TravelingSalesmanGenerator">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.tsp.</span></span><span class="sig-name descname"><span class="pre">TravelingSalesmanGenerator</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">y:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gamma:</span> <span class="pre">~scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fix_cities:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">round:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.tsp.TravelingSalesmanGenerator" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.tsp.</span></code><code class="sig-name descname"><span class="pre">TravelingSalesmanGenerator</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">x:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">y:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">n:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_discrete_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">gamma:</span> <span class="pre">scipy.stats._distn_infrastructure.rv_frozen</span> <span class="pre">=</span> <span class="pre">&lt;scipy.stats._distn_infrastructure.rv_continuous_frozen</span> <span class="pre">object&gt;</span></em>, <em class="sig-param"><span class="pre">fix_cities:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></em>, <em class="sig-param"><span class="pre">round:</span> <span class="pre">bool</span> <span class="pre">=</span> <span class="pre">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.tsp.TravelingSalesmanGenerator" title="Permalink to this definition"></a></dt>
<dd><p>Random generator for the Traveling Salesman Problem.</p> <dd><p>Random generator for the Traveling Salesman Problem.</p>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.problems.uc"> <div class="section" id="module-miplearn.problems.uc">
<span id="miplearn-problems-uc"></span><h2><span class="section-number">10.8. </span>miplearn.problems.uc<a class="headerlink" href="#module-miplearn.problems.uc" title="Link to this heading"></a></h2> <span id="miplearn-problems-uc"></span><h2><span class="section-number">10.8. </span>miplearn.problems.uc<a class="headerlink" href="#module-miplearn.problems.uc" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.uc.UnitCommitmentData"> <dt id="miplearn.problems.uc.UnitCommitmentData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.uc.</span></span><span class="sig-name descname"><span class="pre">UnitCommitmentData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">demand</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_power</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_power</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_uptime</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_downtime</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cost_startup</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cost_prod</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cost_fixed</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.uc.UnitCommitmentData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.uc.</span></code><code class="sig-name descname"><span class="pre">UnitCommitmentData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">demand</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_power</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_power</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_uptime</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_downtime</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cost_startup</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cost_prod</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cost_fixed</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.uc.UnitCommitmentData" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="miplearn.problems.uc.build_uc_model_gurobipy"> <dt id="miplearn.problems.uc.build_uc_model_gurobipy">
<span class="sig-prename descclassname"><span class="pre">miplearn.problems.uc.</span></span><span class="sig-name descname"><span class="pre">build_uc_model_gurobipy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#miplearn.problems.uc.UnitCommitmentData" title="miplearn.problems.uc.UnitCommitmentData"><span class="pre">UnitCommitmentData</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">GurobiModel</span></a></span></span><a class="headerlink" href="#miplearn.problems.uc.build_uc_model_gurobipy" title="Link to this definition"></a></dt> <code class="sig-prename descclassname"><span class="pre">miplearn.problems.uc.</span></code><code class="sig-name descname"><span class="pre">build_uc_model_gurobipy</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><a class="reference internal" href="#miplearn.problems.uc.UnitCommitmentData" title="miplearn.problems.uc.UnitCommitmentData"><span class="pre">miplearn.problems.uc.UnitCommitmentData</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="../solvers/#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">miplearn.solvers.gurobi.GurobiModel</span></a><a class="headerlink" href="#miplearn.problems.uc.build_uc_model_gurobipy" title="Permalink to this definition"></a></dt>
<dd><p>Models the unit commitment problem according to equations (1)-(5) of:</p> <dd><p>Models the unit commitment problem according to equations (1)-(5) of:</p>
<blockquote> <blockquote>
<div><p>Bendotti, P., Fouilhoux, P. &amp; Rottner, C. The min-up/min-down unit <div><p>Bendotti, P., Fouilhoux, P. &amp; Rottner, C. The min-up/min-down unit
@ -738,16 +548,16 @@ commitment polytope. J Comb Optim 36, 1024-1058 (2018).
</div></blockquote> </div></blockquote>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.problems.vertexcover"> <div class="section" id="module-miplearn.problems.vertexcover">
<span id="miplearn-problems-vertexcover"></span><h2><span class="section-number">10.9. </span>miplearn.problems.vertexcover<a class="headerlink" href="#module-miplearn.problems.vertexcover" title="Link to this heading"></a></h2> <span id="miplearn-problems-vertexcover"></span><h2><span class="section-number">10.9. </span>miplearn.problems.vertexcover<a class="headerlink" href="#module-miplearn.problems.vertexcover" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.problems.vertexcover.MinWeightVertexCoverData"> <dt id="miplearn.problems.vertexcover.MinWeightVertexCoverData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.problems.vertexcover.</span></span><span class="sig-name descname"><span class="pre">MinWeightVertexCoverData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">graph</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">networkx.classes.graph.Graph</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.vertexcover.MinWeightVertexCoverData" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.problems.vertexcover.</span></code><code class="sig-name descname"><span class="pre">MinWeightVertexCoverData</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">graph</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">networkx.classes.graph.Graph</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.problems.vertexcover.MinWeightVertexCoverData" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>13. Solvers &#8212; MIPLearn 0.4</title> <title>13. Solvers &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,17 +22,18 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="14. Helpers" href="../helpers/" /> <link rel="next" title="14. Helpers" href="../helpers/" />
@ -64,7 +65,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -91,7 +92,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -123,7 +124,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -225,298 +226,16 @@
<a class="reference internal nav-link" href="#module-miplearn.solvers.abstract"> <a class="reference internal nav-link" href="#module-miplearn.solvers.abstract">
13.1. miplearn.solvers.abstract 13.1. miplearn.solvers.abstract
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.WHERE_CUTS">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.WHERE_CUTS
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.WHERE_DEFAULT">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.WHERE_DEFAULT
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.WHERE_LAZY">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.WHERE_LAZY
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.add_constrs">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.add_constrs()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.extract_after_load">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.extract_after_load()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.extract_after_lp">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.extract_after_lp()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.extract_after_mip">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.extract_after_mip()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.fix_variables">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.fix_variables()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.lazy_enforce">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.lazy_enforce()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.optimize">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.optimize()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.relax">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.relax()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.set_cuts">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.set_cuts()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.set_warm_starts">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.set_warm_starts()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.abstract.AbstractModel.write">
<code class="docutils literal notranslate">
<span class="pre">
AbstractModel.write()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.solvers.gurobi"> <a class="reference internal nav-link" href="#module-miplearn.solvers.gurobi">
13.2. miplearn.solvers.gurobi 13.2. miplearn.solvers.gurobi
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.add_constr">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.add_constr()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.add_constrs">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.add_constrs()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_load">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.extract_after_load()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_lp">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.extract_after_lp()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_mip">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.extract_after_mip()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.fix_variables">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.fix_variables()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.optimize">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.optimize()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.relax">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.relax()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.set_time_limit">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.set_time_limit()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.set_warm_starts">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.set_warm_starts()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.gurobi.GurobiModel.write">
<code class="docutils literal notranslate">
<span class="pre">
GurobiModel.write()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
<li class="toc-h2 nav-item toc-entry"> <li class="toc-h2 nav-item toc-entry">
<a class="reference internal nav-link" href="#module-miplearn.solvers.learning"> <a class="reference internal nav-link" href="#module-miplearn.solvers.learning">
13.3. miplearn.solvers.learning 13.3. miplearn.solvers.learning
</a> </a>
<ul class="nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.learning.LearningSolver">
<code class="docutils literal notranslate">
<span class="pre">
LearningSolver
</span>
</code>
</a>
<ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.learning.LearningSolver.fit">
<code class="docutils literal notranslate">
<span class="pre">
LearningSolver.fit()
</span>
</code>
</a>
</li>
<li class="toc-h4 nav-item toc-entry">
<a class="reference internal nav-link" href="#miplearn.solvers.learning.LearningSolver.optimize">
<code class="docutils literal notranslate">
<span class="pre">
LearningSolver.optimize()
</span>
</code>
</a>
</li>
</ul>
</li>
</ul>
</li> </li>
</ul> </ul>
@ -529,178 +248,178 @@
<div> <div>
<section id="solvers"> <div class="section" id="solvers">
<h1><span class="section-number">13. </span>Solvers<a class="headerlink" href="#solvers" title="Link to this heading"></a></h1> <h1><span class="section-number">13. </span>Solvers<a class="headerlink" href="#solvers" title="Permalink to this headline"></a></h1>
<section id="module-miplearn.solvers.abstract"> <div class="section" id="module-miplearn.solvers.abstract">
<span id="miplearn-solvers-abstract"></span><h2><span class="section-number">13.1. </span>miplearn.solvers.abstract<a class="headerlink" href="#module-miplearn.solvers.abstract" title="Link to this heading"></a></h2> <span id="miplearn-solvers-abstract"></span><h2><span class="section-number">13.1. </span>miplearn.solvers.abstract<a class="headerlink" href="#module-miplearn.solvers.abstract" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel"> <dt id="miplearn.solvers.abstract.AbstractModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.solvers.abstract.</span></span><span class="sig-name descname"><span class="pre">AbstractModel</span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.solvers.abstract.</span></code><code class="sig-name descname"><span class="pre">AbstractModel</span></code><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ABC</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">abc.ABC</span></code></p>
<dl class="py attribute"> <dl class="py attribute">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.WHERE_CUTS"> <dt id="miplearn.solvers.abstract.AbstractModel.WHERE_CUTS">
<span class="sig-name descname"><span class="pre">WHERE_CUTS</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'cuts'</span></em><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.WHERE_CUTS" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">WHERE_CUTS</span></code><em class="property"> <span class="pre">=</span> <span class="pre">'cuts'</span></em><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.WHERE_CUTS" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py attribute"> <dl class="py attribute">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.WHERE_DEFAULT"> <dt id="miplearn.solvers.abstract.AbstractModel.WHERE_DEFAULT">
<span class="sig-name descname"><span class="pre">WHERE_DEFAULT</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'default'</span></em><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.WHERE_DEFAULT" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">WHERE_DEFAULT</span></code><em class="property"> <span class="pre">=</span> <span class="pre">'default'</span></em><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.WHERE_DEFAULT" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py attribute"> <dl class="py attribute">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.WHERE_LAZY"> <dt id="miplearn.solvers.abstract.AbstractModel.WHERE_LAZY">
<span class="sig-name descname"><span class="pre">WHERE_LAZY</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'lazy'</span></em><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.WHERE_LAZY" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">WHERE_LAZY</span></code><em class="property"> <span class="pre">=</span> <span class="pre">'lazy'</span></em><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.WHERE_LAZY" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.add_constrs"> <dt id="miplearn.solvers.abstract.AbstractModel.add_constrs">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">add_constrs</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_lhs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_sense</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_rhs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.add_constrs" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">add_constrs</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_lhs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_sense</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_rhs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.add_constrs" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.extract_after_load"> <dt id="miplearn.solvers.abstract.AbstractModel.extract_after_load">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">extract_after_load</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.extract_after_load" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">extract_after_load</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.extract_after_load" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.extract_after_lp"> <dt id="miplearn.solvers.abstract.AbstractModel.extract_after_lp">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">extract_after_lp</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.extract_after_lp" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">extract_after_lp</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.extract_after_lp" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.extract_after_mip"> <dt id="miplearn.solvers.abstract.AbstractModel.extract_after_mip">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">extract_after_mip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.extract_after_mip" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">extract_after_mip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.extract_after_mip" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.fix_variables"> <dt id="miplearn.solvers.abstract.AbstractModel.fix_variables">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">fix_variables</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.fix_variables" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">fix_variables</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.fix_variables" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.lazy_enforce"> <dt id="miplearn.solvers.abstract.AbstractModel.lazy_enforce">
<span class="sig-name descname"><span class="pre">lazy_enforce</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">violations</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.lazy_enforce" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">lazy_enforce</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">violations</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.lazy_enforce" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.optimize"> <dt id="miplearn.solvers.abstract.AbstractModel.optimize">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">optimize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.optimize" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">optimize</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.optimize" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.relax"> <dt id="miplearn.solvers.abstract.AbstractModel.relax">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">relax</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.relax" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">relax</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.relax" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.set_cuts"> <dt id="miplearn.solvers.abstract.AbstractModel.set_cuts">
<span class="sig-name descname"><span class="pre">set_cuts</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cuts</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.set_cuts" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_cuts</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cuts</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.set_cuts" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.set_warm_starts"> <dt id="miplearn.solvers.abstract.AbstractModel.set_warm_starts">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">set_warm_starts</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.set_warm_starts" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">set_warm_starts</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.set_warm_starts" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.abstract.AbstractModel.write"> <dt id="miplearn.solvers.abstract.AbstractModel.write">
<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">write</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.write" title="Link to this definition"></a></dt> <em class="property"><span class="pre">abstract</span> </em><code class="sig-name descname"><span class="pre">write</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.abstract.AbstractModel.write" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.solvers.gurobi"> <div class="section" id="module-miplearn.solvers.gurobi">
<span id="miplearn-solvers-gurobi"></span><h2><span class="section-number">13.2. </span>miplearn.solvers.gurobi<a class="headerlink" href="#module-miplearn.solvers.gurobi" title="Link to this heading"></a></h2> <span id="miplearn-solvers-gurobi"></span><h2><span class="section-number">13.2. </span>miplearn.solvers.gurobi<a class="headerlink" href="#module-miplearn.solvers.gurobi" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel"> <dt id="miplearn.solvers.gurobi.GurobiModel">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.solvers.gurobi.</span></span><span class="sig-name descname"><span class="pre">GurobiModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">inner</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lazy_separate</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lazy_enforce</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cuts_separate</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cuts_enforce</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.solvers.gurobi.</span></code><code class="sig-name descname"><span class="pre">GurobiModel</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">inner</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">gurobipy.Model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lazy_separate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lazy_enforce</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cuts_separate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cuts_enforce</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractModel</span></code></a></p> <dd><p>Bases: <a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></code></a></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.add_constr"> <dt id="miplearn.solvers.gurobi.GurobiModel.add_constr">
<span class="sig-name descname"><span class="pre">add_constr</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">constr</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Any</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.add_constr" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">add_constr</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">constr</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Any</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.add_constr" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.add_constrs"> <dt id="miplearn.solvers.gurobi.GurobiModel.add_constrs">
<span class="sig-name descname"><span class="pre">add_constrs</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_lhs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_sense</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_rhs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.add_constrs" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">add_constrs</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_lhs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_sense</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">constrs_rhs</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.add_constrs" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.extract_after_load"> <dt id="miplearn.solvers.gurobi.GurobiModel.extract_after_load">
<span class="sig-name descname"><span class="pre">extract_after_load</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_load" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">extract_after_load</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_load" title="Permalink to this definition"></a></dt>
<dd><p>Given a model that has just been loaded, extracts static problem <dd><p>Given a model that has just been loaded, extracts static problem
features, such as variable names and types, objective coefficients, etc.</p> features, such as variable names and types, objective coefficients, etc.</p>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.extract_after_lp"> <dt id="miplearn.solvers.gurobi.GurobiModel.extract_after_lp">
<span class="sig-name descname"><span class="pre">extract_after_lp</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_lp" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">extract_after_lp</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_lp" title="Permalink to this definition"></a></dt>
<dd><p>Given a linear programming model that has just been solved, extracts <dd><p>Given a linear programming model that has just been solved, extracts
dynamic problem features, such as optimal LP solution, basis status, dynamic problem features, such as optimal LP solution, basis status,
etc.</p> etc.</p>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.extract_after_mip"> <dt id="miplearn.solvers.gurobi.GurobiModel.extract_after_mip">
<span class="sig-name descname"><span class="pre">extract_after_mip</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">H5File</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_mip" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">extract_after_mip</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h5</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><a class="reference internal" href="../helpers/#miplearn.h5.H5File" title="miplearn.h5.H5File"><span class="pre">miplearn.h5.H5File</span></a></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.extract_after_mip" title="Permalink to this definition"></a></dt>
<dd><p>Given a mixed-integer linear programming model that has just been <dd><p>Given a mixed-integer linear programming model that has just been
solved, extracts dynamic problem features, such as optimal MIP solution.</p> solved, extracts dynamic problem features, such as optimal MIP solution.</p>
</dd></dl> </dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.fix_variables"> <dt id="miplearn.solvers.gurobi.GurobiModel.fix_variables">
<span class="sig-name descname"><span class="pre">fix_variables</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.fix_variables" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fix_variables</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.fix_variables" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.optimize"> <dt id="miplearn.solvers.gurobi.GurobiModel.optimize">
<span class="sig-name descname"><span class="pre">optimize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.optimize" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">optimize</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.optimize" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.relax"> <dt id="miplearn.solvers.gurobi.GurobiModel.relax">
<span class="sig-name descname"><span class="pre">relax</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">GurobiModel</span></a></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.relax" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">relax</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span> &#x2192; <a class="reference internal" href="#miplearn.solvers.gurobi.GurobiModel" title="miplearn.solvers.gurobi.GurobiModel"><span class="pre">miplearn.solvers.gurobi.GurobiModel</span></a><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.relax" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.set_time_limit"> <dt id="miplearn.solvers.gurobi.GurobiModel.set_time_limit">
<span class="sig-name descname"><span class="pre">set_time_limit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">time_limit_sec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.set_time_limit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_time_limit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">time_limit_sec</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.set_time_limit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.set_warm_starts"> <dt id="miplearn.solvers.gurobi.GurobiModel.set_warm_starts">
<span class="sig-name descname"><span class="pre">set_warm_starts</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.set_warm_starts" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">set_warm_starts</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">var_names</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">var_values</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">numpy.ndarray</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stats</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Dict</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.set_warm_starts" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.gurobi.GurobiModel.write"> <dt id="miplearn.solvers.gurobi.GurobiModel.write">
<span class="sig-name descname"><span class="pre">write</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.write" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">write</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.gurobi.GurobiModel.write" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
<section id="module-miplearn.solvers.learning"> <div class="section" id="module-miplearn.solvers.learning">
<span id="miplearn-solvers-learning"></span><h2><span class="section-number">13.3. </span>miplearn.solvers.learning<a class="headerlink" href="#module-miplearn.solvers.learning" title="Link to this heading"></a></h2> <span id="miplearn-solvers-learning"></span><h2><span class="section-number">13.3. </span>miplearn.solvers.learning<a class="headerlink" href="#module-miplearn.solvers.learning" title="Permalink to this headline"></a></h2>
<dl class="py class"> <dl class="py class">
<dt class="sig sig-object py" id="miplearn.solvers.learning.LearningSolver"> <dt id="miplearn.solvers.learning.LearningSolver">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">miplearn.solvers.learning.</span></span><span class="sig-name descname"><span class="pre">LearningSolver</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">components</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skip_lp</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.solvers.learning.LearningSolver" title="Link to this definition"></a></dt> <em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">miplearn.solvers.learning.</span></code><code class="sig-name descname"><span class="pre">LearningSolver</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">components</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skip_lp</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#miplearn.solvers.learning.LearningSolver" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p> <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.learning.LearningSolver.fit"> <dt id="miplearn.solvers.learning.LearningSolver.fit">
<span class="sig-name descname"><span class="pre">fit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data_filenames</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#miplearn.solvers.learning.LearningSolver.fit" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">fit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data_filenames</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">None</span><a class="headerlink" href="#miplearn.solvers.learning.LearningSolver.fit" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
<dl class="py method"> <dl class="py method">
<dt class="sig sig-object py" id="miplearn.solvers.learning.LearningSolver.optimize"> <dt id="miplearn.solvers.learning.LearningSolver.optimize">
<span class="sig-name descname"><span class="pre">optimize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">AbstractModel</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">build_model</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#miplearn.solvers.learning.LearningSolver.optimize" title="Link to this definition"></a></dt> <code class="sig-name descname"><span class="pre">optimize</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Union</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">build_model</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">Callable</span><span class="p"><span class="pre">]</span></span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> &#x2192; <span class="pre">Tuple</span><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#miplearn.solvers.abstract.AbstractModel" title="miplearn.solvers.abstract.AbstractModel"><span class="pre">miplearn.solvers.abstract.AbstractModel</span></a><span class="p"><span class="pre">,</span> </span><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span> </span><span class="pre">Any</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span><a class="headerlink" href="#miplearn.solvers.learning.LearningSolver.optimize" title="Permalink to this definition"></a></dt>
<dd></dd></dl> <dd></dd></dl>
</dd></dl> </dd></dl>
</section> </div>
</section> </div>
</div> </div>

@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@ -21,17 +22,27 @@
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="preload" as="script" href="../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js?v=888ff710"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="#" /> <link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="../search/" /> <link rel="search" title="Search" href="../search/" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
@ -61,7 +72,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -88,7 +99,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -120,7 +131,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>6. Training Data Collectors &#8212; MIPLearn 0.4</title> <title>6. Training Data Collectors &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,21 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="7. Feature Extractors" href="../features/" /> <link rel="next" title="7. Feature Extractors" href="../features/" />
@ -68,7 +68,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +95,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +127,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -270,17 +270,17 @@
<div> <div>
<section id="Training-Data-Collectors"> <div class="section" id="Training-Data-Collectors">
<h1><span class="section-number">6. </span>Training Data Collectors<a class="headerlink" href="#Training-Data-Collectors" title="Link to this heading"></a></h1> <h1><span class="section-number">6. </span>Training Data Collectors<a class="headerlink" href="#Training-Data-Collectors" title="Permalink to this headline"></a></h1>
<p>The first step in solving mixed-integer optimization problems with the assistance of supervised machine learning methods is solving a large set of training instances and collecting the raw training data. In this section, we describe the various training data collectors included in MIPLearn. Additionally, the framework follows the convention of storing all training data in files with a specific data format (namely, HDF5). In this section, we briefly describe this format and the rationale for <p>The first step in solving mixed-integer optimization problems with the assistance of supervised machine learning methods is solving a large set of training instances and collecting the raw training data. In this section, we describe the various training data collectors included in MIPLearn. Additionally, the framework follows the convention of storing all training data in files with a specific data format (namely, HDF5). In this section, we briefly describe this format and the rationale for
choosing it.</p> choosing it.</p>
<section id="Overview"> <div class="section" id="Overview">
<h2><span class="section-number">6.1. </span>Overview<a class="headerlink" href="#Overview" title="Link to this heading"></a></h2> <h2><span class="section-number">6.1. </span>Overview<a class="headerlink" href="#Overview" title="Permalink to this headline"></a></h2>
<p>In MIPLearn, a <strong>collector</strong> is a class that solves or analyzes the problem and collects raw data which may be later useful for machine learning methods. Collectors, by convention, take as input: (i) a list of problem data filenames, in gzipped pickle format, ending with <code class="docutils literal notranslate"><span class="pre">.pkl.gz</span></code>; (ii) a function that builds the optimization model, such as <code class="docutils literal notranslate"><span class="pre">build_tsp_model</span></code>. After processing is done, collectors store the training data in a HDF5 file located alongside with the problem data. For example, if <p>In MIPLearn, a <strong>collector</strong> is a class that solves or analyzes the problem and collects raw data which may be later useful for machine learning methods. Collectors, by convention, take as input: (i) a list of problem data filenames, in gzipped pickle format, ending with <code class="docutils literal notranslate"><span class="pre">.pkl.gz</span></code>; (ii) a function that builds the optimization model, such as <code class="docutils literal notranslate"><span class="pre">build_tsp_model</span></code>. After processing is done, collectors store the training data in a HDF5 file located alongside with the problem data. For example, if
the problem data is stored in file <code class="docutils literal notranslate"><span class="pre">problem.pkl.gz</span></code>, then the collector writes to <code class="docutils literal notranslate"><span class="pre">problem.h5</span></code>. Collectors are, in general, very time consuming, as they may need to solve the problem to optimality, potentially multiple times.</p> the problem data is stored in file <code class="docutils literal notranslate"><span class="pre">problem.pkl.gz</span></code>, then the collector writes to <code class="docutils literal notranslate"><span class="pre">problem.h5</span></code>. Collectors are, in general, very time consuming, as they may need to solve the problem to optimality, potentially multiple times.</p>
</section> </div>
<section id="HDF5-Format"> <div class="section" id="HDF5-Format">
<h2><span class="section-number">6.2. </span>HDF5 Format<a class="headerlink" href="#HDF5-Format" title="Link to this heading"></a></h2> <h2><span class="section-number">6.2. </span>HDF5 Format<a class="headerlink" href="#HDF5-Format" title="Permalink to this headline"></a></h2>
<p>MIPLearn stores all training data in <a class="reference external" href="HDF5">HDF5</a> (Hierarchical Data Format, Version 5) files. The HDF format was originally developed by the <a class="reference external" href="https://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applications">National Center for Supercomputing Applications</a> (NCSA) for storing and organizing large amounts of data, and supports a variety of data types, including integers, floating-point numbers, strings, and arrays. Compared to other formats, such as CSV, JSON or SQLite, the <p>MIPLearn stores all training data in <a class="reference external" href="HDF5">HDF5</a> (Hierarchical Data Format, Version 5) files. The HDF format was originally developed by the <a class="reference external" href="https://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applications">National Center for Supercomputing Applications</a> (NCSA) for storing and organizing large amounts of data, and supports a variety of data types, including integers, floating-point numbers, strings, and arrays. Compared to other formats, such as CSV, JSON or SQLite, the
HDF5 format provides several advantages for MIPLearn, including:</p> HDF5 format provides several advantages for MIPLearn, including:</p>
<ul class="simple"> <ul class="simple">
@ -292,41 +292,41 @@ HDF5 format provides several advantages for MIPLearn, including:</p>
<p>MIPLearn currently uses HDF5 as simple key-value storage for numerical data; more advanced features of the format, such as metadata, are not currently used. Although files generated by MIPLearn can be read with any HDF5 library, such as <a class="reference external" href="https://www.h5py.org/">h5py</a>, some convenience functions are provided to make the access more simple and less error-prone. Specifically, the class <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File">H5File</a>, which is built on top of h5py, provides the methods <p>MIPLearn currently uses HDF5 as simple key-value storage for numerical data; more advanced features of the format, such as metadata, are not currently used. Although files generated by MIPLearn can be read with any HDF5 library, such as <a class="reference external" href="https://www.h5py.org/">h5py</a>, some convenience functions are provided to make the access more simple and less error-prone. Specifically, the class <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File">H5File</a>, which is built on top of h5py, provides the methods
<a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_scalar</a>, <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_array</a>, <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_sparse</a>, <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_bytes</a> to store, respectively, scalar values, dense multi-dimensional arrays, sparse multi-dimensional arrays and arbitrary binary data. The corresponding <em>get</em> methods are also provided. Compared to pure h5py methods, these methods <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_scalar</a>, <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_array</a>, <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_sparse</a>, <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File.put_scalar">put_bytes</a> to store, respectively, scalar values, dense multi-dimensional arrays, sparse multi-dimensional arrays and arbitrary binary data. The corresponding <em>get</em> methods are also provided. Compared to pure h5py methods, these methods
automatically perform type-checking and gzip compression. The example below shows their usage.</p> automatically perform type-checking and gzip compression. The example below shows their usage.</p>
<section id="Example"> <div class="section" id="Example">
<h3>Example<a class="headerlink" href="#Example" title="Link to this heading"></a></h3> <h3>Example<a class="headerlink" href="#Example" title="Permalink to this headline"></a></h3>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>import numpy as np
<span class="kn">import</span> <span class="nn">scipy.sparse</span> import scipy.sparse
<span class="kn">from</span> <span class="nn">miplearn.h5</span> <span class="kn">import</span> <span class="n">H5File</span> from miplearn.h5 import H5File
<span class="c1"># Set random seed to make example reproducible</span> # Set random seed to make example reproducible
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> np.random.seed(42)
<span class="c1"># Create a new empty HDF5 file</span> # Create a new empty HDF5 file
<span class="k">with</span> <span class="n">H5File</span><span class="p">(</span><span class="s2">&quot;test.h5&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h5</span><span class="p">:</span> with H5File(&quot;test.h5&quot;, &quot;w&quot;) as h5:
<span class="c1"># Store a scalar</span> # Store a scalar
<span class="n">h5</span><span class="o">.</span><span class="n">put_scalar</span><span class="p">(</span><span class="s2">&quot;x1&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> h5.put_scalar(&quot;x1&quot;, 1)
<span class="n">h5</span><span class="o">.</span><span class="n">put_scalar</span><span class="p">(</span><span class="s2">&quot;x2&quot;</span><span class="p">,</span> <span class="s2">&quot;hello world&quot;</span><span class="p">)</span> h5.put_scalar(&quot;x2&quot;, &quot;hello world&quot;)
<span class="c1"># Store a dense array and a dense matrix</span> # Store a dense array and a dense matrix
<span class="n">h5</span><span class="o">.</span><span class="n">put_array</span><span class="p">(</span><span class="s2">&quot;x3&quot;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]))</span> h5.put_array(&quot;x3&quot;, np.array([1, 2, 3]))
<span class="n">h5</span><span class="o">.</span><span class="n">put_array</span><span class="p">(</span><span class="s2">&quot;x4&quot;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span> h5.put_array(&quot;x4&quot;, np.random.rand(3, 3))
<span class="c1"># Store a sparse matrix</span> # Store a sparse matrix
<span class="n">h5</span><span class="o">.</span><span class="n">put_sparse</span><span class="p">(</span><span class="s2">&quot;x5&quot;</span><span class="p">,</span> <span class="n">scipy</span><span class="o">.</span><span class="n">sparse</span><span class="o">.</span><span class="n">random</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">))</span> h5.put_sparse(&quot;x5&quot;, scipy.sparse.random(5, 5, 0.5))
<span class="c1"># Re-open the file we just created and print</span> # Re-open the file we just created and print
<span class="c1"># previously-stored data</span> # previously-stored data
<span class="k">with</span> <span class="n">H5File</span><span class="p">(</span><span class="s2">&quot;test.h5&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h5</span><span class="p">:</span> with H5File(&quot;test.h5&quot;, &quot;r&quot;) as h5:
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x1 =&quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_scalar</span><span class="p">(</span><span class="s2">&quot;x1&quot;</span><span class="p">))</span> print(&quot;x1 =&quot;, h5.get_scalar(&quot;x1&quot;))
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x2 =&quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_scalar</span><span class="p">(</span><span class="s2">&quot;x2&quot;</span><span class="p">))</span> print(&quot;x2 =&quot;, h5.get_scalar(&quot;x2&quot;))
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x3 =&quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_array</span><span class="p">(</span><span class="s2">&quot;x3&quot;</span><span class="p">))</span> print(&quot;x3 =&quot;, h5.get_array(&quot;x3&quot;))
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x4 =&quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_array</span><span class="p">(</span><span class="s2">&quot;x4&quot;</span><span class="p">))</span> print(&quot;x4 =&quot;, h5.get_array(&quot;x4&quot;))
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x5 =&quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_sparse</span><span class="p">(</span><span class="s2">&quot;x5&quot;</span><span class="p">))</span> print(&quot;x5 =&quot;, h5.get_sparse(&quot;x5&quot;))
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -355,10 +355,10 @@ x5 = (3, 2) 0.6803075671195984
(3, 0) 0.83319491147995 (3, 0) 0.83319491147995
</pre></div></div> </pre></div></div>
</div> </div>
</section> </div>
</section> </div>
<section id="Basic-collector"> <div class="section" id="Basic-collector">
<h2><span class="section-number">6.3. </span>Basic collector<a class="headerlink" href="#Basic-collector" title="Link to this heading"></a></h2> <h2><span class="section-number">6.3. </span>Basic collector<a class="headerlink" href="#Basic-collector" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="../../api/collectors/#miplearn.collectors.basic.BasicCollector">BasicCollector</a> is the most fundamental collector, and performs the following steps:</p> <p><a class="reference external" href="../../api/collectors/#miplearn.collectors.basic.BasicCollector">BasicCollector</a> is the most fundamental collector, and performs the following steps:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Extracts all model data, such as objective function and constraint right-hand sides into numpy arrays, which can later be easily and efficiently accessed without rebuilding the model or invoking the solver;</p></li> <li><p>Extracts all model data, such as objective function and constraint right-hand sides into numpy arrays, which can later be easily and efficiently accessed without rebuilding the model or invoking the solver;</p></li>
@ -366,9 +366,14 @@ x5 = (3, 2) 0.6803075671195984
<li><p>Solves the original mixed-integer optimization problem to optimality and stores its optimal solution, along with solve statistics, such as number of explored nodes and wallclock time.</p></li> <li><p>Solves the original mixed-integer optimization problem to optimality and stores its optimal solution, along with solve statistics, such as number of explored nodes and wallclock time.</p></li>
</ol> </ol>
<p>Data extracted in Phases 1, 2 and 3 above are prefixed, respectively as <code class="docutils literal notranslate"><span class="pre">static_</span></code>, <code class="docutils literal notranslate"><span class="pre">lp_</span></code> and <code class="docutils literal notranslate"><span class="pre">mip_</span></code>. The entire set of fields is shown in the table below.</p> <p>Data extracted in Phases 1, 2 and 3 above are prefixed, respectively as <code class="docutils literal notranslate"><span class="pre">static_</span></code>, <code class="docutils literal notranslate"><span class="pre">lp_</span></code> and <code class="docutils literal notranslate"><span class="pre">mip_</span></code>. The entire set of fields is shown in the table below.</p>
<section id="Data-fields"> <div class="section" id="Data-fields">
<h3>Data fields<a class="headerlink" href="#Data-fields" title="Link to this heading"></a></h3> <h3>Data fields<a class="headerlink" href="#Data-fields" title="Permalink to this headline"></a></h3>
<table class="docutils align-default"> <table class="docutils align-default">
<colgroup>
<col style="width: 18%" />
<col style="width: 11%" />
<col style="width: 72%" />
</colgroup>
<thead> <thead>
<tr class="row-odd"><th class="head"><p>Field</p></th> <tr class="row-odd"><th class="head"><p>Field</p></th>
<th class="head"><p>Type</p></th> <th class="head"><p>Type</p></th>
@ -490,53 +495,53 @@ x5 = (3, 2) 0.6803075671195984
</tr> </tr>
</tbody> </tbody>
</table> </table>
</section> </div>
<section id="id1"> <div class="section" id="id1">
<h3>Example<a class="headerlink" href="#id1" title="Link to this heading"></a></h3> <h3>Example<a class="headerlink" href="#id1" title="Permalink to this headline"></a></h3>
<p>The example below shows how to generate a few random instances of the traveling salesman problem, store its problem data, run the collector and print some of the training data to screen.</p> <p>The example below shows how to generate a few random instances of the traveling salesman problem, store its problem data, run the collector and print some of the training data to screen.</p>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">random</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>import random
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> import numpy as np
<span class="kn">from</span> <span class="nn">scipy.stats</span> <span class="kn">import</span> <span class="n">uniform</span><span class="p">,</span> <span class="n">randint</span> from scipy.stats import uniform, randint
<span class="kn">from</span> <span class="nn">glob</span> <span class="kn">import</span> <span class="n">glob</span> from glob import glob
<span class="kn">from</span> <span class="nn">miplearn.problems.tsp</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.problems.tsp import (
<span class="n">TravelingSalesmanGenerator</span><span class="p">,</span> TravelingSalesmanGenerator,
<span class="n">build_tsp_model_gurobipy</span><span class="p">,</span> build_tsp_model_gurobipy,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">write_pkl_gz</span> from miplearn.io import write_pkl_gz
<span class="kn">from</span> <span class="nn">miplearn.h5</span> <span class="kn">import</span> <span class="n">H5File</span> from miplearn.h5 import H5File
<span class="kn">from</span> <span class="nn">miplearn.collectors.basic</span> <span class="kn">import</span> <span class="n">BasicCollector</span> from miplearn.collectors.basic import BasicCollector
<span class="c1"># Set random seed to make example reproducible.</span> # Set random seed to make example reproducible.
<span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> random.seed(42)
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> np.random.seed(42)
<span class="c1"># Generate a few instances of the traveling salesman problem.</span> # Generate a few instances of the traveling salesman problem.
<span class="n">data</span> <span class="o">=</span> <span class="n">TravelingSalesmanGenerator</span><span class="p">(</span> data = TravelingSalesmanGenerator(
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">11</span><span class="p">),</span> n=randint(low=10, high=11),
<span class="n">x</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">),</span> x=uniform(loc=0.0, scale=1000.0),
<span class="n">y</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">),</span> y=uniform(loc=0.0, scale=1000.0),
<span class="n">gamma</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.90</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.20</span><span class="p">),</span> gamma=uniform(loc=0.90, scale=0.20),
<span class="n">fix_cities</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> fix_cities=True,
<span class="nb">round</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> round=True,
<span class="p">)</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> ).generate(10)
<span class="c1"># Save instance data to data/tsp/00000.pkl.gz, data/tsp/00001.pkl.gz, ...</span> # Save instance data to data/tsp/00000.pkl.gz, data/tsp/00001.pkl.gz, ...
<span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s2">&quot;data/tsp&quot;</span><span class="p">)</span> write_pkl_gz(data, &quot;data/tsp&quot;)
<span class="c1"># Solve all instances and collect basic solution information.</span> # Solve all instances and collect basic solution information.
<span class="c1"># Process at most four instances in parallel.</span> # Process at most four instances in parallel.
<span class="n">bc</span> <span class="o">=</span> <span class="n">BasicCollector</span><span class="p">()</span> bc = BasicCollector()
<span class="n">bc</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="n">glob</span><span class="p">(</span><span class="s2">&quot;data/tsp/*.pkl.gz&quot;</span><span class="p">),</span> <span class="n">build_tsp_model_gurobipy</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span> bc.collect(glob(&quot;data/tsp/*.pkl.gz&quot;), build_tsp_model_gurobipy, n_jobs=4)
<span class="c1"># Read and print some training data for the first instance.</span> # Read and print some training data for the first instance.
<span class="k">with</span> <span class="n">H5File</span><span class="p">(</span><span class="s2">&quot;data/tsp/00000.h5&quot;</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h5</span><span class="p">:</span> with H5File(&quot;data/tsp/00000.h5&quot;, &quot;r&quot;) as h5:
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;lp_obj_value = &quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_scalar</span><span class="p">(</span><span class="s2">&quot;lp_obj_value&quot;</span><span class="p">))</span> print(&quot;lp_obj_value = &quot;, h5.get_scalar(&quot;lp_obj_value&quot;))
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;mip_obj_value = &quot;</span><span class="p">,</span> <span class="n">h5</span><span class="o">.</span><span class="n">get_scalar</span><span class="p">(</span><span class="s2">&quot;mip_obj_value&quot;</span><span class="p">))</span> print(&quot;mip_obj_value = &quot;, h5.get_scalar(&quot;mip_obj_value&quot;))
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -557,9 +562,9 @@ mip_obj_value = 2921.0
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>7. Feature Extractors &#8212; MIPLearn 0.4</title> <title>7. Feature Extractors &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,22 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="8. Primal Components" href="../primal/" /> <link rel="next" title="8. Primal Components" href="../primal/" />
@ -68,7 +69,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +96,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +128,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -265,105 +266,105 @@
<div> <div>
<section id="Feature-Extractors"> <div class="section" id="Feature-Extractors">
<h1><span class="section-number">7. </span>Feature Extractors<a class="headerlink" href="#Feature-Extractors" title="Link to this heading"></a></h1> <h1><span class="section-number">7. </span>Feature Extractors<a class="headerlink" href="#Feature-Extractors" title="Permalink to this headline"></a></h1>
<p>In the previous page, we introduced <em>training data collectors</em>, which solve the optimization problem and collect raw training data, such as the optimal solution. In this page, we introduce <strong>feature extractors</strong>, which take the raw training data, stored in HDF5 files, and extract relevant information in order to train a machine learning model.</p> <p>In the previous page, we introduced <em>training data collectors</em>, which solve the optimization problem and collect raw training data, such as the optimal solution. In this page, we introduce <strong>feature extractors</strong>, which take the raw training data, stored in HDF5 files, and extract relevant information in order to train a machine learning model.</p>
<section id="Overview"> <div class="section" id="Overview">
<h2><span class="section-number">7.1. </span>Overview<a class="headerlink" href="#Overview" title="Link to this heading"></a></h2> <h2><span class="section-number">7.1. </span>Overview<a class="headerlink" href="#Overview" title="Permalink to this headline"></a></h2>
<p>Feature extraction is an important step of the process of building a machine learning model because it helps to reduce the complexity of the data and convert it into a format that is more easily processed. Previous research has proposed converting absolute variable coefficients, for example, into relative values which are invariant to various transformations, such as problem scaling, making them more amenable to learning. Various other transformations have also been described.</p> <p>Feature extraction is an important step of the process of building a machine learning model because it helps to reduce the complexity of the data and convert it into a format that is more easily processed. Previous research has proposed converting absolute variable coefficients, for example, into relative values which are invariant to various transformations, such as problem scaling, making them more amenable to learning. Various other transformations have also been described.</p>
<p>In the framework, we treat data collection and feature extraction as two separate steps to accelerate the model development cycle. Specifically, collectors are typically time-consuming, as they often need to solve the problem to optimality, and therefore focus on collecting and storing all data that may or may not be relevant, in its raw format. Feature extractors, on the other hand, focus entirely on filtering the data and improving its representation, and are therefore much faster to run. <p>In the framework, we treat data collection and feature extraction as two separate steps to accelerate the model development cycle. Specifically, collectors are typically time-consuming, as they often need to solve the problem to optimality, and therefore focus on collecting and storing all data that may or may not be relevant, in its raw format. Feature extractors, on the other hand, focus entirely on filtering the data and improving its representation, and are therefore much faster to run.
Experimenting with new data representations, therefore, can be done without resolving the instances.</p> Experimenting with new data representations, therefore, can be done without resolving the instances.</p>
<p>In MIPLearn, extractors implement the abstract class <a class="reference external" href="../../api/collectors/#miplearn.features.fields.FeaturesExtractor">FeatureExtractor</a>, which has methods that take as input an <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File">H5File</a> and produce either: (i) instance features, which describe the entire instances; (ii) variable features, which describe a particular decision variables; or (iii) constraint features, which describe a particular constraint. The extractor is free to implement only a <p>In MIPLearn, extractors implement the abstract class <a class="reference external" href="../../api/collectors/#miplearn.features.fields.FeaturesExtractor">FeatureExtractor</a>, which has methods that take as input an <a class="reference external" href="../../api/helpers/#miplearn.h5.H5File">H5File</a> and produce either: (i) instance features, which describe the entire instances; (ii) variable features, which describe a particular decision variables; or (iii) constraint features, which describe a particular constraint. The extractor is free to implement only a
subset of these methods, if it is known that it will not be used with a machine learning component that requires the other types of features.</p> subset of these methods, if it is known that it will not be used with a machine learning component that requires the other types of features.</p>
</section> </div>
<section id="H5FieldsExtractor"> <div class="section" id="H5FieldsExtractor">
<h2><span class="section-number">7.2. </span>H5FieldsExtractor<a class="headerlink" href="#H5FieldsExtractor" title="Link to this heading"></a></h2> <h2><span class="section-number">7.2. </span>H5FieldsExtractor<a class="headerlink" href="#H5FieldsExtractor" title="Permalink to this headline"></a></h2>
<p><a class="reference internal" href="#H5FieldsExtractor"><span class="std std-ref">H5FieldsExtractor</span></a>, the most simple extractor in MIPLearn, simple extracts data that is already available in the HDF5 file, assembles it into a matrix and returns it as-is. The fields used to build instance, variable and constraint features are user-specified. The class also performs checks to ensure that the shapes of the returned matrices make sense.</p> <p><a class="reference internal" href="#H5FieldsExtractor"><span class="std std-ref">H5FieldsExtractor</span></a>, the most simple extractor in MIPLearn, simple extracts data that is already available in the HDF5 file, assembles it into a matrix and returns it as-is. The fields used to build instance, variable and constraint features are user-specified. The class also performs checks to ensure that the shapes of the returned matrices make sense.</p>
<section id="Example"> <div class="section" id="Example">
<h3>Example<a class="headerlink" href="#Example" title="Link to this heading"></a></h3> <h3>Example<a class="headerlink" href="#Example" title="Permalink to this headline"></a></h3>
<p>The example below demonstrates the usage of H5FieldsExtractor in a randomly generated instance of the multi-dimensional knapsack problem.</p> <p>The example below demonstrates the usage of H5FieldsExtractor in a randomly generated instance of the multi-dimensional knapsack problem.</p>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">glob</span> <span class="kn">import</span> <span class="n">glob</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from glob import glob
<span class="kn">from</span> <span class="nn">shutil</span> <span class="kn">import</span> <span class="n">rmtree</span> from shutil import rmtree
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> import numpy as np
<span class="kn">from</span> <span class="nn">scipy.stats</span> <span class="kn">import</span> <span class="n">uniform</span><span class="p">,</span> <span class="n">randint</span> from scipy.stats import uniform, randint
<span class="kn">from</span> <span class="nn">miplearn.collectors.basic</span> <span class="kn">import</span> <span class="n">BasicCollector</span> from miplearn.collectors.basic import BasicCollector
<span class="kn">from</span> <span class="nn">miplearn.extractors.fields</span> <span class="kn">import</span> <span class="n">H5FieldsExtractor</span> from miplearn.extractors.fields import H5FieldsExtractor
<span class="kn">from</span> <span class="nn">miplearn.h5</span> <span class="kn">import</span> <span class="n">H5File</span> from miplearn.h5 import H5File
<span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">write_pkl_gz</span> from miplearn.io import write_pkl_gz
<span class="kn">from</span> <span class="nn">miplearn.problems.multiknapsack</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.problems.multiknapsack import (
<span class="n">MultiKnapsackGenerator</span><span class="p">,</span> MultiKnapsackGenerator,
<span class="n">build_multiknapsack_model_gurobipy</span><span class="p">,</span> build_multiknapsack_model_gurobipy,
<span class="p">)</span> )
<span class="c1"># Set random seed to make example reproducible</span> # Set random seed to make example reproducible
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> np.random.seed(42)
<span class="c1"># Generate some random multiknapsack instances</span> # Generate some random multiknapsack instances
<span class="n">rmtree</span><span class="p">(</span><span class="s2">&quot;data/multiknapsack/&quot;</span><span class="p">,</span> <span class="n">ignore_errors</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> rmtree(&quot;data/multiknapsack/&quot;, ignore_errors=True)
<span class="n">write_pkl_gz</span><span class="p">(</span> write_pkl_gz(
<span class="n">MultiKnapsackGenerator</span><span class="p">(</span> MultiKnapsackGenerator(
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">11</span><span class="p">),</span> n=randint(low=10, high=11),
<span class="n">m</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">6</span><span class="p">),</span> m=randint(low=5, high=6),
<span class="n">w</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">1000</span><span class="p">),</span> w=uniform(loc=0, scale=1000),
<span class="n">K</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span> K=uniform(loc=100, scale=0),
<span class="n">u</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span> u=uniform(loc=1, scale=0),
<span class="n">alpha</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.25</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span> alpha=uniform(loc=0.25, scale=0),
<span class="n">w_jitter</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.95</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.1</span><span class="p">),</span> w_jitter=uniform(loc=0.95, scale=0.1),
<span class="n">p_jitter</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.5</span><span class="p">),</span> p_jitter=uniform(loc=0.75, scale=0.5),
<span class="n">fix_w</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> fix_w=True,
<span class="p">)</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> ).generate(10),
<span class="s2">&quot;data/multiknapsack&quot;</span><span class="p">,</span> &quot;data/multiknapsack&quot;,
<span class="p">)</span> )
<span class="c1"># Run the basic collector</span> # Run the basic collector
<span class="n">BasicCollector</span><span class="p">()</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span> BasicCollector().collect(
<span class="n">glob</span><span class="p">(</span><span class="s2">&quot;data/multiknapsack/*&quot;</span><span class="p">),</span> glob(&quot;data/multiknapsack/*&quot;),
<span class="n">build_multiknapsack_model_gurobipy</span><span class="p">,</span> build_multiknapsack_model_gurobipy,
<span class="n">n_jobs</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> n_jobs=4,
<span class="p">)</span> )
<span class="n">ext</span> <span class="o">=</span> <span class="n">H5FieldsExtractor</span><span class="p">(</span> ext = H5FieldsExtractor(
<span class="c1"># Use as instance features the value of the LP relaxation and the</span> # Use as instance features the value of the LP relaxation and the
<span class="c1"># vector of objective coefficients.</span> # vector of objective coefficients.
<span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span> instance_fields=[
<span class="s2">&quot;lp_obj_value&quot;</span><span class="p">,</span> &quot;lp_obj_value&quot;,
<span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">,</span> &quot;static_var_obj_coeffs&quot;,
<span class="p">],</span> ],
<span class="c1"># For each variable, use as features the optimal value of the LP</span> # For each variable, use as features the optimal value of the LP
<span class="c1"># relaxation, the variable objective coefficient, the variable&#39;s</span> # relaxation, the variable objective coefficient, the variable&#39;s
<span class="c1"># value its reduced cost.</span> # value its reduced cost.
<span class="n">var_fields</span><span class="o">=</span><span class="p">[</span> var_fields=[
<span class="s2">&quot;lp_obj_value&quot;</span><span class="p">,</span> &quot;lp_obj_value&quot;,
<span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">,</span> &quot;static_var_obj_coeffs&quot;,
<span class="s2">&quot;lp_var_values&quot;</span><span class="p">,</span> &quot;lp_var_values&quot;,
<span class="s2">&quot;lp_var_reduced_costs&quot;</span><span class="p">,</span> &quot;lp_var_reduced_costs&quot;,
<span class="p">],</span> ],
<span class="c1"># For each constraint, use as features the RHS, dual value and slack.</span> # For each constraint, use as features the RHS, dual value and slack.
<span class="n">constr_fields</span><span class="o">=</span><span class="p">[</span> constr_fields=[
<span class="s2">&quot;static_constr_rhs&quot;</span><span class="p">,</span> &quot;static_constr_rhs&quot;,
<span class="s2">&quot;lp_constr_dual_values&quot;</span><span class="p">,</span> &quot;lp_constr_dual_values&quot;,
<span class="s2">&quot;lp_constr_slacks&quot;</span><span class="p">,</span> &quot;lp_constr_slacks&quot;,
<span class="p">],</span> ],
<span class="p">)</span> )
<span class="k">with</span> <span class="n">H5File</span><span class="p">(</span><span class="s2">&quot;data/multiknapsack/00000.h5&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h5</span><span class="p">:</span> with H5File(&quot;data/multiknapsack/00000.h5&quot;) as h5:
<span class="c1"># Extract and print instance features</span> # Extract and print instance features
<span class="n">x1</span> <span class="o">=</span> <span class="n">ext</span><span class="o">.</span><span class="n">get_instance_features</span><span class="p">(</span><span class="n">h5</span><span class="p">)</span> x1 = ext.get_instance_features(h5)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;instance features&quot;</span><span class="p">,</span> <span class="n">x1</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">x1</span><span class="p">)</span> print(&quot;instance features&quot;, x1.shape, &quot;\n&quot;, x1)
<span class="c1"># Extract and print variable features</span> # Extract and print variable features
<span class="n">x2</span> <span class="o">=</span> <span class="n">ext</span><span class="o">.</span><span class="n">get_var_features</span><span class="p">(</span><span class="n">h5</span><span class="p">)</span> x2 = ext.get_var_features(h5)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;variable features&quot;</span><span class="p">,</span> <span class="n">x2</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">x2</span><span class="p">)</span> print(&quot;variable features&quot;, x2.shape, &quot;\n&quot;, x2)
<span class="c1"># Extract and print constraint features</span> # Extract and print constraint features
<span class="n">x3</span> <span class="o">=</span> <span class="n">ext</span><span class="o">.</span><span class="n">get_constr_features</span><span class="p">(</span><span class="n">h5</span><span class="p">)</span> x3 = ext.get_constr_features(h5)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;constraint features&quot;</span><span class="p">,</span> <span class="n">x3</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">x3</span><span class="p">)</span> print(&quot;constraint features&quot;, x3.shape, &quot;\n&quot;, x3)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -399,29 +400,29 @@ constraint features (5, 3)
<p class="admonition-title">Warning</p> <p class="admonition-title">Warning</p>
<p>You should ensure that the number of features remains the same for all relevant HDF5 files. In the previous example, to illustrate this issue, we used variable objective coefficients as instance features. While this is allowed, note that this requires all problem instances to have the same number of variables; otherwise the number of features would vary from instance to instance and MIPLearn would be unable to concatenate the matrices.</p> <p>You should ensure that the number of features remains the same for all relevant HDF5 files. In the previous example, to illustrate this issue, we used variable objective coefficients as instance features. While this is allowed, note that this requires all problem instances to have the same number of variables; otherwise the number of features would vary from instance to instance and MIPLearn would be unable to concatenate the matrices.</p>
</div> </div>
</section> </div>
</section> </div>
<section id="AlvLouWeh2017Extractor"> <div class="section" id="AlvLouWeh2017Extractor">
<h2><span class="section-number">7.3. </span>AlvLouWeh2017Extractor<a class="headerlink" href="#AlvLouWeh2017Extractor" title="Link to this heading"></a></h2> <h2><span class="section-number">7.3. </span>AlvLouWeh2017Extractor<a class="headerlink" href="#AlvLouWeh2017Extractor" title="Permalink to this headline"></a></h2>
<p>Alvarez, Louveaux and Wehenkel (2017) proposed a set features to describe a particular decision variable in a given node of the branch-and-bound tree, and applied it to the problem of mimicking strong branching decisions. The class <a class="reference internal" href="#AlvLouWeh2017Extractor"><span class="std std-ref">AlvLouWeh2017Extractor</span></a> implements a subset of these features (40 out of 64), which are available outside of the branch-and-bound tree. Some features are derived from the static defintion of the problem (i.e. from objective function and <p>Alvarez, Louveaux and Wehenkel (2017) proposed a set features to describe a particular decision variable in a given node of the branch-and-bound tree, and applied it to the problem of mimicking strong branching decisions. The class <a class="reference internal" href="#AlvLouWeh2017Extractor"><span class="std std-ref">AlvLouWeh2017Extractor</span></a> implements a subset of these features (40 out of 64), which are available outside of the branch-and-bound tree. Some features are derived from the static defintion of the problem (i.e. from objective function and
constraint data), while some features are derived from the solution to the LP relaxation. The features have been designed to be: (i) independent of the size of the problem; (ii) invariant with respect to irrelevant problem transformations, such as row and column permutation; and (iii) independent of the scale of the problem. We refer to the paper for a more complete description.</p> constraint data), while some features are derived from the solution to the LP relaxation. The features have been designed to be: (i) independent of the size of the problem; (ii) invariant with respect to irrelevant problem transformations, such as row and column permutation; and (iii) independent of the scale of the problem. We refer to the paper for a more complete description.</p>
<section id="id1"> <div class="section" id="id1">
<h3>Example<a class="headerlink" href="#id1" title="Link to this heading"></a></h3> <h3>Example<a class="headerlink" href="#id1" title="Permalink to this headline"></a></h3>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.extractors.AlvLouWeh2017</span> <span class="kn">import</span> <span class="n">AlvLouWeh2017Extractor</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.extractors.AlvLouWeh2017 import AlvLouWeh2017Extractor
<span class="kn">from</span> <span class="nn">miplearn.h5</span> <span class="kn">import</span> <span class="n">H5File</span> from miplearn.h5 import H5File
<span class="c1"># Build the extractor</span> # Build the extractor
<span class="n">ext</span> <span class="o">=</span> <span class="n">AlvLouWeh2017Extractor</span><span class="p">()</span> ext = AlvLouWeh2017Extractor()
<span class="c1"># Open previously-created multiknapsack training data</span> # Open previously-created multiknapsack training data
<span class="k">with</span> <span class="n">H5File</span><span class="p">(</span><span class="s2">&quot;data/multiknapsack/00000.h5&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h5</span><span class="p">:</span> with H5File(&quot;data/multiknapsack/00000.h5&quot;) as h5:
<span class="c1"># Extract and print variable features</span> # Extract and print variable features
<span class="n">x1</span> <span class="o">=</span> <span class="n">ext</span><span class="o">.</span><span class="n">get_var_features</span><span class="p">(</span><span class="n">h5</span><span class="p">)</span> x1 = ext.get_var_features(h5)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x1&quot;</span><span class="p">,</span> <span class="n">x1</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">x1</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> print(&quot;x1&quot;, x1.shape, &quot;\n&quot;, x1.round(1))
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -500,9 +501,9 @@ x1 (10, 40)
<li><p><strong>Alvarez, Alejandro Marcos, Quentin Louveaux, and Louis Wehenkel.</strong> <em>A machine learning-based approximation of strong branching.</em> INFORMS Journal on Computing 29.1 (2017): 185-195.</p></li> <li><p><strong>Alvarez, Alejandro Marcos, Quentin Louveaux, and Louis Wehenkel.</strong> <em>A machine learning-based approximation of strong branching.</em> INFORMS Journal on Computing 29.1 (2017): 185-195.</p></li>
</ul> </ul>
</div> </div>
</section> </div>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>8. Primal Components &#8212; MIPLearn 0.4</title> <title>8. Primal Components &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,23 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="9. Learning Solver" href="../solvers/" /> <link rel="next" title="9. Learning Solver" href="../solvers/" />
@ -68,7 +70,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +97,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +129,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -289,13 +291,13 @@
<div> <div>
<section id="Primal-Components"> <div class="section" id="Primal-Components">
<h1><span class="section-number">8. </span>Primal Components<a class="headerlink" href="#Primal-Components" title="Link to this heading"></a></h1> <h1><span class="section-number">8. </span>Primal Components<a class="headerlink" href="#Primal-Components" title="Permalink to this headline"></a></h1>
<p>In MIPLearn, a <strong>primal component</strong> is class that uses machine learning to predict a (potentially partial) assignment of values to the decision variables of the problem. Predicting high-quality primal solutions may be beneficial, as they allow the MIP solver to prune potentially large portions of the search space. Alternatively, if proof of optimality is not required, the MIP solver can be used to complete the partial solution generated by the machine learning model and and double-check its <p>In MIPLearn, a <strong>primal component</strong> is class that uses machine learning to predict a (potentially partial) assignment of values to the decision variables of the problem. Predicting high-quality primal solutions may be beneficial, as they allow the MIP solver to prune potentially large portions of the search space. Alternatively, if proof of optimality is not required, the MIP solver can be used to complete the partial solution generated by the machine learning model and and double-check its
feasibility. MIPLearn allows both of these usage patterns.</p> feasibility. MIPLearn allows both of these usage patterns.</p>
<p>In this page, we describe the four primal components currently included in MIPLearn, which employ machine learning in different ways. Each component is highly configurable, and accepts an user-provided machine learning model, which it uses for all predictions. Each component can also be configured to provide the solution to the solver in multiple ways, depending on whether proof of optimality is required.</p> <p>In this page, we describe the four primal components currently included in MIPLearn, which employ machine learning in different ways. Each component is highly configurable, and accepts an user-provided machine learning model, which it uses for all predictions. Each component can also be configured to provide the solution to the solver in multiple ways, depending on whether proof of optimality is required.</p>
<section id="Primal-component-actions"> <div class="section" id="Primal-component-actions">
<h2><span class="section-number">8.1. </span>Primal component actions<a class="headerlink" href="#Primal-component-actions" title="Link to this heading"></a></h2> <h2><span class="section-number">8.1. </span>Primal component actions<a class="headerlink" href="#Primal-component-actions" title="Permalink to this headline"></a></h2>
<p>Before presenting the primal components themselves, we briefly discuss the three ways a solution may be provided to the solver. Each approach has benefits and limitations, which we also discuss in this section. All primal components can be configured to use any of the following approaches.</p> <p>Before presenting the primal components themselves, we briefly discuss the three ways a solution may be provided to the solver. Each approach has benefits and limitations, which we also discuss in this section. All primal components can be configured to use any of the following approaches.</p>
<p>The first approach is to provide the solution to the solver as a <strong>warm start</strong>. This is implemented by the class <a class="reference external" href="SetWarmStart">SetWarmStart</a>. The main advantage is that this method maintains all optimality and feasibility guarantees of the MIP solver, while still providing significant performance benefits for various classes of problems. If the machine learning model is able to predict multiple solutions, it is also possible to set multiple warm starts. In this case, the solver evaluates <p>The first approach is to provide the solution to the solver as a <strong>warm start</strong>. This is implemented by the class <a class="reference external" href="SetWarmStart">SetWarmStart</a>. The main advantage is that this method maintains all optimality and feasibility guarantees of the MIP solver, while still providing significant performance benefits for various classes of problems. If the machine learning model is able to predict multiple solutions, it is also possible to set multiple warm starts. In this case, the solver evaluates
each warm start, discards the infeasible ones, then proceeds with the one that has the best objective value. The main disadvantage of this approach, compared to the next two, is that it provides relatively modest speedups for most problem classes, and no speedup at all for many others, even when the machine learning predictions are 100% accurate.</p> each warm start, discards the infeasible ones, then proceeds with the one that has the best objective value. The main disadvantage of this approach, compared to the next two, is that it provides relatively modest speedups for most problem classes, and no speedup at all for many others, even when the machine learning predictions are 100% accurate.</p>
@ -305,9 +307,9 @@ scratch. The main disadvantage of this approach is that it loses optimality guar
<div class="math notranslate nohighlight"> <div class="math notranslate nohighlight">
\[\sum_{i : \bar{x}_i=0} x_i + \sum_{i : \bar{x}_i=1} \left(1 - x_i\right) \leq k,\]</div> \[\sum_{i : \bar{x}_i=0} x_i + \sum_{i : \bar{x}_i=1} \left(1 - x_i\right) \leq k,\]</div>
<p>to the problem, where <span class="math notranslate nohighlight">\(k\)</span> is a user-defined parameter, which indicates how many of the predicted variables are allowed to deviate from the machine learning suggestion. The main advantage of this approach, compared to fixing variables, is its tolerance to lower-quality machine learning predictions. Its main disadvantage is that it typically leads to smaller speedups, especially for larger values of <span class="math notranslate nohighlight">\(k\)</span>. This approach also loses optimality guarantees.</p> <p>to the problem, where <span class="math notranslate nohighlight">\(k\)</span> is a user-defined parameter, which indicates how many of the predicted variables are allowed to deviate from the machine learning suggestion. The main advantage of this approach, compared to fixing variables, is its tolerance to lower-quality machine learning predictions. Its main disadvantage is that it typically leads to smaller speedups, especially for larger values of <span class="math notranslate nohighlight">\(k\)</span>. This approach also loses optimality guarantees.</p>
</section> </div>
<section id="Memorizing-primal-component"> <div class="section" id="Memorizing-primal-component">
<h2><span class="section-number">8.2. </span>Memorizing primal component<a class="headerlink" href="#Memorizing-primal-component" title="Link to this heading"></a></h2> <h2><span class="section-number">8.2. </span>Memorizing primal component<a class="headerlink" href="#Memorizing-primal-component" title="Permalink to this headline"></a></h2>
<p>A simple machine learning strategy for the prediction of primal solutions is to memorize all distinct solutions seen during training, then try to predict, during inference time, which of those memorized solutions are most likely to be feasible and to provide a good objective value for the current instance. The most promising solutions may alternatively be combined into a single partial solution, which is then provided to the MIP solver. Both variations of this strategy are implemented by the <p>A simple machine learning strategy for the prediction of primal solutions is to memorize all distinct solutions seen during training, then try to predict, during inference time, which of those memorized solutions are most likely to be feasible and to provide a good objective value for the current instance. The most promising solutions may alternatively be combined into a single partial solution, which is then provided to the MIP solver. Both variations of this strategy are implemented by the
<code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> class. Note that it is only applicable if the problem size, and in fact if the meaning of the decision variables, remains the same across problem instances.</p> <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> class. Note that it is only applicable if the problem size, and in fact if the meaning of the decision variables, remains the same across problem instances.</p>
<p>More precisely, let <span class="math notranslate nohighlight">\(I_1,\ldots,I_n\)</span> be the training instances, and let <span class="math notranslate nohighlight">\(\bar{x}^1,\ldots,\bar{x}^n\)</span> be their respective optimal solutions. Given a new instance <span class="math notranslate nohighlight">\(I_{n+1}\)</span>, <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> expects a user-provided binary classifier that assigns (through the <code class="docutils literal notranslate"><span class="pre">predict_proba</span></code> method, following scikit-learns conventions) a score <span class="math notranslate nohighlight">\(\delta_i\)</span> to each solution <span class="math notranslate nohighlight">\(\bar{x}^i\)</span>, such that solutions with higher score are more likely to be good solutions for <p>More precisely, let <span class="math notranslate nohighlight">\(I_1,\ldots,I_n\)</span> be the training instances, and let <span class="math notranslate nohighlight">\(\bar{x}^1,\ldots,\bar{x}^n\)</span> be their respective optimal solutions. Given a new instance <span class="math notranslate nohighlight">\(I_{n+1}\)</span>, <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> expects a user-provided binary classifier that assigns (through the <code class="docutils literal notranslate"><span class="pre">predict_proba</span></code> method, following scikit-learns conventions) a score <span class="math notranslate nohighlight">\(\delta_i\)</span> to each solution <span class="math notranslate nohighlight">\(\bar{x}^i\)</span>, such that solutions with higher score are more likely to be good solutions for
@ -331,70 +333,70 @@ Then it computes, for each binary decision variable <span class="math notranslat
<p>The above specification of <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> is meant to be as general as possible. Simpler strategies can be implemented by configuring this component in specific ways. For example, a simpler approach employed in the literature is to collect all optimal solutions, then provide the entire list of solutions to the solver as warm starts, without any filtering or post-processing. This strategy can be implemented with <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> by using a model that returns a constant <p>The above specification of <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> is meant to be as general as possible. Simpler strategies can be implemented by configuring this component in specific ways. For example, a simpler approach employed in the literature is to collect all optimal solutions, then provide the entire list of solutions to the solver as warm starts, without any filtering or post-processing. This strategy can be implemented with <code class="docutils literal notranslate"><span class="pre">MemorizingPrimalComponent</span></code> by using a model that returns a constant
value for all solutions (e.g. <a class="reference external" href="https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html">scikit-learns DummyClassifier</a>), then selecting the top <span class="math notranslate nohighlight">\(n\)</span> (instead of <span class="math notranslate nohighlight">\(k\)</span>) solutions. See example below. Another simple approach is taking the solution to the most similar instance, and using it, by itself, as a warm start. This can be implemented by using a model that computes distances between the current instance and the training ones (e.g. <a class="reference external" href="https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html">scikit-learns value for all solutions (e.g. <a class="reference external" href="https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html">scikit-learns DummyClassifier</a>), then selecting the top <span class="math notranslate nohighlight">\(n\)</span> (instead of <span class="math notranslate nohighlight">\(k\)</span>) solutions. See example below. Another simple approach is taking the solution to the most similar instance, and using it, by itself, as a warm start. This can be implemented by using a model that computes distances between the current instance and the training ones (e.g. <a class="reference external" href="https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html">scikit-learns
KNeighborsClassifier</a>), then select the solution to the nearest one. See also example below. More complex strategies, of course, can also be configured.</p> KNeighborsClassifier</a>), then select the solution to the nearest one. See also example below. More complex strategies, of course, can also be configured.</p>
<section id="Examples"> <div class="section" id="Examples">
<h3>Examples<a class="headerlink" href="#Examples" title="Link to this heading"></a></h3> <h3>Examples<a class="headerlink" href="#Examples" title="Permalink to this headline"></a></h3>
<div class="nbinput nblast docutils container"> <div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.dummy</span> <span class="kn">import</span> <span class="n">DummyClassifier</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from sklearn.dummy import DummyClassifier
<span class="kn">from</span> <span class="nn">sklearn.neighbors</span> <span class="kn">import</span> <span class="n">KNeighborsClassifier</span> from sklearn.neighbors import KNeighborsClassifier
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.components.primal.actions import (
<span class="n">SetWarmStart</span><span class="p">,</span> SetWarmStart,
<span class="n">FixVariables</span><span class="p">,</span> FixVariables,
<span class="n">EnforceProximity</span><span class="p">,</span> EnforceProximity,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">miplearn.components.primal.mem</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.components.primal.mem import (
<span class="n">MemorizingPrimalComponent</span><span class="p">,</span> MemorizingPrimalComponent,
<span class="n">SelectTopSolutions</span><span class="p">,</span> SelectTopSolutions,
<span class="n">MergeTopSolutions</span><span class="p">,</span> MergeTopSolutions,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">miplearn.extractors.dummy</span> <span class="kn">import</span> <span class="n">DummyExtractor</span> from miplearn.extractors.dummy import DummyExtractor
<span class="kn">from</span> <span class="nn">miplearn.extractors.fields</span> <span class="kn">import</span> <span class="n">H5FieldsExtractor</span> from miplearn.extractors.fields import H5FieldsExtractor
<span class="c1"># Configures a memorizing primal component that collects</span> # Configures a memorizing primal component that collects
<span class="c1"># all distinct solutions seen during training and provides</span> # all distinct solutions seen during training and provides
<span class="c1"># them to the solver without any filtering or post-processing.</span> # them to the solver without any filtering or post-processing.
<span class="n">comp1</span> <span class="o">=</span> <span class="n">MemorizingPrimalComponent</span><span class="p">(</span> comp1 = MemorizingPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">DummyClassifier</span><span class="p">(),</span> clf=DummyClassifier(),
<span class="n">extractor</span><span class="o">=</span><span class="n">DummyExtractor</span><span class="p">(),</span> extractor=DummyExtractor(),
<span class="n">constructor</span><span class="o">=</span><span class="n">SelectTopSolutions</span><span class="p">(</span><span class="mi">1_000_000</span><span class="p">),</span> constructor=SelectTopSolutions(1_000_000),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
<span class="c1"># Configures a memorizing primal component that finds the</span> # Configures a memorizing primal component that finds the
<span class="c1"># training instance with the closest objective function, then</span> # training instance with the closest objective function, then
<span class="c1"># fixes the decision variables to the values they assumed</span> # fixes the decision variables to the values they assumed
<span class="c1"># at the optimal solution for that instance.</span> # at the optimal solution for that instance.
<span class="n">comp2</span> <span class="o">=</span> <span class="n">MemorizingPrimalComponent</span><span class="p">(</span> comp2 = MemorizingPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">KNeighborsClassifier</span><span class="p">(</span><span class="n">n_neighbors</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span> clf=KNeighborsClassifier(n_neighbors=1),
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span> extractor=H5FieldsExtractor(
<span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">],</span> instance_fields=[&quot;static_var_obj_coeffs&quot;],
<span class="p">),</span> ),
<span class="n">constructor</span><span class="o">=</span><span class="n">SelectTopSolutions</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> constructor=SelectTopSolutions(1),
<span class="n">action</span><span class="o">=</span><span class="n">FixVariables</span><span class="p">(),</span> action=FixVariables(),
<span class="p">)</span> )
<span class="c1"># Configures a memorizing primal component that finds the distinct</span> # Configures a memorizing primal component that finds the distinct
<span class="c1"># solutions to the 10 most similar training problem instances,</span> # solutions to the 10 most similar training problem instances,
<span class="c1"># selects the 3 solutions that were most often optimal to these</span> # selects the 3 solutions that were most often optimal to these
<span class="c1"># training instances, combines them into a single partial solution,</span> # training instances, combines them into a single partial solution,
<span class="c1"># then enforces proximity, allowing at most 3 variables to deviate</span> # then enforces proximity, allowing at most 3 variables to deviate
<span class="c1"># from the machine learning suggestion.</span> # from the machine learning suggestion.
<span class="n">comp3</span> <span class="o">=</span> <span class="n">MemorizingPrimalComponent</span><span class="p">(</span> comp3 = MemorizingPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">KNeighborsClassifier</span><span class="p">(</span><span class="n">n_neighbors</span><span class="o">=</span><span class="mi">10</span><span class="p">),</span> clf=KNeighborsClassifier(n_neighbors=10),
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span><span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">]),</span> extractor=H5FieldsExtractor(instance_fields=[&quot;static_var_obj_coeffs&quot;]),
<span class="n">constructor</span><span class="o">=</span><span class="n">MergeTopSolutions</span><span class="p">(</span><span class="n">k</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">thresholds</span><span class="o">=</span><span class="p">[</span><span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.75</span><span class="p">]),</span> constructor=MergeTopSolutions(k=3, thresholds=[0.25, 0.75]),
<span class="n">action</span><span class="o">=</span><span class="n">EnforceProximity</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> action=EnforceProximity(3),
<span class="p">)</span> )
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
<section id="Independent-vars-primal-component"> <div class="section" id="Independent-vars-primal-component">
<h2><span class="section-number">8.3. </span>Independent vars primal component<a class="headerlink" href="#Independent-vars-primal-component" title="Link to this heading"></a></h2> <h2><span class="section-number">8.3. </span>Independent vars primal component<a class="headerlink" href="#Independent-vars-primal-component" title="Permalink to this headline"></a></h2>
<p>Instead of memorizing previously-seen primal solutions, it is also natural to use machine learning models to directly predict the values of the decision variables, constructing a solution from scratch. This approach has the benefit of potentially constructing novel high-quality solutions, never observed in the training data. Two variations of this strategy are supported by MIPLearn: (i) predicting the values of the decision variables independently, using multiple ML models; or (ii) predicting <p>Instead of memorizing previously-seen primal solutions, it is also natural to use machine learning models to directly predict the values of the decision variables, constructing a solution from scratch. This approach has the benefit of potentially constructing novel high-quality solutions, never observed in the training data. Two variations of this strategy are supported by MIPLearn: (i) predicting the values of the decision variables independently, using multiple ML models; or (ii) predicting
the values jointly, with a single model. We describe the first variation in this section, and the second variation in the next section.</p> the values jointly, with a single model. We describe the first variation in this section, and the second variation in the next section.</p>
<p>Let <span class="math notranslate nohighlight">\(I_1,\ldots,I_n\)</span> be the training instances, and let <span class="math notranslate nohighlight">\(\bar{x}^1,\ldots,\bar{x}^n\)</span> be their respective optimal solutions. For each binary decision variable <span class="math notranslate nohighlight">\(x_j\)</span>, the component <code class="docutils literal notranslate"><span class="pre">IndependentVarsPrimalComponent</span></code> creates a copy of a user-provided binary classifier and trains it to predict the optimal value of <span class="math notranslate nohighlight">\(x_j\)</span>, given <span class="math notranslate nohighlight">\(\bar{x}^1_j,\ldots,\bar{x}^n_j\)</span> as training labels. The features provided to the model are the variable features computed by an user-provided <p>Let <span class="math notranslate nohighlight">\(I_1,\ldots,I_n\)</span> be the training instances, and let <span class="math notranslate nohighlight">\(\bar{x}^1,\ldots,\bar{x}^n\)</span> be their respective optimal solutions. For each binary decision variable <span class="math notranslate nohighlight">\(x_j\)</span>, the component <code class="docutils literal notranslate"><span class="pre">IndependentVarsPrimalComponent</span></code> creates a copy of a user-provided binary classifier and trains it to predict the optimal value of <span class="math notranslate nohighlight">\(x_j\)</span>, given <span class="math notranslate nohighlight">\(\bar{x}^1_j,\ldots,\bar{x}^n_j\)</span> as training labels. The features provided to the model are the variable features computed by an user-provided
@ -406,106 +408,106 @@ extractor. During inference time, the component uses these <span class="math not
probability of the value being zero or one (using the <code class="docutils literal notranslate"><span class="pre">predict_proba</span></code> method) and erases from the primal solution all values whose probabilities are below a given threshold.</p></li> probability of the value being zero or one (using the <code class="docutils literal notranslate"><span class="pre">predict_proba</span></code> method) and erases from the primal solution all values whose probabilities are below a given threshold.</p></li>
<li><p>To make multiple copies of the provided ML classifier, MIPLearn uses the standard <code class="docutils literal notranslate"><span class="pre">sklearn.base.clone</span></code> method, which may not be suitable for classifiers from other frameworks. To handle this, it is possible to override the clone function using the <code class="docutils literal notranslate"><span class="pre">clone_fn</span></code> constructor argument.</p></li> <li><p>To make multiple copies of the provided ML classifier, MIPLearn uses the standard <code class="docutils literal notranslate"><span class="pre">sklearn.base.clone</span></code> method, which may not be suitable for classifiers from other frameworks. To handle this, it is possible to override the clone function using the <code class="docutils literal notranslate"><span class="pre">clone_fn</span></code> constructor argument.</p></li>
</ol> </ol>
<section id="id1"> <div class="section" id="id1">
<h3>Examples<a class="headerlink" href="#id1" title="Link to this heading"></a></h3> <h3>Examples<a class="headerlink" href="#id1" title="Permalink to this headline"></a></h3>
<div class="nbinput nblast docutils container"> <div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegression</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from sklearn.linear_model import LogisticRegression
<span class="kn">from</span> <span class="nn">miplearn.classifiers.minprob</span> <span class="kn">import</span> <span class="n">MinProbabilityClassifier</span> from miplearn.classifiers.minprob import MinProbabilityClassifier
<span class="kn">from</span> <span class="nn">miplearn.classifiers.singleclass</span> <span class="kn">import</span> <span class="n">SingleClassFix</span> from miplearn.classifiers.singleclass import SingleClassFix
<span class="kn">from</span> <span class="nn">miplearn.components.primal.indep</span> <span class="kn">import</span> <span class="n">IndependentVarsPrimalComponent</span> from miplearn.components.primal.indep import IndependentVarsPrimalComponent
<span class="kn">from</span> <span class="nn">miplearn.extractors.AlvLouWeh2017</span> <span class="kn">import</span> <span class="n">AlvLouWeh2017Extractor</span> from miplearn.extractors.AlvLouWeh2017 import AlvLouWeh2017Extractor
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="n">SetWarmStart</span> from miplearn.components.primal.actions import SetWarmStart
<span class="c1"># Configures a primal component that independently predicts the value of each</span> # Configures a primal component that independently predicts the value of each
<span class="c1"># binary variable using logistic regression and provides it to the solver as</span> # binary variable using logistic regression and provides it to the solver as
<span class="c1"># warm start. Erases predictions with probability less than 99%; applies</span> # warm start. Erases predictions with probability less than 99%; applies
<span class="c1"># single-class fix; and uses AlvLouWeh2017 features.</span> # single-class fix; and uses AlvLouWeh2017 features.
<span class="n">comp</span> <span class="o">=</span> <span class="n">IndependentVarsPrimalComponent</span><span class="p">(</span> comp = IndependentVarsPrimalComponent(
<span class="n">base_clf</span><span class="o">=</span><span class="n">SingleClassFix</span><span class="p">(</span> base_clf=SingleClassFix(
<span class="n">MinProbabilityClassifier</span><span class="p">(</span> MinProbabilityClassifier(
<span class="n">base_clf</span><span class="o">=</span><span class="n">LogisticRegression</span><span class="p">(),</span> base_clf=LogisticRegression(),
<span class="n">thresholds</span><span class="o">=</span><span class="p">[</span><span class="mf">0.99</span><span class="p">,</span> <span class="mf">0.99</span><span class="p">],</span> thresholds=[0.99, 0.99],
<span class="p">),</span> ),
<span class="p">),</span> ),
<span class="n">extractor</span><span class="o">=</span><span class="n">AlvLouWeh2017Extractor</span><span class="p">(),</span> extractor=AlvLouWeh2017Extractor(),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
<section id="Joint-vars-primal-component"> <div class="section" id="Joint-vars-primal-component">
<h2><span class="section-number">8.4. </span>Joint vars primal component<a class="headerlink" href="#Joint-vars-primal-component" title="Link to this heading"></a></h2> <h2><span class="section-number">8.4. </span>Joint vars primal component<a class="headerlink" href="#Joint-vars-primal-component" title="Permalink to this headline"></a></h2>
<p>In the previous subsection, we used multiple machine learning models to independently predict the values of the binary decision variables. When these values are correlated, an alternative approach is to jointly predict the values of all binary variables using a single machine learning model. This strategy is implemented by <code class="docutils literal notranslate"><span class="pre">JointVarsPrimalComponent</span></code>. Compared to the previous ones, this component is much more straightforwad. It simply extracts instance features, using the user-provided feature <p>In the previous subsection, we used multiple machine learning models to independently predict the values of the binary decision variables. When these values are correlated, an alternative approach is to jointly predict the values of all binary variables using a single machine learning model. This strategy is implemented by <code class="docutils literal notranslate"><span class="pre">JointVarsPrimalComponent</span></code>. Compared to the previous ones, this component is much more straightforwad. It simply extracts instance features, using the user-provided feature
extractor, then directly trains the user-provided binary classifier (using the <code class="docutils literal notranslate"><span class="pre">fit</span></code> method), without making any copies. The trained classifier is then used to predict entire solutions (using the <code class="docutils literal notranslate"><span class="pre">predict</span></code> method), which are given to the solver using one of the previously discussed methods. In the example below, we illustrate the usage of this component with a simple feed-forward neural network.</p> extractor, then directly trains the user-provided binary classifier (using the <code class="docutils literal notranslate"><span class="pre">fit</span></code> method), without making any copies. The trained classifier is then used to predict entire solutions (using the <code class="docutils literal notranslate"><span class="pre">predict</span></code> method), which are given to the solver using one of the previously discussed methods. In the example below, we illustrate the usage of this component with a simple feed-forward neural network.</p>
<p><code class="docutils literal notranslate"><span class="pre">JointVarsPrimalComponent</span></code> can also be used to implement strategies that use multiple machine learning models, but not indepedently. For example, a common strategy in multioutput prediction is building a <em>classifier chain</em>. In this approach, the first decision variable is predicted using the instance features alone; but the <span class="math notranslate nohighlight">\(n\)</span>-th decision variable is predicted using the instance features plus the predicted values of the <span class="math notranslate nohighlight">\(n-1\)</span> previous variables. This can be easily implemented <p><code class="docutils literal notranslate"><span class="pre">JointVarsPrimalComponent</span></code> can also be used to implement strategies that use multiple machine learning models, but not indepedently. For example, a common strategy in multioutput prediction is building a <em>classifier chain</em>. In this approach, the first decision variable is predicted using the instance features alone; but the <span class="math notranslate nohighlight">\(n\)</span>-th decision variable is predicted using the instance features plus the predicted values of the <span class="math notranslate nohighlight">\(n-1\)</span> previous variables. This can be easily implemented
using scikit-learns <code class="docutils literal notranslate"><span class="pre">ClassifierChain</span></code> estimator, as shown in the example below.</p> using scikit-learns <code class="docutils literal notranslate"><span class="pre">ClassifierChain</span></code> estimator, as shown in the example below.</p>
<section id="id2"> <div class="section" id="id2">
<h3>Examples<a class="headerlink" href="#id2" title="Link to this heading"></a></h3> <h3>Examples<a class="headerlink" href="#id2" title="Permalink to this headline"></a></h3>
<div class="nbinput nblast docutils container"> <div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.multioutput</span> <span class="kn">import</span> <span class="n">ClassifierChain</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from sklearn.multioutput import ClassifierChain
<span class="kn">from</span> <span class="nn">sklearn.neural_network</span> <span class="kn">import</span> <span class="n">MLPClassifier</span> from sklearn.neural_network import MLPClassifier
<span class="kn">from</span> <span class="nn">miplearn.components.primal.joint</span> <span class="kn">import</span> <span class="n">JointVarsPrimalComponent</span> from miplearn.components.primal.joint import JointVarsPrimalComponent
<span class="kn">from</span> <span class="nn">miplearn.extractors.fields</span> <span class="kn">import</span> <span class="n">H5FieldsExtractor</span> from miplearn.extractors.fields import H5FieldsExtractor
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="n">SetWarmStart</span> from miplearn.components.primal.actions import SetWarmStart
<span class="c1"># Configures a primal component that uses a feedforward neural network</span> # Configures a primal component that uses a feedforward neural network
<span class="c1"># to jointly predict the values of the binary variables, based on the</span> # to jointly predict the values of the binary variables, based on the
<span class="c1"># objective cost function, and provides the solution to the solver as</span> # objective cost function, and provides the solution to the solver as
<span class="c1"># a warm start.</span> # a warm start.
<span class="n">comp</span> <span class="o">=</span> <span class="n">JointVarsPrimalComponent</span><span class="p">(</span> comp = JointVarsPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">MLPClassifier</span><span class="p">(),</span> clf=MLPClassifier(),
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span> extractor=H5FieldsExtractor(
<span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">],</span> instance_fields=[&quot;static_var_obj_coeffs&quot;],
<span class="p">),</span> ),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
<span class="c1"># Configures a primal component that uses a chain of logistic regression</span> # Configures a primal component that uses a chain of logistic regression
<span class="c1"># models to jointly predict the values of the binary variables, based on</span> # models to jointly predict the values of the binary variables, based on
<span class="c1"># the objective function.</span> # the objective function.
<span class="n">comp</span> <span class="o">=</span> <span class="n">JointVarsPrimalComponent</span><span class="p">(</span> comp = JointVarsPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">ClassifierChain</span><span class="p">(</span><span class="n">SingleClassFix</span><span class="p">(</span><span class="n">LogisticRegression</span><span class="p">())),</span> clf=ClassifierChain(SingleClassFix(LogisticRegression())),
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span> extractor=H5FieldsExtractor(
<span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">],</span> instance_fields=[&quot;static_var_obj_coeffs&quot;],
<span class="p">),</span> ),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
<section id="Expert-primal-component"> <div class="section" id="Expert-primal-component">
<h2><span class="section-number">8.5. </span>Expert primal component<a class="headerlink" href="#Expert-primal-component" title="Link to this heading"></a></h2> <h2><span class="section-number">8.5. </span>Expert primal component<a class="headerlink" href="#Expert-primal-component" title="Permalink to this headline"></a></h2>
<p>Before spending time and effort choosing a machine learning strategy and tweaking its parameters, it is usually a good idea to evaluate what would be the performance impact of the model if its predictions were 100% accurate. This is especially important for the prediction of warm starts, since they are not always very beneficial. To simplify this task, MIPLearn provides <code class="docutils literal notranslate"><span class="pre">ExpertPrimalComponent</span></code>, a component which simply loads the optimal solution from the HDF5 file, assuming that it has already <p>Before spending time and effort choosing a machine learning strategy and tweaking its parameters, it is usually a good idea to evaluate what would be the performance impact of the model if its predictions were 100% accurate. This is especially important for the prediction of warm starts, since they are not always very beneficial. To simplify this task, MIPLearn provides <code class="docutils literal notranslate"><span class="pre">ExpertPrimalComponent</span></code>, a component which simply loads the optimal solution from the HDF5 file, assuming that it has already
been computed, then directly provides it to the solver using one of the available methods. This component is useful in benchmarks, to evaluate how close to the best theoretical performance the machine learning components are.</p> been computed, then directly provides it to the solver using one of the available methods. This component is useful in benchmarks, to evaluate how close to the best theoretical performance the machine learning components are.</p>
<section id="Example"> <div class="section" id="Example">
<h3>Example<a class="headerlink" href="#Example" title="Link to this heading"></a></h3> <h3>Example<a class="headerlink" href="#Example" title="Permalink to this headline"></a></h3>
<div class="nbinput nblast docutils container"> <div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.components.primal.expert</span> <span class="kn">import</span> <span class="n">ExpertPrimalComponent</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.components.primal.expert import ExpertPrimalComponent
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="n">SetWarmStart</span> from miplearn.components.primal.actions import SetWarmStart
<span class="c1"># Configures an expert primal component, which reads a pre-computed</span> # Configures an expert primal component, which reads a pre-computed
<span class="c1"># optimal solution from the HDF5 file and provides it to the solver</span> # optimal solution from the HDF5 file and provides it to the solver
<span class="c1"># as warm start.</span> # as warm start.
<span class="n">comp</span> <span class="o">=</span> <span class="n">ExpertPrimalComponent</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">())</span> comp = ExpertPrimalComponent(action=SetWarmStart())
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
</section> </div>
</div> </div>

File diff suppressed because it is too large Load Diff

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>9. Learning Solver &#8212; MIPLearn 0.4</title> <title>9. Learning Solver &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,25 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="10. Benchmark Problems" href="../../api/problems/" /> <link rel="next" title="10. Benchmark Problems" href="../../api/problems/" />
@ -68,7 +72,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +99,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +131,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -251,12 +255,12 @@
<div> <div>
<section id="Learning-Solver"> <div class="section" id="Learning-Solver">
<h1><span class="section-number">9. </span>Learning Solver<a class="headerlink" href="#Learning-Solver" title="Link to this heading"></a></h1> <h1><span class="section-number">9. </span>Learning Solver<a class="headerlink" href="#Learning-Solver" title="Permalink to this headline"></a></h1>
<p>On previous pages, we discussed various components of the MIPLearn framework, including training data collectors, feature extractors, and individual machine learning components. In this page, we introduce <strong>LearningSolver</strong>, the main class of the framework which integrates all the aforementioned components into a cohesive whole. Using <strong>LearningSolver</strong> involves three steps: (i) configuring the solver; (ii) training the ML components; and (iii) solving new MIP instances. In the following, we <p>On previous pages, we discussed various components of the MIPLearn framework, including training data collectors, feature extractors, and individual machine learning components. In this page, we introduce <strong>LearningSolver</strong>, the main class of the framework which integrates all the aforementioned components into a cohesive whole. Using <strong>LearningSolver</strong> involves three steps: (i) configuring the solver; (ii) training the ML components; and (iii) solving new MIP instances. In the following, we
describe each of these steps, then conclude with a complete runnable example.</p> describe each of these steps, then conclude with a complete runnable example.</p>
<section id="Configuring-the-solver"> <div class="section" id="Configuring-the-solver">
<h2><span class="section-number">9.1. </span>Configuring the solver<a class="headerlink" href="#Configuring-the-solver" title="Link to this heading"></a></h2> <h2><span class="section-number">9.1. </span>Configuring the solver<a class="headerlink" href="#Configuring-the-solver" title="Permalink to this headline"></a></h2>
<p><strong>LearningSolver</strong> is composed by multiple individual machine learning components, each targeting a different part of the solution process, or implementing a different machine learning strategy. This architecture allows strategies to be easily enabled, disabled or customized, making the framework flexible. By default, no components are provided and <strong>LearningSolver</strong> is equivalent to a traditional MIP solver. To specify additional components, the <code class="docutils literal notranslate"><span class="pre">components</span></code> constructor argument may be used:</p> <p><strong>LearningSolver</strong> is composed by multiple individual machine learning components, each targeting a different part of the solution process, or implementing a different machine learning strategy. This architecture allows strategies to be easily enabled, disabled or customized, making the framework flexible. By default, no components are provided and <strong>LearningSolver</strong> is equivalent to a traditional MIP solver. To specify additional components, the <code class="docutils literal notranslate"><span class="pre">components</span></code> constructor argument may be used:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">solver</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">solver</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span>
<span class="n">components</span><span class="o">=</span><span class="p">[</span> <span class="n">components</span><span class="o">=</span><span class="p">[</span>
@ -268,9 +272,9 @@ describe each of these steps, then conclude with a complete runnable example.</p
</pre></div> </pre></div>
</div> </div>
<p>In this example, three components <code class="docutils literal notranslate"><span class="pre">comp1</span></code>, <code class="docutils literal notranslate"><span class="pre">comp2</span></code> and <code class="docutils literal notranslate"><span class="pre">comp3</span></code> are provided. The strategies implemented by these components are applied sequentially when solving the problem. For example, <code class="docutils literal notranslate"><span class="pre">comp1</span></code> and <code class="docutils literal notranslate"><span class="pre">comp2</span></code> could fix a subset of decision variables, while <code class="docutils literal notranslate"><span class="pre">comp3</span></code> constructs a warm start for the remaining problem.</p> <p>In this example, three components <code class="docutils literal notranslate"><span class="pre">comp1</span></code>, <code class="docutils literal notranslate"><span class="pre">comp2</span></code> and <code class="docutils literal notranslate"><span class="pre">comp3</span></code> are provided. The strategies implemented by these components are applied sequentially when solving the problem. For example, <code class="docutils literal notranslate"><span class="pre">comp1</span></code> and <code class="docutils literal notranslate"><span class="pre">comp2</span></code> could fix a subset of decision variables, while <code class="docutils literal notranslate"><span class="pre">comp3</span></code> constructs a warm start for the remaining problem.</p>
</section> </div>
<section id="Training-and-solving-new-instances"> <div class="section" id="Training-and-solving-new-instances">
<h2><span class="section-number">9.2. </span>Training and solving new instances<a class="headerlink" href="#Training-and-solving-new-instances" title="Link to this heading"></a></h2> <h2><span class="section-number">9.2. </span>Training and solving new instances<a class="headerlink" href="#Training-and-solving-new-instances" title="Permalink to this headline"></a></h2>
<p>Once a solver is configured, its ML components need to be trained. This can be achieved by the <code class="docutils literal notranslate"><span class="pre">solver.fit</span></code> method, as illustrated below. The method accepts a list of HDF5 files and trains each individual component sequentially. Once the solver is trained, new instances can be solved using <code class="docutils literal notranslate"><span class="pre">solver.optimize</span></code>. The method returns a dictionary of statistics collected by each component, such as the number of variables fixed.</p> <p>Once a solver is configured, its ML components need to be trained. This can be achieved by the <code class="docutils literal notranslate"><span class="pre">solver.fit</span></code> method, as illustrated below. The method accepts a list of HDF5 files and trains each individual component sequentially. Once the solver is trained, new instances can be solved using <code class="docutils literal notranslate"><span class="pre">solver.optimize</span></code>. The method returns a dictionary of statistics collected by each component, such as the number of variables fixed.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># Build instances</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># Build instances</span>
<span class="n">train_data</span> <span class="o">=</span> <span class="o">...</span> <span class="n">train_data</span> <span class="o">=</span> <span class="o">...</span>
@ -290,79 +294,79 @@ describe each of these steps, then conclude with a complete runnable example.</p
<span class="n">stats</span> <span class="o">=</span> <span class="n">solver</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_model</span><span class="p">)</span> <span class="n">stats</span> <span class="o">=</span> <span class="n">solver</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_model</span><span class="p">)</span>
</pre></div> </pre></div>
</div> </div>
</section> </div>
<section id="Complete-example"> <div class="section" id="Complete-example">
<h2><span class="section-number">9.3. </span>Complete example<a class="headerlink" href="#Complete-example" title="Link to this heading"></a></h2> <h2><span class="section-number">9.3. </span>Complete example<a class="headerlink" href="#Complete-example" title="Permalink to this headline"></a></h2>
<p>In the example below, we illustrate the usage of <strong>LearningSolver</strong> by building instances of the Traveling Salesman Problem, collecting training data, training the ML components, then solving a new instance.</p> <p>In the example below, we illustrate the usage of <strong>LearningSolver</strong> by building instances of the Traveling Salesman Problem, collecting training data, training the ML components, then solving a new instance.</p>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">random</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>import random
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> import numpy as np
<span class="kn">from</span> <span class="nn">scipy.stats</span> <span class="kn">import</span> <span class="n">uniform</span><span class="p">,</span> <span class="n">randint</span> from scipy.stats import uniform, randint
<span class="kn">from</span> <span class="nn">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegression</span> from sklearn.linear_model import LogisticRegression
<span class="kn">from</span> <span class="nn">miplearn.classifiers.minprob</span> <span class="kn">import</span> <span class="n">MinProbabilityClassifier</span> from miplearn.classifiers.minprob import MinProbabilityClassifier
<span class="kn">from</span> <span class="nn">miplearn.classifiers.singleclass</span> <span class="kn">import</span> <span class="n">SingleClassFix</span> from miplearn.classifiers.singleclass import SingleClassFix
<span class="kn">from</span> <span class="nn">miplearn.collectors.basic</span> <span class="kn">import</span> <span class="n">BasicCollector</span> from miplearn.collectors.basic import BasicCollector
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="n">SetWarmStart</span> from miplearn.components.primal.actions import SetWarmStart
<span class="kn">from</span> <span class="nn">miplearn.components.primal.indep</span> <span class="kn">import</span> <span class="n">IndependentVarsPrimalComponent</span> from miplearn.components.primal.indep import IndependentVarsPrimalComponent
<span class="kn">from</span> <span class="nn">miplearn.extractors.AlvLouWeh2017</span> <span class="kn">import</span> <span class="n">AlvLouWeh2017Extractor</span> from miplearn.extractors.AlvLouWeh2017 import AlvLouWeh2017Extractor
<span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">write_pkl_gz</span> from miplearn.io import write_pkl_gz
<span class="kn">from</span> <span class="nn">miplearn.problems.tsp</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.problems.tsp import (
<span class="n">TravelingSalesmanGenerator</span><span class="p">,</span> TravelingSalesmanGenerator,
<span class="n">build_tsp_model_gurobipy</span><span class="p">,</span> build_tsp_model_gurobipy,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">miplearn.solvers.learning</span> <span class="kn">import</span> <span class="n">LearningSolver</span> from miplearn.solvers.learning import LearningSolver
<span class="c1"># Set random seed to make example reproducible.</span> # Set random seed to make example reproducible.
<span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> random.seed(42)
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> np.random.seed(42)
<span class="c1"># Generate a few instances of the traveling salesman problem.</span> # Generate a few instances of the traveling salesman problem.
<span class="n">data</span> <span class="o">=</span> <span class="n">TravelingSalesmanGenerator</span><span class="p">(</span> data = TravelingSalesmanGenerator(
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">11</span><span class="p">),</span> n=randint(low=10, high=11),
<span class="n">x</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">),</span> x=uniform(loc=0.0, scale=1000.0),
<span class="n">y</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">),</span> y=uniform(loc=0.0, scale=1000.0),
<span class="n">gamma</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.90</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.20</span><span class="p">),</span> gamma=uniform(loc=0.90, scale=0.20),
<span class="n">fix_cities</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> fix_cities=True,
<span class="nb">round</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> round=True,
<span class="p">)</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> ).generate(50)
<span class="c1"># Save instance data to data/tsp/00000.pkl.gz, data/tsp/00001.pkl.gz, ...</span> # Save instance data to data/tsp/00000.pkl.gz, data/tsp/00001.pkl.gz, ...
<span class="n">all_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s2">&quot;data/tsp&quot;</span><span class="p">)</span> all_data = write_pkl_gz(data, &quot;data/tsp&quot;)
<span class="c1"># Split train/test data</span> # Split train/test data
<span class="n">train_data</span> <span class="o">=</span> <span class="n">all_data</span><span class="p">[:</span><span class="mi">40</span><span class="p">]</span> train_data = all_data[:40]
<span class="n">test_data</span> <span class="o">=</span> <span class="n">all_data</span><span class="p">[</span><span class="mi">40</span><span class="p">:]</span> test_data = all_data[40:]
<span class="c1"># Collect training data</span> # Collect training data
<span class="n">bc</span> <span class="o">=</span> <span class="n">BasicCollector</span><span class="p">()</span> bc = BasicCollector()
<span class="n">bc</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="n">train_data</span><span class="p">,</span> <span class="n">build_tsp_model_gurobipy</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span> bc.collect(train_data, build_tsp_model_gurobipy, n_jobs=4)
<span class="c1"># Build learning solver</span> # Build learning solver
<span class="n">solver</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span> solver = LearningSolver(
<span class="n">components</span><span class="o">=</span><span class="p">[</span> components=[
<span class="n">IndependentVarsPrimalComponent</span><span class="p">(</span> IndependentVarsPrimalComponent(
<span class="n">base_clf</span><span class="o">=</span><span class="n">SingleClassFix</span><span class="p">(</span> base_clf=SingleClassFix(
<span class="n">MinProbabilityClassifier</span><span class="p">(</span> MinProbabilityClassifier(
<span class="n">base_clf</span><span class="o">=</span><span class="n">LogisticRegression</span><span class="p">(),</span> base_clf=LogisticRegression(),
<span class="n">thresholds</span><span class="o">=</span><span class="p">[</span><span class="mf">0.95</span><span class="p">,</span> <span class="mf">0.95</span><span class="p">],</span> thresholds=[0.95, 0.95],
<span class="p">),</span> ),
<span class="p">),</span> ),
<span class="n">extractor</span><span class="o">=</span><span class="n">AlvLouWeh2017Extractor</span><span class="p">(),</span> extractor=AlvLouWeh2017Extractor(),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
<span class="p">]</span> ]
<span class="p">)</span> )
<span class="c1"># Train ML models</span> # Train ML models
<span class="n">solver</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span> solver.fit(train_data)
<span class="c1"># Solve a test instance</span> # Solve a test instance
<span class="n">solver</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_tsp_model_gurobipy</span><span class="p">)</span> solver.optimize(test_data[0], build_tsp_model_gurobipy)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -457,8 +461,8 @@ User-callback calls 110, time in user-callback 0.00 sec
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="./"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MIPLearn &#8212; MIPLearn 0.4</title> <title>MIPLearn &#8212; MIPLearn 0.4</title>
<link href="_static/css/theme.css" rel="stylesheet" /> <link href="_static/css/theme.css" rel="stylesheet" />
@ -22,17 +22,23 @@
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" />
<link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="" src="_static/documentation_options.js"></script>
<script src="_static/doctools.js?v=888ff710"></script> <script src="_static/jquery.js"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="genindex/" /> <link rel="index" title="Index" href="genindex/" />
<link rel="search" title="Search" href="search/" /> <link rel="search" title="Search" href="search/" />
<link rel="next" title="1. Getting started (Pyomo)" href="tutorials/getting-started-pyomo/" /> <link rel="next" title="1. Getting started (Pyomo)" href="tutorials/getting-started-pyomo/" />
@ -63,7 +69,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -90,7 +96,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -122,7 +128,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -253,14 +259,14 @@
<div> <div>
<section id="miplearn"> <div class="section" id="miplearn">
<h1>MIPLearn<a class="headerlink" href="#miplearn" title="Link to this heading"></a></h1> <h1>MIPLearn<a class="headerlink" href="#miplearn" title="Permalink to this headline"></a></h1>
<p><strong>MIPLearn</strong> is an extensible framework for solving discrete optimization problems using a combination of Mixed-Integer Linear Programming (MIP) and Machine Learning (ML). MIPLearn uses ML methods to automatically identify patterns in previously solved instances of the problem, then uses these patterns to accelerate the performance of conventional state-of-the-art MIP solvers such as CPLEX, Gurobi or XPRESS.</p> <p><strong>MIPLearn</strong> is an extensible framework for solving discrete optimization problems using a combination of Mixed-Integer Linear Programming (MIP) and Machine Learning (ML). MIPLearn uses ML methods to automatically identify patterns in previously solved instances of the problem, then uses these patterns to accelerate the performance of conventional state-of-the-art MIP solvers such as CPLEX, Gurobi or XPRESS.</p>
<p>Unlike pure ML methods, MIPLearn is not only able to find high-quality solutions to discrete optimization problems, but it can also prove the optimality and feasibility of these solutions. Unlike conventional MIP solvers, MIPLearn can take full advantage of very specific observations that happen to be true in a particular family of instances (such as the observation that a particular constraint is typically redundant, or that a particular variable typically assumes a certain value). For certain classes of problems, this approach may provide significant performance benefits.</p> <p>Unlike pure ML methods, MIPLearn is not only able to find high-quality solutions to discrete optimization problems, but it can also prove the optimality and feasibility of these solutions. Unlike conventional MIP solvers, MIPLearn can take full advantage of very specific observations that happen to be true in a particular family of instances (such as the observation that a particular constraint is typically redundant, or that a particular variable typically assumes a certain value). For certain classes of problems, this approach may provide significant performance benefits.</p>
<section id="contents"> <div class="section" id="contents">
<h2>Contents<a class="headerlink" href="#contents" title="Link to this heading"></a></h2> <h2>Contents<a class="headerlink" href="#contents" title="Permalink to this headline"></a></h2>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Tutorials</span></p> <p class="caption"><span class="caption-text">Tutorials</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="tutorials/getting-started-pyomo/">1. Getting started (Pyomo)</a></li> <li class="toctree-l1"><a class="reference internal" href="tutorials/getting-started-pyomo/">1. Getting started (Pyomo)</a></li>
<li class="toctree-l1"><a class="reference internal" href="tutorials/getting-started-gurobipy/">2. Getting started (Gurobipy)</a></li> <li class="toctree-l1"><a class="reference internal" href="tutorials/getting-started-gurobipy/">2. Getting started (Gurobipy)</a></li>
@ -269,7 +275,7 @@
</ul> </ul>
</div> </div>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">User Guide</span></p> <p class="caption"><span class="caption-text">User Guide</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="guide/problems/">5. Benchmark Problems</a><ul> <li class="toctree-l1"><a class="reference internal" href="guide/problems/">5. Benchmark Problems</a><ul>
<li class="toctree-l2"><a class="reference internal" href="guide/problems/#Overview">5.1. Overview</a></li> <li class="toctree-l2"><a class="reference internal" href="guide/problems/#Overview">5.1. Overview</a></li>
@ -313,7 +319,7 @@
</ul> </ul>
</div> </div>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Python API Reference</span></p> <p class="caption"><span class="caption-text">Python API Reference</span></p>
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="api/problems/">10. Benchmark Problems</a></li> <li class="toctree-l1"><a class="reference internal" href="api/problems/">10. Benchmark Problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="api/collectors/">11. Collectors &amp; Extractors</a></li> <li class="toctree-l1"><a class="reference internal" href="api/collectors/">11. Collectors &amp; Extractors</a></li>
@ -322,9 +328,9 @@
<li class="toctree-l1"><a class="reference internal" href="api/helpers/">14. Helpers</a></li> <li class="toctree-l1"><a class="reference internal" href="api/helpers/">14. Helpers</a></li>
</ul> </ul>
</div> </div>
</section> </div>
<section id="authors"> <div class="section" id="authors">
<h2>Authors<a class="headerlink" href="#authors" title="Link to this heading"></a></h2> <h2>Authors<a class="headerlink" href="#authors" title="Permalink to this headline"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p><strong>Alinson S. Xavier</strong> (Argonne National Laboratory)</p></li> <li><p><strong>Alinson S. Xavier</strong> (Argonne National Laboratory)</p></li>
<li><p><strong>Feng Qiu</strong> (Argonne National Laboratory)</p></li> <li><p><strong>Feng Qiu</strong> (Argonne National Laboratory)</p></li>
@ -332,16 +338,16 @@
<li><p><strong>Berkay Becu</strong> (Georgia Institute of Technology)</p></li> <li><p><strong>Berkay Becu</strong> (Georgia Institute of Technology)</p></li>
<li><p><strong>Santanu S. Dey</strong> (Georgia Institute of Technology)</p></li> <li><p><strong>Santanu S. Dey</strong> (Georgia Institute of Technology)</p></li>
</ul> </ul>
</section> </div>
<section id="acknowledgments"> <div class="section" id="acknowledgments">
<h2>Acknowledgments<a class="headerlink" href="#acknowledgments" title="Link to this heading"></a></h2> <h2>Acknowledgments<a class="headerlink" href="#acknowledgments" title="Permalink to this headline"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p>Based upon work supported by <strong>Laboratory Directed Research and Development</strong> (LDRD) funding from Argonne National Laboratory, provided by the Director, Office of Science, of the U.S. Department of Energy.</p></li> <li><p>Based upon work supported by <strong>Laboratory Directed Research and Development</strong> (LDRD) funding from Argonne National Laboratory, provided by the Director, Office of Science, of the U.S. Department of Energy.</p></li>
<li><p>Based upon work supported by the <strong>U.S. Department of Energy Advanced Grid Modeling Program</strong>.</p></li> <li><p>Based upon work supported by the <strong>U.S. Department of Energy Advanced Grid Modeling Program</strong>.</p></li>
</ul> </ul>
</section> </div>
<section id="citing-miplearn"> <div class="section" id="citing-miplearn">
<h2>Citing MIPLearn<a class="headerlink" href="#citing-miplearn" title="Link to this heading"></a></h2> <h2>Citing MIPLearn<a class="headerlink" href="#citing-miplearn" title="Permalink to this headline"></a></h2>
<p>If you use MIPLearn in your research (either the solver or the included problem generators), we kindly request that you cite the package as follows:</p> <p>If you use MIPLearn in your research (either the solver or the included problem generators), we kindly request that you cite the package as follows:</p>
<ul class="simple"> <ul class="simple">
<li><p><strong>Alinson S. Xavier, Feng Qiu, Xiaoyi Gu, Berkay Becu, Santanu S. Dey.</strong> <em>MIPLearn: An Extensible Framework for Learning-Enhanced Optimization (Version 0.4)</em>. Zenodo (2024). DOI: <a class="reference external" href="https://doi.org/10.5281/zenodo.4287567">https://doi.org/10.5281/zenodo.4287567</a></p></li> <li><p><strong>Alinson S. Xavier, Feng Qiu, Xiaoyi Gu, Berkay Becu, Santanu S. Dey.</strong> <em>MIPLearn: An Extensible Framework for Learning-Enhanced Optimization (Version 0.4)</em>. Zenodo (2024). DOI: <a class="reference external" href="https://doi.org/10.5281/zenodo.4287567">https://doi.org/10.5281/zenodo.4287567</a></p></li>
@ -350,8 +356,8 @@
<ul class="simple"> <ul class="simple">
<li><p><strong>Alinson S. Xavier, Feng Qiu, Shabbir Ahmed.</strong> <em>Learning to Solve Large-Scale Unit Commitment Problems.</em> INFORMS Journal on Computing (2020). DOI: <a class="reference external" href="https://doi.org/10.1287/ijoc.2020.0976">https://doi.org/10.1287/ijoc.2020.0976</a></p></li> <li><p><strong>Alinson S. Xavier, Feng Qiu, Shabbir Ahmed.</strong> <em>Learning to Solve Large-Scale Unit Commitment Problems.</em> INFORMS Journal on Computing (2020). DOI: <a class="reference external" href="https://doi.org/10.1287/ijoc.2020.0976">https://doi.org/10.1287/ijoc.2020.0976</a></p></li>
</ul> </ul>
</section> </div>
</section> </div>
</div> </div>

@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@ -21,17 +22,27 @@
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="preload" as="script" href="../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js?v=888ff710"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<link rel="index" title="Index" href="../genindex/" /> <link rel="index" title="Index" href="../genindex/" />
<link rel="search" title="Search" href="../search/" /> <link rel="search" title="Search" href="../search/" />
@ -64,7 +75,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -91,7 +102,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -123,7 +134,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>

@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@ -21,18 +22,28 @@
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="preload" as="script" href="../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js?v=888ff710"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script src="../_static/searchtools.js"></script> <script src="../_static/searchtools.js"></script>
<script src="../_static/language_data.js"></script> <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex/" /> <link rel="index" title="Index" href="../genindex/" />
@ -67,7 +78,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -94,7 +105,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -126,7 +137,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -211,36 +222,27 @@
<div> <div>
<h1 id="search-documentation">Search</h1> <h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning">
<noscript> <script>$('#fallback').hide();</script>
<div class="admonition warning">
<p> <p>
Please activate JavaScript to enable the search Please activate JavaScript to enable the search
functionality. functionality.
</p> </p>
</div> </div>
</noscript>
<p> <p>
Searching for multiple words only shows matches that contain Searching for multiple words only shows matches that contain
all words. all words.
</p> </p>
<form action="" method="get"> <form action="" method="get">
<input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/> <input type="text" name="q" aria-labelledby="search-documentation" value="" />
<input type="submit" value="search" /> <input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span> <span id="search-progress" style="padding-left: 10px"></span>
</form> </form>
<div id="search-results"> <div id="search-results">
</div> </div>
</div> </div>

File diff suppressed because one or more lines are too long

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>4. User cuts and lazy constraints &#8212; MIPLearn 0.4</title> <title>4. User cuts and lazy constraints &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,26 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="5. Benchmark Problems" href="../../guide/problems/" /> <link rel="next" title="5. Benchmark Problems" href="../../guide/problems/" />
@ -68,7 +73,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +100,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +132,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -256,8 +261,8 @@
<div> <div>
<section id="User-cuts-and-lazy-constraints"> <div class="section" id="User-cuts-and-lazy-constraints">
<h1><span class="section-number">4. </span>User cuts and lazy constraints<a class="headerlink" href="#User-cuts-and-lazy-constraints" title="Link to this heading"></a></h1> <h1><span class="section-number">4. </span>User cuts and lazy constraints<a class="headerlink" href="#User-cuts-and-lazy-constraints" title="Permalink to this headline"></a></h1>
<p>User cuts and lazy constraints are two advanced mixed-integer programming techniques that can accelerate solver performance. User cuts are additional constraints, derived from the constraints already in the model, that can tighten the feasible region and eliminate fractional solutions, thus reducing the size of the branch-and-bound tree. Lazy constraints, on the other hand, are constraints that are potentially part of the problem formulation but are omitted from the initial model to reduce its <p>User cuts and lazy constraints are two advanced mixed-integer programming techniques that can accelerate solver performance. User cuts are additional constraints, derived from the constraints already in the model, that can tighten the feasible region and eliminate fractional solutions, thus reducing the size of the branch-and-bound tree. Lazy constraints, on the other hand, are constraints that are potentially part of the problem formulation but are omitted from the initial model to reduce its
size; these constraints are added to the formulation only once the solver finds a solution that violates them. While both techniques have been successful, significant computational effort may still be required to generate strong user cuts and to identify violated lazy constraints, which can reduce their effectiveness.</p> size; these constraints are added to the formulation only once the solver finds a solution that violates them. While both techniques have been successful, significant computational effort may still be required to generate strong user cuts and to identify violated lazy constraints, which can reduce their effectiveness.</p>
<p>MIPLearn is able to predict which user cuts and which lazy constraints to enforce at the beginning of the optimization process, using machine learning. In this tutorial, we will use the framework to predict subtour elimination constraints for the <strong>traveling salesman problem</strong> using Gurobipy. We assume that MIPLearn has already been correctly installed.</p> <p>MIPLearn is able to predict which user cuts and which lazy constraints to enforce at the beginning of the optimization process, using machine learning. In this tutorial, we will use the framework to predict subtour elimination constraints for the <strong>traveling salesman problem</strong> using Gurobipy. We assume that MIPLearn has already been correctly installed.</p>
@ -269,8 +274,8 @@ size; these constraints are added to the formulation only once the solver finds
<li><p>Julia/JuMP: Only solvers supporting solver-independent callbacks are supported. As of JuMP 1.19, this includes Gurobi, CPLEX, XPRESS, SCIP and GLPK. Note that HiGHS and Cbc are not supported. As newer versions of JuMP implement further callback support, MIPLearn should become automatically compatible with these solvers.</p></li> <li><p>Julia/JuMP: Only solvers supporting solver-independent callbacks are supported. As of JuMP 1.19, this includes Gurobi, CPLEX, XPRESS, SCIP and GLPK. Note that HiGHS and Cbc are not supported. As newer versions of JuMP implement further callback support, MIPLearn should become automatically compatible with these solvers.</p></li>
</ul> </ul>
</div> </div>
<section id="Modeling-the-traveling-salesman-problem"> <div class="section" id="Modeling-the-traveling-salesman-problem">
<h2><span class="section-number">4.1. </span>Modeling the traveling salesman problem<a class="headerlink" href="#Modeling-the-traveling-salesman-problem" title="Link to this heading"></a></h2> <h2><span class="section-number">4.1. </span>Modeling the traveling salesman problem<a class="headerlink" href="#Modeling-the-traveling-salesman-problem" title="Permalink to this headline"></a></h2>
<p>Given a list of cities and the distances between them, the <strong>traveling salesman problem (TSP)</strong> asks for the shortest route starting at the first city, visiting each other city exactly once, then returning to the first city. This problem is a generalization of the Hamiltonian path problem, one of Karps 21 NP-complete problems, and has many practical applications, including routing delivery trucks and scheduling airline routes.</p> <p>Given a list of cities and the distances between them, the <strong>traveling salesman problem (TSP)</strong> asks for the shortest route starting at the first city, visiting each other city exactly once, then returning to the first city. This problem is a generalization of the Hamiltonian path problem, one of Karps 21 NP-complete problems, and has many practical applications, including routing delivery trucks and scheduling airline routes.</p>
<p>To describe an instance of TSP, we need to specify the number of cities <span class="math notranslate nohighlight">\(n\)</span>, and an <span class="math notranslate nohighlight">\(n \times n\)</span> matrix of distances. The class <code class="docutils literal notranslate"><span class="pre">TravelingSalesmanData</span></code>, in the <code class="docutils literal notranslate"><span class="pre">miplearn.problems.tsp</span></code> package, can hold this data:</p> <p>To describe an instance of TSP, we need to specify the number of cities <span class="math notranslate nohighlight">\(n\)</span>, and an <span class="math notranslate nohighlight">\(n \times n\)</span> matrix of distances. The class <code class="docutils literal notranslate"><span class="pre">TravelingSalesmanData</span></code>, in the <code class="docutils literal notranslate"><span class="pre">miplearn.problems.tsp</span></code> package, can hold this data:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nd">@dataclass</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nd">@dataclass</span>
@ -285,109 +290,109 @@ size; these constraints are added to the formulation only once the solver finds
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">gurobipy</span> <span class="k">as</span> <span class="nn">gp</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>import gurobipy as gp
<span class="kn">from</span> <span class="nn">gurobipy</span> <span class="kn">import</span> <span class="n">quicksum</span><span class="p">,</span> <span class="n">GRB</span><span class="p">,</span> <span class="n">tuplelist</span> from gurobipy import quicksum, GRB, tuplelist
<span class="kn">from</span> <span class="nn">miplearn.solvers.gurobi</span> <span class="kn">import</span> <span class="n">GurobiModel</span> from miplearn.solvers.gurobi import GurobiModel
<span class="kn">import</span> <span class="nn">networkx</span> <span class="k">as</span> <span class="nn">nx</span> import networkx as nx
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> import numpy as np
<span class="kn">from</span> <span class="nn">miplearn.problems.tsp</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.problems.tsp import (
<span class="n">TravelingSalesmanData</span><span class="p">,</span> TravelingSalesmanData,
<span class="n">TravelingSalesmanGenerator</span><span class="p">,</span> TravelingSalesmanGenerator,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">scipy.stats</span> <span class="kn">import</span> <span class="n">uniform</span><span class="p">,</span> <span class="n">randint</span> from scipy.stats import uniform, randint
<span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">write_pkl_gz</span><span class="p">,</span> <span class="n">read_pkl_gz</span> from miplearn.io import write_pkl_gz, read_pkl_gz
<span class="kn">from</span> <span class="nn">miplearn.collectors.basic</span> <span class="kn">import</span> <span class="n">BasicCollector</span> from miplearn.collectors.basic import BasicCollector
<span class="kn">from</span> <span class="nn">miplearn.solvers.learning</span> <span class="kn">import</span> <span class="n">LearningSolver</span> from miplearn.solvers.learning import LearningSolver
<span class="kn">from</span> <span class="nn">miplearn.components.lazy.mem</span> <span class="kn">import</span> <span class="n">MemorizingLazyComponent</span> from miplearn.components.lazy.mem import MemorizingLazyComponent
<span class="kn">from</span> <span class="nn">miplearn.extractors.fields</span> <span class="kn">import</span> <span class="n">H5FieldsExtractor</span> from miplearn.extractors.fields import H5FieldsExtractor
<span class="kn">from</span> <span class="nn">sklearn.neighbors</span> <span class="kn">import</span> <span class="n">KNeighborsClassifier</span> from sklearn.neighbors import KNeighborsClassifier
<span class="c1"># Set up random seed to make example more reproducible</span> # Set up random seed to make example more reproducible
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> np.random.seed(42)
<span class="c1"># Set up Python logging</span> # Set up Python logging
<span class="kn">import</span> <span class="nn">logging</span> import logging
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">WARNING</span><span class="p">)</span> logging.basicConfig(level=logging.WARNING)
<span class="k">def</span> <span class="nf">build_tsp_model_gurobipy_simplified</span><span class="p">(</span><span class="n">data</span><span class="p">):</span> def build_tsp_model_gurobipy_simplified(data):
<span class="c1"># Read data from file if a filename is provided</span> # Read data from file if a filename is provided
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> if isinstance(data, str):
<span class="n">data</span> <span class="o">=</span> <span class="n">read_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> data = read_pkl_gz(data)
<span class="c1"># Create empty gurobipy model</span> # Create empty gurobipy model
<span class="n">model</span> <span class="o">=</span> <span class="n">gp</span><span class="o">.</span><span class="n">Model</span><span class="p">()</span> model = gp.Model()
<span class="c1"># Create set of edges between every pair of cities, for convenience</span> # Create set of edges between every pair of cities, for convenience
<span class="n">edges</span> <span class="o">=</span> <span class="n">tuplelist</span><span class="p">(</span> edges = tuplelist(
<span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_cities</span><span class="p">)</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">n_cities</span><span class="p">)</span> (i, j) for i in range(data.n_cities) for j in range(i + 1, data.n_cities)
<span class="p">)</span> )
<span class="c1"># Add binary variable x[e] for each edge e</span> # Add binary variable x[e] for each edge e
<span class="n">x</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">edges</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">GRB</span><span class="o">.</span><span class="n">BINARY</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;x&quot;</span><span class="p">)</span> x = model.addVars(edges, vtype=GRB.BINARY, name=&quot;x&quot;)
<span class="c1"># Add objective function</span> # Add objective function
<span class="n">model</span><span class="o">.</span><span class="n">setObjective</span><span class="p">(</span><span class="n">quicksum</span><span class="p">(</span><span class="n">x</span><span class="p">[(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)]</span> <span class="o">*</span> <span class="n">data</span><span class="o">.</span><span class="n">distances</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">))</span> model.setObjective(quicksum(x[(i, j)] * data.distances[i, j] for (i, j) in edges))
<span class="c1"># Add constraint: must choose two edges adjacent to each city</span> # Add constraint: must choose two edges adjacent to each city
<span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span> model.addConstrs(
<span class="p">(</span> (
<span class="n">quicksum</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="nb">min</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="nb">max</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_cities</span><span class="p">)</span> <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">j</span><span class="p">)</span> quicksum(x[min(i, j), max(i, j)] for j in range(data.n_cities) if i != j)
<span class="o">==</span> <span class="mi">2</span> == 2
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_cities</span><span class="p">)</span> for i in range(data.n_cities)
<span class="p">),</span> ),
<span class="n">name</span><span class="o">=</span><span class="s2">&quot;eq_degree&quot;</span><span class="p">,</span> name=&quot;eq_degree&quot;,
<span class="p">)</span> )
<span class="k">def</span> <span class="nf">lazy_separate</span><span class="p">(</span><span class="n">m</span><span class="p">:</span> <span class="n">GurobiModel</span><span class="p">):</span> def lazy_separate(m: GurobiModel):
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span> &quot;&quot;&quot;
<span class="sd"> Callback function that finds subtours in the current solution.</span> Callback function that finds subtours in the current solution.
<span class="sd"> &quot;&quot;&quot;</span> &quot;&quot;&quot;
<span class="c1"># Query current value of the x variables</span> # Query current value of the x variables
<span class="n">x_val</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">cbGetSolution</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> x_val = m.inner.cbGetSolution(x)
<span class="c1"># Initialize empty set of violations</span> # Initialize empty set of violations
<span class="n">violations</span> <span class="o">=</span> <span class="p">[]</span> violations = []
<span class="c1"># Build set of edges we have currently selected</span> # Build set of edges we have currently selected
<span class="n">selected_edges</span> <span class="o">=</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span> <span class="k">if</span> <span class="n">x_val</span><span class="p">[</span><span class="n">e</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">0.5</span><span class="p">]</span> selected_edges = [e for e in edges if x_val[e] &gt; 0.5]
<span class="c1"># Build a graph containing the selected edges, using networkx</span> # Build a graph containing the selected edges, using networkx
<span class="n">graph</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">Graph</span><span class="p">()</span> graph = nx.Graph()
<span class="n">graph</span><span class="o">.</span><span class="n">add_edges_from</span><span class="p">(</span><span class="n">selected_edges</span><span class="p">)</span> graph.add_edges_from(selected_edges)
<span class="c1"># For each component of the graph</span> # For each component of the graph
<span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">nx</span><span class="o">.</span><span class="n">connected_components</span><span class="p">(</span><span class="n">graph</span><span class="p">)):</span> for component in list(nx.connected_components(graph)):
<span class="c1"># If the component is not the entire graph, we found a</span> # If the component is not the entire graph, we found a
<span class="c1"># subtour. Add the edge cut to the list of violations.</span> # subtour. Add the edge cut to the list of violations.
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">component</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">data</span><span class="o">.</span><span class="n">n_cities</span><span class="p">:</span> if len(component) &lt; data.n_cities:
<span class="n">cut_edges</span> <span class="o">=</span> <span class="p">[</span> cut_edges = [
<span class="p">[</span><span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> [e[0], e[1]]
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">edges</span> for e in edges
<span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">component</span> <span class="ow">and</span> <span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">component</span><span class="p">)</span> if (e[0] in component and e[1] not in component)
<span class="ow">or</span> <span class="p">(</span><span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">component</span> <span class="ow">and</span> <span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="n">component</span><span class="p">)</span> or (e[0] not in component and e[1] in component)
<span class="p">]</span> ]
<span class="n">violations</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cut_edges</span><span class="p">)</span> violations.append(cut_edges)
<span class="c1"># Return the list of violations</span> # Return the list of violations
<span class="k">return</span> <span class="n">violations</span> return violations
<span class="k">def</span> <span class="nf">lazy_enforce</span><span class="p">(</span><span class="n">m</span><span class="p">:</span> <span class="n">GurobiModel</span><span class="p">,</span> <span class="n">violations</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span> def lazy_enforce(m: GurobiModel, violations) -&gt; None:
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span> &quot;&quot;&quot;
<span class="sd"> Callback function that, given a list of subtours, adds lazy</span> Callback function that, given a list of subtours, adds lazy
<span class="sd"> constraints to remove them from the feasible region.</span> constraints to remove them from the feasible region.
<span class="sd"> &quot;&quot;&quot;</span> &quot;&quot;&quot;
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Enforcing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">violations</span><span class="p">)</span><span class="si">}</span><span class="s2"> subtour elimination constraints&quot;</span><span class="p">)</span> print(f&quot;Enforcing {len(violations)} subtour elimination constraints&quot;)
<span class="k">for</span> <span class="n">violation</span> <span class="ow">in</span> <span class="n">violations</span><span class="p">:</span> for violation in violations:
<span class="n">m</span><span class="o">.</span><span class="n">add_constr</span><span class="p">(</span><span class="n">quicksum</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">violation</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">)</span> m.add_constr(quicksum(x[e[0], e[1]] for e in violation) &gt;= 2)
<span class="k">return</span> <span class="n">GurobiModel</span><span class="p">(</span> return GurobiModel(
<span class="n">model</span><span class="p">,</span> model,
<span class="n">lazy_separate</span><span class="o">=</span><span class="n">lazy_separate</span><span class="p">,</span> lazy_separate=lazy_separate,
<span class="n">lazy_enforce</span><span class="o">=</span><span class="n">lazy_enforce</span><span class="p">,</span> lazy_enforce=lazy_enforce,
<span class="p">)</span> )
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -398,55 +403,55 @@ the responsbility of the second callback function, <code class="docutils literal
<p class="admonition-title">Constraint Representation</p> <p class="admonition-title">Constraint Representation</p>
<p>How should user cuts and lazy constraints be represented is a decision that the user can make; MIPLearn is representation agnostic. The objects returned by <code class="docutils literal notranslate"><span class="pre">lazy_separate</span></code>, however, are serialized as JSON and stored in the HDF5 training data files. Therefore, it is recommended to use only simple objects, such as lists, tuples and dictionaries.</p> <p>How should user cuts and lazy constraints be represented is a decision that the user can make; MIPLearn is representation agnostic. The objects returned by <code class="docutils literal notranslate"><span class="pre">lazy_separate</span></code>, however, are serialized as JSON and stored in the HDF5 training data files. Therefore, it is recommended to use only simple objects, such as lists, tuples and dictionaries.</p>
</div> </div>
</section> </div>
<section id="Generating-training-data"> <div class="section" id="Generating-training-data">
<h2><span class="section-number">4.2. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Link to this heading"></a></h2> <h2><span class="section-number">4.2. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Permalink to this headline"></a></h2>
<p>To test the callback defined above, we generate a small set of TSP instances, using the provided random instance generator. As in the previous tutorial, we generate some test instances and some training instances, then solve them using <code class="docutils literal notranslate"><span class="pre">BasicCollector</span></code>. Input problem data is stored in <code class="docutils literal notranslate"><span class="pre">tsp/train/00000.pkl.gz,</span> <span class="pre">...</span></code>, whereas solver training data (including list of required lazy constraints) is stored in <code class="docutils literal notranslate"><span class="pre">tsp/train/00000.h5,</span> <span class="pre">...</span></code>.</p> <p>To test the callback defined above, we generate a small set of TSP instances, using the provided random instance generator. As in the previous tutorial, we generate some test instances and some training instances, then solve them using <code class="docutils literal notranslate"><span class="pre">BasicCollector</span></code>. Input problem data is stored in <code class="docutils literal notranslate"><span class="pre">tsp/train/00000.pkl.gz,</span> <span class="pre">...</span></code>, whereas solver training data (including list of required lazy constraints) is stored in <code class="docutils literal notranslate"><span class="pre">tsp/train/00000.h5,</span> <span class="pre">...</span></code>.</p>
<div class="nbinput nblast docutils container"> <div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Configure generator to produce instances with 50 cities located</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span># Configure generator to produce instances with 50 cities located
<span class="c1"># in the 1000 x 1000 square, and with slightly perturbed distances.</span> # in the 1000 x 1000 square, and with slightly perturbed distances.
<span class="n">gen</span> <span class="o">=</span> <span class="n">TravelingSalesmanGenerator</span><span class="p">(</span> gen = TravelingSalesmanGenerator(
<span class="n">x</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">),</span> x=uniform(loc=0.0, scale=1000.0),
<span class="n">y</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">),</span> y=uniform(loc=0.0, scale=1000.0),
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="n">low</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">51</span><span class="p">),</span> n=randint(low=50, high=51),
<span class="n">gamma</span><span class="o">=</span><span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.25</span><span class="p">),</span> gamma=uniform(loc=1.0, scale=0.25),
<span class="n">fix_cities</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> fix_cities=True,
<span class="nb">round</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> round=True,
<span class="p">)</span> )
<span class="c1"># Generate 500 instances and store input data file to .pkl.gz files</span> # Generate 500 instances and store input data file to .pkl.gz files
<span class="n">data</span> <span class="o">=</span> <span class="n">gen</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">500</span><span class="p">)</span> data = gen.generate(500)
<span class="n">train_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">450</span><span class="p">],</span> <span class="s2">&quot;tsp/train&quot;</span><span class="p">)</span> train_data = write_pkl_gz(data[0:450], &quot;tsp/train&quot;)
<span class="n">test_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">450</span><span class="p">:</span><span class="mi">500</span><span class="p">],</span> <span class="s2">&quot;tsp/test&quot;</span><span class="p">)</span> test_data = write_pkl_gz(data[450:500], &quot;tsp/test&quot;)
<span class="c1"># Solve the training instances in parallel, collecting the required lazy</span> # Solve the training instances in parallel, collecting the required lazy
<span class="c1"># constraints, in addition to other information, such as optimal solution.</span> # constraints, in addition to other information, such as optimal solution.
<span class="n">bc</span> <span class="o">=</span> <span class="n">BasicCollector</span><span class="p">()</span> bc = BasicCollector()
<span class="n">bc</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="n">train_data</span><span class="p">,</span> <span class="n">build_tsp_model_gurobipy_simplified</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> bc.collect(train_data, build_tsp_model_gurobipy_simplified, n_jobs=10)
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
<section id="Training-and-solving-new-instances"> <div class="section" id="Training-and-solving-new-instances">
<h2><span class="section-number">4.3. </span>Training and solving new instances<a class="headerlink" href="#Training-and-solving-new-instances" title="Link to this heading"></a></h2> <h2><span class="section-number">4.3. </span>Training and solving new instances<a class="headerlink" href="#Training-and-solving-new-instances" title="Permalink to this headline"></a></h2>
<p>After producing the training dataset, we can train the machine learning models to predict which lazy constraints are necessary. In this tutorial, we use the following ML strategy: given a new instance, find the 50 most similar ones in the training dataset and verify how often each lazy constraint was required. If a lazy constraint was required for the majority of the 50 most-similar instances, enforce it ahead-of-time for the current instance. To measure instance similarity, use the objective <p>After producing the training dataset, we can train the machine learning models to predict which lazy constraints are necessary. In this tutorial, we use the following ML strategy: given a new instance, find the 50 most similar ones in the training dataset and verify how often each lazy constraint was required. If a lazy constraint was required for the majority of the 50 most-similar instances, enforce it ahead-of-time for the current instance. To measure instance similarity, use the objective
function only. This ML strategy can be implemented using <code class="docutils literal notranslate"><span class="pre">MemorizingLazyComponent</span></code> with <code class="docutils literal notranslate"><span class="pre">H5FieldsExtractor</span></code> and <code class="docutils literal notranslate"><span class="pre">KNeighborsClassifier</span></code>, as shown below.</p> function only. This ML strategy can be implemented using <code class="docutils literal notranslate"><span class="pre">MemorizingLazyComponent</span></code> with <code class="docutils literal notranslate"><span class="pre">H5FieldsExtractor</span></code> and <code class="docutils literal notranslate"><span class="pre">KNeighborsClassifier</span></code>, as shown below.</p>
<div class="nbinput nblast docutils container"> <div class="nbinput nblast docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">solver</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>solver = LearningSolver(
<span class="n">components</span><span class="o">=</span><span class="p">[</span> components=[
<span class="n">MemorizingLazyComponent</span><span class="p">(</span> MemorizingLazyComponent(
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span><span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_var_obj_coeffs&quot;</span><span class="p">]),</span> extractor=H5FieldsExtractor(instance_fields=[&quot;static_var_obj_coeffs&quot;]),
<span class="n">clf</span><span class="o">=</span><span class="n">KNeighborsClassifier</span><span class="p">(</span><span class="n">n_neighbors</span><span class="o">=</span><span class="mi">100</span><span class="p">),</span> clf=KNeighborsClassifier(n_neighbors=100),
<span class="p">),</span> ),
<span class="p">],</span> ],
<span class="p">)</span> )
<span class="n">solver</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span> solver.fit(train_data)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -455,11 +460,11 @@ function only. This ML strategy can be implemented using <code class="docutils l
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Increase log verbosity, so that we can see what is MIPLearn doing</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span># Increase log verbosity, so that we can see what is MIPLearn doing
<span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;miplearn&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span> logging.getLogger(&quot;miplearn&quot;).setLevel(logging.INFO)
<span class="c1"># Solve a new test instance</span> # Solve a new test instance
<span class="n">solver</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_tsp_model_gurobipy_simplified</span><span class="p">);</span> solver.optimize(test_data[0], build_tsp_model_gurobipy_simplified);
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -565,8 +570,8 @@ User-callback calls 141, time in user-callback 0.00 sec
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">solver</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span><span class="n">components</span><span class="o">=</span><span class="p">[])</span> <span class="c1"># empty set of ML components</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>solver = LearningSolver(components=[]) # empty set of ML components
<span class="n">solver</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_tsp_model_gurobipy_simplified</span><span class="p">);</span> solver.optimize(test_data[0], build_tsp_model_gurobipy_simplified);
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -660,9 +665,9 @@ Best objective 6.219000000000e+03, best bound 6.219000000000e+03, gap 0.0000%
User-callback calls 170, time in user-callback 0.01 sec User-callback calls 170, time in user-callback 0.01 sec
</pre></div></div> </pre></div></div>
</div> </div>
</section> </div>
<section id="Learning-user-cuts"> <div class="section" id="Learning-user-cuts">
<h2><span class="section-number">4.4. </span>Learning user cuts<a class="headerlink" href="#Learning-user-cuts" title="Link to this heading"></a></h2> <h2><span class="section-number">4.4. </span>Learning user cuts<a class="headerlink" href="#Learning-user-cuts" title="Permalink to this headline"></a></h2>
<p>The example above focused on lazy constraints. To enforce user cuts instead, the procedure is very similar, with the following changes:</p> <p>The example above focused on lazy constraints. To enforce user cuts instead, the procedure is very similar, with the following changes:</p>
<ul class="simple"> <ul class="simple">
<li><p>Instead of <code class="docutils literal notranslate"><span class="pre">lazy_separate</span></code> and <code class="docutils literal notranslate"><span class="pre">lazy_enforce</span></code>, use <code class="docutils literal notranslate"><span class="pre">cuts_separate</span></code> and <code class="docutils literal notranslate"><span class="pre">cuts_enforce</span></code></p></li> <li><p>Instead of <code class="docutils literal notranslate"><span class="pre">lazy_separate</span></code> and <code class="docutils literal notranslate"><span class="pre">lazy_enforce</span></code>, use <code class="docutils literal notranslate"><span class="pre">cuts_separate</span></code> and <code class="docutils literal notranslate"><span class="pre">cuts_enforce</span></code></p></li>
@ -677,8 +682,8 @@ User-callback calls 170, time in user-callback 0.01 sec
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
</div> </div>

@ -45,16 +45,10 @@
"- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n", "- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n",
"- Julia version, compatible with the JuMP modeling language.\n", "- Julia version, compatible with the JuMP modeling language.\n",
"\n", "\n",
"In this tutorial, we will demonstrate how to use and install the Python/Gurobipy version of the package. The first step is to install Python 3.8+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n", "In this tutorial, we will demonstrate how to use and install the Python/Gurobipy version of the package. The first step is to install Python 3.9+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n",
"\n", "\n",
"```\n", "```\n",
"$ pip install MIPLearn==0.4\n", "$ pip install MIPLearn~=0.4\n",
"```\n",
"\n",
"In addition to MIPLearn itself, we will also install Gurobi 10.0, a state-of-the-art commercial MILP solver. This step also install a demo license for Gurobi, which should able to solve the small optimization problems in this tutorial. A license is required for solving larger-scale problems.\n",
"\n",
"```\n",
"$ pip install 'gurobipy>=10,<10.1'\n",
"```" "```"
] ]
}, },

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>2. Getting started (Gurobipy) &#8212; MIPLearn 0.4</title> <title>2. Getting started (Gurobipy) &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,27 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="3. Getting started (JuMP)" href="../getting-started-jump/" /> <link rel="next" title="3. Getting started (JuMP)" href="../getting-started-jump/" />
@ -68,7 +74,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +101,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +133,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -266,10 +272,10 @@
<div> <div>
<section id="Getting-started-(Gurobipy)"> <div class="section" id="Getting-started-(Gurobipy)">
<h1><span class="section-number">2. </span>Getting started (Gurobipy)<a class="headerlink" href="#Getting-started-(Gurobipy)" title="Link to this heading"></a></h1> <h1><span class="section-number">2. </span>Getting started (Gurobipy)<a class="headerlink" href="#Getting-started-(Gurobipy)" title="Permalink to this headline"></a></h1>
<section id="Introduction"> <div class="section" id="Introduction">
<h2><span class="section-number">2.1. </span>Introduction<a class="headerlink" href="#Introduction" title="Link to this heading"></a></h2> <h2><span class="section-number">2.1. </span>Introduction<a class="headerlink" href="#Introduction" title="Permalink to this headline"></a></h2>
<p><strong>MIPLearn</strong> is an open source framework that uses machine learning (ML) to accelerate the performance of mixed-integer programming solvers (e.g. Gurobi, CPLEX, XPRESS). In this tutorial, we will:</p> <p><strong>MIPLearn</strong> is an open source framework that uses machine learning (ML) to accelerate the performance of mixed-integer programming solvers (e.g. Gurobi, CPLEX, XPRESS). In this tutorial, we will:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Install the Python/Gurobipy version of MIPLearn</p></li> <li><p>Install the Python/Gurobipy version of MIPLearn</p></li>
@ -285,29 +291,25 @@
<p class="admonition-title">Warning</p> <p class="admonition-title">Warning</p>
<p>MIPLearn is still in early development stage. If run into any bugs or issues, please submit a bug report in our GitHub repository. Comments, suggestions and pull requests are also very welcome!</p> <p>MIPLearn is still in early development stage. If run into any bugs or issues, please submit a bug report in our GitHub repository. Comments, suggestions and pull requests are also very welcome!</p>
</div> </div>
</section> </div>
<section id="Installation"> <div class="section" id="Installation">
<h2><span class="section-number">2.2. </span>Installation<a class="headerlink" href="#Installation" title="Link to this heading"></a></h2> <h2><span class="section-number">2.2. </span>Installation<a class="headerlink" href="#Installation" title="Permalink to this headline"></a></h2>
<p>MIPLearn is available in two versions:</p> <p>MIPLearn is available in two versions:</p>
<ul class="simple"> <ul class="simple">
<li><p>Python version, compatible with the Pyomo and Gurobipy modeling languages,</p></li> <li><p>Python version, compatible with the Pyomo and Gurobipy modeling languages,</p></li>
<li><p>Julia version, compatible with the JuMP modeling language.</p></li> <li><p>Julia version, compatible with the JuMP modeling language.</p></li>
</ul> </ul>
<p>In this tutorial, we will demonstrate how to use and install the Python/Gurobipy version of the package. The first step is to install Python 3.8+ in your computer. See the <a class="reference external" href="https://www.python.org/downloads/">official Python website for more instructions</a>. After Python is installed, we proceed to install MIPLearn using <code class="docutils literal notranslate"><span class="pre">pip</span></code>:</p> <p>In this tutorial, we will demonstrate how to use and install the Python/Gurobipy version of the package. The first step is to install Python 3.9+ in your computer. See the <a class="reference external" href="https://www.python.org/downloads/">official Python website for more instructions</a>. After Python is installed, we proceed to install MIPLearn using <code class="docutils literal notranslate"><span class="pre">pip</span></code>:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ pip install MIPLearn==0.4 <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ pip install MIPLearn~=0.4
</pre></div>
</div>
<p>In addition to MIPLearn itself, we will also install Gurobi 10.0, a state-of-the-art commercial MILP solver. This step also install a demo license for Gurobi, which should able to solve the small optimization problems in this tutorial. A license is required for solving larger-scale problems.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ pip install &#39;gurobipy&gt;=10,&lt;10.1&#39;
</pre></div> </pre></div>
</div> </div>
<div class="admonition note"> <div class="admonition note">
<p class="admonition-title">Note</p> <p class="admonition-title">Note</p>
<p>In the code above, we install specific version of all packages to ensure that this tutorial keeps running in the future, even when newer (and possibly incompatible) versions of the packages are released. This is usually a recommended practice for all Python projects.</p> <p>In the code above, we install specific version of all packages to ensure that this tutorial keeps running in the future, even when newer (and possibly incompatible) versions of the packages are released. This is usually a recommended practice for all Python projects.</p>
</div> </div>
</section> </div>
<section id="Modeling-a-simple-optimization-problem"> <div class="section" id="Modeling-a-simple-optimization-problem">
<h2><span class="section-number">2.3. </span>Modeling a simple optimization problem<a class="headerlink" href="#Modeling-a-simple-optimization-problem" title="Link to this heading"></a></h2> <h2><span class="section-number">2.3. </span>Modeling a simple optimization problem<a class="headerlink" href="#Modeling-a-simple-optimization-problem" title="Permalink to this headline"></a></h2>
<p>To illustrate how can MIPLearn be used, we will model and solve a small optimization problem related to power systems optimization. The problem we discuss below is a simplification of the <strong>unit commitment problem,</strong> a practical optimization problem solved daily by electric grid operators around the world.</p> <p>To illustrate how can MIPLearn be used, we will model and solve a small optimization problem related to power systems optimization. The problem we discuss below is a simplification of the <strong>unit commitment problem,</strong> a practical optimization problem solved daily by electric grid operators around the world.</p>
<p>Suppose that a utility company needs to decide which electrical generators should be online at each hour of the day, as well as how much power should each generator produce. More specifically, assume that the company owns <span class="math notranslate nohighlight">\(n\)</span> generators, denoted by <span class="math notranslate nohighlight">\(g_1, \ldots, g_n\)</span>. Each generator can either be online or offline. An online generator <span class="math notranslate nohighlight">\(g_i\)</span> can produce between <span class="math notranslate nohighlight">\(p^\text{min}_i\)</span> to <span class="math notranslate nohighlight">\(p^\text{max}_i\)</span> megawatts of power, and it costs the company <p>Suppose that a utility company needs to decide which electrical generators should be online at each hour of the day, as well as how much power should each generator produce. More specifically, assume that the company owns <span class="math notranslate nohighlight">\(n\)</span> generators, denoted by <span class="math notranslate nohighlight">\(g_1, \ldots, g_n\)</span>. Each generator can either be online or offline. An online generator <span class="math notranslate nohighlight">\(g_i\)</span> can produce between <span class="math notranslate nohighlight">\(p^\text{min}_i\)</span> to <span class="math notranslate nohighlight">\(p^\text{max}_i\)</span> megawatts of power, and it costs the company
<span class="math notranslate nohighlight">\(c^\text{fix}_i + c^\text{var}_i y_i\)</span>, where <span class="math notranslate nohighlight">\(y_i\)</span> is the amount of power produced. An offline generator produces nothing and costs nothing. The total amount of power to be produced needs to be exactly equal to the total demand <span class="math notranslate nohighlight">\(d\)</span> (in megawatts).</p> <span class="math notranslate nohighlight">\(c^\text{fix}_i + c^\text{var}_i y_i\)</span>, where <span class="math notranslate nohighlight">\(y_i\)</span> is the amount of power produced. An offline generator produces nothing and costs nothing. The total amount of power to be produced needs to be exactly equal to the total demand <span class="math notranslate nohighlight">\(d\)</span> (in megawatts).</p>
@ -330,19 +332,19 @@
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from dataclasses import dataclass
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span> from typing import List
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> import numpy as np
<span class="nd">@dataclass</span> @dataclass
<span class="k">class</span> <span class="nc">UnitCommitmentData</span><span class="p">:</span> class UnitCommitmentData:
<span class="n">demand</span><span class="p">:</span> <span class="nb">float</span> demand: float
<span class="n">pmin</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> pmin: List[float]
<span class="n">pmax</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> pmax: List[float]
<span class="n">cfix</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> cfix: List[float]
<span class="n">cvar</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> cvar: List[float]
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -351,28 +353,28 @@
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">gurobipy</span> <span class="k">as</span> <span class="nn">gp</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>import gurobipy as gp
<span class="kn">from</span> <span class="nn">gurobipy</span> <span class="kn">import</span> <span class="n">GRB</span><span class="p">,</span> <span class="n">quicksum</span> from gurobipy import GRB, quicksum
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Union</span> from typing import Union
<span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">read_pkl_gz</span> from miplearn.io import read_pkl_gz
<span class="kn">from</span> <span class="nn">miplearn.solvers.gurobi</span> <span class="kn">import</span> <span class="n">GurobiModel</span> from miplearn.solvers.gurobi import GurobiModel
<span class="k">def</span> <span class="nf">build_uc_model</span><span class="p">(</span><span class="n">data</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">UnitCommitmentData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">GurobiModel</span><span class="p">:</span> def build_uc_model(data: Union[str, UnitCommitmentData]) -&gt; GurobiModel:
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> if isinstance(data, str):
<span class="n">data</span> <span class="o">=</span> <span class="n">read_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> data = read_pkl_gz(data)
<span class="n">model</span> <span class="o">=</span> <span class="n">gp</span><span class="o">.</span><span class="n">Model</span><span class="p">()</span> model = gp.Model()
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">pmin</span><span class="p">)</span> n = len(data.pmin)
<span class="n">x</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_x</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">GRB</span><span class="o">.</span><span class="n">BINARY</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;x&quot;</span><span class="p">)</span> x = model._x = model.addVars(n, vtype=GRB.BINARY, name=&quot;x&quot;)
<span class="n">y</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_y</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;y&quot;</span><span class="p">)</span> y = model._y = model.addVars(n, name=&quot;y&quot;)
<span class="n">model</span><span class="o">.</span><span class="n">setObjective</span><span class="p">(</span> model.setObjective(
<span class="n">quicksum</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">cfix</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">data</span><span class="o">.</span><span class="n">cvar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> quicksum(data.cfix[i] * x[i] + data.cvar[i] * y[i] for i in range(n))
<span class="p">)</span> )
<span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">data</span><span class="o">.</span><span class="n">pmax</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> model.addConstrs(y[i] &lt;= data.pmax[i] * x[i] for i in range(n))
<span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">data</span><span class="o">.</span><span class="n">pmin</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> model.addConstrs(y[i] &gt;= data.pmin[i] * x[i] for i in range(n))
<span class="n">model</span><span class="o">.</span><span class="n">addConstr</span><span class="p">(</span><span class="n">quicksum</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> <span class="o">==</span> <span class="n">data</span><span class="o">.</span><span class="n">demand</span><span class="p">)</span> model.addConstr(quicksum(y[i] for i in range(n)) == data.demand)
<span class="k">return</span> <span class="n">GurobiModel</span><span class="p">(</span><span class="n">model</span><span class="p">)</span> return GurobiModel(model)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -381,20 +383,20 @@
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">model</span> <span class="o">=</span> <span class="n">build_uc_model</span><span class="p">(</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>model = build_uc_model(
<span class="n">UnitCommitmentData</span><span class="p">(</span> UnitCommitmentData(
<span class="n">demand</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span> demand=100.0,
<span class="n">pmin</span><span class="o">=</span><span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">],</span> pmin=[10, 20, 30],
<span class="n">pmax</span><span class="o">=</span><span class="p">[</span><span class="mi">50</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">70</span><span class="p">],</span> pmax=[50, 60, 70],
<span class="n">cfix</span><span class="o">=</span><span class="p">[</span><span class="mi">700</span><span class="p">,</span> <span class="mi">600</span><span class="p">,</span> <span class="mi">500</span><span class="p">],</span> cfix=[700, 600, 500],
<span class="n">cvar</span><span class="o">=</span><span class="p">[</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">],</span> cvar=[1.5, 2.0, 2.5],
<span class="p">)</span> )
<span class="p">)</span> )
<span class="n">model</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span> model.optimize()
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;obj =&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">objVal</span><span class="p">)</span> print(&quot;obj =&quot;, model.inner.objVal)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">_x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">x</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)])</span> print(&quot;x =&quot;, [model.inner._x[i].x for i in range(3)])
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">_y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">x</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)])</span> print(&quot;y =&quot;, [model.inner._y[i].x for i in range(3)])
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -455,9 +457,9 @@ y = [0.0, 60.0, 40.0]
<li><p>To ensure training data consistency, MIPLearn requires all decision variables to have names.</p></li> <li><p>To ensure training data consistency, MIPLearn requires all decision variables to have names.</p></li>
</ul> </ul>
</div> </div>
</section> </div>
<section id="Generating-training-data"> <div class="section" id="Generating-training-data">
<h2><span class="section-number">2.4. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Link to this heading"></a></h2> <h2><span class="section-number">2.4. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Permalink to this headline"></a></h2>
<p>Although Gurobi could solve the small example above in a fraction of a second, it gets slower for larger and more complex versions of the problem. If this is a problem that needs to be solved frequently, as it is often the case in practice, it could make sense to spend some time upfront generating a <strong>trained</strong> solver, which can optimize new instances (similar to the ones it was trained on) faster.</p> <p>Although Gurobi could solve the small example above in a fraction of a second, it gets slower for larger and more complex versions of the problem. If this is a problem that needs to be solved frequently, as it is often the case in practice, it could make sense to spend some time upfront generating a <strong>trained</strong> solver, which can optimize new instances (similar to the ones it was trained on) faster.</p>
<p>In the following, we will use MIPLearn to train machine learning models that is able to predict the optimal solution for instances that follow a given probability distribution, then it will provide this predicted solution to Gurobi as a warm start. Before we can train the model, we need to collect training data by solving a large number of instances. In real-world situations, we may construct these training instances based on historical data. In this tutorial, we will construct them using a <p>In the following, we will use MIPLearn to train machine learning models that is able to predict the optimal solution for instances that follow a given probability distribution, then it will provide this predicted solution to Gurobi as a warm start. Before we can train the model, we need to collect training data by solving a large number of instances. In real-world situations, we may construct these training instances based on historical data. In this tutorial, we will construct them using a
random instance generator:</p> random instance generator:</p>
@ -465,28 +467,28 @@ random instance generator:</p>
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">scipy.stats</span> <span class="kn">import</span> <span class="n">uniform</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from scipy.stats import uniform
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span> from typing import List
<span class="kn">import</span> <span class="nn">random</span> import random
<span class="k">def</span> <span class="nf">random_uc_data</span><span class="p">(</span><span class="n">samples</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">seed</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">42</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">UnitCommitmentData</span><span class="p">]:</span> def random_uc_data(samples: int, n: int, seed: int = 42) -&gt; List[UnitCommitmentData]:
<span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span> random.seed(seed)
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span> np.random.seed(seed)
<span class="n">pmin</span> <span class="o">=</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">100_000.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">400_000.0</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> pmin = uniform(loc=100_000.0, scale=400_000.0).rvs(n)
<span class="n">pmax</span> <span class="o">=</span> <span class="n">pmin</span> <span class="o">*</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">2.5</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> pmax = pmin * uniform(loc=2.0, scale=2.5).rvs(n)
<span class="n">cfix</span> <span class="o">=</span> <span class="n">pmin</span> <span class="o">*</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">25.0</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> cfix = pmin * uniform(loc=100.0, scale=25.0).rvs(n)
<span class="n">cvar</span> <span class="o">=</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">1.25</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.25</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> cvar = uniform(loc=1.25, scale=0.25).rvs(n)
<span class="k">return</span> <span class="p">[</span> return [
<span class="n">UnitCommitmentData</span><span class="p">(</span> UnitCommitmentData(
<span class="n">demand</span><span class="o">=</span><span class="n">pmax</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="o">*</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.25</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(),</span> demand=pmax.sum() * uniform(loc=0.5, scale=0.25).rvs(),
<span class="n">pmin</span><span class="o">=</span><span class="n">pmin</span><span class="p">,</span> pmin=pmin,
<span class="n">pmax</span><span class="o">=</span><span class="n">pmax</span><span class="p">,</span> pmax=pmax,
<span class="n">cfix</span><span class="o">=</span><span class="n">cfix</span><span class="p">,</span> cfix=cfix,
<span class="n">cvar</span><span class="o">=</span><span class="n">cvar</span><span class="p">,</span> cvar=cvar,
<span class="p">)</span> )
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">samples</span><span class="p">)</span> for _ in range(samples)
<span class="p">]</span> ]
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -497,11 +499,11 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">write_pkl_gz</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.io import write_pkl_gz
<span class="n">data</span> <span class="o">=</span> <span class="n">random_uc_data</span><span class="p">(</span><span class="n">samples</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">500</span><span class="p">)</span> data = random_uc_data(samples=500, n=500)
<span class="n">train_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">450</span><span class="p">],</span> <span class="s2">&quot;uc/train&quot;</span><span class="p">)</span> train_data = write_pkl_gz(data[0:450], &quot;uc/train&quot;)
<span class="n">test_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">450</span><span class="p">:</span><span class="mi">500</span><span class="p">],</span> <span class="s2">&quot;uc/test&quot;</span><span class="p">)</span> test_data = write_pkl_gz(data[450:500], &quot;uc/test&quot;)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -510,16 +512,16 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.collectors.basic</span> <span class="kn">import</span> <span class="n">BasicCollector</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.collectors.basic import BasicCollector
<span class="n">bc</span> <span class="o">=</span> <span class="n">BasicCollector</span><span class="p">()</span> bc = BasicCollector()
<span class="n">bc</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="n">train_data</span><span class="p">,</span> <span class="n">build_uc_model</span><span class="p">)</span> bc.collect(train_data, build_uc_model)
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
<section id="Training-and-solving-test-instances"> <div class="section" id="Training-and-solving-test-instances">
<h2><span class="section-number">2.5. </span>Training and solving test instances<a class="headerlink" href="#Training-and-solving-test-instances" title="Link to this heading"></a></h2> <h2><span class="section-number">2.5. </span>Training and solving test instances<a class="headerlink" href="#Training-and-solving-test-instances" title="Permalink to this headline"></a></h2>
<p>With training data in hand, we can now design and train a machine learning model to accelerate solver performance. In this tutorial, for illustration purposes, we will use ML to generate a good warm start using <span class="math notranslate nohighlight">\(k\)</span>-nearest neighbors. More specifically, the strategy is to:</p> <p>With training data in hand, we can now design and train a machine learning model to accelerate solver performance. In this tutorial, for illustration purposes, we will use ML to generate a good warm start using <span class="math notranslate nohighlight">\(k\)</span>-nearest neighbors. More specifically, the strategy is to:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Memorize the optimal solutions of all training instances;</p></li> <li><p>Memorize the optimal solutions of all training instances;</p></li>
@ -532,22 +534,22 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.neighbors</span> <span class="kn">import</span> <span class="n">KNeighborsClassifier</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from sklearn.neighbors import KNeighborsClassifier
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="n">SetWarmStart</span> from miplearn.components.primal.actions import SetWarmStart
<span class="kn">from</span> <span class="nn">miplearn.components.primal.mem</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.components.primal.mem import (
<span class="n">MemorizingPrimalComponent</span><span class="p">,</span> MemorizingPrimalComponent,
<span class="n">MergeTopSolutions</span><span class="p">,</span> MergeTopSolutions,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">miplearn.extractors.fields</span> <span class="kn">import</span> <span class="n">H5FieldsExtractor</span> from miplearn.extractors.fields import H5FieldsExtractor
<span class="n">comp</span> <span class="o">=</span> <span class="n">MemorizingPrimalComponent</span><span class="p">(</span> comp = MemorizingPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">KNeighborsClassifier</span><span class="p">(</span><span class="n">n_neighbors</span><span class="o">=</span><span class="mi">25</span><span class="p">),</span> clf=KNeighborsClassifier(n_neighbors=25),
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span> extractor=H5FieldsExtractor(
<span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_constr_rhs&quot;</span><span class="p">],</span> instance_fields=[&quot;static_constr_rhs&quot;],
<span class="p">),</span> ),
<span class="n">constructor</span><span class="o">=</span><span class="n">MergeTopSolutions</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]),</span> constructor=MergeTopSolutions(25, [0.0, 1.0]),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -556,11 +558,11 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.solvers.learning</span> <span class="kn">import</span> <span class="n">LearningSolver</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.solvers.learning import LearningSolver
<span class="n">solver_ml</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span><span class="n">components</span><span class="o">=</span><span class="p">[</span><span class="n">comp</span><span class="p">])</span> solver_ml = LearningSolver(components=[comp])
<span class="n">solver_ml</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span> solver_ml.fit(train_data)
<span class="n">solver_ml</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_uc_model</span><span class="p">)</span> solver_ml.optimize(test_data[0], build_uc_model)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -654,9 +656,9 @@ User-callback calls 193, time in user-callback 0.00 sec
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">solver_baseline</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span><span class="n">components</span><span class="o">=</span><span class="p">[])</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>solver_baseline = LearningSolver(components=[])
<span class="n">solver_baseline</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span> solver_baseline.fit(train_data)
<span class="n">solver_baseline</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_uc_model</span><span class="p">);</span> solver_baseline.optimize(test_data[0], build_uc_model);
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -747,20 +749,20 @@ User-callback calls 708, time in user-callback 0.00 sec
</pre></div></div> </pre></div></div>
</div> </div>
<p>In the log above, the <code class="docutils literal notranslate"><span class="pre">MIP</span> <span class="pre">start</span></code> line is missing, and Gurobi had to start with a significantly inferior initial solution. The solver was still able to find the optimal solution at the end, but it required using its own internal heuristic procedures. In this example, because we solve very small optimization problems, there was almost no difference in terms of running time, but the difference can be significant for larger problems.</p> <p>In the log above, the <code class="docutils literal notranslate"><span class="pre">MIP</span> <span class="pre">start</span></code> line is missing, and Gurobi had to start with a significantly inferior initial solution. The solver was still able to find the optimal solution at the end, but it required using its own internal heuristic procedures. In this example, because we solve very small optimization problems, there was almost no difference in terms of running time, but the difference can be significant for larger problems.</p>
</section> </div>
<section id="Accessing-the-solution"> <div class="section" id="Accessing-the-solution">
<h2><span class="section-number">2.6. </span>Accessing the solution<a class="headerlink" href="#Accessing-the-solution" title="Link to this heading"></a></h2> <h2><span class="section-number">2.6. </span>Accessing the solution<a class="headerlink" href="#Accessing-the-solution" title="Permalink to this headline"></a></h2>
<p>In the example above, we used <code class="docutils literal notranslate"><span class="pre">LearningSolver.solve</span></code> together with data files to solve both the training and the test instances. In the following example, we show how to build and solve a Pyomo model entirely in-memory, using our trained solver.</p> <p>In the example above, we used <code class="docutils literal notranslate"><span class="pre">LearningSolver.solve</span></code> together with data files to solve both the training and the test instances. In the following example, we show how to build and solve a Pyomo model entirely in-memory, using our trained solver.</p>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">data</span> <span class="o">=</span> <span class="n">random_uc_data</span><span class="p">(</span><span class="n">samples</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">500</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>data = random_uc_data(samples=1, n=500)[0]
<span class="n">model</span> <span class="o">=</span> <span class="n">build_uc_model</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> model = build_uc_model(data)
<span class="n">solver_ml</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">model</span><span class="p">)</span> solver_ml.optimize(model)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;obj =&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">objVal</span><span class="p">)</span> print(&quot;obj =&quot;, model.inner.objVal)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">_x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">x</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)])</span> print(&quot;x =&quot;, [model.inner._x[i].x for i in range(3)])
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">_y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">x</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)])</span> print(&quot;y =&quot;, [model.inner._y[i].x for i in range(3)])
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -855,8 +857,8 @@ y = [935662.0949262811, 1604270.0218116897, 0.0]
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
</div> </div>

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>3. Getting started (JuMP) &#8212; MIPLearn 0.4</title> <title>3. Getting started (JuMP) &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,28 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="4. User cuts and lazy constraints" href="../cuts-gurobipy/" /> <link rel="next" title="4. User cuts and lazy constraints" href="../cuts-gurobipy/" />
@ -68,7 +75,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +102,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +134,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -266,10 +273,10 @@
<div> <div>
<section id="Getting-started-(JuMP)"> <div class="section" id="Getting-started-(JuMP)">
<h1><span class="section-number">3. </span>Getting started (JuMP)<a class="headerlink" href="#Getting-started-(JuMP)" title="Link to this heading"></a></h1> <h1><span class="section-number">3. </span>Getting started (JuMP)<a class="headerlink" href="#Getting-started-(JuMP)" title="Permalink to this headline"></a></h1>
<section id="Introduction"> <div class="section" id="Introduction">
<h2><span class="section-number">3.1. </span>Introduction<a class="headerlink" href="#Introduction" title="Link to this heading"></a></h2> <h2><span class="section-number">3.1. </span>Introduction<a class="headerlink" href="#Introduction" title="Permalink to this headline"></a></h2>
<p><strong>MIPLearn</strong> is an open source framework that uses machine learning (ML) to accelerate the performance of mixed-integer programming solvers (e.g. Gurobi, CPLEX, XPRESS). In this tutorial, we will:</p> <p><strong>MIPLearn</strong> is an open source framework that uses machine learning (ML) to accelerate the performance of mixed-integer programming solvers (e.g. Gurobi, CPLEX, XPRESS). In this tutorial, we will:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Install the Julia/JuMP version of MIPLearn</p></li> <li><p>Install the Julia/JuMP version of MIPLearn</p></li>
@ -281,9 +288,9 @@
<p class="admonition-title">Warning</p> <p class="admonition-title">Warning</p>
<p>MIPLearn is still in early development stage. If run into any bugs or issues, please submit a bug report in our GitHub repository. Comments, suggestions and pull requests are also very welcome!</p> <p>MIPLearn is still in early development stage. If run into any bugs or issues, please submit a bug report in our GitHub repository. Comments, suggestions and pull requests are also very welcome!</p>
</div> </div>
</section> </div>
<section id="Installation"> <div class="section" id="Installation">
<h2><span class="section-number">3.2. </span>Installation<a class="headerlink" href="#Installation" title="Link to this heading"></a></h2> <h2><span class="section-number">3.2. </span>Installation<a class="headerlink" href="#Installation" title="Permalink to this headline"></a></h2>
<p>MIPLearn is available in two versions:</p> <p>MIPLearn is available in two versions:</p>
<ul class="simple"> <ul class="simple">
<li><p>Python version, compatible with the Pyomo and Gurobipy modeling languages,</p></li> <li><p>Python version, compatible with the Pyomo and Gurobipy modeling languages,</p></li>
@ -311,9 +318,9 @@
<li><p>In the code above, we install specific version of all packages to ensure that this tutorial keeps running in the future, even when newer (and possibly incompatible) versions of the packages are released. This is usually a recommended practice for all Julia projects.</p></li> <li><p>In the code above, we install specific version of all packages to ensure that this tutorial keeps running in the future, even when newer (and possibly incompatible) versions of the packages are released. This is usually a recommended practice for all Julia projects.</p></li>
</ul> </ul>
</div> </div>
</section> </div>
<section id="Modeling-a-simple-optimization-problem"> <div class="section" id="Modeling-a-simple-optimization-problem">
<h2><span class="section-number">3.3. </span>Modeling a simple optimization problem<a class="headerlink" href="#Modeling-a-simple-optimization-problem" title="Link to this heading"></a></h2> <h2><span class="section-number">3.3. </span>Modeling a simple optimization problem<a class="headerlink" href="#Modeling-a-simple-optimization-problem" title="Permalink to this headline"></a></h2>
<p>To illustrate how can MIPLearn be used, we will model and solve a small optimization problem related to power systems optimization. The problem we discuss below is a simplification of the <strong>unit commitment problem,</strong> a practical optimization problem solved daily by electric grid operators around the world.</p> <p>To illustrate how can MIPLearn be used, we will model and solve a small optimization problem related to power systems optimization. The problem we discuss below is a simplification of the <strong>unit commitment problem,</strong> a practical optimization problem solved daily by electric grid operators around the world.</p>
<p>Suppose that a utility company needs to decide which electrical generators should be online at each hour of the day, as well as how much power should each generator produce. More specifically, assume that the company owns <span class="math notranslate nohighlight">\(n\)</span> generators, denoted by <span class="math notranslate nohighlight">\(g_1, \ldots, g_n\)</span>. Each generator can either be online or offline. An online generator <span class="math notranslate nohighlight">\(g_i\)</span> can produce between <span class="math notranslate nohighlight">\(p^\text{min}_i\)</span> to <span class="math notranslate nohighlight">\(p^\text{max}_i\)</span> megawatts of power, and it costs the company <p>Suppose that a utility company needs to decide which electrical generators should be online at each hour of the day, as well as how much power should each generator produce. More specifically, assume that the company owns <span class="math notranslate nohighlight">\(n\)</span> generators, denoted by <span class="math notranslate nohighlight">\(g_1, \ldots, g_n\)</span>. Each generator can either be online or offline. An online generator <span class="math notranslate nohighlight">\(g_i\)</span> can produce between <span class="math notranslate nohighlight">\(p^\text{min}_i\)</span> to <span class="math notranslate nohighlight">\(p^\text{max}_i\)</span> megawatts of power, and it costs the company
<span class="math notranslate nohighlight">\(c^\text{fix}_i + c^\text{var}_i y_i\)</span>, where <span class="math notranslate nohighlight">\(y_i\)</span> is the amount of power produced. An offline generator produces nothing and costs nothing. The total amount of power to be produced needs to be exactly equal to the total demand <span class="math notranslate nohighlight">\(d\)</span> (in megawatts).</p> <span class="math notranslate nohighlight">\(c^\text{fix}_i + c^\text{var}_i y_i\)</span>, where <span class="math notranslate nohighlight">\(y_i\)</span> is the amount of power produced. An offline generator produces nothing and costs nothing. The total amount of power to be produced needs to be exactly equal to the total demand <span class="math notranslate nohighlight">\(d\)</span> (in megawatts).</p>
@ -447,9 +454,9 @@ Vector(value.(model.inner[:y])) = [0.0, 60.0, 40.0]
<li><p>In the example above, <code class="docutils literal notranslate"><span class="pre">JumpModel</span></code> is just a thin wrapper around a standard JuMP model. This wrapper allows MIPLearn to be solver- and modeling-language-agnostic. The wrapper provides only a few basic methods, such as <code class="docutils literal notranslate"><span class="pre">optimize</span></code>. For more control, and to query the solution, the original JuMP model can be accessed through <code class="docutils literal notranslate"><span class="pre">model.inner</span></code>, as illustrated above.</p></li> <li><p>In the example above, <code class="docutils literal notranslate"><span class="pre">JumpModel</span></code> is just a thin wrapper around a standard JuMP model. This wrapper allows MIPLearn to be solver- and modeling-language-agnostic. The wrapper provides only a few basic methods, such as <code class="docutils literal notranslate"><span class="pre">optimize</span></code>. For more control, and to query the solution, the original JuMP model can be accessed through <code class="docutils literal notranslate"><span class="pre">model.inner</span></code>, as illustrated above.</p></li>
</ul> </ul>
</div> </div>
</section> </div>
<section id="Generating-training-data"> <div class="section" id="Generating-training-data">
<h2><span class="section-number">3.4. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Link to this heading"></a></h2> <h2><span class="section-number">3.4. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Permalink to this headline"></a></h2>
<p>Although Gurobi could solve the small example above in a fraction of a second, it gets slower for larger and more complex versions of the problem. If this is a problem that needs to be solved frequently, as it is often the case in practice, it could make sense to spend some time upfront generating a <strong>trained</strong> solver, which can optimize new instances (similar to the ones it was trained on) faster.</p> <p>Although Gurobi could solve the small example above in a fraction of a second, it gets slower for larger and more complex versions of the problem. If this is a problem that needs to be solved frequently, as it is often the case in practice, it could make sense to spend some time upfront generating a <strong>trained</strong> solver, which can optimize new instances (similar to the ones it was trained on) faster.</p>
<p>In the following, we will use MIPLearn to train machine learning models that is able to predict the optimal solution for instances that follow a given probability distribution, then it will provide this predicted solution to Gurobi as a warm start. Before we can train the model, we need to collect training data by solving a large number of instances. In real-world situations, we may construct these training instances based on historical data. In this tutorial, we will construct them using a <p>In the following, we will use MIPLearn to train machine learning models that is able to predict the optimal solution for instances that follow a given probability distribution, then it will provide this predicted solution to Gurobi as a warm start. Before we can train the model, we need to collect training data by solving a large number of instances. In real-world situations, we may construct these training instances based on historical data. In this tutorial, we will construct them using a
random instance generator:</p> random instance generator:</p>
@ -506,9 +513,9 @@ machines. The code below generates the files <code class="docutils literal notra
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
<section id="Training-and-solving-test-instances"> <div class="section" id="Training-and-solving-test-instances">
<h2><span class="section-number">3.5. </span>Training and solving test instances<a class="headerlink" href="#Training-and-solving-test-instances" title="Link to this heading"></a></h2> <h2><span class="section-number">3.5. </span>Training and solving test instances<a class="headerlink" href="#Training-and-solving-test-instances" title="Permalink to this headline"></a></h2>
<p>With training data in hand, we can now design and train a machine learning model to accelerate solver performance. In this tutorial, for illustration purposes, we will use ML to generate a good warm start using <span class="math notranslate nohighlight">\(k\)</span>-nearest neighbors. More specifically, the strategy is to:</p> <p>With training data in hand, we can now design and train a machine learning model to accelerate solver performance. In this tutorial, for illustration purposes, we will use ML to generate a good warm start using <span class="math notranslate nohighlight">\(k\)</span>-nearest neighbors. More specifically, the strategy is to:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Memorize the optimal solutions of all training instances;</p></li> <li><p>Memorize the optimal solutions of all training instances;</p></li>
@ -655,9 +662,9 @@ User-callback calls 204, time in user-callback 0.00 sec
</pre></div></div> </pre></div></div>
</div> </div>
<p>In the log above, the <code class="docutils literal notranslate"><span class="pre">MIP</span> <span class="pre">start</span></code> line is missing, and Gurobi had to start with a significantly inferior initial solution. The solver was still able to find the optimal solution at the end, but it required using its own internal heuristic procedures. In this example, because we solve very small optimization problems, there was almost no difference in terms of running time, but the difference can be significant for larger problems.</p> <p>In the log above, the <code class="docutils literal notranslate"><span class="pre">MIP</span> <span class="pre">start</span></code> line is missing, and Gurobi had to start with a significantly inferior initial solution. The solver was still able to find the optimal solution at the end, but it required using its own internal heuristic procedures. In this example, because we solve very small optimization problems, there was almost no difference in terms of running time, but the difference can be significant for larger problems.</p>
</section> </div>
<section id="Accessing-the-solution"> <div class="section" id="Accessing-the-solution">
<h2><span class="section-number">3.6. </span>Accessing the solution<a class="headerlink" href="#Accessing-the-solution" title="Link to this heading"></a></h2> <h2><span class="section-number">3.6. </span>Accessing the solution<a class="headerlink" href="#Accessing-the-solution" title="Permalink to this headline"></a></h2>
<p>In the example above, we used <code class="docutils literal notranslate"><span class="pre">LearningSolver.solve</span></code> together with data files to solve both the training and the test instances. In the following example, we show how to build and solve a JuMP model entirely in-memory, using our trained solver.</p> <p>In the example above, we used <code class="docutils literal notranslate"><span class="pre">LearningSolver.solve</span></code> together with data files to solve both the training and the test instances. In the following example, we show how to build and solve a JuMP model entirely in-memory, using our trained solver.</p>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
@ -718,8 +725,8 @@ User-callback calls 182, time in user-callback 0.00 sec
objective_value(model.inner) = 9.866096485613789e9 objective_value(model.inner) = 9.866096485613789e9
</pre></div></div> </pre></div></div>
</div> </div>
</section> </div>
</section> </div>
</div> </div>

@ -45,16 +45,10 @@
"- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n", "- Python version, compatible with the Pyomo and Gurobipy modeling languages,\n",
"- Julia version, compatible with the JuMP modeling language.\n", "- Julia version, compatible with the JuMP modeling language.\n",
"\n", "\n",
"In this tutorial, we will demonstrate how to use and install the Python/Pyomo version of the package. The first step is to install Python 3.8+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n", "In this tutorial, we will demonstrate how to use and install the Python/Pyomo version of the package. The first step is to install Python 3.9+ in your computer. See the [official Python website for more instructions](https://www.python.org/downloads/). After Python is installed, we proceed to install MIPLearn using `pip`:\n",
"\n", "\n",
"```\n", "```\n",
"$ pip install MIPLearn==0.4\n", "$ pip install MIPLearn~=0.4\n",
"```\n",
"\n",
"In addition to MIPLearn itself, we will also install Gurobi 10.0, a state-of-the-art commercial MILP solver. This step also install a demo license for Gurobi, which should able to solve the small optimization problems in this tutorial. A license is required for solving larger-scale problems.\n",
"\n",
"```\n",
"$ pip install 'gurobipy>=10,<10.1'\n",
"```" "```"
] ]
}, },

@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-content_root="../../"> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>1. Getting started (Pyomo) &#8212; MIPLearn 0.4</title> <title>1. Getting started (Pyomo) &#8212; MIPLearn 0.4</title>
<link href="../../_static/css/theme.css" rel="stylesheet" /> <link href="../../_static/css/theme.css" rel="stylesheet" />
@ -22,21 +22,29 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=362ab14a" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css?v=b0dfe17c" /> <link rel="stylesheet" href="../../_static/sphinx-book-theme.acff12b8f9c144ce68a297486a2fa670.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css?v=2aa19091" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css?v=f8244a84" /> <link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/nbsphinx-code-cells.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js"> <link rel="preload" as="script" href="../../_static/js/index.1c5a1a01449ed65a7b51.js">
<script src="../../_static/documentation_options.js?v=751a5dd3"></script> <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js?v=888ff710"></script> <script src="../../_static/jquery.js"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js?v=7c4c3336"></script> <script src="../../_static/sphinx-book-theme.12a9622fbb08dcb3a2a40b2c02b83a57.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script> <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["\\(", "\\)"]], "displayMath": [["\\[", "\\]"]], "processRefs": false, "processEnvironments": false}})</script>
<script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<link rel="index" title="Index" href="../../genindex/" /> <link rel="index" title="Index" href="../../genindex/" />
<link rel="search" title="Search" href="../../search/" /> <link rel="search" title="Search" href="../../search/" />
<link rel="next" title="2. Getting started (Gurobipy)" href="../getting-started-gurobipy/" /> <link rel="next" title="2. Getting started (Gurobipy)" href="../getting-started-gurobipy/" />
@ -68,7 +76,7 @@
<input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" > <input type="search" class="form-control" name="q" id="search-input" placeholder="Search the docs ..." aria-label="Search the docs ..." autocomplete="off" >
</form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation"> </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main navigation">
<div class="bd-toc-item active"> <div class="bd-toc-item active">
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Tutorials Tutorials
</span> </span>
@ -95,7 +103,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
User Guide User Guide
</span> </span>
@ -127,7 +135,7 @@
</a> </a>
</li> </li>
</ul> </ul>
<p class="caption" role="heading"> <p class="caption">
<span class="caption-text"> <span class="caption-text">
Python API Reference Python API Reference
</span> </span>
@ -266,10 +274,10 @@
<div> <div>
<section id="Getting-started-(Pyomo)"> <div class="section" id="Getting-started-(Pyomo)">
<h1><span class="section-number">1. </span>Getting started (Pyomo)<a class="headerlink" href="#Getting-started-(Pyomo)" title="Link to this heading"></a></h1> <h1><span class="section-number">1. </span>Getting started (Pyomo)<a class="headerlink" href="#Getting-started-(Pyomo)" title="Permalink to this headline"></a></h1>
<section id="Introduction"> <div class="section" id="Introduction">
<h2><span class="section-number">1.1. </span>Introduction<a class="headerlink" href="#Introduction" title="Link to this heading"></a></h2> <h2><span class="section-number">1.1. </span>Introduction<a class="headerlink" href="#Introduction" title="Permalink to this headline"></a></h2>
<p><strong>MIPLearn</strong> is an open source framework that uses machine learning (ML) to accelerate the performance of mixed-integer programming solvers (e.g. Gurobi, CPLEX, XPRESS). In this tutorial, we will:</p> <p><strong>MIPLearn</strong> is an open source framework that uses machine learning (ML) to accelerate the performance of mixed-integer programming solvers (e.g. Gurobi, CPLEX, XPRESS). In this tutorial, we will:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Install the Python/Pyomo version of MIPLearn</p></li> <li><p>Install the Python/Pyomo version of MIPLearn</p></li>
@ -285,29 +293,25 @@
<p class="admonition-title">Warning</p> <p class="admonition-title">Warning</p>
<p>MIPLearn is still in early development stage. If run into any bugs or issues, please submit a bug report in our GitHub repository. Comments, suggestions and pull requests are also very welcome!</p> <p>MIPLearn is still in early development stage. If run into any bugs or issues, please submit a bug report in our GitHub repository. Comments, suggestions and pull requests are also very welcome!</p>
</div> </div>
</section> </div>
<section id="Installation"> <div class="section" id="Installation">
<h2><span class="section-number">1.2. </span>Installation<a class="headerlink" href="#Installation" title="Link to this heading"></a></h2> <h2><span class="section-number">1.2. </span>Installation<a class="headerlink" href="#Installation" title="Permalink to this headline"></a></h2>
<p>MIPLearn is available in two versions:</p> <p>MIPLearn is available in two versions:</p>
<ul class="simple"> <ul class="simple">
<li><p>Python version, compatible with the Pyomo and Gurobipy modeling languages,</p></li> <li><p>Python version, compatible with the Pyomo and Gurobipy modeling languages,</p></li>
<li><p>Julia version, compatible with the JuMP modeling language.</p></li> <li><p>Julia version, compatible with the JuMP modeling language.</p></li>
</ul> </ul>
<p>In this tutorial, we will demonstrate how to use and install the Python/Pyomo version of the package. The first step is to install Python 3.8+ in your computer. See the <a class="reference external" href="https://www.python.org/downloads/">official Python website for more instructions</a>. After Python is installed, we proceed to install MIPLearn using <code class="docutils literal notranslate"><span class="pre">pip</span></code>:</p> <p>In this tutorial, we will demonstrate how to use and install the Python/Pyomo version of the package. The first step is to install Python 3.9+ in your computer. See the <a class="reference external" href="https://www.python.org/downloads/">official Python website for more instructions</a>. After Python is installed, we proceed to install MIPLearn using <code class="docutils literal notranslate"><span class="pre">pip</span></code>:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ pip install MIPLearn==0.4 <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ pip install MIPLearn~=0.4
</pre></div>
</div>
<p>In addition to MIPLearn itself, we will also install Gurobi 10.0, a state-of-the-art commercial MILP solver. This step also install a demo license for Gurobi, which should able to solve the small optimization problems in this tutorial. A license is required for solving larger-scale problems.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$ pip install &#39;gurobipy&gt;=10,&lt;10.1&#39;
</pre></div> </pre></div>
</div> </div>
<div class="admonition note"> <div class="admonition note">
<p class="admonition-title">Note</p> <p class="admonition-title">Note</p>
<p>In the code above, we install specific version of all packages to ensure that this tutorial keeps running in the future, even when newer (and possibly incompatible) versions of the packages are released. This is usually a recommended practice for all Python projects.</p> <p>In the code above, we install specific version of all packages to ensure that this tutorial keeps running in the future, even when newer (and possibly incompatible) versions of the packages are released. This is usually a recommended practice for all Python projects.</p>
</div> </div>
</section> </div>
<section id="Modeling-a-simple-optimization-problem"> <div class="section" id="Modeling-a-simple-optimization-problem">
<h2><span class="section-number">1.3. </span>Modeling a simple optimization problem<a class="headerlink" href="#Modeling-a-simple-optimization-problem" title="Link to this heading"></a></h2> <h2><span class="section-number">1.3. </span>Modeling a simple optimization problem<a class="headerlink" href="#Modeling-a-simple-optimization-problem" title="Permalink to this headline"></a></h2>
<p>To illustrate how can MIPLearn be used, we will model and solve a small optimization problem related to power systems optimization. The problem we discuss below is a simplification of the <strong>unit commitment problem,</strong> a practical optimization problem solved daily by electric grid operators around the world.</p> <p>To illustrate how can MIPLearn be used, we will model and solve a small optimization problem related to power systems optimization. The problem we discuss below is a simplification of the <strong>unit commitment problem,</strong> a practical optimization problem solved daily by electric grid operators around the world.</p>
<p>Suppose that a utility company needs to decide which electrical generators should be online at each hour of the day, as well as how much power should each generator produce. More specifically, assume that the company owns <span class="math notranslate nohighlight">\(n\)</span> generators, denoted by <span class="math notranslate nohighlight">\(g_1, \ldots, g_n\)</span>. Each generator can either be online or offline. An online generator <span class="math notranslate nohighlight">\(g_i\)</span> can produce between <span class="math notranslate nohighlight">\(p^\text{min}_i\)</span> to <span class="math notranslate nohighlight">\(p^\text{max}_i\)</span> megawatts of power, and it costs the company <p>Suppose that a utility company needs to decide which electrical generators should be online at each hour of the day, as well as how much power should each generator produce. More specifically, assume that the company owns <span class="math notranslate nohighlight">\(n\)</span> generators, denoted by <span class="math notranslate nohighlight">\(g_1, \ldots, g_n\)</span>. Each generator can either be online or offline. An online generator <span class="math notranslate nohighlight">\(g_i\)</span> can produce between <span class="math notranslate nohighlight">\(p^\text{min}_i\)</span> to <span class="math notranslate nohighlight">\(p^\text{max}_i\)</span> megawatts of power, and it costs the company
<span class="math notranslate nohighlight">\(c^\text{fix}_i + c^\text{var}_i y_i\)</span>, where <span class="math notranslate nohighlight">\(y_i\)</span> is the amount of power produced. An offline generator produces nothing and costs nothing. The total amount of power to be produced needs to be exactly equal to the total demand <span class="math notranslate nohighlight">\(d\)</span> (in megawatts).</p> <span class="math notranslate nohighlight">\(c^\text{fix}_i + c^\text{var}_i y_i\)</span>, where <span class="math notranslate nohighlight">\(y_i\)</span> is the amount of power produced. An offline generator produces nothing and costs nothing. The total amount of power to be produced needs to be exactly equal to the total demand <span class="math notranslate nohighlight">\(d\)</span> (in megawatts).</p>
@ -330,19 +334,19 @@
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from dataclasses import dataclass
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span> from typing import List
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> import numpy as np
<span class="nd">@dataclass</span> @dataclass
<span class="k">class</span> <span class="nc">UnitCommitmentData</span><span class="p">:</span> class UnitCommitmentData:
<span class="n">demand</span><span class="p">:</span> <span class="nb">float</span> demand: float
<span class="n">pmin</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> pmin: List[float]
<span class="n">pmax</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> pmax: List[float]
<span class="n">cfix</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> cfix: List[float]
<span class="n">cvar</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> cvar: List[float]
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -351,34 +355,34 @@
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pyomo.environ</span> <span class="k">as</span> <span class="nn">pe</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>import pyomo.environ as pe
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Union</span> from typing import Union
<span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">read_pkl_gz</span> from miplearn.io import read_pkl_gz
<span class="kn">from</span> <span class="nn">miplearn.solvers.pyomo</span> <span class="kn">import</span> <span class="n">PyomoModel</span> from miplearn.solvers.pyomo import PyomoModel
<span class="k">def</span> <span class="nf">build_uc_model</span><span class="p">(</span><span class="n">data</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">UnitCommitmentData</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">PyomoModel</span><span class="p">:</span> def build_uc_model(data: Union[str, UnitCommitmentData]) -&gt; PyomoModel:
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> if isinstance(data, str):
<span class="n">data</span> <span class="o">=</span> <span class="n">read_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> data = read_pkl_gz(data)
<span class="n">model</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">ConcreteModel</span><span class="p">()</span> model = pe.ConcreteModel()
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">pmin</span><span class="p">)</span> n = len(data.pmin)
<span class="n">model</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">Var</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">),</span> <span class="n">domain</span><span class="o">=</span><span class="n">pe</span><span class="o">.</span><span class="n">Binary</span><span class="p">)</span> model.x = pe.Var(range(n), domain=pe.Binary)
<span class="n">model</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">Var</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">),</span> <span class="n">domain</span><span class="o">=</span><span class="n">pe</span><span class="o">.</span><span class="n">NonNegativeReals</span><span class="p">)</span> model.y = pe.Var(range(n), domain=pe.NonNegativeReals)
<span class="n">model</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">Objective</span><span class="p">(</span> model.obj = pe.Objective(
<span class="n">expr</span><span class="o">=</span><span class="nb">sum</span><span class="p">(</span> expr=sum(
<span class="n">data</span><span class="o">.</span><span class="n">cfix</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">model</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">data</span><span class="o">.</span><span class="n">cvar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">model</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> data.cfix[i] * model.x[i] + data.cvar[i] * model.y[i] for i in range(n)
<span class="p">)</span> )
<span class="p">)</span> )
<span class="n">model</span><span class="o">.</span><span class="n">eq_max_power</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">ConstraintList</span><span class="p">()</span> model.eq_max_power = pe.ConstraintList()
<span class="n">model</span><span class="o">.</span><span class="n">eq_min_power</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">ConstraintList</span><span class="p">()</span> model.eq_min_power = pe.ConstraintList()
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> for i in range(n):
<span class="n">model</span><span class="o">.</span><span class="n">eq_max_power</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">data</span><span class="o">.</span><span class="n">pmax</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">model</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> model.eq_max_power.add(model.y[i] &lt;= data.pmax[i] * model.x[i])
<span class="n">model</span><span class="o">.</span><span class="n">eq_min_power</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">data</span><span class="o">.</span><span class="n">pmin</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">model</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> model.eq_min_power.add(model.y[i] &gt;= data.pmin[i] * model.x[i])
<span class="n">model</span><span class="o">.</span><span class="n">eq_demand</span> <span class="o">=</span> <span class="n">pe</span><span class="o">.</span><span class="n">Constraint</span><span class="p">(</span> model.eq_demand = pe.Constraint(
<span class="n">expr</span><span class="o">=</span><span class="nb">sum</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> <span class="o">==</span> <span class="n">data</span><span class="o">.</span><span class="n">demand</span><span class="p">,</span> expr=sum(model.y[i] for i in range(n)) == data.demand,
<span class="p">)</span> )
<span class="k">return</span> <span class="n">PyomoModel</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;gurobi_persistent&quot;</span><span class="p">)</span> return PyomoModel(model, &quot;gurobi_persistent&quot;)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -387,20 +391,20 @@
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">model</span> <span class="o">=</span> <span class="n">build_uc_model</span><span class="p">(</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>model = build_uc_model(
<span class="n">UnitCommitmentData</span><span class="p">(</span> UnitCommitmentData(
<span class="n">demand</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span> demand=100.0,
<span class="n">pmin</span><span class="o">=</span><span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">],</span> pmin=[10, 20, 30],
<span class="n">pmax</span><span class="o">=</span><span class="p">[</span><span class="mi">50</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">70</span><span class="p">],</span> pmax=[50, 60, 70],
<span class="n">cfix</span><span class="o">=</span><span class="p">[</span><span class="mi">700</span><span class="p">,</span> <span class="mi">600</span><span class="p">,</span> <span class="mi">500</span><span class="p">],</span> cfix=[700, 600, 500],
<span class="n">cvar</span><span class="o">=</span><span class="p">[</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">],</span> cvar=[1.5, 2.0, 2.5],
<span class="p">)</span> )
<span class="p">)</span> )
<span class="n">model</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span> model.optimize()
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;obj =&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">obj</span><span class="p">())</span> print(&quot;obj =&quot;, model.inner.obj())
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;x =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)])</span> print(&quot;x =&quot;, [model.inner.x[i].value for i in range(3)])
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)])</span> print(&quot;y =&quot;, [model.inner.y[i].value for i in range(3)])
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -461,9 +465,9 @@ y = [0.0, 60.0, 40.0]
<li><p>To use CPLEX or XPRESS, instead of Gurobi, replace <code class="docutils literal notranslate"><span class="pre">gurobi_persistent</span></code> by <code class="docutils literal notranslate"><span class="pre">cplex_persistent</span></code> or <code class="docutils literal notranslate"><span class="pre">xpress_persistent</span></code> in the <code class="docutils literal notranslate"><span class="pre">build_uc_model</span></code>. Note that only persistent Pyomo solvers are currently supported. Pull requests adding support for other types of solver are very welcome.</p></li> <li><p>To use CPLEX or XPRESS, instead of Gurobi, replace <code class="docutils literal notranslate"><span class="pre">gurobi_persistent</span></code> by <code class="docutils literal notranslate"><span class="pre">cplex_persistent</span></code> or <code class="docutils literal notranslate"><span class="pre">xpress_persistent</span></code> in the <code class="docutils literal notranslate"><span class="pre">build_uc_model</span></code>. Note that only persistent Pyomo solvers are currently supported. Pull requests adding support for other types of solver are very welcome.</p></li>
</ul> </ul>
</div> </div>
</section> </div>
<section id="Generating-training-data"> <div class="section" id="Generating-training-data">
<h2><span class="section-number">1.4. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Link to this heading"></a></h2> <h2><span class="section-number">1.4. </span>Generating training data<a class="headerlink" href="#Generating-training-data" title="Permalink to this headline"></a></h2>
<p>Although Gurobi could solve the small example above in a fraction of a second, it gets slower for larger and more complex versions of the problem. If this is a problem that needs to be solved frequently, as it is often the case in practice, it could make sense to spend some time upfront generating a <strong>trained</strong> solver, which can optimize new instances (similar to the ones it was trained on) faster.</p> <p>Although Gurobi could solve the small example above in a fraction of a second, it gets slower for larger and more complex versions of the problem. If this is a problem that needs to be solved frequently, as it is often the case in practice, it could make sense to spend some time upfront generating a <strong>trained</strong> solver, which can optimize new instances (similar to the ones it was trained on) faster.</p>
<p>In the following, we will use MIPLearn to train machine learning models that is able to predict the optimal solution for instances that follow a given probability distribution, then it will provide this predicted solution to Gurobi as a warm start. Before we can train the model, we need to collect training data by solving a large number of instances. In real-world situations, we may construct these training instances based on historical data. In this tutorial, we will construct them using a <p>In the following, we will use MIPLearn to train machine learning models that is able to predict the optimal solution for instances that follow a given probability distribution, then it will provide this predicted solution to Gurobi as a warm start. Before we can train the model, we need to collect training data by solving a large number of instances. In real-world situations, we may construct these training instances based on historical data. In this tutorial, we will construct them using a
random instance generator:</p> random instance generator:</p>
@ -471,28 +475,28 @@ random instance generator:</p>
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">scipy.stats</span> <span class="kn">import</span> <span class="n">uniform</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from scipy.stats import uniform
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span> from typing import List
<span class="kn">import</span> <span class="nn">random</span> import random
<span class="k">def</span> <span class="nf">random_uc_data</span><span class="p">(</span><span class="n">samples</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">seed</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">42</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">UnitCommitmentData</span><span class="p">]:</span> def random_uc_data(samples: int, n: int, seed: int = 42) -&gt; List[UnitCommitmentData]:
<span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span> random.seed(seed)
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span> np.random.seed(seed)
<span class="n">pmin</span> <span class="o">=</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">100_000.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">400_000.0</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> pmin = uniform(loc=100_000.0, scale=400_000.0).rvs(n)
<span class="n">pmax</span> <span class="o">=</span> <span class="n">pmin</span> <span class="o">*</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">2.5</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> pmax = pmin * uniform(loc=2.0, scale=2.5).rvs(n)
<span class="n">cfix</span> <span class="o">=</span> <span class="n">pmin</span> <span class="o">*</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">100.0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">25.0</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> cfix = pmin * uniform(loc=100.0, scale=25.0).rvs(n)
<span class="n">cvar</span> <span class="o">=</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">1.25</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.25</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> cvar = uniform(loc=1.25, scale=0.25).rvs(n)
<span class="k">return</span> <span class="p">[</span> return [
<span class="n">UnitCommitmentData</span><span class="p">(</span> UnitCommitmentData(
<span class="n">demand</span><span class="o">=</span><span class="n">pmax</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="o">*</span> <span class="n">uniform</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.25</span><span class="p">)</span><span class="o">.</span><span class="n">rvs</span><span class="p">(),</span> demand=pmax.sum() * uniform(loc=0.5, scale=0.25).rvs(),
<span class="n">pmin</span><span class="o">=</span><span class="n">pmin</span><span class="p">,</span> pmin=pmin,
<span class="n">pmax</span><span class="o">=</span><span class="n">pmax</span><span class="p">,</span> pmax=pmax,
<span class="n">cfix</span><span class="o">=</span><span class="n">cfix</span><span class="p">,</span> cfix=cfix,
<span class="n">cvar</span><span class="o">=</span><span class="n">cvar</span><span class="p">,</span> cvar=cvar,
<span class="p">)</span> )
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">samples</span><span class="p">)</span> for _ in range(samples)
<span class="p">]</span> ]
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -503,11 +507,11 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.io</span> <span class="kn">import</span> <span class="n">write_pkl_gz</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.io import write_pkl_gz
<span class="n">data</span> <span class="o">=</span> <span class="n">random_uc_data</span><span class="p">(</span><span class="n">samples</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">500</span><span class="p">)</span> data = random_uc_data(samples=500, n=500)
<span class="n">train_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">450</span><span class="p">],</span> <span class="s2">&quot;uc/train&quot;</span><span class="p">)</span> train_data = write_pkl_gz(data[0:450], &quot;uc/train&quot;)
<span class="n">test_data</span> <span class="o">=</span> <span class="n">write_pkl_gz</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">450</span><span class="p">:</span><span class="mi">500</span><span class="p">],</span> <span class="s2">&quot;uc/test&quot;</span><span class="p">)</span> test_data = write_pkl_gz(data[450:500], &quot;uc/test&quot;)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -516,16 +520,16 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.collectors.basic</span> <span class="kn">import</span> <span class="n">BasicCollector</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.collectors.basic import BasicCollector
<span class="n">bc</span> <span class="o">=</span> <span class="n">BasicCollector</span><span class="p">()</span> bc = BasicCollector()
<span class="n">bc</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="n">train_data</span><span class="p">,</span> <span class="n">build_uc_model</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span> bc.collect(train_data, build_uc_model, n_jobs=4)
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
<section id="Training-and-solving-test-instances"> <div class="section" id="Training-and-solving-test-instances">
<h2><span class="section-number">1.5. </span>Training and solving test instances<a class="headerlink" href="#Training-and-solving-test-instances" title="Link to this heading"></a></h2> <h2><span class="section-number">1.5. </span>Training and solving test instances<a class="headerlink" href="#Training-and-solving-test-instances" title="Permalink to this headline"></a></h2>
<p>With training data in hand, we can now design and train a machine learning model to accelerate solver performance. In this tutorial, for illustration purposes, we will use ML to generate a good warm start using <span class="math notranslate nohighlight">\(k\)</span>-nearest neighbors. More specifically, the strategy is to:</p> <p>With training data in hand, we can now design and train a machine learning model to accelerate solver performance. In this tutorial, for illustration purposes, we will use ML to generate a good warm start using <span class="math notranslate nohighlight">\(k\)</span>-nearest neighbors. More specifically, the strategy is to:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li><p>Memorize the optimal solutions of all training instances;</p></li> <li><p>Memorize the optimal solutions of all training instances;</p></li>
@ -538,22 +542,22 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.neighbors</span> <span class="kn">import</span> <span class="n">KNeighborsClassifier</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from sklearn.neighbors import KNeighborsClassifier
<span class="kn">from</span> <span class="nn">miplearn.components.primal.actions</span> <span class="kn">import</span> <span class="n">SetWarmStart</span> from miplearn.components.primal.actions import SetWarmStart
<span class="kn">from</span> <span class="nn">miplearn.components.primal.mem</span> <span class="kn">import</span> <span class="p">(</span> from miplearn.components.primal.mem import (
<span class="n">MemorizingPrimalComponent</span><span class="p">,</span> MemorizingPrimalComponent,
<span class="n">MergeTopSolutions</span><span class="p">,</span> MergeTopSolutions,
<span class="p">)</span> )
<span class="kn">from</span> <span class="nn">miplearn.extractors.fields</span> <span class="kn">import</span> <span class="n">H5FieldsExtractor</span> from miplearn.extractors.fields import H5FieldsExtractor
<span class="n">comp</span> <span class="o">=</span> <span class="n">MemorizingPrimalComponent</span><span class="p">(</span> comp = MemorizingPrimalComponent(
<span class="n">clf</span><span class="o">=</span><span class="n">KNeighborsClassifier</span><span class="p">(</span><span class="n">n_neighbors</span><span class="o">=</span><span class="mi">25</span><span class="p">),</span> clf=KNeighborsClassifier(n_neighbors=25),
<span class="n">extractor</span><span class="o">=</span><span class="n">H5FieldsExtractor</span><span class="p">(</span> extractor=H5FieldsExtractor(
<span class="n">instance_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;static_constr_rhs&quot;</span><span class="p">],</span> instance_fields=[&quot;static_constr_rhs&quot;],
<span class="p">),</span> ),
<span class="n">constructor</span><span class="o">=</span><span class="n">MergeTopSolutions</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]),</span> constructor=MergeTopSolutions(25, [0.0, 1.0]),
<span class="n">action</span><span class="o">=</span><span class="n">SetWarmStart</span><span class="p">(),</span> action=SetWarmStart(),
<span class="p">)</span> )
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -562,11 +566,11 @@ machines. The code below generates the files <code class="docutils literal notra
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">miplearn.solvers.learning</span> <span class="kn">import</span> <span class="n">LearningSolver</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>from miplearn.solvers.learning import LearningSolver
<span class="n">solver_ml</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span><span class="n">components</span><span class="o">=</span><span class="p">[</span><span class="n">comp</span><span class="p">])</span> solver_ml = LearningSolver(components=[comp])
<span class="n">solver_ml</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span> solver_ml.fit(train_data)
<span class="n">solver_ml</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_uc_model</span><span class="p">)</span> solver_ml.optimize(test_data[0], build_uc_model)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -660,9 +664,9 @@ WARNING: Cannot get duals for MIP.
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">solver_baseline</span> <span class="o">=</span> <span class="n">LearningSolver</span><span class="p">(</span><span class="n">components</span><span class="o">=</span><span class="p">[])</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>solver_baseline = LearningSolver(components=[])
<span class="n">solver_baseline</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">train_data</span><span class="p">)</span> solver_baseline.fit(train_data)
<span class="n">solver_baseline</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">test_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">build_uc_model</span><span class="p">)</span> solver_baseline.optimize(test_data[0], build_uc_model)
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -757,20 +761,20 @@ WARNING: Cannot get duals for MIP.
</pre></div></div> </pre></div></div>
</div> </div>
<p>In the log above, the <code class="docutils literal notranslate"><span class="pre">MIP</span> <span class="pre">start</span></code> line is missing, and Gurobi had to start with a significantly inferior initial solution. The solver was still able to find the optimal solution at the end, but it required using its own internal heuristic procedures. In this example, because we solve very small optimization problems, there was almost no difference in terms of running time, but the difference can be significant for larger problems.</p> <p>In the log above, the <code class="docutils literal notranslate"><span class="pre">MIP</span> <span class="pre">start</span></code> line is missing, and Gurobi had to start with a significantly inferior initial solution. The solver was still able to find the optimal solution at the end, but it required using its own internal heuristic procedures. In this example, because we solve very small optimization problems, there was almost no difference in terms of running time, but the difference can be significant for larger problems.</p>
</section> </div>
<section id="Accessing-the-solution"> <div class="section" id="Accessing-the-solution">
<h2><span class="section-number">1.6. </span>Accessing the solution<a class="headerlink" href="#Accessing-the-solution" title="Link to this heading"></a></h2> <h2><span class="section-number">1.6. </span>Accessing the solution<a class="headerlink" href="#Accessing-the-solution" title="Permalink to this headline"></a></h2>
<p>In the example above, we used <code class="docutils literal notranslate"><span class="pre">LearningSolver.solve</span></code> together with data files to solve both the training and the test instances. In the following example, we show how to build and solve a Pyomo model entirely in-memory, using our trained solver.</p> <p>In the example above, we used <code class="docutils literal notranslate"><span class="pre">LearningSolver.solve</span></code> together with data files to solve both the training and the test instances. In the following example, we show how to build and solve a Pyomo model entirely in-memory, using our trained solver.</p>
<div class="nbinput docutils container"> <div class="nbinput docutils container">
<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: <div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
</pre></div> </pre></div>
</div> </div>
<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">data</span> <span class="o">=</span> <span class="n">random_uc_data</span><span class="p">(</span><span class="n">samples</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">500</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>data = random_uc_data(samples=1, n=500)[0]
<span class="n">model</span> <span class="o">=</span> <span class="n">build_uc_model</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> model = build_uc_model(data)
<span class="n">solver_ml</span><span class="o">.</span><span class="n">optimize</span><span class="p">(</span><span class="n">model</span><span class="p">)</span> solver_ml.optimize(model)
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;obj =&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">obj</span><span class="p">())</span> print(&quot;obj =&quot;, model.inner.obj())
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; x =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">)])</span> print(&quot; x =&quot;, [model.inner.x[i].value for i in range(5)])
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot; y =&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">model</span><span class="o">.</span><span class="n">inner</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">)])</span> print(&quot; y =&quot;, [model.inner.y[i].value for i in range(5)])
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -872,8 +876,8 @@ obj = 8254590409.96973
</pre></div> </pre></div>
</div> </div>
</div> </div>
</section> </div>
</section> </div>
</div> </div>

Loading…
Cancel
Save