| 872 | } |
| 873 | |
| 874 | void getPrimalDualBasisErrors(const HighsOptions& options, const HighsLp& lp, |
| 875 | const HighsSolution& solution, |
| 876 | const HighsBasis& basis, |
| 877 | HighsPrimalDualErrors& primal_dual_errors) { |
| 878 | double primal_feasibility_tolerance = options.primal_feasibility_tolerance; |
| 879 | double dual_feasibility_tolerance = options.dual_feasibility_tolerance; |
| 880 | const bool& have_primal_solution = solution.value_valid; |
| 881 | const bool& have_dual_solution = solution.dual_valid; |
| 882 | const bool& have_basis = basis.valid; |
| 883 | |
| 884 | // Check that there is no dual solution if there's no primal solution |
| 885 | assert(have_primal_solution || !have_dual_solution); |
| 886 | |
| 887 | // Check that there is no basis if there's no dual solution |
| 888 | assert(have_dual_solution || !have_basis); |
| 889 | |
| 890 | HighsInt& num_nonzero_basic_dual = primal_dual_errors.num_nonzero_basic_duals; |
| 891 | double& max_nonzero_basic_dual = primal_dual_errors.max_nonzero_basic_dual; |
| 892 | double& sum_nonzero_basic_dual = primal_dual_errors.sum_nonzero_basic_duals; |
| 893 | |
| 894 | HighsInt& num_off_bound_nonbasic = primal_dual_errors.num_off_bound_nonbasic; |
| 895 | double& max_off_bound_nonbasic = primal_dual_errors.max_off_bound_nonbasic; |
| 896 | double& sum_off_bound_nonbasic = primal_dual_errors.sum_off_bound_nonbasic; |
| 897 | |
| 898 | if (have_basis) { |
| 899 | num_nonzero_basic_dual = 0; |
| 900 | max_nonzero_basic_dual = 0; |
| 901 | sum_nonzero_basic_dual = 0; |
| 902 | |
| 903 | num_off_bound_nonbasic = 0; |
| 904 | max_off_bound_nonbasic = 0; |
| 905 | sum_off_bound_nonbasic = 0; |
| 906 | } else { |
| 907 | num_nonzero_basic_dual = kHighsIllegalInfeasibilityCount; |
| 908 | max_nonzero_basic_dual = kHighsIllegalInfeasibilityMeasure; |
| 909 | sum_nonzero_basic_dual = kHighsIllegalInfeasibilityMeasure; |
| 910 | |
| 911 | num_off_bound_nonbasic = kHighsIllegalInfeasibilityCount; |
| 912 | max_off_bound_nonbasic = kHighsIllegalInfeasibilityMeasure; |
| 913 | sum_off_bound_nonbasic = kHighsIllegalInfeasibilityMeasure; |
| 914 | } |
| 915 | // Without a primal solution or a basis, nothing can be done! |
| 916 | if (!have_primal_solution || !have_basis) return; |
| 917 | // Makes no sense to get primal dual basis failures without a primal |
| 918 | // solution, dual solution and basis |
| 919 | assert(have_primal_solution && have_dual_solution && have_basis); |
| 920 | double primal_infeasibility; |
| 921 | double relative_primal_infeasibility; |
| 922 | double dual_infeasibility; |
| 923 | double value_residual; |
| 924 | double lower; |
| 925 | double upper; |
| 926 | double value; |
| 927 | double dual = 0; |
| 928 | HighsBasisStatus status; |
| 929 | bool status_value_ok; |
| 930 | for (HighsInt iVar = 0; iVar < lp.num_col_ + lp.num_row_; iVar++) { |
| 931 | if (iVar < lp.num_col_) { |
no test coverage detected