fathom 0.2.2 → 0.2.3

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,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ include Fathom::Distributions
4
+
5
+ class DemoEnforcedNameNode < Node
6
+ include EnforcedName
7
+ end
8
+
9
+ describe EnforcedName do
10
+
11
+ it "should ensure that we have a name as a UID if one is not provided" do
12
+ n = DemoEnforcedNameNode.new
13
+ n.name.should_not be_nil
14
+ end
15
+ end
@@ -17,7 +17,7 @@ describe MonteCarloSet do
17
17
  end
18
18
 
19
19
  @fields = [:commissions_paid, :gross_margins, :revenue]
20
- @summary_fields = [:coefficient_of_variation, :max, :mean, :min, :sd]
20
+ @summary_fields = [:coefficient_of_variation, :lower_bound, :max, :mean, :min, :sd, :upper_bound]
21
21
  end
22
22
 
23
23
  before do
@@ -90,6 +90,17 @@ describe MonteCarloSet do
90
90
  @mcs.process(2)
91
91
  @mcs.revenue_summary.should eql(@mcs.summary(:revenue))
92
92
  end
93
+
94
+ it "should allow the model to be able to produce non-array values" do
95
+ margin_description = ValueDescription.new(@q1_sales) do |s|
96
+ {
97
+ :description => {:first_quarter_sales => s.first_quarter_sales, :first_quarter_prices => s.first_quarter_prices}
98
+ }
99
+ end
100
+ mcs = MonteCarloSet.new(margin_description)
101
+ lambda{mcs.process(2)}.should_not raise_error
102
+ lambda{mcs.summary}.should_not raise_error
103
+ end
93
104
  end
94
105
 
95
106
  def sort_array_of_symbols(array)
