mdarray 0.5.3-java → 0.5.4-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/README.md +325 -70
  2. data/doc/20130625 MDArray Internals.docx +0 -0
  3. data/lib/colt/colt.rb +2 -0
  4. data/lib/colt/matrix/colt_matrix.rb +365 -0
  5. data/lib/colt/matrix/matrix2D_floating_algebra.rb +325 -0
  6. data/lib/colt/matrix/matrix_hierarchy.rb +258 -0
  7. data/lib/mdarray.rb +54 -3
  8. data/lib/mdarray/access.rb +16 -0
  9. data/lib/mdarray/counter.rb +16 -0
  10. data/lib/mdarray/creation.rb +13 -1
  11. data/lib/mdarray/lazy_mdarray.rb +6 -2
  12. data/lib/mdarray/lazy_operators.rb +8 -0
  13. data/lib/mdarray/printing.rb +18 -3
  14. data/lib/mdarray/section.rb +101 -0
  15. data/lib/netcdf/attribute.rb +154 -0
  16. data/lib/netcdf/cdm_node.rb +71 -0
  17. data/lib/netcdf/dimension.rb +146 -0
  18. data/lib/netcdf/file.rb +253 -0
  19. data/lib/netcdf/file_writer.rb +474 -0
  20. data/lib/netcdf/group.rb +205 -0
  21. data/lib/netcdf/netcdf.rb +151 -0
  22. data/lib/netcdf/variable.rb +520 -0
  23. data/test/colt/test_complete.rb +1 -2
  24. data/test/colt/test_double_matrix2d.rb +186 -0
  25. data/test/colt/test_float_matrix2d.rb +171 -0
  26. data/test/colt/test_math.rb +21 -0
  27. data/test/colt/test_matrix.rb +172 -0
  28. data/test/complete.rb +9 -1
  29. data/test/env.rb +11 -1
  30. data/test/mdarray/test_complete.rb +2 -0
  31. data/test/mdarray/test_creation.rb +19 -28
  32. data/test/mdarray/test_non_numeric.rb +97 -0
  33. data/test/mdarray/test_sections.rb +94 -0
  34. data/test/mdarray/test_views.rb +23 -1
  35. data/test/netcdf/netcdfwriter.rb +197 -0
  36. data/test/netcdf/test_complete.rb +27 -0
  37. data/test/netcdf/test_netcdf.rb +331 -0
  38. data/test/netcdf/test_redefine.rb +120 -0
  39. data/vendor/incanter.jar +0 -0
  40. data/vendor/{netcdfAll-4.3.16.jar → netcdfAll-4.3.18.jar} +0 -0
  41. data/version.rb +1 -1
  42. metadata +44 -26
  43. data/vendor/parallelcolt-0.10.0.jar +0 -0
@@ -66,7 +66,8 @@ require_relative 'env'
66
66
  class MDArray
67
67
  include_package "ucar.ma2"
68
68
  include Enumerable
69
-
69
+
70
+ attr_reader :id # an array identifier
70
71
  attr_reader :type
71
72
  attr_reader :nc_array
72
73
  attr_reader :local_index # internal helper index for this array
@@ -79,6 +80,13 @@ class MDArray
79
80
 
80
81
  @numerical = ["numeric", "byte", "short", "int", "long", "float", "double"]
81
82
  @non_numerical = ["boolean", "char", "string", "sequence"]
83
+ @characters = ('a'..'z').to_a + ('A'..'Z').to_a
84
+
85
+ =begin
86
+ @characters = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a
87
+ @characters = ('A'..'F').to_a + (0..9).to_a
88
+ @characters = (32..126).to_a.pack('U*').chars.to_a
89
+ =end
82
90
 
83
91
  class << self
84
92
 
@@ -90,7 +98,8 @@ class MDArray
90
98
  attr_accessor :unary_operator
91
99
  attr_accessor :previous_binary_operator
92
100
  attr_accessor :previous_unary_operator
93
-
101
+ attr_reader :characters
102
+
94
103
  end
95
104
 
96
105
  MDArray.function_map = Map.new
