tioga 1.4

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.
Files changed (116) hide show
  1. data/Tioga_README +372 -0
  2. data/lgpl.txt +504 -0
  3. data/split/Dtable/defs.h +33 -0
  4. data/split/Dtable/dtable.c +1928 -0
  5. data/split/Dtable/dtable_intern.h +144 -0
  6. data/split/Dtable/dvector.h +61 -0
  7. data/split/Dtable/extconf.rb +4 -0
  8. data/split/Dtable/include/dtable.h +35 -0
  9. data/split/Dtable/lib/Dtable_extras.rb +90 -0
  10. data/split/Dtable/namespace.h +47 -0
  11. data/split/Dtable/safe_double.h +104 -0
  12. data/split/Dtable/symbols.c +92 -0
  13. data/split/Dtable/symbols.h +52 -0
  14. data/split/Dvector/defs.h +33 -0
  15. data/split/Dvector/dvector.c +5486 -0
  16. data/split/Dvector/dvector_intern.h +142 -0
  17. data/split/Dvector/extconf.rb +4 -0
  18. data/split/Dvector/include/dvector.h +61 -0
  19. data/split/Dvector/lib/Dvector_extras.rb +328 -0
  20. data/split/Dvector/lib/Numeric_extras.rb +134 -0
  21. data/split/Dvector/namespace.h +47 -0
  22. data/split/Dvector/safe_double.h +104 -0
  23. data/split/Dvector/symbols.c +92 -0
  24. data/split/Dvector/symbols.h +52 -0
  25. data/split/Flate/defs.h +33 -0
  26. data/split/Flate/extconf.rb +19 -0
  27. data/split/Flate/flate.c +156 -0
  28. data/split/Flate/flate_intern.h +97 -0
  29. data/split/Flate/include/flate.h +98 -0
  30. data/split/Flate/namespace.h +47 -0
  31. data/split/Flate/safe_double.h +104 -0
  32. data/split/Flate/symbols.c +92 -0
  33. data/split/Flate/symbols.h +52 -0
  34. data/split/Function/defs.h +33 -0
  35. data/split/Function/dvector.h +61 -0
  36. data/split/Function/extconf.rb +4 -0
  37. data/split/Function/function.c +988 -0
  38. data/split/Function/joint_qsort.c +258 -0
  39. data/split/Function/lib/Function_extras.rb +44 -0
  40. data/split/Function/namespace.h +47 -0
  41. data/split/Function/safe_double.h +104 -0
  42. data/split/Function/symbols.c +92 -0
  43. data/split/Function/symbols.h +52 -0
  44. data/split/Tioga/axes.c +774 -0
  45. data/split/Tioga/defs.h +33 -0
  46. data/split/Tioga/dtable.h +35 -0
  47. data/split/Tioga/dvector.h +61 -0
  48. data/split/Tioga/extconf.rb +4 -0
  49. data/split/Tioga/figures.c +672 -0
  50. data/split/Tioga/figures.h +855 -0
  51. data/split/Tioga/flate.h +98 -0
  52. data/split/Tioga/init.c +524 -0
  53. data/split/Tioga/lib/Arcs_and_Circles.rb +64 -0
  54. data/split/Tioga/lib/ColorConstants.rb +274 -0
  55. data/split/Tioga/lib/Colorbars.rb +10 -0
  56. data/split/Tioga/lib/Colormaps.rb +105 -0
  57. data/split/Tioga/lib/Coordinate_Conversions.rb +194 -0
  58. data/split/Tioga/lib/Creating_Paths.rb +94 -0
  59. data/split/Tioga/lib/Doc.rb +91 -0
  60. data/split/Tioga/lib/Executive.rb +515 -0
  61. data/split/Tioga/lib/FigMkr.rb +2224 -0
  62. data/split/Tioga/lib/FigureConstants.rb +125 -0
  63. data/split/Tioga/lib/Figures_and_Plots.rb +268 -0
  64. data/split/Tioga/lib/Images.rb +278 -0
  65. data/split/Tioga/lib/Legends.rb +190 -0
  66. data/split/Tioga/lib/MarkerConstants.rb +122 -0
  67. data/split/Tioga/lib/Markers.rb +129 -0
  68. data/split/Tioga/lib/Page_Frame_Bounds.rb +567 -0
  69. data/split/Tioga/lib/Rectangles.rb +94 -0
  70. data/split/Tioga/lib/Shading.rb +100 -0
  71. data/split/Tioga/lib/Special_Paths.rb +307 -0
  72. data/split/Tioga/lib/Strokes.rb +129 -0
  73. data/split/Tioga/lib/TeX_Text.rb +454 -0
  74. data/split/Tioga/lib/TexPreamble.rb +358 -0
  75. data/split/Tioga/lib/Titles_and_Labels.rb +306 -0
  76. data/split/Tioga/lib/Transparency.rb +89 -0
  77. data/split/Tioga/lib/Using_Paths.rb +164 -0
  78. data/split/Tioga/lib/Utils.rb +74 -0
  79. data/split/Tioga/lib/X_and_Y_Axes.rb +749 -0
  80. data/split/Tioga/lib/irb_tioga.rb +122 -0
  81. data/split/Tioga/lib/tioga.rb +1 -0
  82. data/split/Tioga/lib/tioga_ui.rb +5 -0
  83. data/split/Tioga/lib/tioga_ui_cmds.rb +793 -0
  84. data/split/Tioga/makers.c +989 -0
  85. data/split/Tioga/mk_tioga_sty.rb +53 -0
  86. data/split/Tioga/namespace.h +47 -0
  87. data/split/Tioga/pdf_font_dicts.c +18253 -0
  88. data/split/Tioga/pdfcolor.c +486 -0
  89. data/split/Tioga/pdfcoords.c +505 -0
  90. data/split/Tioga/pdffile.c +342 -0
  91. data/split/Tioga/pdfimage.c +536 -0
  92. data/split/Tioga/pdfpath.c +914 -0
  93. data/split/Tioga/pdfs.h +229 -0
  94. data/split/Tioga/pdftext.c +443 -0
  95. data/split/Tioga/safe_double.h +104 -0
  96. data/split/Tioga/symbols.c +92 -0
  97. data/split/Tioga/symbols.h +52 -0
  98. data/split/Tioga/texout.c +380 -0
  99. data/split/defs.h +33 -0
  100. data/split/extconf.rb +107 -0
  101. data/split/mkmf2.rb +1612 -0
  102. data/split/namespace.h +47 -0
  103. data/split/safe_double.h +104 -0
  104. data/split/scripts/tioga +4 -0
  105. data/split/symbols.c +92 -0
  106. data/split/symbols.h +52 -0
  107. data/tests/dtable_test.data +6 -0
  108. data/tests/dvector_read_test.data +1 -0
  109. data/tests/dvector_test.data +101 -0
  110. data/tests/tc_Dtable.rb +221 -0
  111. data/tests/tc_Dvector.rb +791 -0
  112. data/tests/tc_FMkr.rb +162 -0
  113. data/tests/tc_Flate.rb +45 -0
  114. data/tests/tc_Function.rb +111 -0
  115. data/tests/ts_Tioga.rb +38 -0
  116. metadata +163 -0