@@ -0,0 +1,129 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ include Fathom
4
+
5
+ describe Node do
6
+ it "should take an options hash to instantiate" do
7
+ lambda{Node.new(:any_value => true)}.should_not raise_error
8
+ end
9
+
10
+ it "should take an optional name parameter" do
11
+ node = Node.new(:name => "My Name")
12
+ node.name.should eql("My Name")
13
+ end
14
+
15
+ it "should take an optional distribution parameter" do
16
+ node = Node.new(:distribution => Fathom::Distributions::Gaussian)
17
+ node.distribution.should eql(Fathom::Distributions::Gaussian)
18
+ end
19
+
20
+ it "should default to the standard distribution" do
21
+ node = Node.new
22
+ node.distribution.should eql(Fathom::Distributions::Gaussian)
23
+ end
24
+
25
+ it "should be able to take a symbol and find the appropriate distribution" do
26
+ node = Node.new(:distribution => :gaussian)
27
+ node.distribution.should eql(Fathom::Distributions::Gaussian)
28
+ end
29
+
30
+ it "should take an optional description" do
31
+ node = Node.new(:description => "some description")
32
+ node.description.should eql('some description')
33
+ end
34
+
35
+ it "should take an optional values parameter" do
36
+ node = Node.new(:values => [1,2,3])
37
+ node.values.should eql([1,2,3])
38
+ end
39
+
40
+ it "should provide name_sym, if a name is defined" do
41
+ node = Node.new(:name => "Some name")
42
+ node.name_sym.should eql(:some_name)
43
+ end
44
+
45
+ it "should change dashes to underscores for name_sym" do
46
+ node = Node.new(:name => "Some-name")
47
+ node.name_sym.should eql(:some_name)
48
+ end
49
+
50
+ it "should take an optional parents list" do
51
+ n1 = Node.new
52
+ n2 = Node.new(:parents => [n1])
53
+ n2.parents.should eql([n1])
54
+ end
55
+
56
+ it "should allow a single node as a parent or parents and turn it into an array" do
57
+ n1 = Node.new
58
+ n2 = Node.new(:parents => n1)
59
+ n2.parents.should eql([n1])
60
+ n2 = Node.new(:parent => n1)
61
+ n2.parents.should eql([n1])
62
+ end
63
+
64
+ it "should create an empty list of parents by default" do
65
+ n1 = Node.new
66
+ n1.parents.should eql([])
67
+ end
68
+
69
+ it "should be able to add a parent" do
70
+ n1, n2 = Node.new, Node.new
71
+ n3 = Node.new(:parent => n2)
72
+ n3.add_parent(n1)
73
+ n3.parents.should eql([n2, n1])
74
+ end
75
+
76
+ it "should register the receiving node when adding a parent" do
77
+ n1 = Node.new
78
+ n1.should_receive(:register_child).and_return(true)
79
+ n2 = Node.new(:parent => n1)
80
+
81
+ n1 = Node.new
82
+ n1.should_receive(:register_child).and_return(true)
83
+ n2 = Node.new
84
+ n2.add_parent(n1)
85
+ end
86
+
87
+ it "should not allow a parent to be registered if it is not a child of the other node" do
88
+ n1 = Node.new
89
+ n2 = Node.new
90
+ lambda{n2.register_parent(n1)}.should raise_error
91
+ end
92
+
93
+ it "should take an optional children list" do
94
+ n1 = Node.new
95
+ n2 = Node.new(:children => [n1])
96
+ n2.children.should eql([n1])
97
+ end
98
+
99
+ it "should allow a single node as a child or children and turn it into an array" do
100
+ n1 = Node.new
101
+ n2 = Node.new(:children => n1)
102
+ n2.children.should eql([n1])
103
+ n2 = Node.new(:child => n1)
104
+ n2.children.should eql([n1])
105
+ end
106
+
107
+ it "should create an empty list of children by default" do
108
+ n1 = Node.new
109
+ n1.children.should eql([])
110
+ end
111
+
112
+ it "should register the receiving node when adding a child" do
113
+ n1 = Node.new
114
+ n1.should_receive(:register_parent).and_return(true)
115
+ n2 = Node.new(:child => n1)
116
+
117
+ n1 = Node.new
118
+ n1.should_receive(:register_parent).and_return(true)
119
+ n2 = Node.new
120
+ n2.add_child(n1)
121
+ end
122
+
123
+ it "should not allow a child to be registered if it is not a parent of the other node" do
124
+ n1 = Node.new
125
+ n2 = Node.new
126
+ lambda{n2.register_child(n1)}.should raise_error
127
+ end
128
+
129
+ end
@@ -0,0 +1,82 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ include Fathom
4
+
5
+ describe NumericMethods do
6
+
7
+ before(:all) do
8
+ @values = [1,2,3]
9
+ @vector = GSL::Vector.ary_to_gv(@values)
10
+ @opts = {:values => @values}
11
+ end
12
+
13
+ before do
14
+ @n = DummyNumericNode.new(@opts)
15
+ end
16
+
17
+ it "should respond to a rand method" do
18
+ @n = DummyNumericNode.new
19
+ @n.should be_respond_to(:rand)
20
+ end
21
+
22
+ it "should be able to construct a vector from the values" do
23
+ @n.vector.should ==(@vector)
24
+ end
25
+
26
+ it "should have a standard deviation if it has a vector" do
27
+ @n.standard_deviation.should eql(@vector.sd)
28
+ end
29
+
30
+ it "should have std and sd aliases for standard deviation" do
31
+ @n.sd.should eql(@n.standard_deviation)
32
+ @n.std.should eql(@n.standard_deviation)
33
+ end
34
+
35
+ it "should not raise an error when looking for a standard deviation and there is no vector" do
36
+ @n = DummyNumericNode.new
37
+ @n.vector.should be_nil
38
+ @n.sd.should be_nil
39
+ end
40
+
41
+ it "should have a mean if it has a vector" do
42
+ @n.mean.should eql(@vector.mean)
43
+ end
44
+
45
+ it "should return nil for mean if it doesn't have a vector" do
46
+ @n = DummyNumericNode.new
47
+ @n.mean.should be_nil
48
+ end
49
+
50
+ it "should provide rand, if it has a vector" do
51
+ Gaussian.should_receive(:rand).and_return(0.5)
52
+ @n.rand
53
+ end
54
+
55
+ it "should return nil for rand if it doesn't have a vector" do
56
+ @n = DummyNumericNode.new
57
+ @n.mean.should be_nil
58
+ end
59
+
60
+ it "should be able to calculate the inverse_cdf, lower_bound, upper_bound and interval_values" do
61
+ lambda{@n.inverse_cdf}.should_not raise_error
62
+ lambda{@n.lower_bound}.should_not raise_error
63
+ lambda{@n.upper_bound}.should_not raise_error
64
+ lambda{@n.interval_values}.should_not raise_error
65
+ end
66
+
67
+ it "should pass the mean and standard deviation to the distribution when calculating an inverse_cdf" do
68
+ @n.inverse_cdf.should eql(Gaussian.inverse_cdf(:mean => @n.mean, :sd => @n.sd))
69
+ end
70
+
71
+ it "should pass the mean and standard deviation to the distribution when calculating an lower_bound" do
72
+ @n.lower_bound.should eql(Gaussian.lower_bound(:mean => @n.mean, :sd => @n.sd))
73
+ end
74
+
75
+ it "should pass the mean and standard deviation to the distribution when calculating an upper_bound" do
76
+ @n.upper_bound.should eql(Gaussian.upper_bound(:mean => @n.mean, :sd => @n.sd))
77
+ end
78
+
79
+ it "should pass the mean and standard deviation to the distribution when calculating an interval_values" do
80
+ @n.interval_values.should eql(Gaussian.interval_values(:mean => @n.mean, :sd => @n.sd))
81
+ end
82
+ end
@@ -67,9 +67,8 @@ describe PlausibleRange do
67
67
  @pr.midpoint.should eql(5.5)