@@ -104,7 +113,8 @@ class MDArray
104
113
  #------------------------------------------------------------------------------------
105
114
 
106
115
  def initialize(type, storage, section = false)
107
-
116
+
117
+ @id = (0..8).map{MDArray.characters.sample}.join
108
118
  @type = type
109
119
  @nc_array = storage
110
120
  @local_index = Counter.new(self)
@@ -416,6 +426,44 @@ class MDArray
416
426
 
417
427
  end
418
428
 
429
+ #------------------------------------------------------------------------------------
430
+ #
431
+ #------------------------------------------------------------------------------------
432
+
433
+ private
434
+
435
+ #------------------------------------------------------------------------------------
436
+ #
437
+ #------------------------------------------------------------------------------------
438
+
439
+ def self.get_ncarray_type(nc_array)
440
+
441
+ if (nc_array.is_a? ArrayDouble)
442
+ "double"
443
+ elsif (nc_array.is_a? ArrayFloat)
444
+ "float"
445
+ elsif (nc_array.is_a? ArrayLong)
446
+ "long"
447
+ elsif (nc_array.is_a? ArrayInt)
448
+ "int"
449
+ elsif (nc_array.is_a? ArrayShort)
450
+ "short"
451
+ elsif (nc_array.is_a? ArrayByte)
452
+ "byte"
453
+ elsif (nc_array.is_a? ArrayChar)
454
+ "char"
455
+ elsif (nc_array.is_a? ArrayString)
456
+ "string"
457
+ elsif (nc_array.is_a? ArrayBoolean)
458
+ "boolean"
459
+ elsif (nc_array.is_a? ArrayObject)
460
+ "object"
461
+ else
462
+ raise "Unknow type for #{nc_array}"
463
+ end
464
+
465
+ end
466
+
419
467
  end
420
468
 
421
469
  require_relative 'mdarray/proc_util'
@@ -434,4 +482,7 @@ require_relative 'mdarray/counter'
434
482
  require_relative 'mdarray/ruby_stats'
435
483
  require_relative 'mdarray/lazy_mdarray'
436
484
  require_relative 'mdarray/csv'
485
+ require_relative 'mdarray/section'
486
+
437
487
  require_relative 'colt/colt'
488
+ require_relative 'netcdf/netcdf'
@@ -70,6 +70,14 @@ class MDArray
70
70
  @local_index.get(index)
71
71
  end
72
72
 
73
+ #---------------------------------------------------------------------------------------
74
+ # Sets a value for a scalar D0 array
75
+ #---------------------------------------------------------------------------------------
76
+
77
+ def get_scalar
78
+ @local_index.get_scalar
79
+ end
80
+
73
81
  #------------------------------------------------------------------------------------
74
82
  #
75
83
  #------------------------------------------------------------------------------------
@@ -121,6 +129,14 @@ class MDArray
121
129
  @local_index.set(index, value)
122
130
  end
123
131
 
132
+ #---------------------------------------------------------------------------------------
133
+ # Sets a value for a scalar D0 array
134
+ #---------------------------------------------------------------------------------------
135
+
136
+ def set_scalar(value)
137
+ @local_index.set_scalar(value)
138
+ end
139
+
124
140
  #---------------------------------------------------------------------------------------
125
141
  #
126
142
  #---------------------------------------------------------------------------------------
@@ -178,6 +178,14 @@ class MDArray
178
178
  get_at_counter
179
179
  end
180
180
 
181
+ #---------------------------------------------------------------------------------------
182
+ #
183
+ #---------------------------------------------------------------------------------------
184
+
185
+ def get_scalar
186
+ @mdarray.nc_array.get
187
+ end
188
+
181
189
  #------------------------------------------------------------------------------------
182
190
  # Gets the element at the given counter. Assumes that the counter is of the proper
183
191
  # shape. Also, counter should be an int java array
@@ -217,6 +225,14 @@ class MDArray
217
225
  set_at_counter(value)
218
226
  end
219
227
 
