0
struct array_comparison {
0
long intersection_size;
0
-static struct array_comparison compare_arrays(VALUE a, VALUE b) {
0
- size_t a_size = RARRAY(a)->len;
0
- size_t b_size = RARRAY(b)->len;
0
- struct array_comparison result;
0
+typedef double (* fun_array_cmp)(const struct array_comparison);
0
+static VALUE compare_arrays(VALUE a, VALUE b, fun_array_cmp cmp) {
0
+ struct array_comparison result = { 0, 0, RARRAY(a)->len, RARRAY(b)->len };
0
- result.intersection_size = 0;
0
- result.union_size = a_size + b_size;
0
+ result.union_size = result.a_size + result.b_size;
0
- if((
a_size > 0) && (b_size > 0))
0
+ if((
result.a_size > 0) && (result.b_size > 0))
0
COPYRUBYHASHARRAY(a, long_a);
0
COPYRUBYHASHARRAY(b, long_b);
0
- for(i = 0; i <
a_size; ++i)
0
+ for(i = 0; i <
result.a_size; ++i)
0
- for(j = 0; j <
b_size; ++j)
0
+ for(j = 0; j <
result.b_size; ++j)
0
if(long_a[i] == long_b[j])
0
@@ -41,27 +42,45 @@ static struct array_comparison compare_arrays(VALUE a, VALUE b) {
0
+ return r
b_float_new((*cmp)(result));
0
-// Calculates the Tanimoto coefficient between two sets.
0
-static VALUE Similarity_tanimoto_coefficient(VALUE self, VALUE data1, VALUE data2) {
0
- struct array_comparison cmp = compare_arrays(data1, data2);
0
+double tanimoto_coefficient(const struct array_comparison cmp) {
0
- result = cmp.intersection_size / (double)(cmp.union_size - cmp.intersection_size);
0
+ return (cmp.intersection_size / (double)(cmp.union_size - cmp.intersection_size));
0
- return rb_float_new(result);
0
+double dice_coefficient(const struct array_comparison cmp) {
0
+ if(cmp.union_size > 0)
0
+ return (2 * cmp.intersection_size) / (double)(cmp.a_size + cmp.b_size);
0
+// Calculates the Tanimoto coefficient between two sets.
0
+static VALUE Similarity_tanimoto_coefficient(VALUE self, VALUE data1, VALUE data2) {
0
+ return compare_arrays(data1, data2, tanimoto_coefficient);
0
+static VALUE Similarity_dice_coefficient(VALUE self, VALUE data1, VALUE data2) {
0
+ return compare_arrays(data1, data2, dice_coefficient);
0
VALUE rbgsl_mSimilarity;
0
void Init_Similarity() {
0
rbgsl_mSimilarity = rb_define_module_under(rbgsl_mGSL, "Similarity");
0
rb_define_module_function(rbgsl_mSimilarity, "tanimoto_coefficient", Similarity_tanimoto_coefficient, 2);
0
+ rb_define_module_function(rbgsl_mSimilarity, "dice_coefficient", Similarity_dice_coefficient, 2);
0
\ No newline at end of file
Comments
No one has commented yet.