68
68
  end
69
69
 
70
- # TODO: Make this more accurate when we start using the GSL stuff more
71
70
  it "should be able to calculate the standard deviation" do
72
- @pr.standard_deviation.should be_close(2.73556231003039, 0.00000001)
71
+ @pr.standard_deviation.should be_close( 2.7358, 0.0001)
73
72
  end
74
73
 
75
74
  it "should be able to use std instead of standard_deviation" do
@@ -0,0 +1,8 @@
1
+ module Fathom
2
+ module Distributions
3
+ class DummyNumericNode < Node
4
+ include NumericMethods
5
+ end
6
+ end
7
+ end
8
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fathom
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 2
10
- version: 0.2.2
9
+ - 3
10
+ version: 0.2.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - David
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-09 00:00:00 -07:00
18
+ date: 2010-11-10 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -51,6 +51,7 @@ files:
51
51
  - LICENSE
52
52
  - README.md
53
53
  - Rakefile
54
+ - TODO.md
54
55
  - VERSION
55
56
  - autotest/discover.rb
56
57
  - lib/fathom.rb
@@ -63,21 +64,27 @@ files:
63
64
  - lib/fathom/archive/node.rb
64
65
  - lib/fathom/archive/noodle.rb
65
66
  - lib/fathom/archive/scratch.rb
66
- - lib/fathom/basic_node.rb
67
67
  - lib/fathom/causal_graph.rb
68
- - lib/fathom/combined_plausibilities.rb
69
68
  - lib/fathom/concept.rb
70
69
  - lib/fathom/data_node.rb
70
+ - lib/fathom/distributions.rb
71
+ - lib/fathom/distributions/discrete_gaussian.rb
72
+ - lib/fathom/distributions/discrete_uniform.rb
73
+ - lib/fathom/distributions/gaussian.rb
74
+ - lib/fathom/distributions/uniform.rb
75
+ - lib/fathom/enforced_name.rb
71
76
  - lib/fathom/ext/array.rb
72
77
  - lib/fathom/ext/faster_csv.rb
73
78
  - lib/fathom/ext/open_struct.rb
79
+ - lib/fathom/ext/string.rb
74
80
  - lib/fathom/import.rb
75
81
  - lib/fathom/import/csv_import.rb
76
82
  - lib/fathom/import/yaml_import.rb
77
83
  - lib/fathom/inverter.rb
78
84
  - lib/fathom/knowledge_base.rb
