Module: Gsplat::Compression::GridSort

Defined in:
lib/gsplat/compression/grid_sort.rb

Overview

Deterministic Morton ordering for square Gaussian parameter grids.

Constant Summary collapse

QUANTIZATION_MAX =
1023

Class Method Summary collapse

Class Method Details

.morton_order(means) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/gsplat/compression/grid_sort.rb', line 31

def morton_order(means)
  coordinates = means.to_a
  mins = 3.times.map { |axis| coordinates.map { |point| point[axis] }.min }
  maxs = 3.times.map { |axis| coordinates.map { |point| point[axis] }.max }
  (0...coordinates.length).sort_by do |index|
    quantized = 3.times.map do |axis|
      span = maxs[axis] - mins[axis]
      span.zero? ? 0 : (((coordinates[index][axis] - mins[axis]) / span) * QUANTIZATION_MAX).round
    end
    [morton3(*quantized), index]
  end
end

.prepare(parameters, use_sort: true) ⇒ Object

Raises:

  • (ArgumentError)


11
12
13
14
15
16
17
18
19
20
# File 'lib/gsplat/compression/grid_sort.rb', line 11

def prepare(parameters, use_sort: true)
  values = parameters.to_h { |name, value| [name.to_s, data(value).dup] }
  validate_lengths!(values)
  side = ::Math.sqrt(values.fetch("means").shape[0]).floor
  raise ArgumentError, "at least one Gaussian is required" if side.zero?

  values = crop_to_square(values, side * side)
  values = reorder(values, morton_order(values.fetch("means"))) if use_sort
  [values, side]
end