let create (config: config) (bound: bound) (statistic: statistic) (state: state)
  (context: context) (problem_literals: problem_literals) (space_registry: space_registry) : candidates =

  (* min. 1 entry necessary for function add *)
  let unprocessed =
    (* no split candidates at all for horn, so no need for array creation  *)
    if Config.is_horn config then
      [| |]
    else
      Array.make (max 1 Const.max_unprocessed_split_candidates) Context_unifier.null_context_unifier
  in
  {
    cd_config = config;
    cd_bound = bound;
    cd_statistic = statistic;
    cd_state = state;
    cd_context = context;
    cd_problem_literals = problem_literals;
    cd_space_registry = space_registry;

    cd_unprocessed = unprocessed;
    cd_unprocessed_size = 0;
    cd_valid = Valid.create null_candidate;
    cd_invalid = [];
    cd_added = [];
    cd_right_splits = [];
    cd_applied_right_splits = [];

    cd_exceeding_elements = Hashtbl.create 64;
    cd_check_exceeding = false;
  }