-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinearProblem_8h_source.html
More file actions
170 lines (168 loc) · 12.1 KB
/
Copy pathLinearProblem_8h_source.html
File metadata and controls
170 lines (168 loc) · 12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<!-- This comment will put IE 6, 7 and 8 in quirks mode -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>boa: source/LinearProblem.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javaScript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.6.3 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<img id="MSearchSelect" src="search/search.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</div>
</li>
</ul>
</div>
<div class="tabs">
<ul>
<li><a href="files.html"><span>File List</span></a></li>
</ul>
</div>
<h1>source/LinearProblem.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef __BOA_LINEAR_PROBLEM_H__</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define __BOA_LINEAR_PROBLEM_H__ </span><span class="comment">/* */</span>
<a name="l00003"></a>00003
<a name="l00004"></a>00004 <span class="preprocessor">#include <glpk.h></span>
<a name="l00005"></a>00005 <span class="preprocessor">#include <limits></span>
<a name="l00006"></a>00006 <span class="preprocessor">#include <vector></span>
<a name="l00007"></a>00007 <span class="preprocessor">#include <map></span>
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="keyword">using</span> std::vector;
<a name="l00010"></a>00010 <span class="keyword">using</span> std::map;
<a name="l00011"></a>00011
<a name="l00012"></a>00012 <span class="preprocessor">#include "log.h"</span>
<a name="l00013"></a>00013
<a name="l00014"></a>00014 <span class="preprocessor">#define MINUS_INFTY (std::numeric_limits<int>::min())</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span>
<a name="l00016"></a>00016 <span class="keyword">namespace </span>boa {
<a name="l00017"></a>00017
<a name="l00018"></a><a class="code" href="classboa_1_1LinearProblem.html">00018</a> <span class="keyword">class </span><a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a> {
<a name="l00019"></a>00019 <span class="comment">// because of llvm command structure, each constraint affect 3(?) variables at the most</span>
<a name="l00020"></a>00020 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> MAX_VARS = 10;
<a name="l00021"></a>00021
<a name="l00022"></a>00022 glp_smcp params_;
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="keyword">static</span> <span class="keywordtype">bool</span> isMax(<span class="keywordtype">string</span> s) {
<a name="l00025"></a>00025 <span class="keywordflow">return</span> (s.substr(s.length() - 3) == <span class="stringliteral">"max"</span>);
<a name="l00026"></a>00026 }
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="keyword">static</span> <span class="keywordtype">bool</span> IsFeasable(<span class="keywordtype">int</span> status) {
<a name="l00029"></a>00029 <span class="keywordflow">return</span> ((status != GLP_INFEAS) && (status != GLP_NOFEAS));
<a name="l00030"></a>00030 }
<a name="l00031"></a>00031
<a name="l00032"></a>00032 <span class="keywordtype">void</span> copyFrom(<span class="keyword">const</span> <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a> &old) {
<a name="l00033"></a>00033 this->lp_ = glp_create_prob();
<a name="l00034"></a>00034 glp_copy_prob(this->lp_, old.lp_, GLP_ON);
<a name="l00035"></a>00035 this->params_ = old.params_;
<a name="l00036"></a>00036 this->varToCol_ = old.varToCol_;
<a name="l00037"></a>00037 this->colToVar_ = old.colToVar_;
<a name="l00038"></a>00038 this->structuralRows_ = old.structuralRows_;
<a name="l00039"></a>00039 this->aliasingRows_ = old.aliasingRows_;
<a name="l00040"></a>00040 }
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00043"></a>00043 glp_prob *lp_;
<a name="l00044"></a>00044 <span class="keywordtype">int</span> realRows_, structuralRows_, aliasingRows_;
<a name="l00045"></a>00045 map<string, int> varToCol_;
<a name="l00046"></a>00046 map<int, string> colToVar_;
<a name="l00047"></a>00047
<a name="l00048"></a>00048
<a name="l00049"></a>00049 <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a>() {
<a name="l00050"></a>00050 lp_ = glp_create_prob();
<a name="l00051"></a>00051 }
<a name="l00052"></a>00052
<a name="l00053"></a>00053 <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a>(<span class="keyword">const</span> <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a> &old) {
<a name="l00054"></a>00054 copyFrom(old);
<a name="l00055"></a>00055 }
<a name="l00056"></a>00056
<a name="l00057"></a>00057 <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a>& operator=(<span class="keyword">const</span> <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a> &old);
<a name="l00058"></a>00058
<a name="l00059"></a>00059 ~<a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a>() {
<a name="l00060"></a>00060 glp_delete_prob(this->lp_);
<a name="l00061"></a>00061 }
<a name="l00062"></a>00062 <span class="comment"></span>
<a name="l00063"></a>00063 <span class="comment"> /**</span>
<a name="l00064"></a>00064 <span class="comment"> Efficiently identify a small group of infeasble constraints using elastic fileter algorithm</span>
<a name="l00065"></a>00065 <span class="comment"> */</span>
<a name="l00066"></a>00066 vector<int> <a class="code" href="classboa_1_1LinearProblem.html#ad69cc6aab63b316849c21ba74fd348de">ElasticFilter</a>() <span class="keyword">const</span>;
<a name="l00067"></a>00067
<a name="l00068"></a>00068 <span class="keywordtype">void</span> SetParams(<span class="keyword">const</span> glp_smcp& params) {
<a name="l00069"></a>00069 params_ = params;
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <span class="comment"></span>
<a name="l00073"></a>00073 <span class="comment"> /**</span>
<a name="l00074"></a>00074 <span class="comment"> Solve the linear problem and return the glpk status</span>
<a name="l00075"></a>00075 <span class="comment"> */</span>
<a name="l00076"></a><a class="code" href="classboa_1_1LinearProblem.html#a501a5007108468f69cc93ef46c6d74cd">00076</a> <span class="keywordtype">int</span> <a class="code" href="classboa_1_1LinearProblem.html#a501a5007108468f69cc93ef46c6d74cd">Solve</a>() {
<a name="l00077"></a>00077 glp_simplex(lp_, &params_);
<a name="l00078"></a>00078 <span class="keywordflow">return</span> glp_get_status(lp_);
<a name="l00079"></a>00079 }
<a name="l00080"></a>00080 <span class="comment"></span>
<a name="l00081"></a>00081 <span class="comment"> /**</span>
<a name="l00082"></a>00082 <span class="comment"> Remove a row from a linear problem matrix, create "unbound constraints" instead</span>
<a name="l00083"></a>00083 <span class="comment"></span>
<a name="l00084"></a>00084 <span class="comment"> The new constraints created at the end of the matrix.</span>
<a name="l00085"></a>00085 <span class="comment"> */</span>
<a name="l00086"></a>00086 <span class="keywordtype">void</span> <a class="code" href="classboa_1_1LinearProblem.html#aa816253bb18bfaf35a8f4f8481d53fad">RemoveRow</a>(<span class="keywordtype">int</span> row);
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <span class="keywordtype">int</span> NumCols()<span class="keyword"> const </span>{
<a name="l00089"></a>00089 <span class="keywordflow">return</span> glp_get_num_cols(lp_);
<a name="l00090"></a>00090 }
<a name="l00091"></a>00091 <span class="comment"></span>
<a name="l00092"></a>00092 <span class="comment"> /**</span>
<a name="l00093"></a>00093 <span class="comment"> Remove a minimal set of constraints that makes the lp inFeasable.</span>
<a name="l00094"></a>00094 <span class="comment"></span>
<a name="l00095"></a>00095 <span class="comment"> Each of the variables in the removed rows will become "unbound" (e.g. - ...!max >= MAX_INT or</span>
<a name="l00096"></a>00096 <span class="comment"> ...!min <= MIN_INT).</span>
<a name="l00097"></a>00097 <span class="comment"></span>
<a name="l00098"></a>00098 <span class="comment"> The removed set is *A* minimal in the sense that these lines alone form an inFeasable problem, and</span>
<a name="l00099"></a>00099 <span class="comment"> each subset of them does not. It is not nessecerily *THE* minimal set in the sense that there is</span>
<a name="l00100"></a>00100 <span class="comment"> no such set which is smaller in size.</span>
<a name="l00101"></a>00101 <span class="comment"> */</span>
<a name="l00102"></a>00102 <span class="keywordtype">void</span> <a class="code" href="classboa_1_1LinearProblem.html#a4ac52a505613d6e1fa7a8d0f7a2f388e">RemoveInfeasable</a>();
<a name="l00103"></a>00103 };
<a name="l00104"></a>00104
<a name="l00105"></a>00105 } <span class="comment">// namespace boa</span>
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="preprocessor">#endif // __BOA_LINEAR_PROBLEM_H__</span>
</pre></div></div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Mar 19 17:29:26 2011 for boa by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>