-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinearProblem_8cpp_source.html
More file actions
163 lines (161 loc) · 11.7 KB
/
Copy pathLinearProblem_8cpp_source.html
File metadata and controls
163 lines (161 loc) · 11.7 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
<!-- 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.cpp 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.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include "LinearProblem.h"</span>
<a name="l00002"></a>00002
<a name="l00003"></a>00003 <span class="preprocessor">#include <vector></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include <map></span>
<a name="l00005"></a>00005 <span class="preprocessor">#include <algorithm></span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="keyword">using</span> std::vector;
<a name="l00008"></a>00008 <span class="keyword">using</span> std::map;
<a name="l00009"></a>00009 <span class="keyword">using</span> std::sort;
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="keyword">namespace </span>boa {
<a name="l00012"></a><a class="code" href="classboa_1_1LinearProblem.html#ad69cc6aab63b316849c21ba74fd348de">00012</a> vector<int> <a class="code" href="classboa_1_1LinearProblem.html#ad69cc6aab63b316849c21ba74fd348de">LinearProblem::ElasticFilter</a>()<span class="keyword"> const </span>{
<a name="l00013"></a>00013 <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a> tmp(*<span class="keyword">this</span>);
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="keywordtype">int</span> realCols = glp_get_num_cols(tmp.lp_);
<a name="l00016"></a>00016 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = realCols; i > 0; --i) { <span class="comment">// set old coefs to zero</span>
<a name="l00017"></a>00017 glp_set_obj_coef(tmp.lp_, i, 0);
<a name="l00018"></a>00018 }
<a name="l00019"></a>00019
<a name="l00020"></a>00020 <span class="keywordtype">int</span> elasticCols = realRows_;
<a name="l00021"></a>00021 glp_add_cols(tmp.lp_, elasticCols);
<a name="l00022"></a>00022 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i <= elasticCols; ++i) {
<a name="l00023"></a>00023 <span class="keywordtype">int</span> indices[MAX_VARS];
<a name="l00024"></a>00024 <span class="keywordtype">double</span> values[MAX_VARS];
<a name="l00025"></a>00025
<a name="l00026"></a>00026 <span class="keywordtype">int</span> row = i + structuralRows_;
<a name="l00027"></a>00027 <span class="keywordtype">int</span> nonZeros = glp_get_mat_row(tmp.lp_, row, indices, values);
<a name="l00028"></a>00028
<a name="l00029"></a>00029 indices[nonZeros + 1] = realCols + i;
<a name="l00030"></a>00030 values[nonZeros + 1] = 1.0;
<a name="l00031"></a>00031
<a name="l00032"></a>00032 glp_set_mat_row(tmp.lp_, row, nonZeros + 1, indices, values);
<a name="l00033"></a>00033 glp_set_obj_coef(tmp.lp_, realCols + i, 1);
<a name="l00034"></a>00034 glp_set_col_bnds(tmp.lp_, realCols + i, GLP_UP, 0.0, 0.0);
<a name="l00035"></a>00035 }
<a name="l00036"></a>00036
<a name="l00037"></a>00037 vector<int> suspects;
<a name="l00038"></a>00038 glp_std_basis(tmp.lp_);
<a name="l00039"></a>00039 <span class="keywordtype">int</span> status = tmp.<a class="code" href="classboa_1_1LinearProblem.html#a501a5007108468f69cc93ef46c6d74cd">Solve</a>();
<a name="l00040"></a>00040 <span class="keywordflow">while</span> ((status != GLP_INFEAS) && (status != GLP_NOFEAS)) {
<a name="l00041"></a>00041 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i <= elasticCols; ++i) {
<a name="l00042"></a>00042 <span class="keywordflow">if</span> (glp_get_col_prim(tmp.lp_, realCols + i) < 0) {
<a name="l00043"></a>00043 suspects.push_back(structuralRows_ + i);
<a name="l00044"></a>00044 glp_set_col_bnds(tmp.lp_, realCols + i, GLP_FX, 0.0, 0.0);
<a name="l00045"></a>00045 }
<a name="l00046"></a>00046 }
<a name="l00047"></a>00047 status = tmp.<a class="code" href="classboa_1_1LinearProblem.html#a501a5007108468f69cc93ef46c6d74cd">Solve</a>();
<a name="l00048"></a>00048 }
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="keywordflow">return</span> suspects;
<a name="l00051"></a>00051 }
<a name="l00052"></a>00052
<a name="l00053"></a><a class="code" href="classboa_1_1LinearProblem.html#aa816253bb18bfaf35a8f4f8481d53fad">00053</a> <span class="keywordtype">void</span> <a class="code" href="classboa_1_1LinearProblem.html#aa816253bb18bfaf35a8f4f8481d53fad">LinearProblem::RemoveRow</a>(<span class="keywordtype">int</span> row) {
<a name="l00054"></a>00054 <span class="keyword">static</span> <span class="keywordtype">int</span> indices[MAX_VARS];
<a name="l00055"></a>00055 <span class="keyword">static</span> <span class="keywordtype">double</span> values[MAX_VARS];
<a name="l00056"></a>00056
<a name="l00057"></a>00057 <span class="keywordtype">int</span> nonZeros = glp_get_mat_row(lp_, row, indices, values);
<a name="l00058"></a>00058 glp_set_row_bnds(lp_, row, GLP_FR, 0.0, 0.0);
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="comment">// glpk ignores the 0's index of the array</span>
<a name="l00061"></a>00061 <span class="keywordtype">int</span> ind[2];
<a name="l00062"></a>00062 <span class="keywordtype">double</span> val[2];
<a name="l00063"></a>00063 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i <= nonZeros; ++i) {
<a name="l00064"></a>00064 ind[1] = indices[i];
<a name="l00065"></a>00065 val[1] = (isMax(colToVar_[indices[i]]) ? -1 : 1);
<a name="l00066"></a>00066 <span class="keywordtype">int</span> r = glp_add_rows(lp_, 1);
<a name="l00067"></a>00067 glp_set_row_bnds(lp_, r, GLP_UP, 0.0, MINUS_INFTY);
<a name="l00068"></a>00068 glp_set_mat_row(lp_, r, 1, ind, val);
<a name="l00069"></a>00069 glp_set_row_name(lp_, r, glp_get_row_name(lp_, row));
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071 }
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a>& LinearProblem::operator=(<span class="keyword">const</span> <a class="code" href="classboa_1_1LinearProblem.html">LinearProblem</a> &old) {
<a name="l00074"></a>00074 <span class="keywordflow">if</span> (&old != <span class="keyword">this</span>) {
<a name="l00075"></a>00075 glp_delete_prob(this->lp_);
<a name="l00076"></a>00076 copyFrom(old);
<a name="l00077"></a>00077 }
<a name="l00078"></a>00078 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00079"></a>00079 }
<a name="l00080"></a>00080
<a name="l00081"></a><a class="code" href="classboa_1_1LinearProblem.html#a4ac52a505613d6e1fa7a8d0f7a2f388e">00081</a> <span class="keywordtype">void</span> <a class="code" href="classboa_1_1LinearProblem.html#a4ac52a505613d6e1fa7a8d0f7a2f388e">LinearProblem::RemoveInfeasable</a>() {
<a name="l00082"></a>00082 LOG << <span class="stringliteral">"No Feasable solution, running elastic filter - "</span> << endl;
<a name="l00083"></a>00083
<a name="l00084"></a>00084 vector<int> rows = <a class="code" href="classboa_1_1LinearProblem.html#ad69cc6aab63b316849c21ba74fd348de">ElasticFilter</a>();
<a name="l00085"></a>00085 sort(rows.begin(), rows.end());
<a name="l00086"></a>00086
<a name="l00087"></a>00087 <span class="comment">// glpk ignores the 0's index of the array</span>
<a name="l00088"></a>00088 <span class="keywordtype">int</span> ind[2], removed = rows.size();
<a name="l00089"></a>00089 realRows_ -= removed;
<a name="l00090"></a>00090 LOG << <span class="stringliteral">"removing "</span> << removed << <span class="stringliteral">" rows"</span> << endl;
<a name="l00091"></a>00091 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < removed; ++i) {
<a name="l00092"></a>00092 <span class="keywordtype">int</span> cur = rows[i] - i;
<a name="l00093"></a>00093 <a class="code" href="classboa_1_1LinearProblem.html#aa816253bb18bfaf35a8f4f8481d53fad">RemoveRow</a>(cur);
<a name="l00094"></a>00094 ind[1] = cur;
<a name="l00095"></a>00095 glp_del_rows(lp_, 1, ind);
<a name="l00096"></a>00096 }
<a name="l00097"></a>00097 glp_std_basis(lp_);
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099
<a name="l00100"></a>00100 } <span class="comment">// namespace boa</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>