📄 asa.c
字号:
#if DELTA_PARAMETERS
VFOR (index_v) fprintf (ptr_asa_out,
#if INT_ALLOC
"OPTIONS->User_Delta_Parameter[%d] = %*.*g\n",
#else
#if INT_LONG
"OPTIONS->User_Delta_Parameter[%ld] = %*.*g\n",
#else
"OPTIONS->User_Delta_Parameter[%d] = %*.*g\n",
#endif
#endif
index_v,
G_FIELD, G_PRECISION,
OPTIONS->User_Delta_Parameter[index_v]);
fprintf (ptr_asa_out, "\n");
#endif /* DELTA_PARAMETERS */
#if QUENCH_PARAMETERS
VFOR (index_v) fprintf (ptr_asa_out,
#if INT_ALLOC
"OPTIONS->User_Quench_Param_Scale[%d] = %*.*g\n",
#else
#if INT_LONG
"OPTIONS->User_Quench_Param_Scale[%ld] = %*.*g\n",
#else
"OPTIONS->User_Quench_Param_Scale[%d] = %*.*g\n",
#endif
#endif
index_v,
G_FIELD, G_PRECISION,
OPTIONS->User_Quench_Param_Scale[index_v]);
#endif /* QUENCH_PARAMETERS */
#if QUENCH_COST
fprintf (ptr_asa_out,
"\nOPTIONS->User_Quench_Cost_Scale = %*.*g\n\n",
G_FIELD, G_PRECISION, OPTIONS->User_Quench_Cost_Scale[0]);
#endif /* QUENCH_COST */
#if USER_INITIAL_PARAMETERS_TEMPS
VFOR (index_v) fprintf (ptr_asa_out,
#if INT_ALLOC
"OPTIONS->User_Parameter_Temperature[%d] = %*.*g\n",
#else
#if INT_LONG
"OPTIONS->User_Parameter_Temperature[%ld] = %*.*g\n",
#else
"OPTIONS->User_Parameter_Temperature[%d] = %*.*g\n",
#endif
#endif
index_v,
G_FIELD, G_PRECISION,
initial_user_parameter_temp[index_v]);
#endif /* USER_INITIAL_PARAMETERS_TEMPS */
#if RATIO_TEMPERATURE_SCALES
VFOR (index_v) fprintf (ptr_asa_out,
#if INT_ALLOC
"OPTIONS->User_Temperature_Ratio[%d] = %*.*g\n",
#else
#if INT_LONG
"OPTIONS->User_Temperature_Ratio[%ld] = %*.*g\n",
#else
"OPTIONS->User_Temperature_Ratio[%d] = %*.*g\n",
#endif
#endif
index_v,
G_FIELD, G_PRECISION,
OPTIONS->User_Temperature_Ratio[index_v]);
#endif /* RATIO_TEMPERATURE_SCALES */
#if USER_INITIAL_COST_TEMP
fprintf (ptr_asa_out,
"OPTIONS->User_Cost_Temperature[0] = %*.*g\n",
G_FIELD, G_PRECISION, *initial_cost_temperature);
#endif /* USER_INITIAL_COST_TEMP */
fflush (ptr_asa_out);
#endif /* ASA_PRINT */
#if MULTI_MIN
#if ASA_PRINT
fprintf (ptr_asa_out, "\n");
fprintf (ptr_asa_out, "Multi_Number = %d\n", OPTIONS->Multi_Number);
fprintf (ptr_asa_out, "Multi_Specify = %d\n", OPTIONS->Multi_Specify);
#if ASA_RESOLUTION
#else
VFOR (index_v) {
fprintf (ptr_asa_out,
#if INT_ALLOC
"Multi_Grid[%d] = %*.*g\n",
#else
#if INT_LONG
"Multi_Grid[%ld] = %*.*g\n",
#else
"Multi_Grid[%d] = %*.*g\n",
#endif
#endif
index_v, G_FIELD, G_PRECISION, OPTIONS->Multi_Grid[index_v]);
}
#endif /* ASA_RESOLUTION */
fprintf (ptr_asa_out, "\n");
fflush (ptr_asa_out);
#endif /* ASA_PRINT */
#endif /* MULTI_MIN */
#if ASA_PARALLEL
#if ASA_PRINT
fprintf (ptr_asa_out,
#if INT_LONG
"Initial ASA_PARALLEL OPTIONS->\n\t Gener_Block = %ld\n\
\t Gener_Block_Max = %ld\n \t Gener_Mov_Avr= %d\n\n",
#else
"ASA_PARALLEL OPTIONS->\n\t Gener_Block = %d\n\
\t Gener_Block_Max = %d\n \t Gener_Mov_Avr= %d\n\n",
#endif
OPTIONS->Gener_Block, OPTIONS->Gener_Block_Max,
OPTIONS->Gener_Mov_Avr);
#endif
#endif /* ASA_PARALLEL */
#if ASA_SAMPLE
#if ASA_PRINT
fprintf (ptr_asa_out, "OPTIONS->Limit_Weights = %*.*g\n\n",
G_FIELD, G_PRECISION, OPTIONS->Limit_Weights);
#endif
#endif
if (OPTIONS->Asa_Recursive_Level > asa_recursive_max)
asa_recursive_max = OPTIONS->Asa_Recursive_Level;
#if ASA_SAVE
if (OPTIONS->Asa_Recursive_Level > 0)
sprintf (asa_save_comm, "asa_save_%d", OPTIONS->Asa_Recursive_Level);
else
sprintf (asa_save_comm, "asa_save");
if ((ptr_save = fopen (asa_save_comm, "r")) == NULL) {
asa_read = FALSE;
} else {
#if ASA_PRINT
fprintf (ptr_asa_out, "\n\n\trestart after ASA_SAVE\n\n");
#endif
fclose (ptr_save);
asa_read = TRUE;
/* give some value to avoid any problems with other OPTIONS */
#if USER_ACCEPTANCE_TEST
OPTIONS->Cost_Temp_Curr = OPTIONS->Cost_Temp_Init =
#endif
current_generated_state->cost
= *initial_cost_temperature = *current_cost_temperature = 3.1416;
}
#endif
tmp_var_int = cost_function_test (current_generated_state->cost,
current_generated_state->parameter,
parameter_minimum,
parameter_maximum, number_parameters,
xnumber_parameters);
/* compute temperature scales */
tmp_var_db1 = -F_LOG ((OPTIONS->Temperature_Ratio_Scale));
tmp_var_db2 = F_LOG (OPTIONS->Temperature_Anneal_Scale);
temperature_scale =
tmp_var_db1 * F_EXP (-tmp_var_db2 / *xnumber_parameters);
/* set here in case not used */
tmp_var_db = ZERO;
#if QUENCH_PARAMETERS
#if RATIO_TEMPERATURE_SCALES
VFOR (index_v) temperature_scale_parameters[index_v] = tmp_var_db1 * F_EXP
#if QUENCH_PARAMETERS_SCALE
(-(tmp_var_db2 * OPTIONS->User_Quench_Param_Scale[index_v])
#else
(-(tmp_var_db2)
#endif
/ *xnumber_parameters)
* OPTIONS->User_Temperature_Ratio[index_v];
#else
VFOR (index_v) temperature_scale_parameters[index_v] = tmp_var_db1 * F_EXP
#if QUENCH_PARAMETERS_SCALE
(-(tmp_var_db2 * OPTIONS->User_Quench_Param_Scale[index_v])
#else
(-(tmp_var_db2)
#endif
/ *xnumber_parameters);
#endif /* RATIO_TEMPERATURE_SCALES */
#else /* QUENCH_PARAMETERS */
#if RATIO_TEMPERATURE_SCALES
VFOR (index_v)
temperature_scale_parameters[index_v] =
tmp_var_db1 * F_EXP (-(tmp_var_db2) / *xnumber_parameters)
* OPTIONS->User_Temperature_Ratio[index_v];
#else
VFOR (index_v)
temperature_scale_parameters[index_v] =
tmp_var_db1 * F_EXP (-(tmp_var_db2) / *xnumber_parameters);
#endif /* RATIO_TEMPERATURE_SCALES */
#endif /* QUENCH_PARAMETERS */
#if USER_ACCEPTANCE_TEST
OPTIONS->Cost_Temp_Scale =
#endif
*temperature_scale_cost =
#if QUENCH_COST
#if QUENCH_COST_SCALE
tmp_var_db1 * F_EXP (-(tmp_var_db2 * OPTIONS->User_Quench_Cost_Scale[0])
#else
tmp_var_db1 * F_EXP (-(tmp_var_db2)
#endif
/ *xnumber_parameters) *
OPTIONS->Cost_Parameter_Scale_Ratio;
#else /* QUENCH_COST */
tmp_var_db1 * F_EXP (-(tmp_var_db2)
/ *xnumber_parameters) *
OPTIONS->Cost_Parameter_Scale_Ratio;
#endif /* QUENCH_COST */
/* set the initial index of parameter generations to 1 */
VFOR (index_v) index_parameter_generations[index_v] = 1;
/* test user-defined options before calling cost function */
tmp_var_int = asa_test_asa_options (seed,
parameter_initial_final,
parameter_minimum,
parameter_maximum,
tangents,
curvature,
number_parameters,
parameter_type,
valid_state_generated_flag,
exit_status, ptr_asa_out, OPTIONS);
if (tmp_var_int > 0) {
#if ASA_PRINT
fprintf (ptr_asa_out, "total number invalid OPTIONS = %d\n", tmp_var_int);
fflush (ptr_asa_out);
#endif
*exit_status = INVALID_USER_INPUT;
goto EXIT_ASA;
}
#if USER_INITIAL_COST_TEMP
#else
#if ASA_SAVE
if (asa_read == TRUE)
OPTIONS->Number_Cost_Samples = 1;
#endif
/* calculate the average cost over samplings of the cost function */
if (OPTIONS->Number_Cost_Samples < -1) {
tmp_var_db1 = ZERO;
tmp_var_db2 = ZERO;
tmp_var_int = -OPTIONS->Number_Cost_Samples;
} else {
tmp_var_db1 = ZERO;
tmp_var_int = OPTIONS->Number_Cost_Samples;
}
OPTIONS->Locate_Cost = 0; /* initial cost temp */
for (index_cost_constraint = 0;
index_cost_constraint < tmp_var_int; ++index_cost_constraint) {
*number_invalid_generated_states = 0;
repeated_invalid_states = 0;
OPTIONS->Sequential_Parameters = *start_sequence - 1;
do {
++(*number_invalid_generated_states);
generate_new_state (user_random_generator,
seed,
parameter_minimum,
parameter_maximum, current_user_parameter_temp,
#if USER_GENERATING_FUNCTION
initial_user_parameter_temp,
temperature_scale_parameters,
#endif
number_parameters,
parameter_type,
current_generated_state, last_saved_state, OPTIONS);
*valid_state_generated_flag = TRUE;
#if USER_ACCEPTANCE_TEST
OPTIONS->User_Acceptance_Flag = TRUE;
OPTIONS->Cost_Acceptance_Flag = FALSE;
#endif
tmp_var_db =
user_cost_function (current_generated_state->parameter,
parameter_minimum,
parameter_maximum,
tangents,
curvature,
number_parameters,
parameter_type,
valid_state_generated_flag, exit_status, OPTIONS);
if (cost_function_test
(tmp_var_db, current_generated_state->parameter,
parameter_minimum, parameter_maximum, number_parameters,
xnumber_parameters) == 0) {
*exit_status = INVALID_COST_FUNCTION;
goto EXIT_ASA;
}
++repeated_invalid_states;
if (repeated_invalid_states > OPTIONS->Limit_Invalid_Generated_States) {
*exit_status = TOO_MANY_INVALID_STATES;
goto EXIT_ASA;
}
}
while (*valid_state_generated_flag == FALSE);
--(*number_invalid_generated_states);
if (OPTIONS->Number_Cost_Samples < -1) {
tmp_var_db1 += tmp_var_db;
tmp_var_db2 += (tmp_var_db * tmp_var_db);
} else {
tmp_var_db1 += fabs (tmp_var_db);
}
}
if (OPTIONS->Number_Cost_Samples < -1) {
tmp_var_db1 /= (double) tmp_var_int;
tmp_var_db2 /= (double) tmp_var_int;
tmp_var_db = sqrt (fabs ((tmp_var_db2 - tmp_var_db1 * tmp_var_db1)
* ((double) tmp_var_int
/ ((double) tmp_var_int - ONE))))
+ (double) EPS_DOUBLE;
} else {
tmp_var_db = tmp_var_db1 / tmp_var_int;
}
#if USER_ACCEPTANCE_TEST
OPTIONS->Cost_Temp_Curr = OPTIONS->Cost_Temp_Init =
#endif
*initial_cost_temperature = *current_cost_temperature = tmp_var_db;
#endif /* USER_INITIAL_COST_TEMP */
/* set all parameters to the initial parameter values */
VFOR (index_v)
best_generated_state->parameter[index_v] =
last_saved_state->parameter[index_v] =
current_generated_state->parameter[index_v] =
parameter_initial_final[index_v];
OPTIONS->Locate_Cost = 1; /* initial cost value */
/* if using user's initial parameters */
if (OPTIONS->User_Initial_Parameters == TRUE) {
*valid_state_generated_flag = TRUE;
#if USER_ACCEPTANCE_TEST
OPTIONS->User_Acceptance_Flag = TRUE;
OPTIONS->Cost_Acceptance_Flag = FALSE;
#endif
#if ASA_SAVE
if (asa_read == FALSE)
#endif
current_generated_state->cost =
user_cost_function (current_generated_state->parameter,
parameter_minimum,
parameter_maximum,
tangents,
curvature,
number_parameters,
parameter_type,
valid_state_generated_flag, exit_status, OPTIONS);
if (cost_function_test
(current_generated_state->cost, current_generated_state->parameter,
parameter_minimum, parameter_maximum, number_parameters,
xnumber_parameters) == 0) {
*exit_status = INVALID_COST_FUNCTION;
goto EXIT_ASA;
}
#if ASA_PRINT
if (*valid_state_generated_flag == FALSE)
fprintf (ptr_asa_out, "user's initial parameters generated \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -