Module: NDAV::Numo::NArray

Defined in:
lib/ndav/numo/narray.rb

Defined Under Namespace

Modules: Converter, FFI, FromNDAV, MemoryViewable

Constant Summary collapse

CLASS_TO_FORMAT =
{
  ::Numo::Int8 => "c",
  ::Numo::UInt8 => "C",
  ::Numo::Int16 => "s",
  ::Numo::UInt16 => "S",
  ::Numo::Int32 => "l",
  ::Numo::UInt32 => "L",
  ::Numo::Int64 => "q",
  ::Numo::UInt64 => "Q",
  ::Numo::SFloat => "f",
  ::Numo::DFloat => "d"
}
FORMAT_TO_CLASS =
CLASS_TO_FORMAT.invert

Class Method Summary collapse

Class Method Details

.na_get_offset(numo) ⇒ Object



49
50
51
# File 'lib/ndav/numo/narray.rb', line 49

def na_get_offset(numo)
  FFI.nary_get_offset(Fiddle.dlwrap(numo))
end

.na_get_pointer_for_read(numo) ⇒ Object



41
42
43
# File 'lib/ndav/numo/narray.rb', line 41

def na_get_pointer_for_read(numo)
  FFI.nary_get_pointer_for_read(Fiddle.dlwrap(numo))
end

.na_get_pointer_for_read_write(numo) ⇒ Object



45
46
47
# File 'lib/ndav/numo/narray.rb', line 45

def na_get_pointer_for_read_write(numo)
  FFI.nary_get_pointer_for_read_write(Fiddle.dlwrap(numo))
end

.pointer_for_read(numo) ⇒ Object



53
54
55
56
57
# File 'lib/ndav/numo/narray.rb', line 53

def pointer_for_read(numo)
  ptr = na_get_pointer_for_read(numo) + na_get_offset(numo)
  ptr.size = numo.byte_size
  ptr
end

.pointer_for_write(numo) ⇒ Object



59
60
61
62
63
# File 'lib/ndav/numo/narray.rb', line 59

def pointer_for_write(numo)
  ptr = na_get_pointer_for_read_write(numo) + na_get_offset(numo)
  ptr.size = numo.byte_size
  ptr
end

.strides(obj) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'ext/narray.c', line 8

static VALUE
ndav_numo_narray_s_strides(VALUE self, VALUE obj)
{
  narray_t *na;
  GetNArray(obj, na);
  int ndim = NA_NDIM(na);
  size_t *shape = NA_SHAPE(na);
  VALUE strides = rb_ary_new_capa(ndim);
  unsigned char type = NA_TYPE(na);
  bool is_row_major = TEST_ROW_MAJOR(obj);
  ssize_t stride;

  if (type == NARRAY_DATA_T) {
    stride = na_get_elmsz(obj);
  }

  for (int i = ndim; i > 0; --i) {
    int axis = is_row_major ? i - 1 : ndim - i;

    switch (type) {
    case NARRAY_DATA_T:
      rb_ary_store(strides, axis, SSIZET2NUM(stride));
      stride *= shape[i - 1];
      break;
    case NARRAY_VIEW_T:
      if (NA_IS_INDEX_AT(na, i - 1)) {
        rb_raise(rb_eArgError, "strides not defined for index-backed array");
      }
      rb_ary_store(strides, axis, SSIZET2NUM(NA_STRIDE_AT(na, i - 1)));
      break;
    default:
      return Qnil;
    }
  }

  return strides;
}