From 358bb67b6a19817283f6298a00e5d71b1760a137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Arnstr=C3=B6m?= Date: Mon, 10 Nov 2025 23:43:38 +0100 Subject: [PATCH 1/2] Improve numerics in hdaqp for weakly active constraints. --- src/hierarchical.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hierarchical.c b/src/hierarchical.c index c011c2fd..2d2cd1bc 100644 --- a/src/hierarchical.c +++ b/src/hierarchical.c @@ -52,9 +52,9 @@ int daqp_hiqp(DAQPWorkspace *work, c_float *lambda){ id=work->WS[j]; if(IS_SOFT(id)){ w = work->lam_star[j]*work->settings->rho_soft; - if(IS_LOWER(id)) + if(w < -work->settings->primal_tol) work->dlower[id]+=w; - else + else if(w > work->settings->primal_tol) work->dupper[id]+=w; if(lambda != NULL){ w += IS_LOWER(id) ? -1e-14 : 1e-14; // For weakly active From 89e259856f3f71c23d8e771bdd9d710ac9215e1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Arnstr=C3=B6m?= Date: Thu, 13 Nov 2025 21:29:52 +0100 Subject: [PATCH 2/2] Ensure constraints that cannot be activated are are mutable --- src/hierarchical.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hierarchical.c b/src/hierarchical.c index 2d2cd1bc..9d6bdb0b 100644 --- a/src/hierarchical.c +++ b/src/hierarchical.c @@ -73,7 +73,9 @@ int daqp_hiqp(DAQPWorkspace *work, c_float *lambda){ // reactive constraint in level current (to addresss soft->hard) // TODO: can factorization be directly reused? int n_active_old = (work->n_active < work->n) ? work->n_active : work->n; - for(int jj=n_active_old; jj < work->n_active ;jj++) SET_INACTIVE(work->WS[jj]); + for(int jj=n_active_old; jj < work->n_active ;jj++) { + work->sense[work->WS[jj]]&=~(ACTIVE+IMMUTABLE); // ensure inactive + mutable + } work->n_active =j; work->reuse_ind=j; work->sing_ind = EMPTY_IND; @@ -83,6 +85,7 @@ int daqp_hiqp(DAQPWorkspace *work, c_float *lambda){ if(work->sing_ind != EMPTY_IND){ remove_constraint(work,j); work->sing_ind = EMPTY_IND; + SET_MUTABLE(work->WS[j]); } else{ if(IS_IMMUTABLE(work->WS[j])) nfree--;