pcg_random 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -2
- data/ext/pcg_random/extconf.rb +8 -4
- data/ext/pcg_random/pcg_random.c +3 -3
- data/ext/pcg_random/pcg_seed.c +68 -28
- data/ext/pcg_random/pcg_seed.h +1 -1
- data/ext/pcg_random/rb_constants.c +17 -4
- data/ext/pcg_random/rb_constants.h +6 -1
- data/lib/pcg_random/version.rb +1 -1
- data/pcg_random.gemspec +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80bdb7b230ebe145ca36718ca2b5ce75927611d3
|
4
|
+
data.tar.gz: f54e765d9d10ce35f10ad63f1cbaa0e8f120fc80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: daf8fdc612fdfb584896480a5ccb5f416cad2b235bbd8f46155c568dcee6b35c911a13eb7fc1af6a7ae5be2b3bd448cbe9f99506b06a17fa05403f5baa4ebc02
|
7
|
+
data.tar.gz: 84057b096b179ffe467e470ba42ac35f84c626edf6c006f108aa9643f0e7b1e525d807a29683774be6e887844205499c7dab06aed3140c5e9f56477ebccbbff9
|
data/.gitignore
CHANGED
data/ext/pcg_random/extconf.rb
CHANGED
@@ -2,7 +2,7 @@ require "mkmf"
|
|
2
2
|
|
3
3
|
RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
4
4
|
|
5
|
-
$CFLAGS = "-Wall -pedantic -ansi -std=c99"
|
5
|
+
$CFLAGS = " -Wall -pedantic -ansi -std=c99"
|
6
6
|
|
7
7
|
LIBDIR = RbConfig::CONFIG['libdir']
|
8
8
|
INCLUDEDIR = RbConfig::CONFIG['includedir']
|
@@ -21,8 +21,12 @@ LIB_DIRS = [
|
|
21
21
|
'/usr/lib',
|
22
22
|
]
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
# Typically, it installs libpcg_random.a to /usr/local/lib and
|
25
|
+
# pcg_variants.h in /usr/local/include/pcg_variants.h
|
27
26
|
dir_config('pcg_random', HEADER_DIRS, LIB_DIRS)
|
27
|
+
|
28
|
+
abort 'libpcg_random is missing' unless have_library('pcg_random', 'pcg32_random')
|
29
|
+
abort 'entropy.h missing' unless have_header('entropy.h')
|
30
|
+
abort 'pcg_variants.h missing' unless have_header('pcg_variants.h')
|
31
|
+
|
28
32
|
create_makefile("pcg_random/pcg_random")
|
data/ext/pcg_random/pcg_random.c
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
#include "pcg_random.h"
|
8
8
|
#include "pcg_seed.h"
|
9
9
|
|
10
|
-
VALUE
|
10
|
+
VALUE rb_cPCGRandom;
|
11
11
|
|
12
12
|
void
|
13
13
|
Init_pcg_random(void)
|
@@ -16,9 +16,9 @@ Init_pcg_random(void)
|
|
16
16
|
pcg_init_rb_constants();
|
17
17
|
|
18
18
|
/* Define encapsulating module */
|
19
|
-
|
19
|
+
rb_cPCGRandom = rb_define_class("PCGRandom", rb_cObject);
|
20
20
|
|
21
21
|
/* Define methods under PCGRandom */
|
22
|
-
rb_define_singleton_method(rb_cPCGRandom, "new_seed", pcg_func_new_seed,
|
22
|
+
rb_define_singleton_method(rb_cPCGRandom, "new_seed", pcg_func_new_seed, -1);
|
23
23
|
rb_define_singleton_method(rb_cPCGRandom, "raw_seed", pcg_func_raw_seed, 1);
|
24
24
|
}
|
data/ext/pcg_random/pcg_seed.c
CHANGED
@@ -6,29 +6,53 @@
|
|
6
6
|
#include "rb_constants.h"
|
7
7
|
#include "pcg_seed.h"
|
8
8
|
|
9
|
-
|
10
|
-
static VALUE pcg_new_seed_bytestr(void);
|
9
|
+
static VALUE pcg_new_seed_bytestr(unsigned long seed_size);
|
11
10
|
static VALUE pcg_raw_seed_bytestr(size_t size);
|
12
|
-
static VALUE
|
11
|
+
static VALUE pcg_rb_unpack_str_uint(VALUE str);
|
13
12
|
|
14
13
|
/*
|
15
|
-
* Returns a
|
14
|
+
* Returns a n-bit integer that stores the seed value used to seed the
|
16
15
|
* initial state and sequence for the PCG generator.
|
16
|
+
* If no parameters are supplied it default to a 128-bit seed size
|
17
|
+
*
|
18
|
+
* @param size Number of bytes (EVEN!) that the generated seed must contain.
|
19
|
+
* Defaults to 16 Bytes = 128 bits
|
20
|
+
*
|
21
|
+
* @raise ArgumentError if size is not even
|
17
22
|
*/
|
18
23
|
VALUE
|
19
|
-
pcg_func_new_seed(
|
24
|
+
pcg_func_new_seed(int argc, VALUE *argv, VALUE self)
|
20
25
|
{
|
21
|
-
|
26
|
+
VALUE seed_size;
|
27
|
+
unsigned long n;
|
28
|
+
|
29
|
+
if(argc == 0)
|
30
|
+
{
|
31
|
+
return pcg_new_seed_bytestr(2 * sizeof(uint64_t));
|
32
|
+
}
|
33
|
+
|
34
|
+
rb_scan_args(argc, argv, "01", &seed_size);
|
35
|
+
n = NUM2ULONG(seed_size);
|
36
|
+
|
37
|
+
// Only accept even seed sizes since this later needs to be split into
|
38
|
+
// two parts!
|
39
|
+
if(n % 2 == 1)
|
40
|
+
{
|
41
|
+
rb_raise(rb_eArgError, "Seed size must be even! Found %lu", n);
|
42
|
+
}
|
43
|
+
return pcg_new_seed_bytestr(n * sizeof(char));
|
22
44
|
}
|
23
45
|
|
24
46
|
/*
|
25
|
-
* Generates a random seed represented as a sequence of bytes
|
47
|
+
* Generates a random seed string represented as a sequence of bytes
|
48
|
+
*
|
49
|
+
* @param size Size of the bytestring to generate
|
26
50
|
*/
|
27
51
|
VALUE
|
28
52
|
pcg_func_raw_seed(VALUE self, VALUE byte_size)
|
29
53
|
{
|
30
54
|
unsigned long n = NUM2ULONG(byte_size);
|
31
|
-
if(
|
55
|
+
if(n == 0)
|
32
56
|
{
|
33
57
|
return rb_str_new2("\0");
|
34
58
|
}
|
@@ -42,24 +66,38 @@ pcg_func_raw_seed(VALUE self, VALUE byte_size)
|
|
42
66
|
bool
|
43
67
|
pcg_func_entropy_getbytes(void *dest, size_t size)
|
44
68
|
{
|
45
|
-
|
46
|
-
|
47
|
-
{
|
48
|
-
fallback_entropy_getbytes(dest, size);
|
49
|
-
return true;
|
50
|
-
}
|
51
|
-
return false;
|
69
|
+
// Get random bytes from /dev/random or a fallback source
|
70
|
+
return entropy_getbytes(dest, size);
|
52
71
|
}
|
53
72
|
|
54
73
|
/*
|
55
|
-
* Internal - Unpacks a string `str` wuth
|
56
|
-
* Unpacks and returns the 0th entry (since it's always a 1 element array)
|
74
|
+
* Internal - Unpacks a string `str` wuth String#unpack
|
57
75
|
*/
|
58
76
|
static VALUE
|
59
|
-
|
77
|
+
pcg_rb_unpack_str_uint(VALUE str)
|
60
78
|
{
|
61
|
-
VALUE ary
|
62
|
-
|
79
|
+
VALUE ary, result, current, base;
|
80
|
+
unsigned long len;
|
81
|
+
|
82
|
+
// This would be an array of 8 bit fixnums, effectively representing it in
|
83
|
+
// base-256
|
84
|
+
ary = rb_funcall(str, rb_intern("unpack"), 1, rb_str_new2("C*\0"));
|
85
|
+
len = RARRAY_LEN(ary);
|
86
|
+
|
87
|
+
base = INT2FIX(256);
|
88
|
+
result = pcg_rb_zero;
|
89
|
+
|
90
|
+
// First entry in array corresponds to highest significance
|
91
|
+
for(int i = 0; i < len; ++i)
|
92
|
+
{
|
93
|
+
current = rb_ary_entry(ary, i);
|
94
|
+
// Maybe optimize the below code based on on TYPE(result) later ?
|
95
|
+
// Currently this doesnt utilize the C-API a effectively
|
96
|
+
result = rb_funcall(result, pcg_rb_plus, 1, current);
|
97
|
+
result = rb_funcall(result, pcg_rb_mul, 1 , base);
|
98
|
+
}
|
99
|
+
|
100
|
+
return result;
|
63
101
|
}
|
64
102
|
|
65
103
|
/*
|
@@ -70,25 +108,27 @@ static VALUE
|
|
70
108
|
pcg_raw_seed_bytestr(size_t size)
|
71
109
|
{
|
72
110
|
char *bytestr = (char *) malloc(size + 1);
|
111
|
+
VALUE result;
|
112
|
+
|
73
113
|
memset(bytestr, 0, size + 1);
|
74
114
|
pcg_func_entropy_getbytes((void *)bytestr, size);
|
75
115
|
|
76
|
-
|
116
|
+
result = rb_str_new2(bytestr);
|
117
|
+
free(bytestr);
|
118
|
+
|
119
|
+
return result;
|
77
120
|
}
|
78
121
|
|
79
122
|
/*
|
80
123
|
* Internal - Two random integers are sourced from /dev/random or a fallback
|
81
|
-
*
|
124
|
+
* source
|
82
125
|
* Seed generated by manipulating a 16byte string & unpacking it to Q*
|
83
|
-
*
|
84
|
-
* @see pcg_new_seed_bigmul() for alternative techniques
|
85
126
|
*/
|
86
127
|
static VALUE
|
87
|
-
pcg_new_seed_bytestr(
|
128
|
+
pcg_new_seed_bytestr(unsigned long seed_size)
|
88
129
|
{
|
89
130
|
VALUE seed_bytes_str;
|
90
|
-
|
91
|
-
|
92
|
-
return pcg_rb_unpack_str_ui64(seed_bytes_str);
|
131
|
+
seed_bytes_str = pcg_raw_seed_bytestr(seed_size);
|
132
|
+
return pcg_rb_unpack_str_uint(seed_bytes_str);
|
93
133
|
}
|
94
134
|
|
data/ext/pcg_random/pcg_seed.h
CHANGED
@@ -2,12 +2,25 @@
|
|
2
2
|
#include "rb_constants.h"
|
3
3
|
|
4
4
|
VALUE pcg_rb_zero,
|
5
|
-
pcg_rb_one
|
5
|
+
pcg_rb_one,
|
6
|
+
pcg_rb_big_zero,
|
7
|
+
pcg_rb_big_one;
|
8
|
+
|
9
|
+
|
10
|
+
ID pcg_rb_plus,
|
11
|
+
pcg_rb_mul;
|
6
12
|
|
7
13
|
void
|
8
14
|
pcg_init_rb_constants(void)
|
9
15
|
{
|
10
|
-
|
11
|
-
pcg_rb_zero = INT2FIX(
|
12
|
-
pcg_rb_one = INT2FIX(
|
16
|
+
// Commonly used ruby objects
|
17
|
+
pcg_rb_zero = INT2FIX(0);
|
18
|
+
pcg_rb_one = INT2FIX(1);
|
19
|
+
|
20
|
+
pcg_rb_big_zero = rb_uint2big(0);
|
21
|
+
pcg_rb_big_one = rb_uint2big(1);
|
22
|
+
|
23
|
+
// Commonly called functions
|
24
|
+
pcg_rb_plus = rb_intern("+");
|
25
|
+
pcg_rb_mul = rb_intern("*");
|
13
26
|
}
|
data/lib/pcg_random/version.rb
CHANGED
data/pcg_random.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
|
31
31
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
32
32
|
spec.add_development_dependency 'rake', '~> 10.0'
|
33
|
-
spec.add_development_dependency 'rake-compiler'
|
33
|
+
spec.add_development_dependency 'rake-compiler'
|
34
34
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
35
|
-
spec.add_development_dependency 'pry'
|
35
|
+
spec.add_development_dependency 'pry'
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pcg_random
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vaibhav Yenamandra
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
name: rake-compiler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -70,14 +70,14 @@ dependencies:
|
|
70
70
|
name: pry
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: PCG is a family of simple fast space-efficient statistically good algorithms
|