static void search_by_ullmann(struct State * state, struct Query * query, struct Target * target){ int k; // Idea for optimization //show(state->mat, query->len, target->n_bits); if(state->depth == state->height - 1){ //printf("FOUND!\n"); state_push_result(state); //show(state->mat, query->len, target->n_bits); }else{ for(k = 0 ; k < target->n_bits ; k++){ if(has_bit(state->mat, state->depth + 1, k, target->n_bytes)){ state_push(state); state_clear_bits(state->mat, state->depth, k, target->n_bytes, query->len); //show(state->mat, query->len, target->n_bits); refine(state, query, target); //show(state->mat, query->len, target->n_bits); if(state_is_valid(state) == TRUE){ //show(state->mat, query->len, target->n_bits); search_by_ullmann(state, query, target); } state_pop(state); } } } }
// phase 13: backtrack when all possibilities in an entry have been exhausted without success static int searchbacktrack(void) { state_pop(); if(sdep==-1) {rcode=1;return 15;} // all done, no solution found return 12; // try next possibility at level above }
// clear state stacks and free allocated memory static void state_finit(void) {while(sdep>=0) state_pop();}