daikini-octave-ruby 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +54 -0
 - data/LICENSE.txt +674 -0
 - data/Manifest.txt +39 -0
 - data/README.txt +58 -0
 - data/Rakefile +18 -0
 - data/ext/octave_api/MANIFEST +4 -0
 - data/ext/octave_api/Makefile +149 -0
 - data/ext/octave_api/extconf.rb +30 -0
 - data/ext/octave_api/octave-includes.h +11 -0
 - data/ext/octave_api/octave-ruby.cpp +62 -0
 - data/ext/octave_api/octave-ruby.h +18 -0
 - data/ext/octave_api/octave_api.c +22 -0
 - data/ext/octave_api/octave_api.h +13 -0
 - data/ext/octave_api/or-array.cpp +56 -0
 - data/ext/octave_api/or-array.h +20 -0
 - data/ext/octave_api/or-boolean_matrix.cpp +61 -0
 - data/ext/octave_api/or-boolean_matrix.h +20 -0
 - data/ext/octave_api/or-cell_matrix.cpp +66 -0
 - data/ext/octave_api/or-cell_matrix.h +22 -0
 - data/ext/octave_api/or-hash.cpp +23 -0
 - data/ext/octave_api/or-hash.h +19 -0
 - data/ext/octave_api/or-matrix.cpp +89 -0
 - data/ext/octave_api/or-matrix.h +22 -0
 - data/ext/octave_api/or-string.cpp +13 -0
 - data/ext/octave_api/or-string.h +22 -0
 - data/ext/octave_api/or-struct_matrix.cpp +88 -0
 - data/ext/octave_api/or-struct_matrix.h +22 -0
 - data/ext/octave_api/or-variable.cpp +58 -0
 - data/ext/octave_api/or-variable.h +22 -0
 - data/lib/octave.rb +5 -0
 - data/lib/octave/driver/native/driver.rb +26 -0
 - data/lib/octave/engine.rb +75 -0
 - data/lib/octave/matrix.rb +84 -0
 - data/lib/octave/version.rb +14 -0
 - data/octave-ruby.gemspec +21 -0
 - data/setup.rb +1333 -0
 - data/test/driver/native/test_conversions.rb +203 -0
 - data/test/driver/native/test_driver.rb +32 -0
 - data/test/test_engine.rb +50 -0
 - metadata +99 -0
 
| 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef OR_ARRAY_DEFINED_H_
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define OR_ARRAY_DEFINED_H_
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "ruby.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "octave-includes.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class OR_Array
         
     | 
| 
      
 8 
     | 
    
         
            +
            {
         
     | 
| 
      
 9 
     | 
    
         
            +
              private:
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE ruby_val;
         
     | 
| 
      
 11 
     | 
    
         
            +
                
         
     | 
| 
      
 12 
     | 
    
         
            +
                bool should_convert_to_cell_matrix();
         
     | 
| 
      
 13 
     | 
    
         
            +
              public:
         
     | 
| 
      
 14 
     | 
    
         
            +
                OR_Array(VALUE r) : ruby_val(r) { };
         
     | 
| 
      
 15 
     | 
    
         
            +
                ~OR_Array();
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
                octave_value to_octave();
         
     | 
| 
      
 18 
     | 
    
         
            +
            };
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            #endif /* OR_ARRAY_DEFINED_H_ */
         
     | 
| 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "or-boolean_matrix.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            OR_BooleanMatrix::~OR_BooleanMatrix() {}
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            VALUE OR_BooleanMatrix::to_ruby()
         
     | 
