| 101 | } |
| 102 | |
| 103 | static void userCallback(const int callback_type, const char* message, |
| 104 | const HighsCallbackDataOut* data_out, |
| 105 | HighsCallbackDataIn* data_in, |
| 106 | void* user_callback_data) { |
| 107 | // Extract the double value pointed to from void* user_callback_data |
| 108 | const double local_callback_data = |
| 109 | user_callback_data == NULL ? -1 : *(double*)user_callback_data; |
| 110 | |
| 111 | if (callback_type == kHighsCallbackLogging) { |
| 112 | if (dev_run) |
| 113 | printf("userCallback(%11.4g): %s\n", local_callback_data, message); |
| 114 | } else if (callback_type == kHighsCallbackMipImprovingSolution) { |
| 115 | // Test the accessor function for data_out |
| 116 | // |
| 117 | // Check that passing an valid name returns a non-null pointer, |
| 118 | // and that the corresponding value is the same as obtained using |
| 119 | // the struct |
| 120 | const void* objective_function_value_p = Highs_getCallbackDataOutItem( |
| 121 | data_out, kHighsCallbackDataOutObjectiveFunctionValueName); |
| 122 | assert(objective_function_value_p); |
| 123 | double objective_function_value = *(double*)(objective_function_value_p); |
| 124 | assert(objective_function_value == data_out->objective_function_value); |
| 125 | if (dev_run) |
| 126 | printf("userCallback(%11.4g): improving solution with objective = %g\n", |
| 127 | local_callback_data, objective_function_value); |
| 128 | // Now test all more simply |
| 129 | checkGetCallbackDataOutInt(data_out, kHighsCallbackDataOutLogTypeName, 1); |
| 130 | checkGetCallbackDataOutDouble( |
| 131 | data_out, kHighsCallbackDataOutRunningTimeName, data_out->running_time); |
| 132 | checkGetCallbackDataOutHighsInt( |
| 133 | data_out, kHighsCallbackDataOutSimplexIterationCountName, |
| 134 | data_out->simplex_iteration_count); |
| 135 | checkGetCallbackDataOutHighsInt(data_out, |
| 136 | kHighsCallbackDataOutIpmIterationCountName, |
| 137 | data_out->ipm_iteration_count); |
| 138 | checkGetCallbackDataOutHighsInt(data_out, |
| 139 | kHighsCallbackDataOutPdlpIterationCountName, |
| 140 | data_out->pdlp_iteration_count); |
| 141 | checkGetCallbackDataOutDouble( |
| 142 | data_out, kHighsCallbackDataOutObjectiveFunctionValueName, |
| 143 | data_out->objective_function_value); |
| 144 | checkGetCallbackDataOutInt64(data_out, |
| 145 | kHighsCallbackDataOutMipNodeCountName, |
| 146 | data_out->mip_node_count); |
| 147 | checkGetCallbackDataOutDouble(data_out, |
| 148 | kHighsCallbackDataOutMipPrimalBoundName, |
| 149 | data_out->mip_primal_bound); |
| 150 | checkGetCallbackDataOutDouble(data_out, |
| 151 | kHighsCallbackDataOutMipDualBoundName, |
| 152 | data_out->mip_dual_bound); |
| 153 | checkGetCallbackDataOutDouble(data_out, kHighsCallbackDataOutMipGapName, |
| 154 | data_out->mip_gap); |
| 155 | // Cutpool data structure is not assigned, so num_col, num_cut and |
| 156 | // num_nz are unassigned |
| 157 | // checkGetCallbackDataOutHighsInt(data_out, |
| 158 | // kHighsCallbackDataOutCutpoolNumColName, 0); |
| 159 | // checkGetCallbackDataOutHighsInt(data_out, |
| 160 | // kHighsCallbackDataOutCutpoolNumCutName, 0); |
nothing calls this directly
no test coverage detected