79
85
  - lib/fathom/monte_carlo_set.rb
80
- - lib/fathom/node_utilities.rb
86
+ - lib/fathom/node.rb
87
+ - lib/fathom/numeric_methods.rb
81
88
  - lib/fathom/plausible_range.rb
82
89
  - lib/fathom/simulation.rb
83
90
  - lib/fathom/simulation/tick_methods.rb
@@ -89,11 +96,18 @@ files:
89
96
  - spec/fathom/agent/agent_cluster_spec.rb
90
97
  - spec/fathom/agent_spec.rb
91
98
  - spec/fathom/data_node_spec.rb
99
+ - spec/fathom/distributions/discrete_gaussian_spec.rb
100
+ - spec/fathom/distributions/discrete_uniform_spec.rb
101
+ - spec/fathom/distributions/gaussian_spec.rb
102
+ - spec/fathom/distributions/uniform_spec.rb
103
+ - spec/fathom/enforced_name_spec.rb
92
104
  - spec/fathom/import/csv_import_spec.rb
93
105
  - spec/fathom/import/yaml_import_spec.rb
94
106
  - spec/fathom/import_spec.rb
95
107
  - spec/fathom/knowledge_base_spec.rb
96
108
  - spec/fathom/monte_carlo_set_spec.rb
109
+ - spec/fathom/node_spec.rb
110
+ - spec/fathom/numeric_methods_spec.rb
97
111
  - spec/fathom/plausible_range_spec.rb
98
112
  - spec/fathom/simulation/tick_simulation_spec.rb
99
113
  - spec/fathom/simulation_spec.rb
@@ -102,6 +116,7 @@ files:
102
116
  - spec/spec_helper.rb
103
117
  - spec/support/demo.yml
104
118
  - spec/support/demo_agent.rb
119
+ - spec/support/dummy_numeric_node.rb
105
120
  has_rdoc: true
106
121
  homepage: http://github.com/davidrichards/fathom
107
122
  licenses: []
@@ -140,11 +155,18 @@ test_files:
140
155
  - spec/fathom/agent/agent_cluster_spec.rb
141
156
  - spec/fathom/agent_spec.rb
142
157
  - spec/fathom/data_node_spec.rb
158
+ - spec/fathom/distributions/discrete_gaussian_spec.rb
159
+ - spec/fathom/distributions/discrete_uniform_spec.rb
160
+ - spec/fathom/distributions/gaussian_spec.rb
161
+ - spec/fathom/distributions/uniform_spec.rb
162
+ - spec/fathom/enforced_name_spec.rb
143
163
  - spec/fathom/import/csv_import_spec.rb
144
164
  - spec/fathom/import/yaml_import_spec.rb
145
165
  - spec/fathom/import_spec.rb
146
166
  - spec/fathom/knowledge_base_spec.rb
147
167
  - spec/fathom/monte_carlo_set_spec.rb
168
+ - spec/fathom/node_spec.rb
169
+ - spec/fathom/numeric_methods_spec.rb
148
170
  - spec/fathom/plausible_range_spec.rb
149
171
  - spec/fathom/simulation/tick_simulation_spec.rb
150
172
  - spec/fathom/simulation_spec.rb
@@ -152,3 +174,4 @@ test_files:
152
174
  - spec/fathom_spec.rb
153
175
  - spec/spec_helper.rb
154
176
  - spec/support/demo_agent.rb
177
+ - spec/support/dummy_numeric_node.rb
@@ -1,12 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'fathom'))
2
- module Fathom
3
- class CombinedPlausibilities
4
-
5
- end
6
- end
7
-
8
- if __FILE__ == $0
9
- include Fathom
10
- # TODO: Is there anything you want to do to run this file on its own?
11
- # CombinedPlausibilities.new
12
- end
@@ -1,8 +0,0 @@
1
- module Fathom
2
- module NodeUtilities
3
- def name_sym
4
- return nil unless self.name
5
- @name_sym ||= self.name.to_s.downcase.gsub(/\s+/, '_').to_sym
6
- end
7
- end
8
- end