| 
      
 6 
     | 
    
         
            +
            {
         
     | 
| 
      
 7 
     | 
    
         
            +
              Matrix matrix;
         
     | 
| 
      
 8 
     | 
    
         
            +
              MArray<double> values;
         
     | 
| 
      
 9 
     | 
    
         
            +
              double cell;
         
     | 
| 
      
 10 
     | 
    
         
            +
              int i, number_of_values;
         
     | 
| 
      
 11 
     | 
    
         
            +
              VALUE argv[2];
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              matrix = octave_val.matrix_value();
         
     | 
| 
      
 14 
     | 
    
         
            +
              int number_of_rows = matrix.rows();
         
     | 
| 
      
 15 
     | 
    
         
            +
              int number_of_columns = matrix.columns();
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
              if (number_of_rows == 1) {
         
     | 
| 
      
 18 
     | 
    
         
            +
                values = matrix.row(0);
         
     | 
| 
      
 19 
     | 
    
         
            +
              } else if (number_of_columns == 1) {
         
     | 
| 
      
 20 
     | 
    
         
            +
                values = matrix.column(0);
         
     | 
| 
      
 21 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 22 
     | 
    
         
            +
                argv[0] = INT2FIX(number_of_rows);
         
     | 
| 
      
 23 
     | 
    
         
            +
                argv[1] = INT2FIX(number_of_columns);
         
     | 
| 
      
 24 
     | 
    
         
            +
                ruby_val = rb_class_new_instance(2, argv, rb_path2class("Octave::Matrix"));
         
     | 
| 
      
 25 
     | 
    
         
            +
                
         
     | 
| 
      
 26 
     | 
    
         
            +
                int row_index, column_index = 0;
         
     | 
| 
      
 27 
     | 
    
         
            +
                VALUE cells, row;
         
     | 
| 
      
 28 
     | 
    
         
            +
                cells = rb_ary_new2(number_of_rows);
         
     | 
| 
      
 29 
     | 
    
         
            +
                for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  row = rb_ary_new2(number_of_columns);
         
     | 
| 
      
 31 
     | 
    
         
            +
                  values = matrix.row(row_index);
         
     | 
| 
      
 32 
     | 
    
         
            +
                  
         
     | 
| 
      
 33 
     | 
    
         
            +
                  for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 34 
     | 
    
         
            +
                    cell = values(column_index);
         
     | 
| 
      
 35 
     | 
    
         
            +
                    if (xisnan(cell) || octave_is_NA(cell)) {
         
     | 
| 
      
 36 
     | 
    
         
            +
                      rb_ary_push(row, Qnil);
         
     | 
| 
      
 37 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 38 
     | 
    
         
            +
                      rb_ary_push(row, (int(cell) == 1 ? Qtrue : Qfalse));
         
     | 
| 
      
 39 
     | 
    
         
            +
                    }
         
     | 
| 
      
 40 
     | 
    
         
            +
                  }
         
     | 
| 
      
 41 
     | 
    
         
            +
                  
         
     | 
| 
      
 42 
     | 
    
         
            +
                  rb_ary_push(cells, row);
         
     | 
| 
      
 43 
     | 
    
         
            +
                }
         
     | 
| 
      
 44 
     | 
    
         
            +
                
         
     | 
| 
      
 45 
     | 
    
         
            +
                rb_iv_set(ruby_val, "@cells", cells);
         
     | 
| 
      
 46 
     | 
    
         
            +
                return ruby_val;
         
     | 
| 
      
 47 
     | 
    
         
            +
              }
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              number_of_values = values.length();
         
     | 
| 
      
 50 
     | 
    
         
            +
              ruby_val = rb_ary_new2(number_of_values);
         
     | 
| 
      
 51 
     | 
    
         
            +
              for (i = 0; i < number_of_values; i++) {
         
     | 
| 
      
 52 
     | 
    
         
            +
                cell = values(i);
         
     | 
| 
      
 53 
     | 
    
         
            +
                if (xisnan(cell) || octave_is_NA(cell)) {
         
     | 
| 
      
 54 
     | 
    
         
            +
                  rb_ary_push(ruby_val, Qnil);
         
     | 
| 
      
 55 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 56 
     | 
    
         
            +
                  rb_ary_push(ruby_val, (int(cell) == 1 ? Qtrue : Qfalse));
         
     | 
| 
      
 57 
     | 
    
         
            +
                }
         
     | 
| 
      
 58 
     | 
    
         
            +
              }
         
     | 
| 
      
 59 
     | 
    
         
            +
              
         
     | 
| 
      
 60 
     | 
    
         
            +
              return ruby_val;
         
     | 
| 
      
 61 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef OR_BOOLEAN_MATRIX_DEFINED_H_
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define OR_BOOLEAN_MATRIX_DEFINED_H_
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "ruby.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "octave-includes.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class OR_BooleanMatrix
         
     | 
| 
      
 8 
     | 
    
         
            +
            {
         
     | 
| 
      
 9 
     | 
    
         
            +
              private:
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE ruby_val;
         
     | 
| 
      
 11 
     | 
    
         
            +
                octave_value octave_val;
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              public:
         
     | 
| 
      
 14 
     | 
    
         
            +
                OR_BooleanMatrix(octave_value o) : octave_val(o) { };
         
     | 
| 
      
 15 
     | 
    
         
            +
                ~OR_BooleanMatrix();
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
                VALUE to_ruby();
         
     | 
| 
      
 18 
     | 
    
         
            +
            };
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            #endif /* OR_BOOLEAN_MATRIX_DEFINED_H_ */
         
     | 
