diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d7c38d..cf5bddd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10) -project(daqp VERSION 0.8.4) +project(daqp VERSION 0.8.5) include(GNUInstallDirs) diff --git a/interfaces/daqp-python/setup.py b/interfaces/daqp-python/setup.py index f1ef628..bbb2ada 100644 --- a/interfaces/daqp-python/setup.py +++ b/interfaces/daqp-python/setup.py @@ -45,7 +45,7 @@ include_dirs=[str(csrc_dir / 'include')]) setup(name='daqp', - version='0.8.5', + version='0.8.6', description='DAQP: A dual active-set QP solver', url='http://github.com/darnstrom/daqp', author='Daniel Arnström', diff --git a/src/utils.c b/src/utils.c index f626351..e796f31 100644 --- a/src/utils.c +++ b/src/utils.c @@ -472,19 +472,29 @@ int daqp_update_avi(DAQPAVI* avi, DAQPProblem* p){ // Setup matrices Hsym, Hs_rho, and H_rho, LU_H int i,j,disp; c_float val; + c_float min_diag = DAQP_INF; + c_float max_row_sum = 0.0; + c_float fro_norm_sq = 0.0; avi->rho = 0.0; for (i = 0, disp=0; i < n; i++) { + c_float row_sum = 0.0; for (j = 0; j < n; j++, disp++) { val = (p->H[disp] + p->H[j * n + i]) * 0.5; avi->Hsym[disp] = val; avi->Hs_rho[disp] = val; avi->H_rho[disp] = p->H[disp]; avi->LU_H[disp] = p->H[disp]; - avi->rho += p->H[disp] * p->H[disp]; + row_sum += (val < 0.0) ? -val : val; + fro_norm_sq += p->H[disp] * p->H[disp]; + if(i == j && val < min_diag) min_diag = val; } + if(row_sum > max_row_sum) max_row_sum = row_sum; } // Regularization - avi->rho = sqrt(avi->rho)/2; + if(min_diag > 0.0 && max_row_sum > 0.0) + avi->rho = sqrt(min_diag * max_row_sum); + else + avi->rho = sqrt(fro_norm_sq)/2; for(i=0,disp=0; iHs_rho[disp] += avi->rho; avi->H_rho[disp] += avi->rho;