Module: NMatrix::IO::Market
- Defined in:
- lib/nmatrix/io/market.rb
Overview
Matrix Market is a repository of test data for use in studies of algorithms for numerical linear algebra. There are 3 file formats used:
-
Matrix Market Exchange Format.
-
Harwell-Boeing Exchange Format.
-
Coordinate Text File Format. (to be phased out)
This module can load and save the first format. We might support Harwell-Boeing in the future.
The MatrixMarket format is documented in:
Constant Summary collapse
- CONVERTER_AND_DTYPE =
{ :real => [:to_f, :float64], :complex => [:to_c, :complex128], :integer => [:to_i, :int64], :pattern => [:to_i, :byte] }
- ENTRY_TYPE =
:nodoc:
{ :byte => :integer, :int8 => :integer, :int16 => :integer, :int32 => :integer, :int64 => :integer,:float32 => :real, :float64 => :real, :complex64 => :complex, :complex128 => :complex }
Class Method Summary collapse
-
.load(filename) ⇒ Object
call-seq: load(filename) -> NMatrix.
-
.save(matrix, filename, options = {}) ⇒ Object
call-seq: save(matrix, filename, options = {}) -> true.
Class Method Details
.load(filename) ⇒ Object
call-seq:
load(filename) -> NMatrix
Load a MatrixMarket file. Requires a filename
as an argument.
-
Arguments :
-
filename
-> String with the filename to be saved.
-
-
Raises :
-
IOError
-> expected type code line beginning with ‘%%MatrixMarket matrix’
-
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/nmatrix/io/market.rb', line 66 def load(filename) f = File.new(filename, "r") header = f.gets header.chomp! raise(IOError, "expected type code line beginning with '%%MatrixMarket matrix'") \ if header !~ /^\%\%MatrixMarket\ matrix/ header = header.split entry_type = header[3].downcase.to_sym symmetry = header[4].downcase.to_sym converter, default_dtype = CONVERTER_AND_DTYPE[entry_type] if header[2] == 'coordinate' load_coordinate f, converter, default_dtype, entry_type, symmetry else load_array f, converter, default_dtype, entry_type, symmetry end end |
.save(matrix, filename, options = {}) ⇒ Object
call-seq:
save(matrix, filename, options = {}) -> true
Can optionally set :symmetry to :general, :symmetric, :hermitian; and can set :pattern => true if you’re writing a sparse matrix and don’t want values stored.
-
Arguments :
-
matrix
-> NMatrix with the data to be saved. -
filename
-> String with the filename to be saved.
-
-
Raises :
-
DataTypeError
-> MatrixMarket does not support Ruby objects. -
ArgumentError
-> Expected two-dimensional NMatrix.
-
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/nmatrix/io/market.rb', line 101 def save(matrix, filename, = {}) = {:pattern => false, :symmetry => :general}.merge() mode = matrix.stype == :dense ? :array : :coordinate if [:object].include?(matrix.dtype) raise(DataTypeError, "MatrixMarket does not support Ruby objects") end entry_type = [:pattern] ? :pattern : ENTRY_TYPE[matrix.dtype] raise(ArgumentError, "expected two-dimensional NMatrix") \ if matrix.dim != 2 f = File.new(filename, 'w') f.puts "%%MatrixMarket matrix #{mode} #{entry_type} #{[:symmetry]}" if matrix.stype == :dense save_array matrix, f, [:symmetry] elsif [:list,:yale].include?(matrix.stype) save_coordinate matrix, f, [:symmetry], [:pattern] end f.close true end |