| 
         @@ -0,0 +1,66 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "or-cell_matrix.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
            #include "or-variable.h"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            OR_CellMatrix::~OR_CellMatrix() {}
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            VALUE OR_CellMatrix::to_ruby()
         
     | 
| 
      
 7 
     | 
    
         
            +
            {
         
     | 
| 
      
 8 
     | 
    
         
            +
              int i, number_of_values;
         
     | 
| 
      
 9 
     | 
    
         
            +
              int number_of_rows = octave_val.rows();
         
     | 
| 
      
 10 
     | 
    
         
            +
              int number_of_columns = octave_val.columns();
         
     | 
| 
      
 11 
     | 
    
         
            +
              Cell cell = octave_val.cell_value();
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              if (number_of_rows == 1 && number_of_columns == 1) {
         
     | 
| 
      
 14 
     | 
    
         
            +
                return OR_Variable(cell(0)).to_ruby();
         
     | 
| 
      
 15 
     | 
    
         
            +
              } else if (number_of_columns == 1) {
         
     | 
| 
      
 16 
     | 
    
         
            +
                number_of_values = number_of_rows;
         
     | 
| 
      
 17 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 18 
     | 
    
         
            +
                VALUE argv[2];
         
     | 
| 
      
 19 
     | 
    
         
            +
                argv[0] = INT2FIX(number_of_rows);
         
     | 
| 
      
 20 
     | 
    
         
            +
                argv[1] = INT2FIX(number_of_columns);
         
     | 
| 
      
 21 
     | 
    
         
            +
                ruby_val = rb_class_new_instance(2, argv, rb_path2class("Octave::CellMatrix"));
         
     | 
| 
      
 22 
     | 
    
         
            +
                
         
     | 
| 
      
 23 
     | 
    
         
            +
                int row_index, column_index = 0;
         
     | 
| 
      
 24 
     | 
    
         
            +
                VALUE cells, row;
         
     | 
| 
      
 25 
     | 
    
         
            +
                cells = rb_ary_new2(number_of_rows);
         
     | 
| 
      
 26 
     | 
    
         
            +
                for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 27 
     | 
    
         
            +
                  row = rb_ary_new2(number_of_columns);
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 30 
     | 
    
         
            +
                    rb_ary_push(row, OR_Variable(cell(row_index, column_index)).to_ruby());
         
     | 
| 
      
 31 
     | 
    
         
            +
                  }
         
     | 
| 
      
 32 
     | 
    
         
            +
                  
         
     | 
| 
      
 33 
     | 
    
         
            +
                  rb_ary_push(cells, row);
         
     | 
| 
      
 34 
     | 
    
         
            +
                }
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                rb_iv_set(ruby_val, "@cells", cells);
         
     | 
| 
      
 37 
     | 
    
         
            +
                return ruby_val;
         
     | 
| 
      
 38 
     | 
    
         
            +
              }
         
     | 
| 
      
 39 
     | 
    
         
            +
              
         
     | 
| 
      
 40 
     | 
    
         
            +
              ruby_val = rb_ary_new2(number_of_values);
         
     | 
| 
      
 41 
     | 
    
         
            +
              for (i = 0; i < number_of_values; i++) {
         
     | 
| 
      
 42 
     | 
    
         
            +
                rb_ary_push(ruby_val, OR_Variable(cell(i)).to_ruby());
         
     | 
| 
      
 43 
     | 
    
         
            +
              }
         
     | 
| 
      
 44 
     | 
    
         
            +
              return ruby_val;
         
     | 
| 
      
 45 
     | 
    
         
            +
            }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            octave_value OR_CellMatrix::to_octave()
         
     | 
