tioga 1.4

Sign up to get free protection for your applications and to get access to all the features.
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
+