@@ -0,0 +1,142 @@
1
+ /* Dvector.h */
2
+ /*
3
+ Copyright (C) 2005 Bill Paxton
4
+
5
+ Dvector is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Library Public License as published
7
+ by the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ Dvector is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Library General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Library General Public License
16
+ along with Dvector; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
+ */
19
+
20
+ #ifndef __Dvector_H__
21
+ #define __Dvector_H__
22
+
23
+ #include "ruby.h"
24
+ #include <stdbool.h>
25
+ #include <namespace.h>
26
+
27
+
28
+
29
+ /*======================================================================*/
30
+
31
+ PUBLIC void Init_Dvector();
32
+ /* dirty hack to prevent namespace conflicts */
33
+ PRIVATE bool Is_Dvector(VALUE obj);
34
+ PRIVATE double *Dvector_Data_for_Read(VALUE dvector, long *len_ptr); /* returns pointer to the dvector's data (which may be shared) */
35
+ PRIVATE double *Dvector_Data_Copy(VALUE dvector, long *len_ptr); /* like Dvector_Data_for_Read, but returns pointer to a copy of the data */
36
+ PRIVATE double *Dvector_Data_for_Write(VALUE dvector, long *len_ptr);
37
+ PRIVATE double *Dvector_Data_Resize(VALUE dvector, long new_len);
38
+ PRIVATE double *Dvector_Data_Replace(VALUE dvector, long len, double *data); /* copies the data into the dvector */
39
+ PRIVATE VALUE Dvector_Create(void);
40
+ PRIVATE void Dvector_Push_Double(VALUE ary, double val);
41
+ PRIVATE void Dvector_Store_Double(VALUE ary, long idx, double val);
42
+
43
+ PRIVATE VALUE Read_Dvectors(char *filename, VALUE destinations, int first_row_of_file, int number_of_rows);
44
+ PRIVATE VALUE Read_Row(char *filename, int row, VALUE row_ary);
45
+
46
+ /* implementations for Ruby methods */
47
+
48
+ PRIVATE VALUE dvector_apply_math_op(VALUE source, double (*op)(double));
49
+ PRIVATE VALUE dvector_apply_math_op2(VALUE ary1, VALUE ary2, double (*op)(double, double));
50
+ PRIVATE VALUE dvector_apply_math_op_bang(VALUE ary, double (*op)(double));
51
+ PRIVATE VALUE dvector_apply_math_op2_bang(VALUE ary1, VALUE ary2, double (*op)(double, double));
52
+
53
+ PRIVATE VALUE dvector_freeze(VALUE ary);
54
+ PRIVATE VALUE dvector_frozen_p(VALUE ary);
55
+ PRIVATE VALUE make_new_dvector(VALUE klass, long len, long capa);
56
+ PRIVATE VALUE dvector_new2(long len, long capa);
57
+ PRIVATE VALUE dvector_new();
58
+ PRIVATE VALUE dvector_new4(long len, VALUE *data);
59
+ PRIVATE VALUE dvector_new4_dbl(long len, double *data);
60
+ PRIVATE VALUE dvector_check_array_type(VALUE ary);
61
+ PRIVATE VALUE dvector_initialize(int argc, VALUE *argv, VALUE ary);
62
+ PRIVATE VALUE dvector_push(VALUE ary, VALUE item);
63
+ PRIVATE VALUE dvector_push_m(int argc, VALUE *argv, VALUE ary);
64
+ PRIVATE VALUE dvector_pop(VALUE ary);
65
+ PRIVATE VALUE dvector_shift(VALUE ary);
66
+ PRIVATE VALUE dvector_unshift_m(int argc, VALUE *argv, VALUE ary);
67
+ PRIVATE VALUE dvector_entry(VALUE ary, long offset);
68
+ PRIVATE VALUE dvector_subseq(VALUE ary, long beg, long len);
69
+ PRIVATE VALUE dvector_aref(int argc, VALUE *argv, VALUE ary);
70
+ PRIVATE VALUE dvector_at(VALUE ary, VALUE pos);
71
+ PRIVATE VALUE dvector_first(int argc, VALUE *argv, VALUE ary);
72
+ PRIVATE VALUE dvector_last(int argc, VALUE *argv, VALUE ary);
73
+ PRIVATE VALUE dvector_uniq_bang(VALUE ary);
74
+ PRIVATE VALUE dvector_uniq(VALUE ary);
75
+ PRIVATE VALUE dvector_fetch(int argc, VALUE *argv, VALUE ary);
76
+ PRIVATE VALUE dvector_index(VALUE ary, VALUE val);
77
+ PRIVATE VALUE dvector_rindex(VALUE ary, VALUE val);
78
+ PRIVATE VALUE dvector_aset(int argc, VALUE *argv, VALUE ary);
79
+ PRIVATE VALUE dvector_insert(int argc, VALUE *argv, VALUE ary);
80
+ PRIVATE VALUE dvector_each(VALUE ary);
81
+ PRIVATE VALUE dvector_each2(VALUE ary, VALUE ary2);
82
+ PRIVATE VALUE dvector_each_index(VALUE ary);
83
+ PRIVATE VALUE dvector_each_with_index(VALUE ary);
84
+ PRIVATE VALUE dvector_each2_with_index(VALUE ary, VALUE ary2);
85
+ PRIVATE VALUE dvector_reverse_each(VALUE ary);
86
+ PRIVATE VALUE dvector_reverse_each2(VALUE ary, VALUE ary2);
87
+ PRIVATE VALUE dvector_reverse_each_index(VALUE ary);
88
+ PRIVATE VALUE dvector_reverse_each_with_index(VALUE ary);
89
+ PRIVATE VALUE dvector_reverse_each2_with_index(VALUE ary, VALUE ary2);
90
+ PRIVATE VALUE dvector_length(VALUE ary);
91
+ PRIVATE VALUE dvector_empty_p(VALUE ary);
92
+ PRIVATE VALUE dvector_dup(VALUE ary);
93
+ PRIVATE VALUE dvector_join(VALUE ary, VALUE sep);
94
+ PRIVATE VALUE dvector_join_m(int argc, VALUE *argv, VALUE ary);
95
+ PRIVATE VALUE dvector_to_s(VALUE ary);
96
+ PRIVATE VALUE dvector_to_a(VALUE ary);
97
+ PRIVATE VALUE dvector_read(int argc, VALUE *argv, VALUE klass);
98
+ PRIVATE VALUE dvector_read_row(int argc, VALUE *argv, VALUE klass);
99
+ PRIVATE VALUE dvector_read_rows(int argc, VALUE *argv, VALUE klass);
100
+ PRIVATE VALUE dvector_reverse(VALUE ary);
101
+ PRIVATE VALUE dvector_reverse_bang(VALUE ary);
102
+ PRIVATE VALUE dvector_reverse_m(VALUE ary);
103
+ PRIVATE VALUE dvector_sort_bang(VALUE ary);
104
+ PRIVATE VALUE dvector_sort(VALUE ary);
105
+ PRIVATE VALUE dvector_collect(VALUE ary);
106
+ PRIVATE VALUE dvector_collect2(VALUE ary, VALUE ary2);
107
+ PRIVATE VALUE dvector_collect_bang(VALUE ary);
108
+ PRIVATE VALUE dvector_collect2_bang(VALUE ary, VALUE ary2);
109
+ PRIVATE VALUE dvector_values_at(int argc, VALUE *argv, VALUE ary);
110
+ PRIVATE VALUE dvector_select(VALUE ary);
111
+ PRIVATE VALUE dvector_delete(VALUE ary, VALUE item);
112
+ PRIVATE VALUE dvector_delete_at(VALUE ary, long pos);
113
+ PRIVATE VALUE dvector_slice_bang(int argc, VALUE *argv, VALUE ary);
114
+ PRIVATE VALUE dvector_reject_bang(VALUE ary);
115
+ PRIVATE VALUE dvector_reject(VALUE ary);
116
+ PRIVATE VALUE dvector_delete_if(VALUE ary);
117
+ PRIVATE VALUE dvector_replace(VALUE dest, VALUE orig);
118
+ PRIVATE VALUE dvector_clear(VALUE ary);
119
+ PRIVATE VALUE dvector_fill(int argc, VALUE *argv, VALUE ary);
120
+ PRIVATE VALUE dvector_eql(VALUE ary1, VALUE ary2);
121
+ PRIVATE VALUE dvector_includes(VALUE ary, VALUE item);
122
+ PRIVATE VALUE dvector_cmp(VALUE ary1, VALUE ary2);
123
+ PRIVATE VALUE dvector_mod(VALUE ary, VALUE arg);
124
+ PRIVATE VALUE dvector_min(int argc, VALUE *argv, VALUE ary);
125
+ PRIVATE VALUE dvector_max(int argc, VALUE *argv, VALUE ary);
126
+
127
+ PRIVATE void c_dvector_create_spline_interpolant(int n_pts_data, double *Xs, double *Ys,
128
+ bool start_clamped, double start_slope, bool end_clamped, double end_slope,
129
+ double *Bs, double *Cs, double *Ds);
130
+ PRIVATE VALUE dvector_create_spline_interpolant(int argc, VALUE *argv, VALUE klass);
131
+
132
+ PRIVATE double c_dvector_spline_interpolate(double x, int n_pts_data,
133
+ double *Xs, double *Ys, double *Bs, double *Cs, double *Ds);
134
+ PRIVATE VALUE dvector_spline_interpolate(int argc, VALUE *argv, VALUE klass);
135
+
136
+ PRIVATE double c_dvector_linear_interpolate(int num_pts, double *xs, double *ys, double x);
137
+ PRIVATE VALUE dvector_linear_interpolate(int argc, VALUE *argv, VALUE klass);
138
+
139
+ /* end of dirty hack */
140
+
141
+ #endif /* __Dvector_H__ */
142
+
@@ -0,0 +1,4 @@
1
+ # Dtable installation file
2
+ require 'mkmf'
3
+
4
+ create_makefile 'Dobjects/Dvector'
@@ -0,0 +1,61 @@
1
+ /* Dvector.h */
2
+ /*
3
+ Copyright (C) 2005 Bill Paxton
4
+
5
+ Dvector is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Library Public License as published
7
+ by the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ Dvector is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Library General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Library General Public License
16
+ along with Dvector; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
+ */
19
+
20
+ #ifndef __Dvector_H__
21
+ #define __Dvector_H__
22
+
23
+ /* this file has been heavily modified by Vincent Fourmond to take care
24
+ of the 'RCR330' scheme of exporting symbols
25
+ */
26
+
27
+ #include <symbols.h>
28
+ #include <stdbool.h>
29
+
30
+ /*======================================================================*/
31
+
32
+ /* functions for handling Dvectors: */
33
+
34
+ DECLARE_SYMBOL(double *, Dvector_Data_for_Read, (VALUE dvector, long *len_ptr));
35
+ /* returns pointer to the dvector's data (which may be shared) */
36
+ DECLARE_SYMBOL(double *, Dvector_Data_Copy, (VALUE dvector, long *len_ptr));
37
+ /* like Dvector_Data_for_Read, but returns pointer to a copy of the data */
38
+ DECLARE_SYMBOL(double *, Dvector_Data_for_Write,
39
+ (VALUE dvector, long *len_ptr));
40
+ DECLARE_SYMBOL(double *, Dvector_Data_Resize, (VALUE dvector, long new_len));
41
+ DECLARE_SYMBOL(double *, Dvector_Data_Replace,
42
+ (VALUE dvector, long len, double *data));
43
+ /* copies the data into the dvector */
44
+ DECLARE_SYMBOL(VALUE, Dvector_Create, (void));
45
+ DECLARE_SYMBOL(void, Dvector_Store_Double, (VALUE ary, long idx, double val));
46
+ /* pushes one element onto the vector */
47
+ DECLARE_SYMBOL(void, Dvector_Push_Double, (VALUE ary, double val));
48
+
49
+ /* functions for interpolation */
50
+ DECLARE_SYMBOL(double, c_dvector_spline_interpolate,
51
+ (double x, int n_pts_data, double *Xs, double *Ys,
52
+ double *Bs, double *Cs, double *Ds));
53
+ DECLARE_SYMBOL(double, c_dvector_linear_interpolate,
54
+ (int num_pts, double *xs, double *ys, double x));
55
+ DECLARE_SYMBOL(void, c_dvector_create_spline_interpolant,
56
+ (int n_pts_data, double *Xs, double *Ys,
57
+ bool start_clamped, double start_slope,
58
+ bool end_clamped, double end_slope,
59
+ double *As, double *Bs, double *Cs));
60
+ #endif /* __Dvector_H__ */
61
+
@@ -0,0 +1,328 @@
1
+ # Tioga::Dvector_extras.rb
2
+
3
+ module Dobjects
4
+
5
+ # MathEvaluator enables one to evaluate a simple mathematical expression
6
+ # such as "x[0] + cos(x[1])", where the array x is given at each call to
7
+ # compute, or "x + y**z", or...
8
+ #
9
+ # This class acts as a backend for Dvector.compute_formula, to make sure
10
+ # that the Math module is included, without the drawback of cluttering
11
+ # all Math functions in Dvector, which would admittedly be quite stupid.
12
+
13
+ class MathEvaluator
14
+ include Math
15
+
16
+ # Creates an evaluator for a formula. +formula+ is the formula. It is
17
+ # transformed into a block that takes +argname+ as an argument --
18
+ # +argname+ can be whatever you want. +mods+ are the modules you would
19
+ # like the formula to include. Math is included by default, but you
20
+ # can include other ones to make other kinds of functions available.
21
+ #
22
+ # MathEvaluator.new("col[0] + col[1]", "col")
23
+ # MathEvaluator.new("x*cos(y)", "x,y")
24
+ def initialize(formula, argname, mods = [])
25
+ for mod in mods
26
+ self.extend mod
27
+ end
28
+ @block = eval "proc { |#{argname}| #{formula} }"
29
+ end
30
+
31
+ # This function does the actual evaluation with the blocks
32
+ # given.
33
+ #
34
+ # e = MathEvaluator.new("x*y", "x,y")
35
+ # e.compute(1,2) -> 2
36
+ def compute(*args)
37
+ return @block.call(*args)
38
+ end
39
+ end
40
+
41
+ class Dvector
42
+
43
+ def to_dvector
44
+ self
45
+ end
46
+
47
+ # Dvector.fancy_read's defaults options. See that function for
48
+ # more details
49
+ FANCY_READ_DEFAULTS = {
50
+ 'sep' => /\s+/,
51
+ 'comments' => /^\s*\#/,
52
+ 'skip_first' => 0,
53
+ 'index_col' => false,
54
+ 'headers' => nil, # not used for now.
55
+ 'default' => 0.0/0.0, # defaults to NaN
56
+ 'remove_space' => true ,# removes spaces at the beginning of the lines
57
+ }
58
+
59
+
60
+ # This function reads in +stream+ (can an IO object or a String,
61
+ # in which case it represents the name of a file to be opened)
62
+ # the columns specified by +cols+ and returns them. column 0 is the
63
+ # first column. If +cols+ is +nil+, then fancy_read attempts to find
64
+ # all the columns in the file, while filling absent data with NaN.
65
+ #
66
+ # +opts+ is a hash for tuning the behavior of the reading. It can hold
67
+ # the following keys:
68
+ # 'sep':: the record separator
69
+ # 'comments':: a regular expression matching comment lines
70
+ # 'skip_first':: how many lines to skip at the beginning of the file,
71
+ # 'default':: the value taken for missing elements
72
+ # 'index_col':: if set to true, the first column contains the
73
+ # indices of the corresponding lines (0 for first and so on)
74
+
75
+ def Dvector.fancy_read(stream, cols = nil, opts = {}) # :doc:
76
+ # first, we turn the stream into a real IO stream
77
+ if stream.is_a?(String)
78
+ stream = File.open(stream)
79
+ end
80
+ raise ArgumentError.new("'stream' should have a gets method") unless
81
+ stream.respond_to? :gets
82
+
83
+ # we take default options and override them with opts
84
+ o = FANCY_READ_DEFAULTS.merge(opts)
85
+
86
+ # strip off the first lines.
87
+ while o["skip_first"] > 0
88
+ stream.gets
89
+ o["skip_first"] -= 1
90
+ end
91
+
92
+ # then, parsing the lines. We store the results in an array. We read up
93
+ # all columns, regardless of what is asked (it doesn't slow that much
94
+ # the process -- or does it ?)
95
+
96
+ columns = []
97
+ line_number = 0 # the number of the significant lines read so far
98
+
99
+ while line = stream.gets
100
+ next if line =~ o["comments"]
101
+ next if line =~ /^\s*$/ # skip empty lines
102
+ if o["remove_space"]
103
+ line.gsub!(/^\s+/,'')
104
+ end
105
+
106
+ elements = line.split(o["sep"])
107
+ # now, the fun: the actual reading.
108
+ # we first turn this elements into floats:
109
+ numbers = elements.collect do |s|
110
+ begin
111
+ a = Float(s)
112
+ rescue
113
+ o["default"]
114
+ end
115
+ end
116
+
117
+ if numbers.size < columns.size
118
+ # we pad it with default values
119
+ while numbers.size < columns.size
120
+ numbers << o["default"]
121
+ end
122
+ else
123
+ # in that case, we need to create new Dvectors to match the
124
+ # size of numbers
125
+ while columns.size < numbers.size
126
+ columns << Dvector.new(line_number, o["default"])
127
+ end
128
+ end
129
+ # now, we should have the same number of elements both
130
+ # in numbers and in columns
131
+ columns.size.times do |i|
132
+ columns[i] << numbers[i]
133
+ end
134
+ # and it's done ;-) !
135
+
136
+ line_number += 1
137
+ end
138
+ # Adding the index columns if necessary
139
+ if o["index_col"]
140
+ columns.unshift(Dvector.new(columns[0].length) { |i| i})
141
+ end
142
+
143
+ return columns unless cols
144
+ return cols.collect { |i|
145
+ columns[i]
146
+ }
147
+ end
148
+
149
+ # This function is a rudimentary formula computing stuff. Give it
150
+ # a text _formula_ and an array of Dvectors (_a_), and it returns a
151
+ # Dvector with the result. The formula should contain the following;
152
+ # column[n]:: represents the current element of the n th
153
+ # Dvector of the array
154
+ #
155
+ # This is just a try, and should be implemented in C rather than in
156
+ # Ruby. But if you're looking for simplicity, here you go ;-) !
157
+ #
158
+ # _modules_ are the modules you would wish the evaluator to +include+.
159
+ # This feature enables one to make sure custom functions are included
160
+
161
+ def Dvector.compute_formula(formula, a, modules = []) # :doc:
162
+
163
+ evaluator = MathEvaluator.new(formula, "column", modules)
164
+ # if we reach this place, it means that there a no big syntax errors ;-)
165
+
166
+ # we now need to inspect the array given, and make sure that there is
167
+ # and transform it into a clean stuff (an array with only Dvectors and
168
+ # nil elements).
169
+
170
+ target = []
171
+ last = nil
172
+ a.each { |elem|
173
+ if elem.is_a? Dvector
174
+ target << elem
175
+ last = elem
176
+ else
177
+ target << nil
178
+ end
179
+ }
180
+
181
+ raise "No Dvector found" unless last
182
+
183
+ # we check all the vectors have the same length
184
+ target.each {|x|
185
+ if x && x.length != last.length
186
+ raise "Dvectors should have all the same length !"
187
+ end
188
+ }
189
+
190
+ res = Dvector.new
191
+
192
+ last.each_index { |i|
193
+ args = target.collect { |val|
194
+ if val
195
+ val[i]
196
+ else
197
+ nil
198
+ end
199
+ }
200
+ # we add the index at the beginning:
201
+ # args.unshift(i)
202
+ # Commented out for simplicity
203
+
204
+ # then we call the block:
205
+ elem = evaluator.compute(args)
206
+ res << elem
207
+ }
208
+
209
+ return res
210
+ end
211
+
212
+ WRITE_DEFAULTS = {
213
+ 'sep' => "\t",
214
+ 'write_mode' => "a",
215
+ }
216
+
217
+ # Writes an array of Dvectors into a text _file_
218
+ def Dvector.write(file, cols, options = {})
219
+ ops = WRITE_DEFAULTS.update(options)
220
+ if file.is_a?(String)
221
+ file = File.open(file, ops["write_mode"])
222
+ end
223
+ nb = cols.map {|d| d.size}.max # The number of lines
224
+ nb.times do |i|
225
+ file.puts(cols.map {|d| d[i].to_s }.join(ops["sep"]))
226
+ end
227
+ end
228
+
229
+ end
230
+ end
231
+
232
+ # Modified by Vincent Fourmond to have a nice Dvector module
233
+ # instead of the Tioga module.
234
+ # add arithmetic operators for Float and Fixnum with Dvec
235
+
236
+ class Array # :nodoc: all
237
+ def to_dvector
238
+ Dobjects::Dvector[*self]
239
+ end
240
+ end
241
+
242
+ class Float # :nodoc: all
243
+ alias :pre_dvec_add :+
244
+ def +(a)
245
+ if a.class == Dobjects::Dvector
246
+ a+self
247
+ else
248
+ pre_dvec_add(a)
249
+ end
250
+ end
251
+ alias :pre_dvec_sub :-
252
+ def -(a)
253
+ if a.class == Dobjects::Dvector
254
+ a.neg+self
255
+ else
256
+ pre_dvec_sub(a)
257
+ end
258
+ end
259
+ alias :pre_dvec_mult :*
260
+ def *(a)
261
+ if a.class == Dobjects::Dvector
262
+ a*self
263
+ else
264
+ pre_dvec_mult(a)
265
+ end
266
+ end
267
+ alias :pre_dvec_div :/
268
+ def /(a)
269
+ if a.class == Dobjects::Dvector
270
+ a.inv*self
271
+ else
272
+ pre_dvec_div(a)
273
+ end
274
+ end
275
+ alias :pre_dvec_pow :**
276
+ def **(a)
277
+ if a.class == Dobjects::Dvector
278
+ a.as_exponent_of(self)
279
+ else
280
+ pre_dvec_pow(a)
281
+ end
282
+ end
283
+
284
+ end
285
+
286
+ class Fixnum # :nodoc: all
287
+ alias :pre_dvec_add :+
288
+ def +(a)
289
+ if a.class == Dobjects::Dvector
290
+ a+self
291
+ else
292
+ pre_dvec_add(a)
293
+ end
294
+ end
295
+ alias :pre_dvec_sub :-
296
+ def -(a)
297
+ if a.class == Dobjects::Dvector
298
+ a.neg+self
299
+ else
300
+ pre_dvec_sub(a)
301
+ end
302
+ end
303
+ alias :pre_dvec_mult :*
304
+ def *(a)
305
+ if a.class == Dobjects::Dvector
306
+ a*self
307
+ else
308
+ pre_dvec_mult(a)
309
+ end
310
+ end
311
+ alias :pre_dvec_div :/
312
+ def /(a)
313
+ if a.class == Dobjects::Dvector
314
+ a.inv*self
315
+ else
316
+ pre_dvec_div(a)
317
+ end
318
+ end
319
+ alias :pre_dvec_pow :**
320
+ def **(a)
321
+ if a.class == Dobjects::Dvector
322
+ a.as_exponent_of(self)
323
+ else
324
+ pre_dvec_pow(a)
325
+ end
326
+ end
327
+ end
328
+