Module: Zfp::Packer

Defined in:
lib/zfp/packer.rb

Constant Summary collapse

MAGIC =
"ZFP\x01"
HEADER_LEN =
32
PACK_FMT =
"a4CCCCVVVVE"
TYPE_TO_BYTE =
{ float: 0, double: 1, int32: 2, int64: 3 }.freeze
BYTE_TO_TYPE =
TYPE_TO_BYTE.invert.freeze
MODE_TO_BYTE =
{ fixed_rate: 0, fixed_precision: 1, fixed_accuracy: 2, reversible: 3 }.freeze
BYTE_TO_MODE =
MODE_TO_BYTE.invert.freeze

Class Method Summary collapse

Class Method Details

.decode(bytes) ⇒ Object

Raises:



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/zfp/packer.rb', line 25

def self.decode(bytes)
  if bytes.bytesize < HEADER_LEN
    raise Zfp::PackerError, "truncated header (#{bytes.bytesize} < #{HEADER_LEN} bytes)"
  end

  magic, type_b, mode_b, rank, flags, d0, d1, d2, d3, param =
    bytes[0, HEADER_LEN].unpack(PACK_FMT)

  raise Zfp::PackerError, "bad magic bytes (expected ZFP\\x01)" unless magic == MAGIC

  type  = BYTE_TO_TYPE.fetch(type_b) { raise Zfp::PackerError, "unknown type byte #{type_b}" }
  mode  = BYTE_TO_MODE.fetch(mode_b) { raise Zfp::PackerError, "unknown mode byte #{mode_b}" }
  shape = [d0, d1, d2, d3].first(rank)
  numo  = flags & 1 == 1
  params = decode_params(mode, param)
  data  = bytes[HEADER_LEN..]

  [type, shape, mode, params, numo, data]
end

.encode(compressed_bytes, type:, shape:, mode:, params: {}, numo: false) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/zfp/packer.rb', line 15

def self.encode(compressed_bytes, type:, shape:, mode:, params: {}, numo: false)
  flags  = numo ? 1 : 0
  dims   = shape.length
  dim0, dim1, dim2, dim3 = Array.new(4) { |i| shape[i].to_i }
  param  = extract_param(mode, params)
  header = [MAGIC, TYPE_TO_BYTE[type], MODE_TO_BYTE[mode], dims, flags,
            dim0, dim1, dim2, dim3, param].pack(PACK_FMT)
  header + compressed_bytes
end