1 | % (c) 2009-2017 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
2 | % Heinrich Heine Universitaet Duesseldorf | |
3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
4 | ||
5 | :- module(random_permutations, [get_num_bits/3, | |
6 | get_masks/3, | |
7 | random_permutation_element/10, | |
8 | init_random_permutations/0 | |
9 | ]). | |
10 | ||
11 | :- use_module(probsrc(module_information),[module_info/2]). | |
12 | :- module_info(group,cbc). | |
13 | :- module_info(description,'This module provides on-the-fly construction of random permutations of intervals.'). | |
14 | ||
15 | foreign_resource(random_permutations,[get_num_bits,draw_index]). | |
16 | foreign(get_num_bits, c, get_num_bits(+integer,-integer,-integer)). | |
17 | foreign(draw_index, c, draw_index(+integer,+integer,+integer,+integer,+integer,+integer,+integer,+integer,-integer,-integer)). | |
18 | ||
19 | :- dynamic is_initialised/0. | |
20 | ||
21 | init_random_permutations :- is_initialised,!. | |
22 | init_random_permutations :- | |
23 | load_foreign_resource(library(random_permutations)), | |
24 | assert(is_initialised). | |
25 | ||
26 | get_masks(HalfNumBits,LeftMask,RightMask) :- | |
27 | RightMask is (1 << HalfNumBits) - 1, | |
28 | LeftMask is RightMask << HalfNumBits. | |
29 | ||
30 | random_permutation_element(Index,MaxIndex,From,To,Seed,NumBits,LeftMask,RightMask,RandomElement,NextIndex) :- | |
31 | draw_index(Index,MaxIndex,Seed,NumBits,LeftMask,RightMask,From,To,DrawnElement,NextIndex), | |
32 | % working on a 4^x long interval. thus, we might pick a number that is too large | |
33 | % if this happens, we just pick a new one | |
34 | % to avoid context switching overhead, this is now done inside the C code | |
35 | RandomElement is DrawnElement + From. | |
36 | ||
37 | % ------------------- | |
38 | % Testing predicates | |
39 | % ------------------- | |
40 | % unused at the moment: | |
41 | %:- public shuffle/2. | |
42 | %:- use_module(library(system)). | |
43 | %shuffle(From,To) :- | |
44 | % init_random_permutations, | |
45 | % IntervalLength is To - From + 1, | |
46 | % get_num_bits(IntervalLength,MaxIndex,NumBits), | |
47 | % get_masks(NumBits,LeftMask,RightMask), | |
48 | % now(Seed), | |
49 | % shuffle(From,0,To,MaxIndex,Seed,NumBits,LeftMask,RightMask). | |
50 | %shuffle(From,CurIdx,To,MaxIndex,Seed,NumBits,LeftMask,RightMask) :- | |
51 | % random_permutation_element(CurIdx,MaxIndex,From,To,Seed,NumBits,LeftMask,RightMask,Drawn,NextIdx), | |
52 | % format('Drawing index ~w resulted in ~w~n',[CurIdx,Drawn]), | |
53 | % shuffle(From,NextIdx,To,MaxIndex,Seed,NumBits,LeftMask,RightMask). | |
54 | %shuffle(_,_,_,_,_,_,_,_). |