Imports
29.5 Projecting phase-II dual certificates
The first dual coordinate belongs to the artificial lock row. Removing it preserves every original dual constraint and preserves the dual objective, because the lock row has right-hand side zero.
namespace CLRSnamespace Chapter29open Matrixopen scoped BigOperatorsnamespace StandardLPRemove the dual coordinate belonging to the artificial lock row.
def lockedDualTail (y : Fin (m + 1) → ℝ) : Fin m → ℝ :=
fun i => y i.succOn an original column, locked and original transposed matrix products agree after dropping the lock-row dual coordinate.
theorem lockedAuxiliary_dual_mulVec_original (P : StandardLP m n)
(y : Fin (m + 1) → ℝ) (j : Fin n) :
(P.lockedAuxiliary.A.transpose *ᵥ y) (auxiliaryOriginal j) =
(P.A.transpose *ᵥ lockedDualTail y) j := by
simp [Matrix.mulVec, dotProduct, lockedAuxiliary, lockProgram,
auxiliary, auxiliaryOriginal, auxiliaryArtificial, lockedDualTail,
Fin.sum_univ_succ]A phase-II dual-feasible vector projects to a dual-feasible vector for the original program.
theorem lockedAuxiliary_dualFeasible_to_original (P : StandardLP m n)
{y : Fin (m + 1) → ℝ} (hy : P.lockedAuxiliary.IsDualFeasible y) :
P.IsDualFeasible (lockedDualTail y) := by
constructor
· intro i
exact hy.1 i.succ
· intro j
have hj := hy.2 (auxiliaryOriginal j)
rw [P.lockedAuxiliary_dual_mulVec_original y j] at hj
simpa using hjDropping the lock-row coordinate preserves the dual objective.
theorem lockedAuxiliary_dualObjective (P : StandardLP m n)
(y : Fin (m + 1) → ℝ) :
P.lockedAuxiliary.dualObjective y =
P.dualObjective (lockedDualTail y) := by
simp [dualObjective, dotProduct, lockedAuxiliary, lockProgram,
lockedDualTail, Fin.sum_univ_succ]end StandardLPend Chapter29end CLRS