Example #1
0
void FixCand::fixByRedCost(CutBuffer<Variable, Constraint> *addVarBuffer)
{
	if (candidates_ == nullptr) return;

	Logger::ilout(Logger::LL_MINOR) << endl << "Fixing Variables by Reduced Costs:     ";

	const int nCandidates = candidates_->size();

	ArrayBuffer<int> fixed(nCandidates,false);  // fixed variables
	Variable    *v;                                // variable being fi0xed

	for (int i = 0; i < nCandidates; i++)
		if ((master_->optSense()->max() &&
			((*lhs_)[i] + master_->eps() < master_->primalBound())) ||
			(master_->optSense()->min() &&
			((*lhs_)[i] - master_->eps() > master_->primalBound())))
		{
			v = (Variable *) (*candidates_)[i]->conVar();
			if (v) {
				if (!v->fsVarStat()->fixed())
					master_->newFixed(1);
				v->fsVarStat()->status((*fsVarStat_)[i]);

				// should a fixed inactive variable be activated?
				/* If an inactive variable is fixed to a value different from 0, then
				*  we activate it.
				*/
				if (!v->active()) {
					switch (v->fsVarStat()->status()) {
					case FSVarStat::FixedToLowerBound:
						if (fabs(v->lBound()) > master_->eps())
							addVarBuffer->insert((*candidates_)[i]->slot(), true);
						break;

					case FSVarStat::FixedToUpperBound:
						if (fabs(v->uBound()) > master_->eps())
							addVarBuffer->insert((*candidates_)[i]->slot(), true);
						break;

					case FSVarStat::Fixed:
						if (fabs(v->fsVarStat()->value()) > master_->eps())
							addVarBuffer->insert((*candidates_)[i]->slot(), true);
						break;

					default:
						Logger::ifout() << "FixCand::fixByRedCost(): activated variable not fixed\n";
						OGDF_THROW_PARAM(AlgorithmFailureException, ogdf::afcFixCand);
					}
				}

				fixed.push(i);
			}
		}
		// remove fixed candidates
		/* We delete allocated memory of \a fsVarStat_ for the fixed variables
		*  und remove the fixed variables from the three buffers.
		*/
		const int nFixed = fixed.size();

		for (int i = 0; i < nFixed; i++) {
			delete (*candidates_)[fixed[i]];
			delete (*fsVarStat_)[fixed[i]];
		}

		candidates_->leftShift(fixed);
		fsVarStat_->leftShift(fixed);
		lhs_->leftShift(fixed);

		Logger::ilout(Logger::LL_MINOR) << "\t" << fixed.size() << " variables fixed" << endl;

}