// The char * returned is malloc()ed and should be free()ed. DLLEXPORT char *fc_solve_user_INTERNAL_delta_states_enc_and_dec( const fcs_dbm_variant_type local_variant GCC_UNUSED, const char *const init_state_s, const char *const derived_state_s) { fcs_state_keyval_pair init_state, derived_state, new_derived_state; fcs_uchar enc_state[24]; fcs_bit_reader bit_r; fcs_state_locs_struct locs; fc_solve_init_locs(&locs); DECLARE_IND_BUF_T(indirect_stacks_buffer) DECLARE_IND_BUF_T(derived_stacks_buffer) DECLARE_IND_BUF_T(new_derived_indirect_stacks_buffer) fc_solve_initial_user_state_to_c(init_state_s, &init_state, FREECELLS_NUM, STACKS_NUM, DECKS_NUM, indirect_stacks_buffer); fc_solve_initial_user_state_to_c(derived_state_s, &derived_state, FREECELLS_NUM, STACKS_NUM, DECKS_NUM, derived_stacks_buffer); fcs_delta_stater delta; fc_solve_delta_stater_init(&delta, local_variant, &(init_state.s), STACKS_NUM, FREECELLS_NUM PASS_ON_NOT_FC_ONLY(FCS_SEQ_BUILT_BY_ALTERNATE_COLOR)); fc_solve_delta_stater_set_derived(&delta, &(derived_state.s)); fc_solve_state_init( &new_derived_state, STACKS_NUM, new_derived_indirect_stacks_buffer); fc_solve_bit_writer bit_w; fc_solve_bit_writer_init(&bit_w, enc_state); fc_solve_delta_stater_encode_composite(&delta, &bit_w); fc_solve_bit_reader_init(&bit_r, enc_state); fc_solve_delta_stater_decode(&delta, &bit_r, &(new_derived_state.s)); char *new_derived_as_str = SMALLOC(new_derived_as_str, 1000); FCS__RENDER_STATE(new_derived_as_str, &(new_derived_state.s), &locs); fc_solve_delta_stater_release(&delta); return new_derived_as_str; }
/* * The char * returned is malloc()ed and should be free()ed. */ DLLEXPORT int fc_solve_user_INTERNAL_calc_derived_states_wrapper( fcs_dbm_variant_type_t local_variant, const char *init_state_str_proto, int *const num_out_derived_states, fcs_derived_state_debug_t **out_derived_states, const fcs_bool_t perform_horne_prune) { fcs_state_keyval_pair_t init_state; fcs_encoded_state_buffer_t enc_state; fcs_state_locs_struct_t locs; fcs_derived_state_t *derived_list = NULL; fcs_derived_state_t *derived_list_recycle_bin = NULL; fcs_compact_allocator_t allocator; fcs_meta_compact_allocator_t meta_alloc; size_t states_count = 0; fcs_derived_state_t *iter; DECLARE_IND_BUF_T(indirect_stacks_buffer) fc_solve_initial_user_state_to_c(init_state_str_proto, &init_state, FREECELLS_NUM, STACKS_NUM, DECKS_NUM, indirect_stacks_buffer); fc_solve_delta_stater_t delta; fc_solve_delta_stater_init( &delta, &(init_state.s), STACKS_NUM, FREECELLS_NUM #ifndef FCS_FREECELL_ONLY , FCS_SEQ_BUILT_BY_ALTERNATE_COLOR #endif ); fcs_init_and_encode_state(&delta, local_variant, &(init_state), &enc_state); fc_solve_meta_compact_allocator_init(&meta_alloc); fc_solve_compact_allocator_init(&allocator, &meta_alloc); instance_solver_thread_calc_derived_states(local_variant, &init_state, NULL, &derived_list, &derived_list_recycle_bin, &allocator, perform_horne_prune); iter = derived_list; while (iter) { states_count++; iter = iter->next; } *(num_out_derived_states) = states_count; fcs_derived_state_debug_t *const debug_ret = SMALLOC(debug_ret, states_count); *(out_derived_states) = debug_ret; fc_solve_init_locs(&locs); iter = derived_list; size_t idx = 0; while (iter) { debug_ret[idx] = (typeof(debug_ret[idx])){ .state_string = SMALLOC(debug_ret[idx].state_string, 1000), .move = iter->move, .core_irreversible_moves_count = iter->core_irreversible_moves_count, .num_non_reversible_moves_including_prune = iter->num_non_reversible_moves_including_prune, .which_irreversible_moves_bitmask = iter->which_irreversible_moves_bitmask}; FCS__RENDER_STATE(debug_ret[idx].state_string, &(iter->state.s), &locs); /* TODO : Put something meaningful there by passing it to the function. */ idx++; iter = iter->next; } assert(idx == states_count); fc_solve_compact_allocator_finish(&allocator); fc_solve_meta_compact_allocator_finish(&meta_alloc); fc_solve_delta_stater_release(&delta); return 0; } /* * The char * returned is malloc()ed and should be free()ed. */ DLLEXPORT int fc_solve_user_INTERNAL_perform_horne_prune( fcs_dbm_variant_type_t local_variant, const char *init_state_str_proto, char **ret_state_s) { fcs_state_keyval_pair_t init_state; fcs_state_locs_struct_t locs; int prune_ret; DECLARE_IND_BUF_T(indirect_stacks_buffer) fc_solve_init_locs(&locs); fc_solve_initial_user_state_to_c(init_state_str_proto, &init_state, FREECELLS_NUM, STACKS_NUM, DECKS_NUM, indirect_stacks_buffer); prune_ret = horne_prune__simple(local_variant, &init_state); *ret_state_s = SMALLOC(*ret_state_s, 1000); FCS__RENDER_STATE(*ret_state_s, &(init_state.s), &locs); return prune_ret; }