| 
      
 48 
     | 
    
         
            +
            {
         
     | 
| 
      
 49 
     | 
    
         
            +
              int i, row_index, column_index;
         
     | 
| 
      
 50 
     | 
    
         
            +
              int number_of_rows = FIX2INT(rb_iv_get(ruby_val, "@m"));
         
     | 
| 
      
 51 
     | 
    
         
            +
              int number_of_columns = FIX2INT(rb_iv_get(ruby_val, "@n"));
         
     | 
| 
      
 52 
     | 
    
         
            +
              VALUE cells = rb_iv_get(ruby_val, "@cells");
         
     | 
| 
      
 53 
     | 
    
         
            +
              VALUE row, cell;
         
     | 
| 
      
 54 
     | 
    
         
            +
              Cell matrix = Cell(number_of_rows, number_of_columns);
         
     | 
| 
      
 55 
     | 
    
         
            +
              
         
     | 
| 
      
 56 
     | 
    
         
            +
              for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 57 
     | 
    
         
            +
                row = RARRAY(cells)->ptr[row_index];
         
     | 
| 
      
 58 
     | 
    
         
            +
                
         
     | 
| 
      
 59 
     | 
    
         
            +
                for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 60 
     | 
    
         
            +
                  cell = RARRAY(row)->ptr[column_index];
         
     | 
| 
      
 61 
     | 
    
         
            +
                  matrix(row_index, column_index) = OR_Variable(cell).to_octave();
         
     | 
| 
      
 62 
     | 
    
         
            +
                }
         
     | 
| 
      
 63 
     | 
    
         
            +
              }
         
     | 
| 
      
 64 
     | 
    
         
            +
              
         
     | 
| 
      
 65 
     | 
    
         
            +
              return matrix;
         
     | 
| 
      
 66 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef OR_CELL_MATRIX_DEFINED_H_
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define OR_CELL_MATRIX_DEFINED_H_
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "ruby.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "octave-includes.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class OR_CellMatrix
         
     | 
| 
      
 8 
     | 
    
         
            +
            {
         
     | 
| 
      
 9 
     | 
    
         
            +
              private:
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE ruby_val;
         
     | 
| 
      
 11 
     | 
    
         
            +
                octave_value octave_val;
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
              public:
         
     | 
| 
      
 14 
     | 
    
         
            +
                OR_CellMatrix(VALUE r) : ruby_val(r) { };
         
     | 
| 
      
 15 
     | 
    
         
            +
                OR_CellMatrix(octave_value o) : octave_val(o) { };
         
     | 
| 
      
 16 
     | 
    
         
            +
                ~OR_CellMatrix();
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
                VALUE to_ruby();
         
     | 
| 
      
 19 
     | 
    
         
            +
                octave_value to_octave();
         
     | 
| 
      
 20 
     | 
    
         
            +
            };
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            #endif /* OR_CELL_MATRIX_DEFINED_H_ */
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "or-hash.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
            #include "or-variable.h"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            OR_Hash::~OR_Hash() {}
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            octave_value OR_Hash::to_octave()
         
     | 
| 
      
 7 
     | 
    
         
            +
            {
         
     | 
| 
      
 8 
     | 
    
         
            +
              int i;
         
     | 
| 
      
 9 
     | 
    
         
            +
              VALUE names = rb_funcall(ruby_val, rb_intern("keys"), 0);
         
     | 
| 
      
 10 
     | 
    
         
            +
              int number_of_keys = RARRAY(names)->len;
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              string_vector keys = string_vector();
         
     | 
| 
      
 13 
     | 
    
         
            +
              for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 14 
     | 
    
         
            +
                keys.append(std::string(RSTRING(RARRAY(names)->ptr[i])->ptr));
         
     | 
| 
      
 15 
     | 
    
         
            +
              }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              Octave_map struct_matrix = Octave_map(dim_vector(1, 1), Cell(keys));
         
     | 
| 
      
 18 
     | 
    
         
            +
              for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 19 
     | 
    
         
            +
                struct_matrix.contents(std::string(RSTRING(RARRAY(names)->ptr[i])->ptr)) = OR_Variable(rb_hash_aref(ruby_val, rb_str_new2(RSTRING(RARRAY(names)->ptr[i])->ptr))).to_octave();
         
     | 
| 
      
 20 
     | 
    
         
            +
              }
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              return struct_matrix;
         
     | 
| 
      
 23 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef OR_HASH_DEFINED_H_
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define OR_HASH_DEFINED_H_
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "ruby.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "octave-includes.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class OR_Hash
         
     | 
| 
      
 8 
     | 
    
         
            +
            {
         
     | 
| 
      
 9 
     | 
    
         
            +
              private:
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE ruby_val;
         
     | 
| 
      
 11 
     | 
    
         
            +
                
         
     | 
| 
      
 12 
     | 
    
         
            +
              public:
         
     | 
| 
      
 13 
     | 
    
         
            +
                OR_Hash(VALUE r) : ruby_val(r) { };
         
     | 
| 
      
 14 
     | 
    
         
            +
                ~OR_Hash();
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
                octave_value to_octave();
         
     | 
| 
      
 17 
     | 
    
         
            +
            };
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            #endif /* OR_HASH_DEFINED_H_ */
         
     | 
