a_b_split 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/a_b_split.rb +2 -1
- data/lib/a_b_split/functions.rb +1 -0
- data/lib/a_b_split/functions/heaviside_weighted_split.rb +3 -2
- data/lib/a_b_split/functions/md5_weighted_split.rb +1 -0
- data/lib/a_b_split/functions/weighted_split.rb +6 -5
- data/lib/a_b_split/test.rb +3 -2
- data/lib/a_b_split/version.rb +2 -1
- metadata +15 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cfc2882fcb9f24f91f27a3468f85d65924c97a791f3f95ce559df5da565b5f1f
|
4
|
+
data.tar.gz: 54409dd1f4376d3ea80ac105a23a7c9e88cfd12033b94b1fa0659c9028bb7e06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b28f31ba66a0891083612f9d7d47df028754161de2f0fdc2eb50b75f5f3cf6a88d8c97628490d83de3d68746605e820028a8a00afd80de2fe502d89dc6264288
|
7
|
+
data.tar.gz: a25f4d3d1d6c5435a517e68840e7941a3a57482d95052d3bde26eaf5703930d9eed2c60fbfbcfcb6d0e216070a5483e6b65b6bb17dbb44cfbb24e3e45988e294
|
data/lib/a_b_split.rb
CHANGED
data/lib/a_b_split/functions.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'bigdecimal'
|
3
4
|
require_relative 'weighted_split'
|
4
5
|
|
@@ -49,8 +50,8 @@ module ABSplit
|
|
49
50
|
experiment['weight'].to_f / 100
|
50
51
|
end
|
51
52
|
|
52
|
-
def sigmoid(
|
53
|
-
BigDecimal
|
53
|
+
def sigmoid(value)
|
54
|
+
BigDecimal((1.0 / (1 + Math.exp(-2 * value))).to_s)
|
54
55
|
end
|
55
56
|
end
|
56
57
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ABSplit
|
3
4
|
module Functions
|
4
5
|
# Weighted split based on hash value.
|
@@ -10,12 +11,12 @@ module ABSplit
|
|
10
11
|
MAX_POSITIONS = (9_999_999_999_999_999_999 * 2) + 1 # capacity of Fixnum
|
11
12
|
|
12
13
|
class << self
|
13
|
-
def value_for(
|
14
|
+
def value_for(value, *params)
|
14
15
|
given_weights = validate(params)
|
15
16
|
|
16
17
|
experiments = split_weights(params, params.size, given_weights)
|
17
18
|
|
18
|
-
select_experiment_for(
|
19
|
+
select_experiment_for(value, experiments)
|
19
20
|
end
|
20
21
|
|
21
22
|
protected
|
@@ -42,15 +43,15 @@ module ABSplit
|
|
42
43
|
experiment['weight'] = if experiment['weight']
|
43
44
|
experiment['weight'].to_f
|
44
45
|
else
|
45
|
-
missing_percentage.to_f / missing_weights
|
46
|
+
missing_percentage.to_f / missing_weights
|
46
47
|
end
|
47
48
|
|
48
49
|
experiment
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
52
|
-
def select_experiment_for(
|
53
|
-
x_position =
|
53
|
+
def select_experiment_for(value, experiments)
|
54
|
+
x_position = value.hash
|
54
55
|
|
55
56
|
markers(experiments).each_with_index do |limit, i|
|
56
57
|
return experiments[i]['name'] if x_position <= limit
|
data/lib/a_b_split/test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ABSplit
|
3
4
|
# This class is responsible for spliting the population using the experiment
|
4
5
|
# name passed as a parameter. It will always return an experiment name or a
|
@@ -7,12 +8,12 @@ module ABSplit
|
|
7
8
|
include ABSplit
|
8
9
|
|
9
10
|
class << self
|
10
|
-
def split(name,
|
11
|
+
def split(name, value)
|
11
12
|
self.experiment = find(name)
|
12
13
|
|
13
14
|
raise ABSplit::NoValidExperiment unless experiment
|
14
15
|
|
15
|
-
function.value_for(
|
16
|
+
function.value_for(value, *options)
|
16
17
|
end
|
17
18
|
|
18
19
|
private
|
data/lib/a_b_split/version.rb
CHANGED
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: a_b_split
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Enrique M Figuerola Gomez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: pry
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0.12'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0.12'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.8'
|
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
|
-
version: '
|
54
|
+
version: '3.8'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubocop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
61
|
+
version: '0.70'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
68
|
+
version: '0.70'
|
69
69
|
description:
|
70
70
|
email: me@emfigo.com
|
71
71
|
executables: []
|
@@ -92,15 +92,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
92
|
requirements:
|
93
93
|
- - ">="
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: 2.
|
95
|
+
version: '2.3'
|
96
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
97
|
requirements:
|
98
98
|
- - ">="
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
requirements: []
|
102
|
-
|
103
|
-
rubygems_version: 2.6.8
|
102
|
+
rubygems_version: 3.0.3
|
104
103
|
signing_key:
|
105
104
|
specification_version: 4
|
106
105
|
summary: Splits experiment cohorts for A/B testing
|