simulator 0.1.2

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.
@@ -0,0 +1,38 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "a variable context" do
5
+ before :each do
6
+ @context = VariableContext.new
7
+ end
8
+
9
+ it "can contain variables explicitly" do
10
+ @context.add_variables Variable.new(:x), Variable.new(:y)
11
+ @context.set(x: 3, y: 4).should eq x: 3, y:4
12
+ end
13
+
14
+ it "can bind variables implicitly" do
15
+ @context.add x:3, y: 4
16
+ @context.get(:x).value.should eq 3
17
+ @context.get(:y).value.should eq 4
18
+ end
19
+
20
+ it "binds variables to values using BoundVariables" do
21
+ @context.add_variables Variable.new(:x), Variable.new(:y)
22
+ @context.set x: 3, y: 4
23
+
24
+ @context.get(:x).value.should eq 3
25
+ @context.get(:y).value.should eq 4
26
+ end
27
+
28
+ it "can be cloned while maintaining variable instances" do
29
+ @context.add_variables Variable.new(:x), Variable.new(:y)
30
+ @context.set x: 3, y: 4
31
+ copy = @context.clone
32
+ copy.set x: 10
33
+
34
+ @context.get(:x).value.should be 3
35
+ copy.get(:x).value.should be 10
36
+ end
37
+ end
38
+
@@ -0,0 +1,24 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "an equation" do
5
+ before :each do
6
+ @context = VariableContext.new
7
+ @var_x = Variable.new :x
8
+ @var_z = Variable.new :z
9
+
10
+ # add new variables to the context
11
+ @context.add_variables @var_x, @var_z
12
+
13
+ # set the values of the variables in this context
14
+ @context.set x: 3, z: 4
15
+ end
16
+ it "is bound to a variable" do
17
+ @context.get(:x).value.should be 3
18
+ eqtn = Equation.new @var_x do
19
+ 99
20
+ end
21
+ eqtn.evaluate_in(@context).should be 99
22
+ end
23
+ end
24
+
@@ -0,0 +1,79 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "a simple interest model" do
5
+ before :each do
6
+ @model = Model.new do
7
+ name = "Interest Model"
8
+
9
+ var :balance
10
+ var :interest
11
+
12
+ eqtn :balance do
13
+ balance + balance * interest
14
+ end
15
+ end
16
+
17
+ @run = Run.new @model
18
+ end
19
+
20
+ it "can step a run" do
21
+ @run.period_count.should eq 1
22
+ @run.set balance: 100, interest: 0.1
23
+
24
+ @run.step
25
+ @run.period_count.should eq 2
26
+ @run.variable_value(:balance).should eq 110
27
+ @run.step
28
+
29
+ @run.period_count.should eq 3
30
+ @run.variable_value(:balance).should eq 121
31
+
32
+ @run.set interest: 0.5
33
+ @run.step
34
+
35
+ @run.period_count.should eq 4
36
+ @run.variable_value(:balance).should eq (181.5)
37
+ end
38
+ end
39
+
40
+
41
+ describe "a complex interest model" do
42
+ before :each do
43
+ @model = Model.new do
44
+ name = "Interest Model"
45
+
46
+ var :balance
47
+ var :interest
48
+
49
+ eqtn :balance do
50
+ balance + balance * interest
51
+ end
52
+
53
+ eqtn :interest do
54
+ # Add 1% each evaluation
55
+ interest + 0.01
56
+ end
57
+ end
58
+
59
+ @run = Run.new @model
60
+ end
61
+
62
+ it "can step a run" do
63
+ @run.period_count.should eq 1
64
+ @run.set balance: 100, interest: 0.1
65
+
66
+ @run.step
67
+ @run.period_count.should eq 2
68
+ @run.variable_value(:balance).should eq 110
69
+ @run.variable_value(:interest).should eq 0.11
70
+ @run.step
71
+
72
+ @run.period_count.should eq 3
73
+ @run.variable_value(:balance).should eq 122.1
74
+ @run.variable_value(:interest).should eq 0.12
75
+
76
+ end
77
+ end
78
+
79
+
@@ -0,0 +1,33 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "a model" do
5
+ before :each do
6
+ @model = Model.new
7
+ end
8
+
9
+ it "has equations" do
10
+ @model.equations.nil?.should be false
11
+ end
12
+
13
+ it "has variables" do
14
+ @model.variables.nil?.should be false
15
+ end
16
+
17
+ it "accepts new variables" do
18
+ @model.variables.length.should be 0
19
+ x = Variable.new :x
20
+ @model.add_variable x
21
+ @model.variables.length.should be 1
22
+ end
23
+
24
+ it "accepts new equations" do
25
+ @model.equations.length.should be 0
26
+ e = Equation.new nil do
27
+ 1
28
+ end
29
+ @model.add_equation e
30
+ @model.equations.length.should be 1
31
+ end
32
+ end
33
+
@@ -0,0 +1,28 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "a period" do
5
+ before :each do
6
+ #model = Model.new
7
+ #[:x, :z].each do |v|
8
+ #model.add_variable Variable.new v
9
+ #end
10
+ #run = Run.new model
11
+ #@period = run.periods.first
12
+
13
+ periods = []
14
+ 3.times do
15
+ periods << Period.new(nil, periods.clone)
16
+ end
17
+ @period = Period.new nil, periods
18
+ end
19
+ it "has a variable context" do
20
+ @period.context.should_not be nil
21
+ end
22
+ it "knows about previous periods" do
23
+ @period.previous_periods.should_not be_empty
24
+ @period.previous.previous_periods.length.should be (@period.previous_periods.length - 1)
25
+ @period.first.should be @period.previous_periods.first
26
+ end
27
+ end
28
+
data/spec/run_spec.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "a run" do
5
+ before :each do
6
+ @model = Model.new
7
+ var_x = Variable.new :x
8
+ eqtn = Equation.new var_x do
9
+ x + 1
10
+ end
11
+ @model.add_equation eqtn
12
+ @model.add_variable var_x
13
+ @run = Run.new @model
14
+ end
15
+
16
+ it "has bound variables" do
17
+ @run.variables.first.class.should be BoundVariable
18
+ end
19
+
20
+ it "is not affected by setting variables in a different run" do
21
+ run2 = Run.new @model
22
+
23
+ @run.set x: 1
24
+ run2.set x: 2
25
+
26
+ @run.variable_value(:x).should be 1
27
+ run2.variable_value(:x).should be 2
28
+ end
29
+
30
+ it "can evaluate model equations in its current context" do
31
+ @run.set x: 3
32
+ @run.evaluate
33
+ @run.variable_value(:x).should be 4
34
+ @run.evaluate
35
+ @run.variable_value(:x).should be 5
36
+ end
37
+
38
+ it "can increment periods" do
39
+ @run.periods.length.should be 1
40
+ @run.increment_period
41
+ @run.periods.length.should be 2
42
+ end
43
+ end
44
+
@@ -0,0 +1,24 @@
1
+ require 'simulator'
2
+ include Simulator
3
+
4
+ describe "an evaluation sandbox" do
5
+ before :each do
6
+ @context = VariableContext.new
7
+ @context.add x: 3, z: 4
8
+ @sandbox = Sandbox.new @context
9
+ end
10
+ it "can evaluate variables" do
11
+ @sandbox.instance_eval do
12
+ x
13
+ end.should eq 3
14
+ @sandbox.instance_eval do
15
+ z
16
+ end.should eq 4
17
+ end
18
+ it "is used to evaluate expressions" do
19
+ @sandbox.instance_eval do
20
+ x * z
21
+ end.should eq 12
22
+ end
23
+ end
24
+
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simulator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jamie Ly
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: cucumber
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Use to simulate discrete time models. See the examples directory for
47
+ examples.
48
+ email:
49
+ - me@jamie.ly
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - Gemfile
56
+ - LICENSE
57
+ - README.md
58
+ - RELEASE.md
59
+ - Rakefile
60
+ - examples/drop/Gemfile
61
+ - examples/drop/drop.png
62
+ - examples/drop/drop.rb
63
+ - examples/mortage/Gemfile
64
+ - examples/mortage/mortgage.png
65
+ - examples/mortage/mortgage.rb
66
+ - features/equations.feature
67
+ - features/physics.feature
68
+ - features/savings_simulation.feature
69
+ - features/step_definitions/equations_steps.rb
70
+ - features/step_definitions/savings_simulation_steps.rb
71
+ - lib/simulator.rb
72
+ - lib/simulator/bound_variable.rb
73
+ - lib/simulator/data.rb
74
+ - lib/simulator/equation.rb
75
+ - lib/simulator/model.rb
76
+ - lib/simulator/period.rb
77
+ - lib/simulator/run.rb
78
+ - lib/simulator/sandbox.rb
79
+ - lib/simulator/variable.rb
80
+ - lib/simulator/variable_context.rb
81
+ - lib/simulator/version.rb
82
+ - simulator.gemspec
83
+ - spec/beer_spec.rb
84
+ - spec/context_spec.rb
85
+ - spec/equation_spec.rb
86
+ - spec/interest_spec.rb
87
+ - spec/model_spec.rb
88
+ - spec/period_spec.rb
89
+ - spec/run_spec.rb
90
+ - spec/sandbox_spec.rb
91
+ homepage: http://github.com/jamiely/simulator
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 1.8.23
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: Use to simulate discrete time models.
115
+ test_files:
116
+ - features/equations.feature
117
+ - features/physics.feature
118
+ - features/savings_simulation.feature
119
+ - features/step_definitions/equations_steps.rb
120
+ - features/step_definitions/savings_simulation_steps.rb
121
+ - spec/beer_spec.rb
122
+ - spec/context_spec.rb
123
+ - spec/equation_spec.rb
124
+ - spec/interest_spec.rb
125
+ - spec/model_spec.rb
126
+ - spec/period_spec.rb
127
+ - spec/run_spec.rb
128
+ - spec/sandbox_spec.rb