| 
         @@ -0,0 +1,89 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "or-matrix.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            OR_Matrix::~OR_Matrix() {}
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            VALUE OR_Matrix::to_ruby()
         
     | 
| 
      
 6 
     | 
    
         
            +
            {
         
     | 
| 
      
 7 
     | 
    
         
            +
              Matrix matrix;
         
     | 
| 
      
 8 
     | 
    
         
            +
              MArray<double> values;
         
     | 
| 
      
 9 
     | 
    
         
            +
              double cell;
         
     | 
| 
      
 10 
     | 
    
         
            +
              int i, number_of_values;
         
     | 
| 
      
 11 
     | 
    
         
            +
              VALUE argv[2];
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              matrix = octave_val.matrix_value();
         
     | 
| 
      
 14 
     | 
    
         
            +
              int number_of_rows = matrix.rows();
         
     | 
| 
      
 15 
     | 
    
         
            +
              int number_of_columns = matrix.columns();
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
              if ((number_of_rows == 0) && (number_of_columns == 0)) {
         
     | 
| 
      
 18 
     | 
    
         
            +
                return rb_ary_new2(0);
         
     | 
| 
      
 19 
     | 
    
         
            +
              } else if (number_of_columns == 1) {
         
     | 
| 
      
 20 
     | 
    
         
            +
                values = matrix.column(0);
         
     | 
| 
      
 21 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 22 
     | 
    
         
            +
                argv[0] = INT2FIX(number_of_rows);
         
     | 
| 
      
 23 
     | 
    
         
            +
                argv[1] = INT2FIX(number_of_columns);
         
     | 
| 
      
 24 
     | 
    
         
            +
                ruby_val = rb_class_new_instance(2, argv, rb_path2class("Octave::Matrix"));
         
     | 
| 
      
 25 
     | 
    
         
            +
                
         
     | 
| 
      
 26 
     | 
    
         
            +
                int row_index, column_index = 0;
         
     | 
| 
      
 27 
     | 
    
         
            +
                VALUE cells, row;
         
     | 
| 
      
 28 
     | 
    
         
            +
                cells = rb_ary_new2(number_of_rows);
         
     | 
| 
      
 29 
     | 
    
         
            +
                for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 30 
     | 
    
         
            +
                  row = rb_ary_new2(number_of_columns);
         
     | 
| 
      
 31 
     | 
    
         
            +
                  values = matrix.row(row_index);
         
     | 
| 
      
 32 
     | 
    
         
            +
                  
         
     | 
| 
      
 33 
     | 
    
         
            +
                  for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 34 
     | 
    
         
            +
                    cell = values(column_index);
         
     | 
| 
      
 35 
     | 
    
         
            +
                    if (xisnan(cell) || octave_is_NA(cell)) {
         
     | 
| 
      
 36 
     | 
    
         
            +
                      rb_ary_push(row, Qnil);
         
     | 
| 
      
 37 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 38 
     | 
    
         
            +
                      rb_ary_push(row, rb_float_new(cell));
         
     | 
| 
      
 39 
     | 
    
         
            +
                    }
         
     | 
| 
      
 40 
     | 
    
         
            +
                  }
         
     | 
| 
      
 41 
     | 
    
         
            +
                  
         
     | 
| 
      
 42 
     | 
    
         
            +
                  rb_ary_push(cells, row);
         
     | 
| 
      
 43 
     | 
    
         
            +
                }
         
     | 
| 
      
 44 
     | 
    
         
            +
                
         
     | 
| 
      
 45 
     | 
    
         
            +
                rb_iv_set(ruby_val, "@cells", cells);
         
     | 
| 
      
 46 
     | 
    
         
            +
                return ruby_val;
         
     | 
| 
      
 47 
     | 
    
         
            +
              }
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              number_of_values = values.length();
         
     | 
| 
      
 50 
     | 
    
         
            +
              ruby_val = rb_ary_new2(number_of_values);
         
     | 
