Class: ABAnalyzer::Matrix

Inherits:
Object
  • Object
show all
Defined in:
lib/abanalyzer/matrix.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(values) ⇒ Matrix

Returns a new instance of Matrix.



4
5
6
7
8
9
# File 'lib/abanalyzer/matrix.rb', line 4

def initialize(values)
  @values = values
  @columns = values.keys
  @rows = values[@columns.first].keys
  validate
end

Instance Attribute Details

#columnsObject (readonly)

Returns the value of attribute columns.



3
4
5
# File 'lib/abanalyzer/matrix.rb', line 3

def columns
  @columns
end

#rowsObject (readonly)

Returns the value of attribute rows.



3
4
5
# File 'lib/abanalyzer/matrix.rb', line 3

def rows
  @rows
end

Instance Method Details

#column_sum(name) ⇒ Object



44
45
46
# File 'lib/abanalyzer/matrix.rb', line 44

def column_sum(name)
  get_column(name).inject { |a, b| a + b }
end

#each_cellObject



32
33
34
35
36
37
38
# File 'lib/abanalyzer/matrix.rb', line 32

def each_cell
  @columns.each do |colname|
    @rows.each do |rowname|
      yield colname, rowname, get(colname, rowname)
    end
  end
end

#get(colname, rowname) ⇒ Object



40
41
42
# File 'lib/abanalyzer/matrix.rb', line 40

def get(colname, rowname)
  @values[colname][rowname]
end

#get_column(name) ⇒ Object



22
23
24
# File 'lib/abanalyzer/matrix.rb', line 22

def get_column(name)
  @values[name].values
end

#get_row(name) ⇒ Object



26
27
28
29
30
# File 'lib/abanalyzer/matrix.rb', line 26

def get_row(name)
  @values.map do |_colname, rows|
    rows[name]
  end
end

#row_sum(name) ⇒ Object



48
49
50
# File 'lib/abanalyzer/matrix.rb', line 48

def row_sum(name)
  get_row(name).inject { |a, b| a + b }
end

#total_sumObject



52
53
54
# File 'lib/abanalyzer/matrix.rb', line 52

def total_sum
  @columns.map { |col| column_sum(col) }.inject { |a, b| a + b }
end

#validateObject

Raises:



11
12
13
14
15
16
17
18
19
20
# File 'lib/abanalyzer/matrix.rb', line 11

def validate
  @values.each do |colname, column|
    if column.keys.map(&:to_s).sort != @rows.map(&:to_s).sort
      raise MatrixFormatError, "Column #{colname} has row names that don't match the first column's."
    end
  end
  coltotal = @columns.map { |col| column_sum(col) }.inject { |a, b| a + b }
  rowtotal = @rows.map { |col| row_sum(col) }.inject { |a, b| a + b }
  raise MatrixFormatError, 'Column sums do not equal row sums' if coltotal != rowtotal
end