cmfrec 0.3.1 → 0.3.3

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: ac5590ea6e166698a9a274b86cf8c8b5bfe6e995733002a4e5c3ab896f7b84c8
4
+ data.tar.gz: c8bf8c6bc93e78baf86a19b4583f5901402f239641a943c718848322111efab5
5
5
  SHA512:
6
- metadata.gz: 53e65f7b6ab488238713ff468c438cf45ecdbe85608c505fe4a66f140486b279785355fbf4aaedd72f6c4d6bc5fad502c97d7d592c24c4952520186db83adef1
7
- data.tar.gz: 4dd240635c221c6eada3c66f9fa244da90c342655ebcdf98731fbd805bec1015a51c72fdb87a1c6423b0994ccd9d4729a784d6af603a2f6154aa1178ef37bf6b
6
+ metadata.gz: 73f375181c7aa2af16b1bed8d1884f30e1e3f5ef81ead8f880dbbdd0d30b5b4b4c1e24406a82a8fb64768c91be2616a76f653821e250eb673953880ae3eb8906
7
+ data.tar.gz: d5281893b9e2d8f32fc994510bc776310aa25a1638452b416ed4d764964dc9a363ccd8c74c1b3954ead16248231aaf2f3080f2a213e6c1e592d069b83633f38e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.3.3 (2025-09-30)
2
+
3
+ - Fixed error with Rover 0.5+
4
+
5
+ ## 0.3.2 (2025-05-04)
6
+
7
+ - Fixed crash with Fiddle 1.1.7+
8
+ - Fixed memory leaks
9
+
1
10
  ## 0.3.1 (2024-12-29)
2
11
 
3
12
  - Removed dependency on `base64` gem for serialization
data/README.md CHANGED
@@ -46,7 +46,7 @@ recommender.fit([
46
46
  ])
47
47
  ```
48
48
 
49
- > Use `value` instead of rating for implicit feedback
49
+ > Use `value` instead of `rating` for implicit feedback
50
50
 
51
51
  Get recommendations for a user in the training data
52
52
 
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
@@ -620,11 +620,7 @@ module Cmfrec
620
620
  def to_dataset(dataset)
621
621
  if defined?(Rover::DataFrame) && dataset.is_a?(Rover::DataFrame)
622
622
  # convert keys to symbols
623
- dataset = dataset.dup
624
- dataset.keys.each do |k, v|
625
- dataset[k.to_sym] ||= dataset.delete(k)
626
- end
627
- dataset.to_a
623
+ dataset.each_row.map { |v| v.transform_keys(&:to_sym) }
628
624
  elsif defined?(Daru::DataFrame) && dataset.is_a?(Daru::DataFrame)
629
625
  # convert keys to symbols
630
626
  dataset = dataset.dup
@@ -689,8 +685,8 @@ module Cmfrec
689
685
  n_exclude = 0
690
686
  end
691
687
 
692
- outp_ix = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_INT)
693
- outp_score = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_DOUBLE)
688
+ outp_ix = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
689
+ outp_score = Fiddle::Pointer.malloc(count * Fiddle::SIZEOF_DOUBLE, Fiddle::RUBY_FREE)
694
690
 
695
691
  [include_ix, n_include, exclude_ix, n_exclude, outp_ix, outp_score, count]
696
692
  end
@@ -742,9 +738,8 @@ module Cmfrec
742
738
  end
743
739
  end
744
740
 
745
- # convert boolean to int
746
741
  def fiddle_args(args)
747
- args.map { |v| v == true || v == false ? (v ? 1 : 0) : v }
742
+ args
748
743
  end
749
744
 
750
745
  def check_status(ret_val)
@@ -790,11 +785,11 @@ module Cmfrec
790
785
  end
791
786
 
792
787
  def int_array(ptr)
793
- ptr.to_s(ptr.size).unpack("i*")
788
+ ptr.to_str(ptr.size).unpack("i*")
794
789
  end
795
790
 
796
791
  def real_array(ptr)
797
- ptr.to_s(ptr.size).unpack("d*")
792
+ ptr.to_str(ptr.size).unpack("d*")
798
793
  end
799
794
 
800
795
  def set_implicit_vars
@@ -811,7 +806,7 @@ module Cmfrec
811
806
  end
812
807
 
813
808
  def json_dump_ptr(ptr)
814
- [ptr.to_s(ptr.size)].pack("m0") if ptr
809
+ [ptr.to_str(ptr.size)].pack("m0") if ptr
815
810
  end
816
811
 
817
812
  def json_load_ptr(str)
@@ -1,3 +1,3 @@
1
1
  module Cmfrec
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.3"
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.3
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.9
67
67
  specification_version: 4
68
68
  summary: Recommendations for Ruby using collective matrix factorization
69
69
  test_files: []