| 
      
 51 
     | 
    
         
            +
              for (i = 0; i < number_of_values; i++) {
         
     | 
| 
      
 52 
     | 
    
         
            +
                cell = values(i);
         
     | 
| 
      
 53 
     | 
    
         
            +
                if (xisnan(cell) || octave_is_NA(cell)) {
         
     | 
| 
      
 54 
     | 
    
         
            +
                  rb_ary_push(ruby_val, Qnil);
         
     | 
| 
      
 55 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 56 
     | 
    
         
            +
                  rb_ary_push(ruby_val, rb_float_new(cell));
         
     | 
| 
      
 57 
     | 
    
         
            +
                }
         
     | 
| 
      
 58 
     | 
    
         
            +
              }
         
     | 
| 
      
 59 
     | 
    
         
            +
              
         
     | 
| 
      
 60 
     | 
    
         
            +
              return ruby_val;
         
     | 
| 
      
 61 
     | 
    
         
            +
            }
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            octave_value OR_Matrix::to_octave()
         
     | 
| 
      
 64 
     | 
    
         
            +
            {
         
     | 
| 
      
 65 
     | 
    
         
            +
              int row_index, column_index;
         
     | 
| 
      
 66 
     | 
    
         
            +
              int number_of_rows = FIX2INT(rb_iv_get(ruby_val, "@m"));
         
     | 
| 
      
 67 
     | 
    
         
            +
              int number_of_columns = FIX2INT(rb_iv_get(ruby_val, "@n"));
         
     | 
| 
      
 68 
     | 
    
         
            +
              VALUE cells = rb_iv_get(ruby_val, "@cells");
         
     | 
| 
      
 69 
     | 
    
         
            +
              VALUE row, cell;
         
     | 
| 
      
 70 
     | 
    
         
            +
              Matrix matrix = Matrix(number_of_rows, number_of_columns);
         
     | 
| 
      
 71 
     | 
    
         
            +
              
         
     | 
| 
      
 72 
     | 
    
         
            +
              for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 73 
     | 
    
         
            +
                row = RARRAY(cells)->ptr[row_index];
         
     | 
| 
      
 74 
     | 
    
         
            +
                
         
     | 
| 
      
 75 
     | 
    
         
            +
                for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 76 
     | 
    
         
            +
                  cell = RARRAY(row)->ptr[column_index];
         
     | 
| 
      
 77 
     | 
    
         
            +
                  
         
     | 
| 
      
 78 
     | 
    
         
            +
                  if (rb_type(cell) == T_FLOAT) {
         
     | 
| 
      
 79 
     | 
    
         
            +
                    matrix(row_index, column_index) = RFLOAT(cell)->value;
         
     | 
| 
      
 80 
     | 
    
         
            +
                  } else if (rb_type(cell) == T_FIXNUM) {
         
     | 
| 
      
 81 
     | 
    
         
            +
                    matrix(row_index, column_index) = FIX2LONG(cell);
         
     | 
| 
      
 82 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 83 
     | 
    
         
            +
                    matrix(row_index, column_index) = octave_NaN;
         
     | 
| 
      
 84 
     | 
    
         
            +
                  }
         
     | 
| 
      
 85 
     | 
    
         
            +
                }
         
     | 
| 
      
 86 
     | 
    
         
            +
              }
         
     | 
| 
      
 87 
     | 
    
         
            +
              
         
     | 
| 
      
 88 
     | 
    
         
            +
              return matrix;
         
     | 
| 
      
 89 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef OR_MATRIX_DEFINED_H_
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define OR_MATRIX_DEFINED_H_
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "ruby.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "octave-includes.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class OR_Matrix
         
     | 
| 
      
 8 
     | 
    
         
            +
            {
         
     | 
| 
      
 9 
     | 
    
         
            +
              private:
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE ruby_val;
         
     | 
| 
      
 11 
     | 
    
         
            +
                octave_value octave_val;
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              public:
         
     | 
| 
      
 14 
     | 
    
         
            +
                OR_Matrix(VALUE r) : ruby_val(r) { };
         
     | 
| 
      
 15 
     | 
    
         
            +
                OR_Matrix(octave_value o) : octave_val(o) { };
         
     | 
| 
      
 16 
     | 
    
         
            +
                ~OR_Matrix();
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
                VALUE to_ruby();
         
     | 
| 
      
 19 
     | 
    
         
            +
                octave_value to_octave();
         
     | 
| 
      
 20 
     | 
    
         
            +
            };
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            #endif /* OR_MATRIX_DEFINED_H_ */
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef OR_STRING_DEFINED_H_
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define OR_STRING_DEFINED_H_
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "ruby.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "octave-includes.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class OR_String
         
     | 
