montecarlo

corsort.montecarlo.evaluate(sort_list, n_list, nt, pool=None)[source]

Run a sim.

Parameters:
  • sort_list (list) – List of sorting algorithms (cf. examples).

  • n_list (list) – List of sizes for the tested lists.

  • nt (int) – Number of samples.

  • pool (Pool, optional.) – Use parallelism.

Examples

>>> from corsort import SortQuick, WrapFullJit, entropy_bound, jit_corsort_borda
>>> my_nt = 100
>>> np.random.seed(42)
>>> my_sort_list = [SortQuick(), WrapFullJit(jit_corsort_borda)]
>>> my_n_list = [10, 15]

Evaluate corsort and quicksort using a Pool:

>>> with Pool() as p:
...     my_res = evaluate(my_sort_list, my_n_list, nt=my_nt, pool=p)
Evaluate quicksort for n = 10
Evaluate corsort_borda for n = 10
Evaluate quicksort for n = 15
Evaluate corsort_borda for n = 15
>>> print_res(my_res)
n=10, quicksort: mean=24.15, std=3.50
n=15, quicksort: mean=46.26, std=6.99
n=10, corsort_borda: mean=22.11, std=0.87
n=15, corsort_borda: mean=40.59, std=1.33

Same without the pool:

>>> np.random.seed(42)
>>> my_res = evaluate(my_sort_list, my_n_list, nt=my_nt)
Evaluate quicksort for n = 10
Evaluate corsort_borda for n = 10
Evaluate quicksort for n = 15
Evaluate corsort_borda for n = 15
>>> print_res(my_res)
n=10, quicksort: mean=24.15, std=3.50
n=15, quicksort: mean=46.26, std=6.99
n=10, corsort_borda: mean=22.11, std=0.87
n=15, corsort_borda: mean=40.59, std=1.33

Bound (loose, not exact):

>>> print("\n".join(f"Bound for n={my_n}: {entropy_bound(my_n):.2f}" for my_n in my_n_list))
Bound for n=10: 21.78
Bound for n=15: 40.24
corsort.montecarlo.evaluate_comparisons(sort_list, n_list, nt, pool=None)[source]
Parameters:
  • sort_list

  • n_list

  • nt

  • pool

Examples

>>> from corsort import SortQuick, WrapFullJit, entropy_bound, jit_corsort_borda
>>> my_nt = 100
>>> np.random.seed(42)
>>> my_sort_list = [SortQuick(), WrapFullJit(jit_corsort_borda)]
>>> my_n_list = [10, 15]

Evaluate corsort and quicksort using a Pool:

>>> with Pool() as p:
...     my_res = evaluate_comparisons(my_sort_list, my_n_list, nt=my_nt, pool=p)
Evaluate comparisons of quicksort for n = 10
Evaluate comparisons of corsort_borda for n = 10
Evaluate comparisons of quicksort for n = 15
Evaluate comparisons of corsort_borda for n = 15
>>> np.round(np.mean(my_res['quicksort'][10]), 1)
24.2

Same without the pool:

>>> np.random.seed(42)
>>> my_res = evaluate_comparisons(my_sort_list, my_n_list, nt=my_nt)
Evaluate comparisons of quicksort for n = 10
Evaluate comparisons of corsort_borda for n = 10
Evaluate comparisons of quicksort for n = 15
Evaluate comparisons of corsort_borda for n = 15
>>> np.round(np.mean(my_res['quicksort'][10]), 1)
24.2
corsort.montecarlo.evaluate_convergence(sort_list, n, nt, pool=None)[source]

Performance profile.

Parameters:
  • sort_list (list) – List of sorting algorithms (cf. examples).

  • n (int) – Size for the tested lists.

  • nt (int) – Number of samples.

  • pool (Pool, optional.) – Use parallelism.

Returns:

Key: name of the sorting algorithm. Value: a ndarray of nt rows. Each row gives the history of distance to the sorted list.

Return type:

dict

Examples

>>> from corsort import SortQuick, WrapFullJit, entropy_bound, jit_corsort_borda
>>> my_nt = 100
>>> np.random.seed(42)
>>> my_sort_list = [SortQuick(), WrapFullJit(jit_corsort_borda)]
>>> my_n = 10

Evaluate corsort and quicksort using a Pool:

>>> with Pool() as p:
...     my_res = evaluate_convergence(my_sort_list, my_n, nt=my_nt, pool=p)
Evaluate convergence of quicksort for n = 10
Evaluate convergence of corsort_borda for n = 10
>>> np.round(np.mean(my_res['quicksort'], axis=0), 1)  
array([32.7, 32.4, 32. , 31.4, 30.4, 28.9, 27.1, 24.8, 21.7, 18.8, 18.3,
       17.5, 16.8, 15.3, 13.9, 12.1, 10.2,  9. ,  7.8,  6.5,  5.1,  3.9,
        2.9,  2.1,  1.5,  1.1,  0.9,  0.6,  0.5,  0.3,  0.2,  0.1,  0.1,
        0.1,  0. ,  0. ,  0. ])

Same without the pool:

>>> np.random.seed(42)
>>> my_res = evaluate_convergence(my_sort_list, my_n, nt=my_nt)
Evaluate convergence of quicksort for n = 10
Evaluate convergence of corsort_borda for n = 10
>>> np.round(np.mean(my_res['quicksort'], axis=0), 1)  
array([32.7, 32.4, 32. , 31.4, 30.4, 28.9, 27.1, 24.8, 21.7, 18.8, 18.3,
       17.5, 16.8, 15.3, 13.9, 12.1, 10.2,  9. ,  7.8,  6.5,  5.1,  3.9,
        2.9,  2.1,  1.5,  1.1,  0.9,  0.6,  0.5,  0.3,  0.2,  0.1,  0.1,
        0.1,  0. ,  0. ,  0. ])