cmfrec 0.3.1 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c549b3c94d2b80e94938f61694636fc35b85bb0217bec39d5234f81dbba1684b
4
- data.tar.gz: e953ddaa00c5ba4b13838300aad880175db5d2c1531bf284866348b69ff2075b
3
+ metadata.gz: 9d530b650bba045d26a7c683ca7c8b8e7321c2043a8e80556c3c7c865a441432
4
+ data.tar.gz: d49736337135bc7b956a96f631ad54b88b354d3fbbe91e925962ba15fbd3735d
5
5
  SHA512:
6
- metadata.gz: 53e65f7b6ab488238713ff468c438cf45ecdbe85608c505fe4a66f140486b279785355fbf4aaedd72f6c4d6bc5fad502c97d7d592c24c4952520186db83adef1
7
- data.tar.gz: 4dd240635c221c6eada3c66f9fa244da90c342655ebcdf98731fbd805bec1015a51c72fdb87a1c6423b0994ccd9d4729a784d6af603a2f6154aa1178ef37bf6b
6
+ metadata.gz: 36d8fcfd4cd87539f728afd2d927bc8c4ea9a75a437bc32617dabb416ba9b322dcdc135855fa7144615955b42013029ada465c6209c38f9beca2e77f2d1059e9
7
+ data.tar.gz: c21ca152c2ec3edcf134ac9c915ca8ee3bd06c7ebd2c09e95bce592e9d5d64ac1dbbb8f7791756377b7febc899113ce255b4a8054b843fc1a6042ea50b8acaa3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.3.2 (2025-05-04)
2
+
3
+ - Fixed crash with Fiddle 1.1.7+
4
+ - Fixed memory leaks
5
+
1
6
  ## 0.3.1 (2024-12-29)
2
7
 
3
8
  - Removed dependency on `base64` gem for serialization
data/lib/cmfrec/data.rb CHANGED
@@ -30,7 +30,7 @@ module Cmfrec
30
30
  next if movie_names[row[1]]
31
31
  movie_names[row[1]] = true
32
32
 
33
- item = {item_id: row[1], year: !row[2].empty? ? Date.parse(row[2]).year : 1970}
33
+ item = {item_id: row[1], year: !row[2].empty? ? Date.strptime(row[2], "%d-%b-%Y").year : 1970}
34
34
  genres.each_with_index do |genre, i|
35
35
  item[:"genre_#{genre}"] = row[i + 5].to_i
36
36
  end
data/lib/cmfrec/ffi.rb CHANGED
@@ -12,7 +12,6 @@ module Cmfrec
12
12
 
13
13
  # https://github.com/david-cortes/cmfrec/blob/master/src/cmfrec.h
14
14
 
15
- typealias "bool", "char"
16
15
  # determined by CMakeLists.txt
17
16
  typealias "int_t", "int"
18
17
  typealias "real_t", "double"
@@ -35,7 +35,7 @@ module Cmfrec
35
35
  row = int_ptr(u)
36
36
  col = int_ptr(i)
37
37
  n_predict = data.size