228
+ #---------------------------------------------------------------------------------------
229
+ #
230
+ #---------------------------------------------------------------------------------------
231
+
232
+ def set_scalar(value)
233
+ @mdarray.nc_array.set(value)
234
+ end
235
+
220
236
  #------------------------------------------------------------------------------------
221
237
  # Sets value of current counter. Can be done fast, as the current counter is always
222
238
  # in its basic shape.
@@ -91,16 +91,28 @@ class MDArray
91
91
  #
92
92
  #------------------------------------------------------------------------------------
93
93
 
94
+ def self.from_jstorage(type, shape, jstorage, section = false)
95
+
96
+ dtype = DataType.valueOf(type.upcase)
97
+ jshape = shape.to_java :int
98
+ nc_array = Java::UcarMa2.Array.factory(dtype, jshape, jstorage)
99
+ klass = Object.const_get("#{type.capitalize}MDArray")
100
+ return klass.new(type, nc_array, section)
101
+
102
+ end
94
103
 
95
104
  #------------------------------------------------------------------------------------
96
105
  #
97
106
  #------------------------------------------------------------------------------------
98
107
 
99
108
  def self.build_from_nc_array(type, nc_array, section = false)
109
+ if (!type)
110
+ type = MDArray.get_ncarray_type(nc_array)
111
+ end
100
112
  klass = Object.const_get("#{type.capitalize}MDArray")
101
113
  return klass.new(type, nc_array, section)
102
114
  end
103
-
115
+
104
116
  #------------------------------------------------------------------------------------
105
117
  # Builds a boolean mdarray
106
118
  # @param shape [Array] the shape of the mdarray as a ruby array
@@ -175,12 +175,16 @@ class LazyMDArray < ByteMDArray
175
175
  end
176
176
 
177
177
  #---------------------------------------------------------------------------------------
178
- # Validates the expression checking if it can be performed: all dimensions need to be
179
- # compatible
178
+ #
180
179
  #---------------------------------------------------------------------------------------
181
180
 
182
181
  protected
183
182
 
183
+ #---------------------------------------------------------------------------------------
184
+ # Validates the expression checking if it can be performed: all dimensions need to be
185
+ # compatible
186
+ #---------------------------------------------------------------------------------------
187
+
184
188
  def validate_fast(*args)
185
189
 
186
190
  # test_janino_function
@@ -26,6 +26,8 @@
26
26
 
27
27
  class LazyBinaryOperator < BinaryOperator
28
28
 
29
+ attr_reader :exp # expression in string format
30
+
29
31
  #---------------------------------------------------------------------------------------
30
32
  #
31
33
  #---------------------------------------------------------------------------------------
@@ -35,6 +37,7 @@ class LazyBinaryOperator < BinaryOperator
35
37
  @op1 = args.shift
36
38
  @op2 = args.shift
37
39
  @other_args = args
40
+ @exp = ""
38
41
 
39
42
  end
40
43
 
@@ -52,11 +55,16 @@ class LazyBinaryOperator < BinaryOperator
52
55
  if (@op1.is_a? LazyMDArray)
53
56
  lazy.push(@op2)
54
57
  lazy.push(self)
58
+ # @exp << "(" << @op1.exp << name << @op2.id << ")"
55
59
  else
56
60
  lazy = LazyMDArray.new
57
61
  lazy.push(@op1)
58
62
  lazy.push(@op2)
59
63
  lazy.push(self)
64
+ # p @op1.id
65
+ # p @op2.id
66
+ # p @name
67
+ # @exp << "(" << @op1.id << name << @op2.id << ")"
60
68
  end
61
69
 
62
70
  return lazy
@@ -77,8 +77,17 @@ class MDArray
77
77
  #------------------------------------------------------------------------------------
78
78
 
79
79
  def print
80
- (rank == 1)? print1d : printnd
80
+
81
+ case rank
82
+ when 0
83
+ print0d
84
+ when 1
85
+ print1d
86
+ else
87
+ printnd
88
+ end
81
89
  Kernel.print "\n"
90
+
82
91
  end
83
92
 
84
93
  #------------------------------------------------------------------------------------
