Residuals(const Problem& problem, const Omega& omega, const Psi& psi) : normOfC{problem.c.norm()}, normOfB{problem.b.norm()}, AXPlusS{problem.A * omega.x + psi.s}, ATransposeY{problem.A.transpose() * omega.y}, cTransposeX{problem.c.transpose() * omega.x}, bTranspoesY{problem.b.transpose() * omega.y}, primal{getPrimal(problem, omega, psi)}, dual{getDual(problem, omega)}, primalDualGap{getGap(problem, omega)}, unbounded{cTransposeX < 0 ? AXPlusS.norm() * normOfC / -cTransposeX : NAN}, infeasible{bTranspoesY < 0 ? ATransposeY.norm() * normOfB / -bTranspoesY : NAN} {}
uint Board::scoreMove(const Cell* cell, AXIS::Axis axis) { uint primaryScore = scoreAxis(cell, axis); uint dualScores = 0; uint numChanged = 0; Cell *from, *to; uint incr = getIncrement(axis); AXIS::Axis dual = getDual(axis); if (getEndpoints(cell, axis, from, to)) { for (const Cell* c = from; c <= to; c += incr) { if (changed(c)) { numChanged++; uint sec = scoreAxis(c, dual, " "); dualScores += sec; } } } uint totalScore = primaryScore + dualScores; if(numChanged == Common::rackSize) totalScore+=Common::bingoValue; return totalScore; }