(*************************************) (* PRIOQUEUE *) (*************************************) module type PRIOQUEUE = sig type priority = int type 'a queue (* now abstract *) val empty : unit -> 'a queue val is_empty : 'a queue -> bool val insert : 'a queue -> priority -> 'a -> 'a queue val delete_min : 'a queue -> priority * 'a * 'a queue val find_min : 'a queue -> priority * 'a * 'a queue val union : 'a queue -> 'a queue -> 'a queue exception Queue_is_empty end;; (*************************************) (* CYCLE QUEUE *) (*************************************) module type CYCLE_QUEUE = sig type priority = int type 'a queue (* now abstract *) val empty : unit -> 'a queue val is_empty : 'a queue -> bool val insert : 'a queue -> priority -> 'a -> 'a queue val delete_min : 'a queue -> priority * 'a * 'a queue val find_min : 'a queue -> priority * 'a * 'a queue val divide : 'a queue -> priority * 'a queue * 'a queue exception Queue_is_empty exception Queue_is_full end;; (*************************************) (* Number of array elements *) (*************************************) module type SIZE = sig val size : int end;; (*************************************) (* Keys G E N E R A T O R *) (*************************************) module type KEYS_GENERATOR = sig val permutations : int -> int list list val list_i_to_j : int -> int -> int list val init_random : unit -> unit val random_int_from_i_to_j : int -> int -> int val list_of_n_rand_from_i_to_j : int -> int -> int -> int list val prop_s_div_r : int -> int -> bool val add_k_min_to_l : int -> int -> int list -> int list val list_of_n_i : int -> int -> int list val randomize : float -> int list -> int list end;; module type PRIOQUEUE_TESTER = functor (Prioqueue : PRIOQUEUE) -> sig type generation_method (* this module is parametrized *) (* feel free to change the default values *) (* though they can be changed dynamically *) (* P A R A M E T E R S *) (* elem and min need to be of same type 'a *) val min : int ref (* min should be only used with minimal key *) val elem : int ref (* defines the smallest key in the list *) val min_key : int ref (* number of min elements in generated keys list *) val num_of_min : int ref (* number of other elements in that same list *) val num_of_other : int ref (* number of devalions when testing speed *) val num_of_delete : int ref (* size of permutation when generated for stats *) val permutation_size : int ref (* how many elements will be inserted into queue when generating stats about certain permutations *) val queue_input_size : int ref (* when random : float is level of randomization, const means only min_key is in keys list *) val key_gen_method : generation_method ref (* defines hom many times a test will be repeated for one permutation *) val how_precise : int ref (* please remember, that the same list is used for *) (* both speed and correctness testing *) val keys : Prioqueue.priority list ref (* M E T H O D S F O R M O D I F Y I N G P A R A M E T E R S *) val max_permutation_size : int exception Parameter_value_is_to_low exception Parameter_value_is_to_high val set_min : Prioqueue.priority -> unit val set_elem : Prioqueue.priority -> unit val set_min_key : Prioqueue.priority -> unit val set_num_of_min : int -> unit val set_num_of_other : int -> unit val set_num_of_delete : int -> unit val set_same_ins_del : int -> unit val set_permutation_size : int -> unit val set_queue_input_size : int -> unit val set_key_gen_method : float -> unit val set_base_keys : Prioqueue.priority list -> unit val set_how_precise : int -> unit val key_gen : unit -> unit (* please remember, that the same list is used for *) (* both speed and correctness testing *) val keys : Prioqueue.priority list ref val key_gen : unit -> unit val correct_insert_find_min : unit -> bool val correct_insert_del_min : unit -> bool val speed_insert_del_min : unit -> float val correct_union : int -> bool val correct_union_all : unit -> bool val speed_union : int -> float val permutation_size : int ref val queue_input_size : int ref val how_precise : int ref val choose_best_permutations : unit -> (Prioqueue.priority list * float) list val statistics_of_best_permutations : unit -> (Prioqueue.priority list * float) list * float * float * float end;;