@@ -125,6 +134,14 @@ class MDArray
125
134
 
126
135
  end
127
136
 
137
+ #------------------------------------------------------------------------------------
138
+ #
139
+ #------------------------------------------------------------------------------------
140
+
141
+ def print0d
142
+ Kernel.print(@nc_array.get())
143
+ end
144
+
128
145
  #------------------------------------------------------------------------------------
129
146
  #
130
147
  #------------------------------------------------------------------------------------
@@ -158,8 +175,6 @@ class MDArray
158
175
  end
159
176
  end
160
177
 
161
- p "axes: #{axes}, slice: #{slice}, sizes: #{sizes}"
162
-
163
178
  counter.each_along_axes(axes) do |ct, axis|
164
179
  section(ct, sizes)
165
180
  end
@@ -0,0 +1,101 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # Copyright © 2013 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
5
+ # and distribute this software and its documentation, without fee and without a signed
6
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
7
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
8
+ # distributions.
9
+ #
10
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
11
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
12
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
13
+ # POSSIBILITY OF SUCH DAMAGE.
14
+ #
15
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
17
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
18
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
19
+ # OR MODIFICATIONS.
20
+ ##########################################################################################
21
+
22
+ class MDArray
23
+
24
+ class Section
25
+ include_package "ucar.ma2"
26
+
27
+ attr_reader :netcdf_elmt
28
+
29
+ #-------------------------------------------------------------------------------------
30
+ #
31
+ #-------------------------------------------------------------------------------------
32
+
33
+ def initialize(netcdf_section)
34
+ @netcdf_elmt = netcdf_section
35
+ end
36
+
37
+ #-------------------------------------------------------------------------------------
38
+ # Builds a section by passing the proper section definition. The following itens can
39
+ # be part of the section definition
40
+ # shape
41
+ # origin
42
+ # size
43
+ # stride
44
+ # range
45
+ # section
46
+ # spec
47
+ #-------------------------------------------------------------------------------------
48
+
49
+ def self.build(*args)
50
+
51
+ opts = Map.options(args)
52
+
53
+ shape = opts.getopt(:shape)
54
+ origin = opts.getopt(:origin)
55
+ size = opts.getopt(:size)
56
+ stride = opts.getopt(:stride)
57
+ range = opts.getopt(:range)
58
+ section = opts.getopt(:section)
59
+ spec = opts.getopt(:spec)
60
+
61
+ if (spec)
62
+ new(Java::UcarMa2::Section.new(spec))
63
+ elsif (shape)
64
+ if (origin)
65
+ new(Java::UcarMa2::Section.new(origin.to_java(:int), shape.to_java(:int)))
66
+ else
67
+ new(Java::UcarMa2::Section.new(shape.to_java(:int)))
68
+ end
69
+ elsif (origin)
70
+ if (!size || !stride)
71
+ raise "Invalid section definition, size and stride are required"
72
+ end
73
+ new(Java::UcarMa2::Section.new(origin.to_java(:int), size.to_java(:int),
74
+ stride.to_java(:int)))
75
+ elsif (range)
76
+ new(Java::UcarMa2::Section.new(range))
77
+ end
78
+
79
+ end
80
+
81
+ #-------------------------------------------------------------------------------------
82
+ #
83
+ #-------------------------------------------------------------------------------------
84
+
85
+ def print
86
+ p @netcdf_elmt.toString()
87
+ end
88
+
89
+ #-------------------------------------------------------------------------------------
90
+ #
91
+ #-------------------------------------------------------------------------------------
92
+
93
+ def to_s
94
+ @netcdf_elmt.toString()
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+
101
+
@@ -0,0 +1,154 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # Copyright © 2013 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
5
+ # and distribute this software and its documentation, without fee and without a signed
6
+ # licensing agreement, is hereby granted, provided that the above copyright notice, this
7
+ # paragraph and the following two paragraphs appear in all copies, modifications, and
8
+ # distributions.
9
+ #
10
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
11
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
12
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
13
+ # POSSIBILITY OF SUCH DAMAGE.
14
+ #
15
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
17
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
18
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
19
+ # OR MODIFICATIONS.
20
+ ##########################################################################################
21
+
22
+ #=========================================================================================
23
+ #
24
+ #=========================================================================================
25
+
26
+ class NetCDF
27
+
28
+ #=======================================================================================
29
+ # An Attribute has a name and a value, used for associating arbitrary metadata with
30
+ # a Variable or a Group. The value can be a one dimensional array of Strings or
31
+ # numeric values.
32
+ # Attributes are immutable.
33
+ #=======================================================================================
34
+
35
+ class Attribute < CDMNode
36
+
37
+ #------------------------------------------------------------------------------------
38
+ #
39
+ #------------------------------------------------------------------------------------
40
+
41
+ def data_type
42
+ @netcdf_elmt.getDataType().toString()
43
+ end
44
+
45
+ #------------------------------------------------------------------------------------
46
+ #
47
+ #------------------------------------------------------------------------------------
48
+
49
+ def length
50
+ @netcdf_elmt.getLength()
51
+ end
52
+
53
+ #------------------------------------------------------------------------------------
54
+ #
55
+ #------------------------------------------------------------------------------------
56
+
57
+ def numeric_value(index = 0)
58
+ @netcdf_elmt.getNumericValue(index)
59
+ end
60
+
61
+ #------------------------------------------------------------------------------------
62
+ #
63
+ #------------------------------------------------------------------------------------
64
+
65
+ def string_value(index = 0)
66
+ @netcdf_elmt.getStringValue(index)
67
+ end
68
+
69
+ #------------------------------------------------------------------------------------
70
+ #
71
+ #------------------------------------------------------------------------------------
72
+
73
+ def value(index = 0)
74
+ @netcdf_elmt.getValue(index)
75
+ end
76
+
77
+ #------------------------------------------------------------------------------------
78
+ #
79
+ #------------------------------------------------------------------------------------
80
+
81
+ def array?
82
+ @netcdf_elmt.isArray()
83
+ end
84
+
85
+ #------------------------------------------------------------------------------------
86
+ #
87
+ #------------------------------------------------------------------------------------
88
+
89
+ def string?
90
+ @netcdf_elmt.isString()
91
+ end
92
+
93
+ #------------------------------------------------------------------------------------
94
+ #
95
+ #------------------------------------------------------------------------------------
96
+
97
+ def unsigned?
98
+ @netcdf_elmt.isUnsigned()
99
+ end
100
+
101
+ #------------------------------------------------------------------------------------
102
+ #
103
+ #------------------------------------------------------------------------------------
104
+
105
+ def to_string(strict = false)
106
+ @netcdf_elmt.toString(strict)
107
+ end
108
+
109
+ #------------------------------------------------------------------------------------
110
+ # Needs to be correctly rubyfied
111
+ #------------------------------------------------------------------------------------
112
+
113
+ def write_cdl(formater, strict = false)
114
+ @netcdf_elmt.write_cdl(formater, strict)
115
+ end
116
+
117
+ end # Attribute
118
+
119
+ #=======================================================================================
120
+ #
121
+ #=======================================================================================
122
+
123
+ class AttributeWriter < Attribute
124
+
125
+ #------------------------------------------------------------------------------------
126
+ #
127
+ #------------------------------------------------------------------------------------
128
+
129
+ def self.build(name, val, type = "int")
130
+
131
+ type = type.to_sym
132
+ value = val
133
+ if (val.is_a? Numeric)
134
+ value = val.to_java(type)
135
+ elsif (val.is_a? Array)
136
+ value = Array.new
137
+ val.each do |elmt|
138
+ if (elmt.is_a? Numeric)
139
+ value << elmt.to_java(type)
140
+ else
141
+ value << elmt
142
+ end
143
+ end
144
+ end
145
+
146
+ NetCDF::Attribute.new(Java::UcarNc2::Attribute.new(name, value))
147
+
148
+ end
149
+
150
+ end # AttributeWriter
151
+
152
+ end
153
+
154
+