class XLearn::DMatrix

Public Class Methods

finalize(pointer) click to toggle source
# File lib/xlearn/dmatrix.rb, line 49
def self.finalize(pointer)
  # must use proc instead of stabby lambda
  proc { FFI.XlearnDataFree(pointer) }
end
new(data, label: nil) click to toggle source
# File lib/xlearn/dmatrix.rb, line 5
def initialize(data, label: nil)
  @handle = ::FFI::MemoryPointer.new(:pointer)

  if matrix?(data)
    nrow = data.row_count
    ncol = data.column_count
    flat_data = data.to_a.flatten
  elsif daru?(data)
    nrow, ncol = data.shape
    flat_data = data.map_rows(&:to_a).flatten
  elsif rover?(data)
    nrow, ncol = data.shape
    flat_data = data.each_row.map(&:values).flatten
  elsif narray?(data)
    nrow, ncol = data.shape
    # TODO convert to SFloat and pass pointer
    # for better performance
    flat_data = data.flatten.to_a
  else
    nrow = data.count
    ncol = data.first.count
    flat_data = data.flatten
  end

  c_data = ::FFI::MemoryPointer.new(:float, flat_data.size)
  c_data.put_array_of_float(0, flat_data)

  if label
    label = label.to_a
    c_label = ::FFI::MemoryPointer.new(:float, label.size)
    c_label.put_array_of_float(0, label)
  end

  # TODO support this
  field_map = nil

  check_call FFI.XlearnCreateDataFromMat(c_data, nrow, ncol, c_label, field_map, @handle)
  ObjectSpace.define_finalizer(self, self.class.finalize(@handle))
end

Public Instance Methods

to_ptr() click to toggle source
# File lib/xlearn/dmatrix.rb, line 45
def to_ptr
  @handle
end

Private Instance Methods

daru?(data) click to toggle source
# File lib/xlearn/dmatrix.rb, line 60
def daru?(data)
  defined?(Daru::DataFrame) && data.is_a?(Daru::DataFrame)
end
matrix?(data) click to toggle source
# File lib/xlearn/dmatrix.rb, line 56
def matrix?(data)
  defined?(Matrix) && data.is_a?(Matrix)
end
narray?(data) click to toggle source
# File lib/xlearn/dmatrix.rb, line 64
def narray?(data)
  defined?(Numo::NArray) && data.is_a?(Numo::NArray)
end
rover?(data) click to toggle source
# File lib/xlearn/dmatrix.rb, line 68
def rover?(data)
  defined?(Rover::DataFrame) && data.is_a?(Rover::DataFrame)
end