38
- predicted = Fiddle::Pointer.malloc(n_predict * Fiddle::SIZEOF_DOUBLE)
38
+ predicted = Fiddle::Pointer.malloc(n_predict * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
39
39
 
40
40
  if @implicit
41
41
  check_status FFI.predict_X_old_collective_implicit(
@@ -414,16 +414,16 @@ module Cmfrec
414
414
  # initialize w/ normal distribution
415
415
  reset_values = !@fit
416
416
 
417
- @a = Fiddle::Pointer.malloc([@m, @m_u].max * (@k_user + @k + @k_main) * Fiddle::SIZEOF_DOUBLE)
418
- @b = Fiddle::Pointer.malloc([@n, @n_i].max * (@k_item + @k + @k_main) * Fiddle::SIZEOF_DOUBLE)
419
- @c = p_ > 0 ? Fiddle::Pointer.malloc(p_ * (@k_user + @k) * Fiddle::SIZEOF_DOUBLE) : nil
420
- @d = q > 0 ? Fiddle::Pointer.malloc(q * (@k_item + @k) * Fiddle::SIZEOF_DOUBLE) : nil
417
+ @a = Fiddle::Pointer.malloc([@m, @m_u].max * (@k_user + @k + @k_main) * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
418
+ @b = Fiddle::Pointer.malloc([@n, @n_i].max * (@k_item + @k + @k_main) * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
419
+ @c = p_ > 0 ? Fiddle::Pointer.malloc(p_ * (@k_user + @k) * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE) : nil
420
+ @d = q > 0 ? Fiddle::Pointer.malloc(q * (@k_item + @k) * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE) : nil
421
421
 
422
422
  @bias_a = nil
423
423
  @bias_b = nil
424
424
 
425
- u_colmeans = Fiddle::Pointer.malloc(p_ * Fiddle::SIZEOF_DOUBLE)
426
- i_colmeans = Fiddle::Pointer.malloc(q * Fiddle::SIZEOF_DOUBLE)
425
+ u_colmeans = Fiddle::Pointer.malloc(p_ * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
426
+ i_colmeans = Fiddle::Pointer.malloc(q * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
427
427
 
428
428
  if @implicit
429
429
  set_implicit_vars
@@ -458,18 +458,18 @@ module Cmfrec
458
458
 
459
459
  @global_mean = 0
460
460
  else
461
- @bias_a = Fiddle::Pointer.malloc([@m, @m_u].max * Fiddle::SIZEOF_DOUBLE) if @user_bias
462
- @bias_b = Fiddle::Pointer.malloc([@n, @n_i].max * Fiddle::SIZEOF_DOUBLE) if @item_bias
461
+ @bias_a = Fiddle::Pointer.malloc([@m, @m_u].max * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE) if @user_bias
462
+ @bias_b = Fiddle::Pointer.malloc([@n, @n_i].max * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE) if @item_bias
463
463
 
464
464
  if @add_implicit_features
465
- @ai = Fiddle::Pointer.malloc([@m, @m_u].max * (@k + @k_main) * Fiddle::SIZEOF_DOUBLE)
466
- @bi = Fiddle::Pointer.malloc([@n, @n_i].max * (@k + @k_main) * Fiddle::SIZEOF_DOUBLE)
465
+ @ai = Fiddle::Pointer.malloc([@m, @m_u].max * (@k + @k_main) * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
466
+ @bi = Fiddle::Pointer.malloc([@n, @n_i].max * (@k + @k_main) * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
467
467
  else
468
468
  @ai = nil
469
469
  @bi = nil
470
470
  end
471
471
 
472
- glob_mean = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DOUBLE)
472
+ glob_mean = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
473
473
 
474
474
  # TODO add
475
475
  scaling_bias_a = nil
@@ -689,8 +689,8 @@ module Cmfrec
689
689
  n_exclude = 0
690
690
  end
691
691
 
692
- outp_ix = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_INT)
693
- outp_score = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_DOUBLE)
692
+ outp_ix = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
693
+ outp_score = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
694
694
 
695
695
  [include_ix, n_include, exclude_ix, n_exclude, outp_ix, outp_score, count]
696
696
  end
@@ -742,9 +742,8 @@ module Cmfrec
742
742
  end
743
743
  end
744
744
 
745
- # convert boolean to int
746
745
  def fiddle_args(args)
747
- args.map { |v| v == true || v == false ? (v ? 1 : 0) : v }
746
+ args
748
747
  end
749
748
 
750
749
  def check_status(ret_val)
@@ -790,11 +789,11 @@ module Cmfrec
790
789
  end
791
790
 
792
791
  def int_array(ptr)
793
- ptr.to_s(ptr.size).unpack("i*")
792
+ ptr.to_str(ptr.size).unpack("i*")
794
793
  end
795
794
 
796
795
  def real_array(ptr)
797
- ptr.to_s(ptr.size).unpack("d*")
796
+ ptr.to_str(ptr.size).unpack("d*")
798
797
  end
799
798
 
800
799
  def set_implicit_vars
@@ -811,7 +810,7 @@ module Cmfrec
811
810
  end
812
811
 
813
812
  def json_dump_ptr(ptr)
814
- [ptr.to_s(ptr.size)].pack("m0") if ptr
813
+ [ptr.to_str(ptr.size)].pack("m0") if ptr
815
814
  end
816
815
 
817
816
  def json_load_ptr(str)
@@ -1,3 +1,3 @@
1
1
  module Cmfrec
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
data/lib/cmfrec.rb CHANGED
@@ -3,9 +3,9 @@ require "etc"
3
3
  require "fiddle/import"
4
4
 
5
5
  # modules
6
- require "cmfrec/data"
7
- require "cmfrec/recommender"
8
- require "cmfrec/version"
6
+ require_relative "cmfrec/data"
7
+ require_relative "cmfrec/recommender"
8
+ require_relative "cmfrec/version"
9
9
 
10
10
  module Cmfrec
11
11
  class Error < StandardError; end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmfrec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-12-30 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: fiddle
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '0'
18
+ version: 1.1.7
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '0'
25
+ version: 1.1.7
26
26
  email: andrew@ankane.org
27
27
  executables: []
28
28
  extensions: []
@@ -63,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  - !ruby/object:Gem::Version
64
64
  version: '0'
65
65
  requirements: []
66
- rubygems_version: 3.6.2
66
+ rubygems_version: 3.6.7
67
67
  specification_version: 4
68
68
  summary: Recommendations for Ruby using collective matrix factorization
69
69
  test_files: []