You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MIPLearn/0.2/api/miplearn/extractors.html

680 lines
27 KiB

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.0" />
<title>miplearn.extractors API documentation</title>
<meta name="description" content="" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>miplearn.extractors</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python"># MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
import gzip
import logging
import pickle
from abc import ABC, abstractmethod
import numpy as np
from tqdm.auto import tqdm
logger = logging.getLogger(__name__)
class InstanceIterator:
def __init__(self, instances):
self.instances = instances
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current &gt;= len(self.instances):
raise StopIteration
result = self.instances[self.current]
self.current += 1
if isinstance(result, str):
logger.debug(&#34;Read: %s&#34; % result)
try:
if result.endswith(&#34;.gz&#34;):
with gzip.GzipFile(result, &#34;rb&#34;) as file:
result = pickle.load(file)
else:
with open(result, &#34;rb&#34;) as file:
result = pickle.load(file)
except pickle.UnpicklingError:
raise Exception(f&#34;Invalid instance file: {result}&#34;)
return result
class Extractor(ABC):
@abstractmethod
def extract(self, instances):
pass
@staticmethod
def split_variables(instance):
result = {}
lp_solution = instance.training_data[0][&#34;LP solution&#34;]
for var_name in lp_solution:
for index in lp_solution[var_name]:
category = instance.get_variable_category(var_name, index)
if category is None:
continue
if category not in result:
result[category] = []
result[category] += [(var_name, index)]
return result
class VariableFeaturesExtractor(Extractor):
def extract(self, instances):
result = {}
for instance in tqdm(
InstanceIterator(instances),
desc=&#34;Extract (vars)&#34;,
disable=len(instances) &lt; 5,
):
instance_features = instance.get_instance_features()
var_split = self.split_variables(instance)
lp_solution = instance.training_data[0][&#34;LP solution&#34;]
for (category, var_index_pairs) in var_split.items():
if category not in result:
result[category] = []
for (var_name, index) in var_index_pairs:
result[category] += [
instance_features.tolist()
+ instance.get_variable_features(var_name, index).tolist()
+ [lp_solution[var_name][index]]
]
for category in result:
result[category] = np.array(result[category])
return result
class SolutionExtractor(Extractor):
def __init__(self, relaxation=False):
self.relaxation = relaxation
def extract(self, instances):
result = {}
for instance in tqdm(
InstanceIterator(instances),
desc=&#34;Extract (solution)&#34;,
disable=len(instances) &lt; 5,
):
var_split = self.split_variables(instance)
if self.relaxation:
solution = instance.training_data[0][&#34;LP solution&#34;]
else:
solution = instance.training_data[0][&#34;Solution&#34;]
for (category, var_index_pairs) in var_split.items():
if category not in result:
result[category] = []
for (var_name, index) in var_index_pairs:
v = solution[var_name][index]
if v is None:
result[category] += [[0, 0]]
else:
result[category] += [[1 - v, v]]
for category in result:
result[category] = np.array(result[category])
return result
class InstanceFeaturesExtractor(Extractor):
def extract(self, instances):
return np.vstack(
[
np.hstack(
[
instance.get_instance_features(),
instance.training_data[0][&#34;LP value&#34;],
]
)
for instance in InstanceIterator(instances)
]
)
class ObjectiveValueExtractor(Extractor):
def __init__(self, kind=&#34;lp&#34;):
assert kind in [&#34;lower bound&#34;, &#34;upper bound&#34;, &#34;lp&#34;]
self.kind = kind
def extract(self, instances):
if self.kind == &#34;lower bound&#34;:
return np.array(
[
[instance.training_data[0][&#34;Lower bound&#34;]]
for instance in InstanceIterator(instances)
]
)
if self.kind == &#34;upper bound&#34;:
return np.array(
[
[instance.training_data[0][&#34;Upper bound&#34;]]
for instance in InstanceIterator(instances)
]
)
if self.kind == &#34;lp&#34;:
return np.array(
[
[instance.training_data[0][&#34;LP value&#34;]]
for instance in InstanceIterator(instances)
]
)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="miplearn.extractors.Extractor"><code class="flex name class">
<span>class <span class="ident">Extractor</span></span>
<span>(</span><span>*args, **kwargs)</span>
</code></dt>
<dd>
<section class="desc"><p>Helper class that provides a standard way to create an ABC using
inheritance.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class Extractor(ABC):
@abstractmethod
def extract(self, instances):
pass
@staticmethod
def split_variables(instance):
result = {}
lp_solution = instance.training_data[0][&#34;LP solution&#34;]
for var_name in lp_solution:
for index in lp_solution[var_name]:
category = instance.get_variable_category(var_name, index)
if category is None:
continue
if category not in result:
result[category] = []
result[category] += [(var_name, index)]
return result</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li>abc.ABC</li>
</ul>
<h3>Subclasses</h3>
<ul class="hlist">
<li><a title="miplearn.extractors.VariableFeaturesExtractor" href="#miplearn.extractors.VariableFeaturesExtractor">VariableFeaturesExtractor</a></li>
<li><a title="miplearn.extractors.SolutionExtractor" href="#miplearn.extractors.SolutionExtractor">SolutionExtractor</a></li>
<li><a title="miplearn.extractors.InstanceFeaturesExtractor" href="#miplearn.extractors.InstanceFeaturesExtractor">InstanceFeaturesExtractor</a></li>
<li><a title="miplearn.extractors.ObjectiveValueExtractor" href="#miplearn.extractors.ObjectiveValueExtractor">ObjectiveValueExtractor</a></li>
</ul>
<h3>Static methods</h3>
<dl>
<dt id="miplearn.extractors.Extractor.split_variables"><code class="name flex">
<span>def <span class="ident">split_variables</span></span>(<span>instance)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@staticmethod
def split_variables(instance):
result = {}
lp_solution = instance.training_data[0][&#34;LP solution&#34;]
for var_name in lp_solution:
for index in lp_solution[var_name]:
category = instance.get_variable_category(var_name, index)
if category is None:
continue
if category not in result:
result[category] = []
result[category] += [(var_name, index)]
return result</code></pre>
</details>
</dd>
</dl>
<h3>Methods</h3>
<dl>
<dt id="miplearn.extractors.Extractor.extract"><code class="name flex">
<span>def <span class="ident">extract</span></span>(<span>self, instances)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@abstractmethod
def extract(self, instances):
pass</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="miplearn.extractors.InstanceFeaturesExtractor"><code class="flex name class">
<span>class <span class="ident">InstanceFeaturesExtractor</span></span>
<span>(</span><span>*args, **kwargs)</span>
</code></dt>
<dd>
<section class="desc"><p>Helper class that provides a standard way to create an ABC using
inheritance.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class InstanceFeaturesExtractor(Extractor):
def extract(self, instances):
return np.vstack(
[
np.hstack(
[
instance.get_instance_features(),
instance.training_data[0][&#34;LP value&#34;],
]
)
for instance in InstanceIterator(instances)
]
)</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="miplearn.extractors.Extractor" href="#miplearn.extractors.Extractor">Extractor</a></li>
<li>abc.ABC</li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="miplearn.extractors.InstanceFeaturesExtractor.extract"><code class="name flex">
<span>def <span class="ident">extract</span></span>(<span>self, instances)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def extract(self, instances):
return np.vstack(
[
np.hstack(
[
instance.get_instance_features(),
instance.training_data[0][&#34;LP value&#34;],
]
)
for instance in InstanceIterator(instances)
]
)</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="miplearn.extractors.InstanceIterator"><code class="flex name class">
<span>class <span class="ident">InstanceIterator</span></span>
<span>(</span><span>instances)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class InstanceIterator:
def __init__(self, instances):
self.instances = instances
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current &gt;= len(self.instances):
raise StopIteration
result = self.instances[self.current]
self.current += 1
if isinstance(result, str):
logger.debug(&#34;Read: %s&#34; % result)
try:
if result.endswith(&#34;.gz&#34;):
with gzip.GzipFile(result, &#34;rb&#34;) as file:
result = pickle.load(file)
else:
with open(result, &#34;rb&#34;) as file:
result = pickle.load(file)
except pickle.UnpicklingError:
raise Exception(f&#34;Invalid instance file: {result}&#34;)
return result</code></pre>
</details>
</dd>
<dt id="miplearn.extractors.ObjectiveValueExtractor"><code class="flex name class">
<span>class <span class="ident">ObjectiveValueExtractor</span></span>
<span>(</span><span>kind='lp')</span>
</code></dt>
<dd>
<section class="desc"><p>Helper class that provides a standard way to create an ABC using
inheritance.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class ObjectiveValueExtractor(Extractor):
def __init__(self, kind=&#34;lp&#34;):
assert kind in [&#34;lower bound&#34;, &#34;upper bound&#34;, &#34;lp&#34;]
self.kind = kind
def extract(self, instances):
if self.kind == &#34;lower bound&#34;:
return np.array(
[
[instance.training_data[0][&#34;Lower bound&#34;]]
for instance in InstanceIterator(instances)
]
)
if self.kind == &#34;upper bound&#34;:
return np.array(
[
[instance.training_data[0][&#34;Upper bound&#34;]]
for instance in InstanceIterator(instances)
]
)
if self.kind == &#34;lp&#34;:
return np.array(
[
[instance.training_data[0][&#34;LP value&#34;]]
for instance in InstanceIterator(instances)
]
)</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="miplearn.extractors.Extractor" href="#miplearn.extractors.Extractor">Extractor</a></li>
<li>abc.ABC</li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="miplearn.extractors.ObjectiveValueExtractor.extract"><code class="name flex">
<span>def <span class="ident">extract</span></span>(<span>self, instances)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def extract(self, instances):
if self.kind == &#34;lower bound&#34;:
return np.array(
[
[instance.training_data[0][&#34;Lower bound&#34;]]
for instance in InstanceIterator(instances)
]
)
if self.kind == &#34;upper bound&#34;:
return np.array(
[
[instance.training_data[0][&#34;Upper bound&#34;]]
for instance in InstanceIterator(instances)
]
)
if self.kind == &#34;lp&#34;:
return np.array(
[
[instance.training_data[0][&#34;LP value&#34;]]
for instance in InstanceIterator(instances)
]
)</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="miplearn.extractors.SolutionExtractor"><code class="flex name class">
<span>class <span class="ident">SolutionExtractor</span></span>
<span>(</span><span>relaxation=False)</span>
</code></dt>
<dd>
<section class="desc"><p>Helper class that provides a standard way to create an ABC using
inheritance.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class SolutionExtractor(Extractor):
def __init__(self, relaxation=False):
self.relaxation = relaxation
def extract(self, instances):
result = {}
for instance in tqdm(
InstanceIterator(instances),
desc=&#34;Extract (solution)&#34;,
disable=len(instances) &lt; 5,
):
var_split = self.split_variables(instance)
if self.relaxation:
solution = instance.training_data[0][&#34;LP solution&#34;]
else:
solution = instance.training_data[0][&#34;Solution&#34;]
for (category, var_index_pairs) in var_split.items():
if category not in result:
result[category] = []
for (var_name, index) in var_index_pairs:
v = solution[var_name][index]
if v is None:
result[category] += [[0, 0]]
else:
result[category] += [[1 - v, v]]
for category in result:
result[category] = np.array(result[category])
return result</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="miplearn.extractors.Extractor" href="#miplearn.extractors.Extractor">Extractor</a></li>
<li>abc.ABC</li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="miplearn.extractors.SolutionExtractor.extract"><code class="name flex">
<span>def <span class="ident">extract</span></span>(<span>self, instances)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def extract(self, instances):
result = {}
for instance in tqdm(
InstanceIterator(instances),
desc=&#34;Extract (solution)&#34;,
disable=len(instances) &lt; 5,
):
var_split = self.split_variables(instance)
if self.relaxation:
solution = instance.training_data[0][&#34;LP solution&#34;]
else:
solution = instance.training_data[0][&#34;Solution&#34;]
for (category, var_index_pairs) in var_split.items():
if category not in result:
result[category] = []
for (var_name, index) in var_index_pairs:
v = solution[var_name][index]
if v is None:
result[category] += [[0, 0]]
else:
result[category] += [[1 - v, v]]
for category in result:
result[category] = np.array(result[category])
return result</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="miplearn.extractors.VariableFeaturesExtractor"><code class="flex name class">
<span>class <span class="ident">VariableFeaturesExtractor</span></span>
<span>(</span><span>*args, **kwargs)</span>
</code></dt>
<dd>
<section class="desc"><p>Helper class that provides a standard way to create an ABC using
inheritance.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class VariableFeaturesExtractor(Extractor):
def extract(self, instances):
result = {}
for instance in tqdm(
InstanceIterator(instances),
desc=&#34;Extract (vars)&#34;,
disable=len(instances) &lt; 5,
):
instance_features = instance.get_instance_features()
var_split = self.split_variables(instance)
lp_solution = instance.training_data[0][&#34;LP solution&#34;]
for (category, var_index_pairs) in var_split.items():
if category not in result:
result[category] = []
for (var_name, index) in var_index_pairs:
result[category] += [
instance_features.tolist()
+ instance.get_variable_features(var_name, index).tolist()
+ [lp_solution[var_name][index]]
]
for category in result:
result[category] = np.array(result[category])
return result</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="miplearn.extractors.Extractor" href="#miplearn.extractors.Extractor">Extractor</a></li>
<li>abc.ABC</li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="miplearn.extractors.VariableFeaturesExtractor.extract"><code class="name flex">
<span>def <span class="ident">extract</span></span>(<span>self, instances)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def extract(self, instances):
result = {}
for instance in tqdm(
InstanceIterator(instances),
desc=&#34;Extract (vars)&#34;,
disable=len(instances) &lt; 5,
):
instance_features = instance.get_instance_features()
var_split = self.split_variables(instance)
lp_solution = instance.training_data[0][&#34;LP solution&#34;]
for (category, var_index_pairs) in var_split.items():
if category not in result:
result[category] = []
for (var_name, index) in var_index_pairs:
result[category] += [
instance_features.tolist()
+ instance.get_variable_features(var_name, index).tolist()
+ [lp_solution[var_name][index]]
]
for category in result:
result[category] = np.array(result[category])
return result</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="miplearn" href="index.html">miplearn</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="miplearn.extractors.Extractor" href="#miplearn.extractors.Extractor">Extractor</a></code></h4>
<ul class="">
<li><code><a title="miplearn.extractors.Extractor.extract" href="#miplearn.extractors.Extractor.extract">extract</a></code></li>
<li><code><a title="miplearn.extractors.Extractor.split_variables" href="#miplearn.extractors.Extractor.split_variables">split_variables</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="miplearn.extractors.InstanceFeaturesExtractor" href="#miplearn.extractors.InstanceFeaturesExtractor">InstanceFeaturesExtractor</a></code></h4>
<ul class="">
<li><code><a title="miplearn.extractors.InstanceFeaturesExtractor.extract" href="#miplearn.extractors.InstanceFeaturesExtractor.extract">extract</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="miplearn.extractors.InstanceIterator" href="#miplearn.extractors.InstanceIterator">InstanceIterator</a></code></h4>
</li>
<li>
<h4><code><a title="miplearn.extractors.ObjectiveValueExtractor" href="#miplearn.extractors.ObjectiveValueExtractor">ObjectiveValueExtractor</a></code></h4>
<ul class="">
<li><code><a title="miplearn.extractors.ObjectiveValueExtractor.extract" href="#miplearn.extractors.ObjectiveValueExtractor.extract">extract</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="miplearn.extractors.SolutionExtractor" href="#miplearn.extractors.SolutionExtractor">SolutionExtractor</a></code></h4>
<ul class="">
<li><code><a title="miplearn.extractors.SolutionExtractor.extract" href="#miplearn.extractors.SolutionExtractor.extract">extract</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="miplearn.extractors.VariableFeaturesExtractor" href="#miplearn.extractors.VariableFeaturesExtractor">VariableFeaturesExtractor</a></code></h4>
<ul class="">
<li><code><a title="miplearn.extractors.VariableFeaturesExtractor.extract" href="#miplearn.extractors.VariableFeaturesExtractor.extract">extract</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.0</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>