redshift 1.3.24 → 1.3.30
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.
- checksums.yaml +7 -0
- data/README.md +49 -0
- data/RELEASE-NOTES +34 -3
- data/Rakefile +81 -0
- data/bench/bench +1 -1
- data/bench/formula.rb +2 -3
- data/examples/pid.rb +6 -6
- data/examples/robots/lib/shell-world.rb +1 -1
- data/examples/scheduler.rb +6 -1
- data/ext/redshift/dvector-float/dvector-float.c +184 -0
- data/ext/redshift/dvector-float/dvector-float.h +36 -0
- data/ext/redshift/dvector-float/dvector-float.rb +33 -0
- data/ext/redshift/dvector-float/extconf.rb +2 -0
- data/lib/redshift/redshift.rb +5 -5
- data/lib/redshift/target/c/component-gen.rb +1 -1
- data/lib/redshift/target/c/flow-gen.rb +1 -1
- data/lib/redshift/target/c/flow/delay.rb +1 -1
- data/lib/redshift/target/c/world-gen.rb +101 -101
- data/lib/redshift/util/isaac.rb +2 -2
- data/lib/redshift/util/tkar-driver.rb +1 -1
- data/test/test.rb +1 -1
- data/test/test_buffer.rb +2 -2
- data/test/test_connect.rb +2 -2
- data/test/test_connect_parallel.rb +2 -2
- data/test/test_connect_strict.rb +4 -5
- data/test/test_constant.rb +2 -4
- data/test/test_delay.rb +2 -2
- data/test/test_derivative.rb +2 -2
- data/test/test_discrete.rb +2 -4
- data/test/test_discrete_isolated.rb +2 -4
- data/test/test_dvector-float.rb +110 -0
- data/test/test_dvector.rb +15 -17
- data/test/test_exit.rb +2 -4
- data/test/test_flow.rb +2 -4
- data/test/test_flow_link.rb +2 -4
- data/test/test_flow_sub.rb +2 -4
- data/test/test_flow_trans.rb +23 -25
- data/test/test_inherit.rb +2 -4
- data/test/test_inherit_event.rb +2 -4
- data/test/test_inherit_flow.rb +2 -4
- data/test/test_inherit_link.rb +2 -4
- data/test/test_inherit_setup.rb +2 -4
- data/test/test_inherit_state.rb +2 -4
- data/test/test_inherit_transition.rb +2 -4
- data/test/test_numerics.rb +2 -4
- data/test/test_queue.rb +3 -3
- data/test/test_queue_alone.rb +2 -2
- data/test/test_reset.rb +2 -4
- data/test/test_setup.rb +2 -4
- data/test/test_strict_continuity.rb +2 -4
- data/test/test_strict_reset_error.rb +2 -4
- data/test/test_strictness_error.rb +2 -4
- data/test/test_sync.rb +2 -2
- data/test/test_world.rb +2 -4
- metadata +80 -106
- data/.bnsignore +0 -27
- data/.gitignore +0 -9
- data/README +0 -25
- data/TODO +0 -431
- data/bench/aug17-ruby19.bench +0 -86
- data/bench/aug17.bench +0 -86
- data/bench/aug7.bench +0 -86
- data/bench/prof.html +0 -0
- data/examples/robots/README +0 -49
- data/ext/redshift/util/isaac/extconf.rb +0 -2
- data/ext/redshift/util/isaac/isaac.c +0 -129
- data/ext/redshift/util/isaac/rand.c +0 -140
- data/ext/redshift/util/isaac/rand.h +0 -61
- data/rakefile +0 -50
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0e70ddb9e9f05b61a7b15acd4a9a59ad94f8fb43771aa0619f0d69400f691ba2
|
4
|
+
data.tar.gz: 0a2087fa620759313761ddcfc788dc44fcc204f5b0d2d8ceb5e73681102c2f75
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '059c869b96c8e837ebdd1762e28859f5fdf6d4f4f76afa6a955149a93013b11d262d849b30e472523ce9ca9d09f0b255efc6ae64bcf9488703a0431e6af5cbe5'
|
7
|
+
data.tar.gz: 25438a65be067f8b8a5df3dbd9f276722e2de0468bfa06273041fd7dc3e56f79677a1382c75633783c4d46c436845df1873ec34b72c89d83beb87be1638c814a
|
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# RedShift #
|
2
|
+
|
3
|
+
A framework for simulation of networks of hybrid automata, similar to SHIFT and Lambda-SHIFT. Includes ruby-based DSL for defining simulation components, and ruby/C code generation and runtime.
|
4
|
+
|
5
|
+
RedShift is for simulating digital devices operating in an analog world. It's also for simulating any system that exhibits a mix of discrete and continuous behavior.
|
6
|
+
|
7
|
+
There's not much [documentation](doc) yet, but plenty of [examples](examples). Some of the original SHIFT papers are available: [Shift: A Formalism and a Programming Language for Dynamic Networks of Hybrid Automata]( http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.32.5913&rep=rep1&type=pdf).
|
8
|
+
|
9
|
+
My [2009 rubyconf talk](http://confreaks.com/videos/165-rubyconf2009-dsls-code-generation-and-new-domains-for-ruby) discusses RedShift.
|
10
|
+
|
11
|
+
## Requirements ##
|
12
|
+
|
13
|
+
RedShift needs ruby (1.8, 1.9, 2.0, 2.1) and a compatible C compiler. If you can build native gems, you're all set.
|
14
|
+
|
15
|
+
Some of the examples also use Ruby/Tk and the tkar gem.
|
16
|
+
|
17
|
+
## Installation ##
|
18
|
+
|
19
|
+
Install as gem:
|
20
|
+
|
21
|
+
gem install redshift
|
22
|
+
|
23
|
+
## Env vars ##
|
24
|
+
|
25
|
+
If you have a multicore system and are using the gnu toolchain, set
|
26
|
+
|
27
|
+
REDSHIFT_MAKE_ARGS='-j -l2'
|
28
|
+
|
29
|
+
or some variation. You'll find that rebuilds of your simulation code go faster.
|
30
|
+
|
31
|
+
|
32
|
+
What is RedShift?
|
33
|
+
-----------------
|
34
|
+
|
35
|
+
RedShift combines *dataflow* programming (for continuous variables) with *actor*-based programming (for discrete events, states, and variables, and also for continuous variables).
|
36
|
+
|
37
|
+
Examples
|
38
|
+
--------
|
39
|
+
|
40
|
+
See the [examples](examples) dir.
|
41
|
+
|
42
|
+
The [RedCloud](https://github.com/vjoel/redcloud) project is based on RedShift.
|
43
|
+
|
44
|
+
|
45
|
+
----
|
46
|
+
|
47
|
+
Copyright (C) 2001-2014, Joel VanderWerf, mailto:vjoel@users.sourceforge.net
|
48
|
+
Distributed under the Ruby license. See www.ruby-lang.org.
|
49
|
+
|
data/RELEASE-NOTES
CHANGED
@@ -1,3 +1,34 @@
|
|
1
|
+
redshift 1.3.28
|
2
|
+
|
3
|
+
- gemspec specifies dvector-float extension
|
4
|
+
|
5
|
+
redshift 1.3.28
|
6
|
+
|
7
|
+
- update .gitignore
|
8
|
+
- fixes for ruby 2.1
|
9
|
+
- modernize rakefile: release tasks
|
10
|
+
- use -march=native in formula benchmark
|
11
|
+
|
12
|
+
redshift 1.3.27
|
13
|
+
|
14
|
+
- cleanup
|
15
|
+
- use minitest
|
16
|
+
- remove local isaac ext and depend on prng-isaac gem instead
|
17
|
+
|
18
|
+
redshift 1.3.26
|
19
|
+
|
20
|
+
- updated to ruby 2.0
|
21
|
+
|
22
|
+
- fixed gemspec
|
23
|
+
|
24
|
+
redshift 1.3.25
|
25
|
+
|
26
|
+
- added DVectorFloat
|
27
|
+
|
28
|
+
- added 'rake ex' task to build extensions for current ruby version
|
29
|
+
|
30
|
+
- minor bug fixes and updates
|
31
|
+
|
1
32
|
redshift 1.3.24
|
2
33
|
|
3
34
|
- fixed include path problem when running from installed gem
|
@@ -7,7 +38,7 @@ redshift 1.3.23
|
|
7
38
|
- compatible with ruby-1.9.2
|
8
39
|
|
9
40
|
- renamed Random module to RandomDistribution to avoid conflict
|
10
|
-
|
41
|
+
|
11
42
|
redshift 1.3.22
|
12
43
|
|
13
44
|
- handling of env vars is more consistent
|
@@ -100,7 +131,7 @@ redshift 1.3.13
|
|
100
131
|
|
101
132
|
redshift 1.3.12
|
102
133
|
|
103
|
-
- Fixed bug with explicitly assigning an array to a
|
134
|
+
- Fixed bug with explicitly assigning an array to a
|
104
135
|
delay buffer.
|
105
136
|
|
106
137
|
- Raise if time_step changes while using delay.
|
@@ -185,7 +216,7 @@ redshift 1.2.41
|
|
185
216
|
- Improved message for reset type error.
|
186
217
|
|
187
218
|
- Link vars can now be declared without a type (defaults to Component).
|
188
|
-
|
219
|
+
|
189
220
|
- Fixed Queue behavior when #unpop called with SimultaneousQueueEntries.
|
190
221
|
|
191
222
|
- Added examples and tests.
|
data/Rakefile
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
PRJ = "redshift"
|
4
|
+
|
5
|
+
def cur_ruby
|
6
|
+
require 'rbconfig'
|
7
|
+
@cur_ruby ||= RbConfig::CONFIG["RUBY_INSTALL_NAME"]
|
8
|
+
end
|
9
|
+
|
10
|
+
def version
|
11
|
+
@version ||= begin
|
12
|
+
require 'redshift/redshift'
|
13
|
+
warn "RedShift::VERSION not a string" unless
|
14
|
+
RedShift::VERSION.kind_of? String
|
15
|
+
RedShift::VERSION
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def tag
|
20
|
+
@tag ||= "#{PRJ}-#{version}"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Run unit tests"
|
24
|
+
task :test do |t|
|
25
|
+
sh "cd test && RUBYLIB=../lib:../ext:$RUBYLIB ./test.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "build extensions for current ruby: #{RUBY_VERSION}"
|
29
|
+
task :build_ext do
|
30
|
+
require 'find'
|
31
|
+
Find.find('ext/redshift') do |f|
|
32
|
+
next unless File.basename(f) == "extconf.rb"
|
33
|
+
d = File.dirname(f)
|
34
|
+
Dir.chdir d do
|
35
|
+
sh "make distclean || true"
|
36
|
+
ruby "extconf.rb"
|
37
|
+
sh "make"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Commit, tag, and push repo; build and push gem"
|
43
|
+
task :release => "release:is_new_version" do
|
44
|
+
require 'tempfile'
|
45
|
+
|
46
|
+
sh "gem build #{PRJ}.gemspec"
|
47
|
+
|
48
|
+
file = Tempfile.new "template"
|
49
|
+
begin
|
50
|
+
file.puts "release #{version}"
|
51
|
+
file.close
|
52
|
+
sh "git commit --allow-empty -a -v -t #{file.path}"
|
53
|
+
ensure
|
54
|
+
file.close unless file.closed?
|
55
|
+
file.unlink
|
56
|
+
end
|
57
|
+
|
58
|
+
sh "git tag #{tag}"
|
59
|
+
sh "git push"
|
60
|
+
sh "git push --tags"
|
61
|
+
|
62
|
+
sh "gem push #{tag}.gem"
|
63
|
+
end
|
64
|
+
|
65
|
+
namespace :release do
|
66
|
+
desc "Diff to latest release"
|
67
|
+
task :diff do
|
68
|
+
latest = `git describe --abbrev=0 --tags --match '#{PRJ}-*'`.chomp
|
69
|
+
sh "git diff #{latest}"
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "Log to latest release"
|
73
|
+
task :log do
|
74
|
+
latest = `git describe --abbrev=0 --tags --match '#{PRJ}-*'`.chomp
|
75
|
+
sh "git log #{latest}.."
|
76
|
+
end
|
77
|
+
|
78
|
+
task :is_new_version do
|
79
|
+
abort "#{tag} exists; update version!" unless `git tag -l #{tag}`.empty?
|
80
|
+
end
|
81
|
+
end
|
data/bench/bench
CHANGED
@@ -9,7 +9,7 @@ def bench_one(name)
|
|
9
9
|
puts "#{name}:"
|
10
10
|
#{name.split(/[-_]/).map {|w|w.capitalize}.join}.do_bench {|l| puts l}
|
11
11
|
}
|
12
|
-
ruby =
|
12
|
+
ruby = RbConfig::CONFIG["RUBY_INSTALL_NAME"]
|
13
13
|
system ruby, "-r" , "./bench", "-r", lib, "-e", cmd
|
14
14
|
end
|
15
15
|
|
data/bench/formula.rb
CHANGED
@@ -6,11 +6,10 @@
|
|
6
6
|
# with
|
7
7
|
# CFLAGS = -fPIC -O2 -march=i686 -msse2 -mfpmath=sse
|
8
8
|
|
9
|
+
$CFLAGS="-fPIC -O2 -march=native"
|
9
10
|
case RUBY_PLATFORM
|
10
11
|
when /x86_64/
|
11
|
-
$CFLAGS
|
12
|
-
else
|
13
|
-
$CFLAGS="-fPIC -O2 -march=i686 -msse2 -mfpmath=sse"
|
12
|
+
$CFLAGS << " -msse2 -mfpmath=sse"
|
14
13
|
end
|
15
14
|
|
16
15
|
require 'redshift'
|
data/examples/pid.rb
CHANGED
@@ -9,14 +9,14 @@ srand(12345)
|
|
9
9
|
# Variable with discrete and continuous perturbation.
|
10
10
|
class Plant < Component
|
11
11
|
continuous :x => 0, :t => 1
|
12
|
-
|
12
|
+
|
13
13
|
link :control => :Control # fwd ref to undefined class Control
|
14
|
-
|
14
|
+
|
15
15
|
flow do
|
16
16
|
diff " x' = control.output + sin(t) "
|
17
17
|
diff " t' = -1 "
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
transition do
|
21
21
|
guard "t <= 0"
|
22
22
|
action do
|
@@ -30,14 +30,14 @@ end
|
|
30
30
|
class Control < Component
|
31
31
|
continuous :set_point => 2.0
|
32
32
|
continuous :p_out, :i_out, :d_out, :output
|
33
|
-
|
33
|
+
|
34
34
|
# Gains
|
35
35
|
constant :k_p => 1.0,
|
36
36
|
:k_i => 1.0,
|
37
37
|
:k_d => 1.0
|
38
|
-
|
38
|
+
|
39
39
|
link :plant => Plant
|
40
|
-
|
40
|
+
|
41
41
|
flow do
|
42
42
|
algebraic " error = set_point - plant.x "
|
43
43
|
algebraic " p_out = k_p * error "
|
data/examples/scheduler.rb
CHANGED
@@ -18,10 +18,14 @@ class Scheduler < RedShift::Component
|
|
18
18
|
|
19
19
|
class Request
|
20
20
|
include Comparable
|
21
|
+
|
21
22
|
attr_accessor :time, :queue, :message
|
23
|
+
|
22
24
|
def <=>(other)
|
23
25
|
self.time <=> other.time
|
24
26
|
end
|
27
|
+
|
28
|
+
# Scheduled request: at given +time+, send +message+ to +queue+.
|
25
29
|
def initialize time, queue, message
|
26
30
|
@time, @queue, @message = time, queue, message
|
27
31
|
end
|
@@ -29,6 +33,7 @@ class Scheduler < RedShift::Component
|
|
29
33
|
|
30
34
|
EPSILON = 1E-12 # float fuzziness, if timestep is 0.1, for example
|
31
35
|
|
36
|
+
# Schedule the sending of +message+ to +queue+, after +delta_t+ elapses.
|
32
37
|
# Returns the request object for use with unschedule
|
33
38
|
def schedule_message delta_t, queue, message
|
34
39
|
req = Request.new(time + delta_t - EPSILON, queue, message)
|
@@ -82,7 +87,7 @@ class Client < RedShift::Component
|
|
82
87
|
|
83
88
|
transition Enter => Waiting do
|
84
89
|
action do
|
85
|
-
puts "scheduling message at #{world.clock} sec"
|
90
|
+
puts "scheduling message at #{world.clock} sec to run after #{delay} sec"
|
86
91
|
scheduler.schedule_message delay, wakeup, "Time to wake up, snoozebrain!"
|
87
92
|
end
|
88
93
|
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
#include "dvector-float.h"
|
2
|
+
#include <math.h>
|
3
|
+
|
4
|
+
static VALUE dvf_alloc(VALUE klass)
|
5
|
+
{
|
6
|
+
VALUE self;
|
7
|
+
RS_DVectorFloat *dvf;
|
8
|
+
|
9
|
+
self = Data_Make_Struct(klass, RS_DVectorFloat, 0, -1, dvf);
|
10
|
+
|
11
|
+
dvf->len = 0;
|
12
|
+
dvf->capa = 0;
|
13
|
+
dvf->ptr = 0;
|
14
|
+
|
15
|
+
return self;
|
16
|
+
}
|
17
|
+
|
18
|
+
void rs_dvf_grow(RS_DVectorFloat *dvf)
|
19
|
+
{
|
20
|
+
if (!dvf->ptr) {
|
21
|
+
dvf->capa = 16;
|
22
|
+
dvf->ptr = ALLOC_N(float, dvf->capa);
|
23
|
+
}
|
24
|
+
else if (dvf->len == dvf->capa) {
|
25
|
+
dvf->capa *= 2;
|
26
|
+
REALLOC_N(dvf->ptr, float, dvf->capa);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
void rs_dvf_shrink(RS_DVectorFloat *dvf)
|
31
|
+
{
|
32
|
+
if (dvf->ptr && dvf->len < dvf->capa) {
|
33
|
+
REALLOC_N(dvf->ptr, float, dvf->len);
|
34
|
+
dvf->capa = dvf->len;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
static VALUE dvf_method_push(int argc, VALUE *argv, VALUE self)
|
39
|
+
{
|
40
|
+
int i;
|
41
|
+
RS_DVectorFloat *dvf;
|
42
|
+
|
43
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
44
|
+
|
45
|
+
for (i = 0; i < argc; i++) {
|
46
|
+
rs_dvf_push(dvf, NUM2DBL(argv[i]));
|
47
|
+
}
|
48
|
+
|
49
|
+
return self;
|
50
|
+
}
|
51
|
+
|
52
|
+
static VALUE dvf_method_pop(VALUE self)
|
53
|
+
{
|
54
|
+
RS_DVectorFloat *dvf;
|
55
|
+
|
56
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
57
|
+
|
58
|
+
return dvf->len == 0 ? Qnil : rb_float_new(rs_dvf_pop(dvf));
|
59
|
+
}
|
60
|
+
|
61
|
+
static VALUE dvf_method_each(VALUE self)
|
62
|
+
{
|
63
|
+
long i;
|
64
|
+
RS_DVectorFloat *dvf;
|
65
|
+
|
66
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
67
|
+
|
68
|
+
RETURN_ENUMERATOR(self, 0, 0);
|
69
|
+
for (i=0; i < dvf->len; i++) {
|
70
|
+
rb_yield(rb_float_new(dvf->ptr[i]));
|
71
|
+
}
|
72
|
+
|
73
|
+
return self;
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE dvf_method_to_a(VALUE self)
|
77
|
+
{
|
78
|
+
int i;
|
79
|
+
RS_DVectorFloat *dvf;
|
80
|
+
VALUE ary;
|
81
|
+
|
82
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
83
|
+
|
84
|
+
ary = rb_ary_new();
|
85
|
+
if (!dvf->ptr) return ary;
|
86
|
+
|
87
|
+
for (i=0; i < dvf->len; i++) {
|
88
|
+
rb_ary_push(ary, rb_float_new(dvf->ptr[i]));
|
89
|
+
}
|
90
|
+
|
91
|
+
return ary;
|
92
|
+
}
|
93
|
+
|
94
|
+
static VALUE dvf_method_length(VALUE self)
|
95
|
+
{
|
96
|
+
RS_DVectorFloat *dvf;
|
97
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
98
|
+
return INT2NUM(dvf->len);
|
99
|
+
}
|
100
|
+
|
101
|
+
static VALUE dvf_method_equal(VALUE self, VALUE other)
|
102
|
+
{
|
103
|
+
int i;
|
104
|
+
RS_DVectorFloat *dvf1, *dvf2;
|
105
|
+
|
106
|
+
if (self == other) return Qtrue;
|
107
|
+
if (CLASS_OF(self) != CLASS_OF(other)) return Qfalse;
|
108
|
+
|
109
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf1);
|
110
|
+
Data_Get_Struct(other, RS_DVectorFloat, dvf2);
|
111
|
+
if (dvf1->len != dvf2->len) return Qfalse;
|
112
|
+
|
113
|
+
for (i=0; i < dvf1->len; i++) {
|
114
|
+
if (dvf1->ptr[i] != dvf2->ptr[i]) return Qfalse;
|
115
|
+
}
|
116
|
+
return Qtrue;
|
117
|
+
}
|
118
|
+
|
119
|
+
static VALUE dvf_method_hash(VALUE self)
|
120
|
+
{
|
121
|
+
long i, h;
|
122
|
+
RS_DVectorFloat *dvf;
|
123
|
+
|
124
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
125
|
+
|
126
|
+
h = dvf->len;
|
127
|
+
for (i=0; i < dvf->len; i++) {
|
128
|
+
int hash;
|
129
|
+
unsigned int j;
|
130
|
+
char *c;
|
131
|
+
float f;
|
132
|
+
|
133
|
+
h = (h << 1) | (h<0 ? 1 : 0);
|
134
|
+
f = dvf->ptr[i];
|
135
|
+
|
136
|
+
if (f == 0) f = fabs(f);
|
137
|
+
c = (char*)&f;
|
138
|
+
for (hash=0, j=0; j<sizeof(float); j++) {
|
139
|
+
hash = (hash * 971) ^ (unsigned char)c[j];
|
140
|
+
}
|
141
|
+
if (hash < 0) hash = -hash;
|
142
|
+
|
143
|
+
h ^= hash;
|
144
|
+
}
|
145
|
+
return LONG2FIX(h);
|
146
|
+
}
|
147
|
+
|
148
|
+
static VALUE dvf_method_load_data(VALUE self, VALUE from_array)
|
149
|
+
{
|
150
|
+
long i;
|
151
|
+
RS_DVectorFloat *dvf;
|
152
|
+
Data_Get_Struct(self, RS_DVectorFloat, dvf);
|
153
|
+
|
154
|
+
for (i=0; i < RARRAY_LEN(from_array); i++) {
|
155
|
+
rs_dvf_push(dvf, NUM2DBL(RARRAY_PTR(from_array)[i]));
|
156
|
+
}
|
157
|
+
|
158
|
+
return self;
|
159
|
+
}
|
160
|
+
|
161
|
+
VALUE rs_cDVectorFloat;
|
162
|
+
|
163
|
+
void
|
164
|
+
Init_dvector_float(void)
|
165
|
+
{
|
166
|
+
rs_cDVectorFloat = rb_path2class("RedShift::DVectorFloat");
|
167
|
+
|
168
|
+
rb_define_alloc_func(rs_cDVectorFloat, dvf_alloc);
|
169
|
+
rb_define_method(rs_cDVectorFloat, "push", dvf_method_push, -1);
|
170
|
+
rb_define_method(rs_cDVectorFloat, "pop", dvf_method_pop, 0);
|
171
|
+
rb_define_alias(rs_cDVectorFloat, "<<", "push");
|
172
|
+
|
173
|
+
rb_define_method(rs_cDVectorFloat, "each", dvf_method_each, 0);
|
174
|
+
rb_define_method(rs_cDVectorFloat, "to_a", dvf_method_to_a, 0);
|
175
|
+
rb_define_method(rs_cDVectorFloat, "length", dvf_method_length, 0);
|
176
|
+
rb_define_alias(rs_cDVectorFloat, "size", "length");
|
177
|
+
|
178
|
+
rb_define_method(rs_cDVectorFloat, "==", dvf_method_equal, 1);
|
179
|
+
rb_define_method(rs_cDVectorFloat, "eql?", dvf_method_equal, 1);
|
180
|
+
rb_define_method(rs_cDVectorFloat, "hash", dvf_method_hash, 0);
|
181
|
+
|
182
|
+
rb_define_method(rs_cDVectorFloat, "_load_data", dvf_method_load_data, 1);
|
183
|
+
rb_define_method(rs_cDVectorFloat, "_dump_data", dvf_method_to_a, 0);
|
184
|
+
}
|