def solve_with(cls, solver: Solver, domain_factory: Optional[Callable[[], Domain]] = None, load_path: Optional[str] = None) -> Solver: """Solve the domain with a new or loaded solver and return it auto-cast to the level of the domain. By default, #Solver.check_domain() provides some boilerplate code and internally calls #Solver._check_domain_additional() (which returns True by default but can be overridden to define specific checks in addition to the "domain requirements"). The boilerplate code automatically checks whether all domain requirements are met. # Parameters solver: The solver. domain_factory: A callable with no argument returning the domain to solve (factory is the domain class if None). load_path: The path to restore the solver state from (if None, the solving process will be launched instead). # Returns The new solver (auto-cast to the level of the domain). """ if domain_factory is None: domain_factory = cls if load_path is not None: # TODO: avoid repeating this code somehow (identical in solver.solve(...))? Is factory necessary (vs cls)? def cast_domain_factory(): domain = domain_factory() autocast_all(domain, domain, solver.T_domain) return domain solver.load(load_path, cast_domain_factory) else: solver.solve(domain_factory) autocast_all(solver, solver.T_domain, cls) return solver
def cast_domain_factory(): domain = domain_factory() autocast_all(domain, domain, solver.T_domain) return domain