measurable 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg
2
+ tmp/*
3
+ benchmarks/*
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ # Gemfile
2
+ source "http://rubygems.org"
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,30 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ measurables (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rake (0.9.2.2)
11
+ rake-compiler (0.8.1)
12
+ rake
13
+ rspec (2.9.0)
14
+ rspec-core (~> 2.9.0)
15
+ rspec-expectations (~> 2.9.0)
16
+ rspec-mocks (~> 2.9.0)
17
+ rspec-core (2.9.0)
18
+ rspec-expectations (2.9.1)
19
+ diff-lcs (~> 1.1.3)
20
+ rspec-mocks (2.9.0)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ bundler
27
+ measurables!
28
+ rake (~> 0.9)
29
+ rake-compiler (~> 0.8.1)
30
+ rspec (~> 2.9.0)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Carlos Agarie
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # Measurable
2
+
3
+ This (soon to be) gem encompasses various distance measures to be used in different projects. I want to support both the built-in `Array` class and [NMatrix](http://github.com/sciruby/nmatrix)'s `NVector`.
4
+
5
+ This is a fork of the gem [Distance Measure](https://github.com/reddavis/Distance-Measures), which has a similar objective, but isn't actively maintained and doesn't support NMatrix. Thank you, [reddavis](https://github.com/reddavis). :)
6
+
7
+ # Install
8
+
9
+ I'll update this section when I publish the gem. For now... wait.
10
+
11
+ ## How to use
12
+
13
+ This list will be updated as I have time. I'll refactor the existing measures and add some that I'll need in a project.
14
+
15
+ The API I intend to support is something like this:
16
+
17
+ ```ruby
18
+ require "measurable"
19
+
20
+ u = NVector.ones(2)
21
+ v = NVector.zeros(2)
22
+ w = [1, 0]
23
+
24
+ Measurable::euclidean(u, v) # => 1.41421
25
+ Measurable::euclidean(w, v) # => 1.00000
26
+ Measurable::euclidean(w, w) # => 0.00000
27
+ ```
28
+
29
+ Maybe add some support for some of NMatrix's dtypes, like `:float32`, `:float64`, `:complex64`, `:complex128`, etc.
30
+
31
+ ## How to use, the old way:
32
+
33
+ a = [1,1]
34
+ b = [2,2]
35
+
36
+ a.euclidean_distance(b)
37
+
38
+ a.cosine_similarity(b)
39
+
40
+ a.jaccard_index(b)
41
+
42
+ a.jaccard_distance(b)
43
+
44
+ a.binary_jaccard_index(b)
45
+
46
+ a.binary_jaccard_distance(b)
47
+
48
+ a.tanimoto_coefficient(b)
49
+
50
+ a.haversine_distance(b)
51
+
52
+ This may or may not be the complete list, best thing is to check the source code.
53
+
54
+ There are also a couple bonus methods:
55
+
56
+ a.dot_product(b)
57
+
58
+ a.sum_of_squares
59
+
60
+ a.intersection_with(b)
61
+
62
+ a.union_with(b)
63
+
64
+ # When your dealing with 1's and 0's
65
+ a.binary_intersection_with(b)
66
+
67
+ a.binary_union_with(b)
68
+
69
+ ## License
70
+
71
+ Copyright (c) 2012 Carlos Agarie. See LICENSE for details.
72
+
73
+ The original `Distance Measure` gem is copyrighted by reddavis 2010.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require 'rake'
2
+ require "rake/extensiontask"
3
+
4
+ # Setup the necessary gems, specified in the gemspec.
5
+ require 'bundler'
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts "Run `bundle install` to install missing gems"
11
+ exit e.status_code
12
+ end
13
+
14
+ # Compile task.
15
+ Rake::ExtensionTask.new do |ext|
16
+ ext.name = 'measurable'
17
+ ext.ext_dir = 'ext/measurable'
18
+ ext.lib_dir = 'lib/'
19
+ ext.source_pattern = "**/*.{c, cpp, h}"
20
+ end
@@ -0,0 +1,5 @@
1
+ require "mkmf"
2
+
3
+ dir_config("measurable")
4
+
5
+ create_makefile("measurable")
@@ -0,0 +1,209 @@
1
+ #include <ruby.h>
2
+ #include <math.h>
3
+
4
+ #ifndef RUBY_19
5
+ #ifndef RARRAY_LEN
6
+ #define RARRAY_LEN(v) (RARRAY(v)->len)
7
+ #endif
8
+ #ifndef RARRAY_PTR
9
+ #define RARRAY_PTR(v) (RARRAY(v)->ptr)
10
+ #endif
11
+ #endif
12
+
13
+ /*
14
+ ** def euclidean_distance(other)
15
+ ** sum = 0.0
16
+ ** self.each_index do |i|
17
+ ** sum += (self[i] - other[i])**2
18
+ ** end
19
+ ** Math.sqrt(sum)
20
+ ** end
21
+ */
22
+
23
+ static VALUE rb_euclidean(VALUE self, VALUE other_array) {
24
+ double value = 0.0;
25
+
26
+ /* TODO: check they're the same size. */
27
+ long vector_length = (RARRAY_LEN(self) - 1);
28
+ int index;
29
+
30
+ for (index = 0; index <= vector_length; index++) {
31
+ double x, y;
32
+
33
+ x = NUM2DBL(RARRAY_PTR(self)[index]);
34
+ y = NUM2DBL(RARRAY_PTR(other_array)[index]);
35
+
36
+ value += pow(x - y, 2);
37
+ }
38
+
39
+ return rb_float_new(sqrt(value));
40
+ }
41
+
42
+ /* Prototypes */
43
+ long c_array_size(VALUE array);
44
+
45
+ /*
46
+ ** def dot_product(other)
47
+ ** sum = 0.0
48
+ ** self.each_with_index do |n, index|
49
+ ** sum += n * other[index]
50
+ ** end
51
+ **
52
+ ** sum
53
+ ** end
54
+ */
55
+
56
+ static VALUE rb_dot_product(VALUE self, VALUE other_array) {
57
+ double sum = 0;
58
+
59
+ /* TODO check they're the same size. */
60
+ long array_size = c_array_size(self);
61
+ int index;
62
+
63
+ for(index = 0; index <= array_size; index++) {
64
+ double x, y;
65
+
66
+ x = NUM2DBL(RARRAY_PTR(self)[index]);
67
+ y = NUM2DBL(RARRAY_PTR(other_array)[index]);
68
+
69
+ sum += x * y;
70
+ }
71
+
72
+ return rb_float_new(sum);
73
+ }
74
+
75
+ /*
76
+ ** def sum_of_squares
77
+ ** inject(0) {|sum, n| sum + n ** 2}
78
+ ** end
79
+ */
80
+
81
+ static VALUE rb_sum_of_squares(VALUE self) {
82
+ double sum = 0;
83
+ long array_size = c_array_size(self);
84
+ int index;
85
+
86
+ for(index = 0; index <= array_size; index++) {
87
+ double x;
88
+
89
+ x = NUM2DBL(RARRAY_PTR(self)[index]);
90
+
91
+ sum += pow(x, 2);
92
+ }
93
+
94
+ return rb_float_new(sum);
95
+ }
96
+
97
+ /*
98
+ ** def euclidean_normalize
99
+ ** sum = 0.0
100
+ ** self.each do |n|
101
+ ** sum += n ** 2
102
+ ** end
103
+ **
104
+ ** Math.sqrt(sum)
105
+ ** end
106
+ */
107
+
108
+ static VALUE rb_euclidean_normalize(VALUE self) {
109
+ double sum = 0;
110
+ long array_size = c_array_size(self);
111
+ int index;
112
+
113
+ for(index = 0; index <= array_size; index++) {
114
+ double x;
115
+
116
+ x = NUM2DBL(RARRAY_PTR(self)[index]);
117
+
118
+ sum += pow(x, 2);
119
+ }
120
+
121
+ return rb_float_new(sqrt(sum));
122
+ }
123
+
124
+ /*
125
+ ** def binary_union_with(other)
126
+ ** unions = []
127
+ ** self.each_with_index do |n, index|
128
+ ** if n == 1 || other[index] == 1
129
+ ** unions << 1
130
+ ** else
131
+ ** unions << 0
132
+ ** end
133
+ ** end
134
+ **
135
+ ** unions
136
+ ** end
137
+ */
138
+
139
+ static VALUE rb_binary_union_with(VALUE self, VALUE other_array) {
140
+ //TODO: check arrays are same size
141
+ long array_size = c_array_size(self);
142
+ int index;
143
+ VALUE results = rb_ary_new();
144
+
145
+ for(index = 0; index <= array_size; index++) {
146
+ int self_attribute = NUM2INT(RARRAY_PTR(self)[index]);
147
+ int other_array_attribute = NUM2INT(RARRAY_PTR(other_array)[index]);
148
+
149
+ if(self_attribute == 1 || other_array_attribute == 1) {
150
+ rb_ary_push(results, rb_int_new(1));
151
+ } else {
152
+ rb_ary_push(results, rb_int_new(0));
153
+ }
154
+ }
155
+
156
+ return results;
157
+ }
158
+
159
+ /*
160
+ ** def binary_intersection_with(other)
161
+ ** intersects = []
162
+ ** self.each_with_index do |n, index|
163
+ ** if n == 1 && other[index] == 1
164
+ ** intersects << 1
165
+ ** else
166
+ ** intersects << 0
167
+ ** end
168
+ ** end
169
+ **
170
+ ** intersects
171
+ ** end
172
+ */
173
+
174
+ static VALUE rb_binary_intersection_with(VALUE self, VALUE other_array) {
175
+ /* TODO check arrays are same size */
176
+ long array_size = c_array_size(self);
177
+ int index;
178
+ VALUE results = rb_ary_new();
179
+
180
+ for(index = 0; index <= array_size; index++) {
181
+ int self_attribute = NUM2INT(RARRAY_PTR(self)[index]);
182
+ int other_array_attribute = NUM2INT(RARRAY_PTR(other_array)[index]);
183
+
184
+ if(self_attribute == 1 && other_array_attribute == 1) {
185
+ rb_ary_push(results, rb_int_new(1));
186
+ } else {
187
+ rb_ary_push(results, rb_int_new(0));
188
+ }
189
+ }
190
+
191
+ return results;
192
+ }
193
+
194
+ /* return the size of a Ruby array - 1 */
195
+ long c_array_size(VALUE array) {
196
+ return (RARRAY_LEN(array) - 1);
197
+ }
198
+
199
+ void
200
+ Init_measurable()
201
+ {
202
+ VALUE rb_measurable = rb_define_module("Measurable");
203
+ rb_define_method(rb_measurable, "euclidean", rb_euclidean, 1);
204
+ rb_define_method(rb_measurable, "dot_product", rb_dot_product, 1);
205
+ rb_define_method(rb_measurable, "sum_of_squares", rb_sum_of_squares, 0);
206
+ rb_define_method(rb_measurable, "euclidean_normalize", rb_euclidean_normalize, 0);
207
+ rb_define_method(rb_measurable, "binary_union_with", rb_binary_union_with, 1);
208
+ rb_define_method(rb_measurable, "binary_intersection_with", rb_binary_intersection_with, 1);
209
+ }
data/lib/measurable.rb ADDED
@@ -0,0 +1,32 @@
1
+ $:.unshift(File.dirname(__FILE__) + "/../lib")
2
+
3
+ require "measurable/version.rb"
4
+
5
+ require "measurable/cosine_similarity"
6
+ require "measurable/tanimoto_coefficient"
7
+ require "measurable/jaccard"
8
+ require "measurable/haversine"
9
+
10
+ require "measurable.so"
11
+
12
+ class Array
13
+ include Measurable
14
+
15
+ # http://en.wikipedia.org/wiki/Intersection_(set_theory)
16
+ def intersection_with(other)
17
+ (self & other)
18
+ end
19
+
20
+ # http://en.wikipedia.org/wiki/Union_(set_theory)
21
+ def union_with(other)
22
+ (self + other).uniq
23
+ end
24
+
25
+ private
26
+
27
+ # Checks if we"re dealing with NaN"s and will return 0.0 unless
28
+ # handle NaN"s is set to false
29
+ def handle_nan(result)
30
+ result.nan? ? 0.0 : result
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ module Measurable
2
+ def self.cosine_similarity(other)
3
+ dot_product = self.dot_product(other)
4
+ normalization = self.euclidean_normalize * other.euclidean_normalize
5
+
6
+ handle_nan(dot_product / normalization)
7
+ end
8
+ end
@@ -0,0 +1,46 @@
1
+ #
2
+ # Notes:
3
+ #
4
+ # translated into Ruby based on information contained in:
5
+ # http://mathforum.org/library/drmath/view/51879.html Doctors Rick and Peterson - 4/20/99
6
+ # http://www.movable-type.co.uk/scripts/latlong.html
7
+ # http://en.wikipedia.org/wiki/Haversine_formula
8
+ #
9
+ # This formula can compute accurate distances between two points given latitude and longitude, even for
10
+ # short distances.
11
+
12
+ module Measurable
13
+
14
+ # PI = 3.1415926535
15
+ RAD_PER_DEG = 0.017453293 # PI/180
16
+
17
+ R_MILES = 3956 # radius of the great circle in miles
18
+ R_KM = 6371 # radius in kilometers...some algorithms use 6367
19
+
20
+ # the great circle distance d will be in whatever units R is in
21
+ R = {
22
+ :miles => R_MILES,
23
+ :km => R_KM,
24
+ :feet => R_MILES * 5282,
25
+ :meters => R_KM * 1000
26
+ }
27
+
28
+ def haversine_distance(other, um = :meters)
29
+ dlon = other[1] - self[1]
30
+ dlat = other[0] - self[0]
31
+
32
+ dlon_rad = dlon * RAD_PER_DEG
33
+ dlat_rad = dlat * RAD_PER_DEG
34
+
35
+ lat1_rad = self[0] * RAD_PER_DEG
36
+ lon1_rad = self[1] * RAD_PER_DEG
37
+
38
+ lat2_rad = other[0] * RAD_PER_DEG
39
+ lon2_rad = other[1] * RAD_PER_DEG
40
+
41
+ a = (Math.sin(dlat_rad/2))**2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * (Math.sin(dlon_rad/2))**2
42
+ c = 2 * Math.atan2( Math.sqrt(a), Math.sqrt(1-a))
43
+
44
+ R[um] * c
45
+ end
46
+ end
@@ -0,0 +1,26 @@
1
+ # http://en.wikipedia.org/wiki/Jaccard_coefficient
2
+ module Measurable
3
+
4
+ def jaccard_distance(other)
5
+ 1 - self.jaccard_index(other)
6
+ end
7
+
8
+ def jaccard_index(other)
9
+ union = (self + other).uniq.size.to_f
10
+ intersection = self.intersection_with(other).size.to_f
11
+
12
+ intersection / union
13
+ end
14
+
15
+ def binary_jaccard_distance(other)
16
+ 1 - self.binary_jaccard_index(other)
17
+ end
18
+
19
+ def binary_jaccard_index(other)
20
+ intersection = self.binary_intersection_with(other).delete_if {|x| x == 0}.size.to_f
21
+ union = self.binary_union_with(other).delete_if {|x| x == 0}.size.to_f
22
+
23
+ intersection / union
24
+ end
25
+
26
+ end
@@ -0,0 +1,9 @@
1
+ # http://en.wikipedia.org/wiki/Jaccard_index#Tanimoto_coefficient_.28extended_Jaccard_coefficient.29
2
+ module Measurable
3
+ def tanimoto_coefficient(other)
4
+ dot = self.dot_product(other).to_f
5
+ result = dot / (self.sum_of_squares + other.sum_of_squares - dot).to_f
6
+
7
+ handle_nan(result)
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Measurable
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require 'measurable/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "measurable"
8
+ gem.version = Measurable::VERSION
9
+ gem.date = Date.today.to_s
10
+ gem.summary = %Q{A Ruby module with a lot of distance measures for your projects.}
11
+ gem.description = %Q{A Ruby module with a lot of distance measures for your projects.}
12
+
13
+ gem.authors = ["Carlos Agarie"]
14
+ gem.email = "carlos@onox.com.br"
15
+ gem.homepage = "http://github.com/agarie/measurable"
16
+
17
+ gem.files = `git ls-files`.split("\n")
18
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+
21
+ gem.require_paths = ["lib"]
22
+ gem.extensions = ['ext/measurable/extconf.rb']
23
+
24
+ gem.required_ruby_version = '>= 1.9.2'
25
+
26
+ gem.add_development_dependency 'bundler'
27
+ gem.add_development_dependency 'rake', '~> 0.9'
28
+ gem.add_development_dependency 'rake-compiler', '~> 0.8.1'
29
+ gem.add_development_dependency 'rspec', '~> 2.9.0'
30
+ end
@@ -0,0 +1,106 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Measurable do
4
+
5
+ let(:array) { [5, 5] }
6
+ let(:array_2) { [7, 3, 2, 4, 1] }
7
+ let(:array_3) { [4, 1, 9, 7, 5] }
8
+
9
+ describe "Euclidean Distance" do
10
+ it "should return 0.0" do
11
+ array.euclidean_distance(array).should == 0.0
12
+ end
13
+
14
+ it "should return 4.0" do
15
+ [5].euclidean_distance([1]).should == 4.0
16
+ end
17
+ end
18
+
19
+ describe "Cosine Similarity" do
20
+ it "should return 1.0" do
21
+ array.cosine_similarity(array).should.to_s == "1.0" # WTF
22
+ end
23
+
24
+ it "should handle NaN's" do
25
+ [0.0, 0.0].cosine_similarity([0.0, 0.0]).nan?.should be_false
26
+ end
27
+ end
28
+
29
+ describe "Tanimoto Coefficient" do
30
+ it "should return 1.0" do
31
+ array.tanimoto_coefficient(array).should == 1.0
32
+ end
33
+
34
+ it "should handle NaN's" do
35
+ [0.0, 0.0].tanimoto_coefficient([0.0, 0.0]).nan?.should be_false
36
+ end
37
+ end
38
+
39
+ describe "Sum of Squares" do
40
+ it "should return 50" do
41
+ array.sum_of_squares.should == 50
42
+ end
43
+ end
44
+
45
+ describe "Jaccard" do
46
+ describe "Jaccard Distance" do
47
+ it "should return" do
48
+ array_2.jaccard_distance(array_3).should == (1 - 3.0/7.0)
49
+ end
50
+ end
51
+
52
+ describe "Jaccard Index" do
53
+ it "should return" do
54
+ array_2.jaccard_index(array_3).should == 3.0/7.0
55
+ end
56
+ end
57
+
58
+ describe "Binary Jaccard Index" do
59
+ it "should return 1/4" do
60
+ [1,1,1,1].binary_jaccard_index([0,1,0,0]).should == 1/4.0
61
+ end
62
+ end
63
+ end
64
+
65
+ describe "Binary Jaccard Distance" do
66
+ it "should return 0.75" do
67
+ [1,1,1,1].binary_jaccard_distance([0,1,0,0]).should == 1 - (1/4.0)
68
+ end
69
+ end
70
+
71
+ describe "Intersection" do
72
+ it "should return [7,4,1]" do
73
+ array_2.intersection_with(array_3).should == [7,4,1]
74
+ end
75
+ end
76
+
77
+ describe "Union" do
78
+ it "should return " do
79
+ array_2.union_with(array_3).should == [7,3,2,4,1,9,5]
80
+ end
81
+ end
82
+
83
+ describe "Binary Intersection" do
84
+ it "should return [0,1,0,0]" do
85
+ [1,1,1,1].binary_intersection_with([0,1,0,0]).should == [0,1,0,0]
86
+ end
87
+ end
88
+
89
+ describe "Binary Union" do
90
+ it "should return [1,1,1,0]" do
91
+ [1,1,1,0].binary_union_with([0,0,0,0]).should == [1,1,1,0]
92
+ end
93
+ end
94
+
95
+ describe "Dot Product" do
96
+ it "should return 50" do
97
+ [5, 5].dot_product([5, 5]).should == 50.0
98
+ end
99
+ end
100
+
101
+ describe "Euclidean normalize" do
102
+ it "should" do
103
+ [10].euclidean_normalize.should == 10
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'measurable'
5
+ require 'spec'
6
+ require 'spec/autorun'
7
+
8
+ Spec::Runner.configure do |config|
9
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: measurable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Carlos Agarie
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '0.9'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.9'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake-compiler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.8.1
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.9.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.9.0
78
+ description: A Ruby module with a lot of distance measures for your projects.
79
+ email: carlos@onox.com.br
80
+ executables: []
81
+ extensions:
82
+ - ext/measurable/extconf.rb
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - Gemfile
87
+ - Gemfile.lock
88
+ - LICENSE
89
+ - README.md
90
+ - Rakefile
91
+ - ext/measurable/extconf.rb
92
+ - ext/measurable/measurable.c
93
+ - lib/measurable.rb
94
+ - lib/measurable/cosine_similarity.rb
95
+ - lib/measurable/haversine.rb
96
+ - lib/measurable/jaccard.rb
97
+ - lib/measurable/tanimoto_coefficient.rb
98
+ - lib/measurable/version.rb
99
+ - measurable.gemspec
100
+ - spec/measurable.rb
101
+ - spec/spec_helper.rb
102
+ homepage: http://github.com/agarie/measurable
103
+ licenses: []
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: 1.9.2
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 1.8.24
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: A Ruby module with a lot of distance measures for your projects.
126
+ test_files:
127
+ - spec/measurable.rb
128
+ - spec/spec_helper.rb