| 
      
 8 
     | 
    
         
            +
            {
         
     | 
| 
      
 9 
     | 
    
         
            +
              private:
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE ruby_val;
         
     | 
| 
      
 11 
     | 
    
         
            +
                octave_value octave_val;
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
              public:
         
     | 
| 
      
 14 
     | 
    
         
            +
                OR_String(VALUE r) : ruby_val(r) { };
         
     | 
| 
      
 15 
     | 
    
         
            +
                OR_String(octave_value o) : octave_val(o) { };
         
     | 
| 
      
 16 
     | 
    
         
            +
                ~OR_String();
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
                VALUE to_ruby();
         
     | 
| 
      
 19 
     | 
    
         
            +
                octave_value to_octave();
         
     | 
| 
      
 20 
     | 
    
         
            +
            };
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            #endif /* OR_STRING_DEFINED_H_ */
         
     | 
| 
         @@ -0,0 +1,88 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "or-struct_matrix.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
            #include "or-variable.h"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            OR_StructMatrix::~OR_StructMatrix() {}
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            VALUE OR_StructMatrix::to_ruby()
         
     | 
| 
      
 7 
     | 
    
         
            +
            {
         
     | 
| 
      
 8 
     | 
    
         
            +
              Octave_map struct_matrix = Octave_map(octave_val.map_value());
         
     | 
| 
      
 9 
     | 
    
         
            +
              string_vector keys = struct_matrix.keys();
         
     | 
| 
      
 10 
     | 
    
         
            +
              int number_of_keys = keys.length();
         
     | 
| 
      
 11 
     | 
    
         
            +
              int number_of_rows = struct_matrix.rows();
         
     | 
| 
      
 12 
     | 
    
         
            +
              int number_of_columns = struct_matrix.columns();
         
     | 
| 
      
 13 
     | 
    
         
            +
              int i;
         
     | 
| 
      
 14 
     | 
    
         
            +
              VALUE cells, row, cell;
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              if (number_of_rows == 0 && number_of_columns == 1) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                ruby_val = rb_hash_new();
         
     | 
| 
      
 18 
     | 
    
         
            +
                for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 19 
     | 
    
         
            +
                  rb_hash_aset(ruby_val, rb_str_new2(keys[i].c_str()), OR_Variable(struct_matrix.contents(keys[i])).to_ruby());
         
     | 
| 
      
 20 
     | 
    
         
            +
                }
         
     | 
| 
      
 21 
     | 
    
         
            +
              } else if (number_of_rows == 1 && number_of_columns == 1) {
         
     | 
| 
      
 22 
     | 
    
         
            +
                ruby_val = rb_hash_new();
         
     | 
| 
      
 23 
     | 
    
         
            +
                for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  rb_hash_aset(ruby_val, rb_str_new2(keys[i].c_str()), OR_Variable(struct_matrix.contents(keys[i])(0)).to_ruby());
         
     | 
| 
      
 25 
     | 
    
         
            +
                }
         
     | 
| 
      
 26 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 27 
     | 
    
         
            +
                int number_of_arguments_to_struct_matrix = number_of_keys + 2;
         
     | 
| 
      
 28 
     | 
    
         
            +
                VALUE argv[number_of_arguments_to_struct_matrix];
         
     | 
| 
      
 29 
     | 
    
         
            +
                argv[0] = INT2FIX(number_of_rows);
         
     | 
| 
      
 30 
     | 
    
         
            +
                argv[1] = INT2FIX(number_of_columns);
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
                for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 33 
     | 
    
         
            +
                  argv[2 + i] = rb_str_new2(keys[i].c_str());
         
     | 
| 
      
 34 
     | 
    
         
            +
                }
         
     | 
| 
      
 35 
     | 
    
         
            +
                ruby_val = rb_class_new_instance(number_of_arguments_to_struct_matrix, argv, rb_path2class("Octave::StructMatrix"));
         
     | 
| 
      
 36 
     | 
    
         
            +
                cells = rb_ary_new2(number_of_rows);
         
     | 
| 
      
 37 
     | 
    
         
            +
              
         
     | 
| 
      
 38 
     | 
    
         
            +
                int row_index, column_index;
         
     | 
| 
      
 39 
     | 
    
         
            +
                for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 40 
     | 
    
         
            +
                  row = rb_ary_new2(number_of_columns);
         
     | 
| 
      
 41 
     | 
    
         
            +
                
         
     | 
| 
      
 42 
     | 
    
         
            +
                  for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                    cell = rb_hash_new();
         
     | 
