class FC_Solve: # TEST:$num_befs_weights=5; NUM_BEFS_WEIGHTS = 5 FCS_STATE_SUSPEND_PROCESS = 5 def __init__(self): self.ffi = FFI() self.lib = self.ffi.dlopen( "../libfreecell-solver." + ("dll" if (platform.system() == 'Windows') else "so")) self.ffi.cdef(''' void * freecell_solver_user_alloc(); typedef struct{ char s[20];}fcs_move_t; int freecell_solver_user_get_moves_left (void * user); int freecell_solver_user_get_next_move (void * user, fcs_move_t * move); void freecell_solver_user_free(void * instance); double fc_solve_user_INTERNAL_get_befs_weight(void * user, int idx); typedef char * freecell_solver_str_t; typedef int (*freecell_solver_user_cmd_line_known_commands_callback_t)( void *instance, int argc, freecell_solver_str_t argv[], int arg_index, int *num_to_skip, int *ret, void *context); int freecell_solver_user_cmd_line_parse_args_with_file_nesting_count( void *instance, int argc, freecell_solver_str_t argv[], int start_arg, freecell_solver_str_t *known_parameters, freecell_solver_user_cmd_line_known_commands_callback_t callback, void *callback_context, char **error_string, int *last_arg, int file_nesting_count, freecell_solver_str_t opened_files_dir); int freecell_solver_user_set_flares_plan(void * instance, char * s); int freecell_solver_user_INTERNAL_compile_all_flares_plans(void * instance, char * * s); int fc_solve_user_INTERNAL_get_flares_plan_num_items(void * i); char * fc_solve_user_INTERNAL_get_flares_plan_item_type(void * i, int item_idx); int fc_solve_user_INTERNAL_get_flares_plan_item_flare_idx(void * i, int item_idx); int fc_solve_user_INTERNAL_get_flares_plan_item_iters_count(void * i, int item_idx); int fc_solve_user_INTERNAL_compile_all_flares_plans(void * i, char **error_string); int fc_solve_user_INTERNAL_get_num_by_depth_tests_order( void * api_instance); int fc_solve_user_INTERNAL_get_by_depth_tests_max_depth( void * api_instance, int depth_idx); long freecell_solver_user_get_num_times_long(void * user); long freecell_solver_user_get_num_states_in_collection_long(void * user); void freecell_solver_user_limit_iterations_long( void * api_instance, const long max_iters); int freecell_solver_user_solve_board(void *api_instance, const char *const state_as_string); int freecell_solver_user_resume_solution(void * user); void freecell_solver_user_recycle(void *api_instance); ''') self.user = self.lib.freecell_solver_user_alloc() def is_SUSPEND(self, ret_code): """docstring for is_SUSPEND""" return ret_code == self.FCS_STATE_SUSPEND_PROCESS def get_next_move(self): move = self.ffi.new('fcs_move_t *') num_moves = self.lib.freecell_solver_user_get_moves_left(self.user) if not num_moves: return None ret = self.lib.freecell_solver_user_get_next_move(self.user, move) SUCCESS = 0 return (move if ret == SUCCESS else None) def input_cmd_line__generic(self, cmd_line_args): last_arg = self.ffi.new('int *') error_string = self.ffi.new('char * *') known_params = self.ffi.new('char * *') opened_files_dir = self.ffi.new('char [32001]') prefix = 'freecell_solver_user_cmd_line' func = 'parse_args_with_file_nesting_count' getattr(self.lib, prefix + '_' + func)( self.user, # instance len(cmd_line_args), # argc [self.ffi.new('char[]', bytes(s, 'UTF-8')) \ for s in cmd_line_args], # argv 0, # start_arg known_params, # known_params self.ffi.NULL, # callback self.ffi.NULL, # callback_context error_string, # error_string last_arg, # last_arg -1, # file_nesting_count opened_files_dir ) return (last_arg[0], len(cmd_line_args)) # TEST:$set_befs=0; def _set_befs_weights(self, name, weights_s): # TEST:$set_befs=$set_befs+$input_cmd_line; self.input_cmd_line(name, ["-asw", weights_s]) def __destroy__(self): self.ffi.freecell_solver_user_free(self.user) def _get_plan_type(self, item_idx): return self.ffi.string( self.lib.fc_solve_user_INTERNAL_get_flares_plan_item_type( self.user, item_idx)) def solve_board(self, board): return self.lib.freecell_solver_user_solve_board( self.user, bytes(board, 'UTF-8') ) def resume_solution(self): return self.lib.freecell_solver_user_resume_solution(self.user) def limit_iterations(self, max_iters): self.lib.freecell_solver_user_limit_iterations_long( self.user, max_iters ) def get_num_times(self): return self.lib.freecell_solver_user_get_num_times_long( self.user) def get_num_states_in_col(self): return self.lib.freecell_solver_user_get_num_states_in_collection_long( self.user) def recycle(self): self.lib.freecell_solver_user_recycle(self.user)
class FC_Solve: # TEST:$num_befs_weights=5; NUM_BEFS_WEIGHTS = 5 def __init__(self): self.ffi = FFI() self.lib = self.ffi.dlopen("../libfreecell-solver." + ("dll" if ( platform.system() == 'Windows') else "so")) self.ffi.cdef(''' void * freecell_solver_user_alloc(); void freecell_solver_user_free(void * instance); double fc_solve_user_INTERNAL_get_befs_weight(void * user, int idx); typedef char * freecell_solver_str_t; typedef int (*freecell_solver_user_cmd_line_known_commands_callback_t)( void *instance, int argc, freecell_solver_str_t argv[], int arg_index, int *num_to_skip, int *ret, void *context); int freecell_solver_user_cmd_line_parse_args_with_file_nesting_count( void *instance, int argc, freecell_solver_str_t argv[], int start_arg, freecell_solver_str_t *known_parameters, freecell_solver_user_cmd_line_known_commands_callback_t callback, void *callback_context, char **error_string, int *last_arg, int file_nesting_count, freecell_solver_str_t opened_files_dir); int freecell_solver_user_set_flares_plan(void * instance, char * s); int freecell_solver_user_INTERNAL_compile_all_flares_plans(void * instance, char * * s); int fc_solve_user_INTERNAL_get_flares_plan_num_items(void * i); char * fc_solve_user_INTERNAL_get_flares_plan_item_type(void * i, int item_idx); int fc_solve_user_INTERNAL_get_flares_plan_item_flare_idx(void * i, int item_idx); int fc_solve_user_INTERNAL_get_flares_plan_item_iters_count(void * i, int item_idx); int fc_solve_user_INTERNAL_compile_all_flares_plans(void * i, char **error_string); int fc_solve_user_INTERNAL_get_num_by_depth_tests_order( void * api_instance); int fc_solve_user_INTERNAL_get_by_depth_tests_max_depth( void * api_instance, int depth_idx); long freecell_solver_user_get_num_times_long(void * user); long freecell_solver_user_get_num_states_in_collection_long(void * user); void freecell_solver_user_limit_iterations_long( void * api_instance, const long max_iters); int freecell_solver_user_solve_board(void *api_instance, const char *const state_as_string); int freecell_solver_user_resume_solution(void * user); void freecell_solver_user_recycle(void *api_instance); ''') self.user = self.lib.freecell_solver_user_alloc() def input_cmd_line__generic(self, cmd_line_args): last_arg = self.ffi.new('int *') error_string = self.ffi.new('char * *') known_params = self.ffi.new('char * *') opened_files_dir = self.ffi.new('char [32001]') prefix = 'freecell_solver_user_cmd_line' func = 'parse_args_with_file_nesting_count' getattr(self.lib, prefix + '_' + func)( self.user, # instance len(cmd_line_args), # argc [self.ffi.new('char[]', bytes(s, 'UTF-8')) \ for s in cmd_line_args], # argv 0, # start_arg known_params, # known_params self.ffi.NULL, # callback self.ffi.NULL, # callback_context error_string, # error_string last_arg, # last_arg -1, # file_nesting_count opened_files_dir ) return (last_arg[0], len(cmd_line_args)) # TEST:$set_befs=0; def _set_befs_weights(self, name, weights_s): # TEST:$set_befs=$set_befs+$input_cmd_line; self.input_cmd_line(name, ["-asw", weights_s]) def __destroy__(self): self.ffi.freecell_solver_user_free(self.user) def _get_plan_type(self, item_idx): return self.ffi.string( self.lib.fc_solve_user_INTERNAL_get_flares_plan_item_type( self.user, item_idx)) def solve_board(self, board): return self.lib.freecell_solver_user_solve_board( self.user, bytes(board, 'UTF-8')) def resume_solution(self): return self.lib.freecell_solver_user_resume_solution(self.user) def limit_iterations(self, max_iters): self.lib.freecell_solver_user_limit_iterations_long( self.user, max_iters) def get_num_times(self): return self.lib.freecell_solver_user_get_num_times_long(self.user) def get_num_states_in_col(self): return self.lib.freecell_solver_user_get_num_states_in_collection_long( self.user) def recycle(self): self.lib.freecell_solver_user_recycle(self.user)