99 clearDataStructures();
101 if (newConstraints.isEmpty())
106 for (
int i = 0; i < newConstraints.size(); ++i) {
108 c->constant = newConstraints[i]->constant;
109 c->ratio = newConstraints[i]->ratio;
110 c->variables = newConstraints[i]->variables;
115 if (!simplifyConstraints(&constraints)) {
116 qWarning(
"QSimplex: No feasible solution!");
117 clearDataStructures();
128 QSet<QSimplexVariable *> variablesSet;
129 for (
int i = 0; i < constraints.size(); ++i) {
130 const auto &v = constraints.at(i)->variables;
131 for (
auto it = v.cbegin(), end = v.cend(); it != end; ++it)
132 variablesSet.insert(it.key());
134 variables = variablesSet.values();
139 for (
int i = 0; i < variables.size(); ++i) {
141 variables[i]->index = i + 1;
156 int variableIndex = variables.size();
157 QList <QSimplexVariable *> artificialList;
159 for (
int i = 0; i < constraints.size(); ++i) {
160 QConcreteSimplexVariable *slack;
161 QConcreteSimplexVariable *surplus;
162 QConcreteSimplexVariable *artificial;
164 Q_ASSERT(constraints[i]->helper.first == 0);
165 Q_ASSERT(constraints[i]->artificial ==
nullptr);
167 switch(constraints[i]->ratio) {
168 case QSimplexConstraint::LessOrEqual:
169 slack =
new QConcreteSimplexVariable;
170 slack->index = ++variableIndex;
171 constraints[i]->helper.first = slack;
172 constraints[i]->helper.second = 1.0;
174 case QSimplexConstraint::MoreOrEqual:
175 surplus =
new QConcreteSimplexVariable;
176 surplus->index = ++variableIndex;
177 constraints[i]->helper.first = surplus;
178 constraints[i]->helper.second = -1.0;
180 case QSimplexConstraint::Equal:
181 artificial =
new QConcreteSimplexVariable;
182 constraints[i]->artificial = artificial;
183 artificialList += constraints[i]->artificial;
192 firstArtificial = variableIndex + 1;
193 for (
int i = 0; i < artificialList.size(); ++i)
194 artificialList[i]->index = ++variableIndex;
195 artificialList.clear();
202 columns = variableIndex + 2;
204 rows = constraints.size() + 1;
206 matrix = (qreal *)malloc(
sizeof(qreal) * columns * rows);
208 qWarning(
"QSimplex: Unable to allocate memory!");
211 for (
int i = columns * rows - 1; i >= 0; --i)
215 for (
int i = 1; i <= constraints.size(); ++i) {
220 setValueAt(i, 0, c->artificial->index);
221 setValueAt(i, c->artificial->index, 1.0);
223 if (c->helper.second != 0.0) {
225 setValueAt(i, c->helper.first->index, c->helper.second);
229 Q_ASSERT(c->helper.second == 1.0);
230 setValueAt(i, 0, c->helper.first->index);
231 setValueAt(i, c->helper.first->index, 1.0);
234 for (
auto iter = c->variables.cbegin(); iter != c->variables.cend(); ++iter)
235 setValueAt(i, iter.key()->index, iter.value());
237 setValueAt(i, columns - 1, c->constant);
242 for (
int j = firstArtificial; j < columns - 1; ++j)
243 setValueAt(0, j, 1.0);
254 if ((valueAt(0, columns - 1) != 0.0) && (qAbs(valueAt(0, columns - 1)) > 0.00001)) {
255 qWarning(
"QSimplex: No feasible solution!");
256 clearDataStructures();
263 clearColumns(firstArtificial, columns - 2);