| 
      
 44 
     | 
    
         
            +
                    for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 45 
     | 
    
         
            +
                      rb_hash_aset(cell, rb_str_new2(keys[i].c_str()), OR_Variable(struct_matrix.contents(keys[i])(row_index, column_index)).to_ruby());
         
     | 
| 
      
 46 
     | 
    
         
            +
                    }
         
     | 
| 
      
 47 
     | 
    
         
            +
                    rb_ary_push(row, cell);
         
     | 
| 
      
 48 
     | 
    
         
            +
                  }
         
     | 
| 
      
 49 
     | 
    
         
            +
                
         
     | 
| 
      
 50 
     | 
    
         
            +
                  rb_ary_push(cells, row);
         
     | 
| 
      
 51 
     | 
    
         
            +
                }
         
     | 
| 
      
 52 
     | 
    
         
            +
              
         
     | 
| 
      
 53 
     | 
    
         
            +
                rb_iv_set(ruby_val, "@cells", cells);
         
     | 
| 
      
 54 
     | 
    
         
            +
              }
         
     | 
| 
      
 55 
     | 
    
         
            +
              
         
     | 
| 
      
 56 
     | 
    
         
            +
              return ruby_val;
         
     | 
| 
      
 57 
     | 
    
         
            +
            }
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            octave_value OR_StructMatrix::to_octave()
         
     | 
| 
      
 60 
     | 
    
         
            +
            {
         
     | 
| 
      
 61 
     | 
    
         
            +
              int i, row_index, column_index;
         
     | 
| 
      
 62 
     | 
    
         
            +
              VALUE row, cell;
         
     | 
| 
      
 63 
     | 
    
         
            +
              VALUE cells = rb_iv_get(ruby_val, "@cells");
         
     | 
| 
      
 64 
     | 
    
         
            +
              VALUE names = rb_iv_get(ruby_val, "@names");
         
     | 
| 
      
 65 
     | 
    
         
            +
              int number_of_keys = RARRAY(names)->len;
         
     | 
| 
      
 66 
     | 
    
         
            +
              int number_of_rows = FIX2INT(rb_iv_get(ruby_val, "@m"));
         
     | 
| 
      
 67 
     | 
    
         
            +
              int number_of_columns = FIX2INT(rb_iv_get(ruby_val, "@n"));
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
              string_vector keys = string_vector();
         
     | 
| 
      
 70 
     | 
    
         
            +
              for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 71 
     | 
    
         
            +
                keys.append(std::string(RSTRING(RARRAY(names)->ptr[i])->ptr));
         
     | 
| 
      
 72 
     | 
    
         
            +
              }
         
     | 
| 
      
 73 
     | 
    
         
            +
              
         
     | 
| 
      
 74 
     | 
    
         
            +
              Octave_map struct_matrix = Octave_map(dim_vector(number_of_rows, number_of_columns), Cell(keys));
         
     | 
| 
      
 75 
     | 
    
         
            +
              for (row_index = 0; row_index < number_of_rows; row_index++) {
         
     | 
| 
      
 76 
     | 
    
         
            +
                row = RARRAY(cells)->ptr[row_index];
         
     | 
| 
      
 77 
     | 
    
         
            +
              
         
     | 
| 
      
 78 
     | 
    
         
            +
                for (column_index = 0; column_index < number_of_columns; column_index++) {
         
     | 
| 
      
 79 
     | 
    
         
            +
                  cell = RARRAY(row)->ptr[column_index];
         
     | 
| 
      
 80 
     | 
    
         
            +
                  
         
     | 
| 
      
 81 
     | 
    
         
            +
                  for (i = 0; i < number_of_keys; i++) {
         
     | 
| 
      
 82 
     | 
    
         
            +
                    struct_matrix.contents(std::string(RSTRING(RARRAY(names)->ptr[i])->ptr))(row_index, column_index) = OR_Variable(rb_hash_aref(cell, rb_str_new2(RSTRING(RARRAY(names)->ptr[i])->ptr))).to_octave();
         
     | 
| 
      
 83 
     | 
    
         
            +
                  }
         
     | 
| 
      
 84 
     | 
    
         
            +
                }
         
     | 
| 
      
 85 
     | 
    
         
            +
              }
         
     | 
| 
      
 86 
     | 
    
         
            +
              
         
     | 
| 
      
 87 
     | 
    
         
            +
              return struct_matrix;
         
     | 
| 
      
 88 
     | 
    
         
            +
            }
         
     |