/* set gft_conn, update gef_conn if all PCs are satisfied */ void activate_ft( int index, int time ) { int i; gft_conn[index].level = time; for ( i = 0; i < gft_conn[index].num_PC; i++ ) { gef_conn[gft_conn[index].PC[i]].num_active_PCs++; if ( !gef_conn[gft_conn[index].PC[i]].ch ) { gef_conn[gft_conn[index].PC[i]].ch = TRUE; lch_E[lnum_ch_E++] = gft_conn[index].PC[i]; } if ( gef_conn[gft_conn[index].PC[i]].num_active_PCs == gef_conn[gft_conn[index].PC[i]].num_PC ) { new_ef( gft_conn[index].PC[i] ); } } }
void get_A( State *S ) { int i; initialize_fixpoint( S ); for ( i = 0; i < lnum_F; i++ ) { activate_ft( lF[i], 0 ); } for ( i = 0; i < lnum_0P_E; i++ ) { if ( gef_conn[l0P_E[i]].in_E ) { continue; } new_ef( l0P_E[i] ); } collect_A_info(); reset_fixpoint(); }
int build_fixpoint( State *S ) { int start_ft, stop_ft, start_ef, stop_ef, i, time = 0; static Bool first_call = TRUE; if ( first_call ) { /* get memory for local globals */ lF = ( int * ) calloc( gnum_ft_conn, sizeof( int ) ); lE = ( int * ) calloc( gnum_ef_conn, sizeof( int ) ); lch_E = ( int * ) calloc( gnum_ef_conn, sizeof( int ) ); l0P_E = ( int * ) calloc( gnum_ef_conn, sizeof( int ) ); /* initialize connectivity graph members for * relaxed planning */ lnum_0P_E = 0; for ( i = 0; i < gnum_ef_conn; i++ ) { gef_conn[i].level = INFINITY; gef_conn[i].in_E = FALSE; gef_conn[i].num_active_PCs = 0; gef_conn[i].ch = FALSE; if ( gef_conn[i].num_PC == 0 ) { l0P_E[lnum_0P_E++] = i; } } for ( i = 0; i < gnum_op_conn; i++ ) { gop_conn[i].is_in_A = FALSE; gop_conn[i].is_in_H = FALSE; } for ( i = 0; i < gnum_ft_conn; i++ ) { gft_conn[i].level = INFINITY; gft_conn[i].in_F = FALSE; } first_call = FALSE; } initialize_fixpoint( S ); start_ft = 0; start_ef = 0; while ( TRUE ) { //Y. Chen new //if ( all_goals_activated( time ) ) { if ( all_known_iga_activated( time ) && all_goals_activated( time ) ) { break; } stop_ft = lnum_F; for ( i = start_ft; i < stop_ft; i++ ) { activate_ft( lF[i], time ); } if ( time == 0 ) { for ( i = 0; i < lnum_0P_E; i++ ) { if ( gef_conn[l0P_E[i]].in_E ) { continue; } new_ef( l0P_E[i] ); } } stop_ef = lnum_E; for ( i = start_ef; i < stop_ef; i++ ) { activate_ef( lE[i], time ); } if ( stop_ft == lnum_F ) { break; } start_ft = stop_ft; start_ef = stop_ef; time++; } return time; }