fathom 0.3.7 → 0.5.0
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.
- data/.autotest +7 -5
- data/.document +2 -2
- data/Gemfile +9 -10
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.md +29 -90
- data/Rakefile +34 -32
- data/VERSION +1 -1
- data/fathom.gemspec +105 -0
- data/features/fathom.feature +26 -0
- data/features/step_definitions/fathom_steps.rb +23 -0
- data/features/support/env.rb +13 -0
- data/lib/ext/array.rb +6 -2
- data/lib/ext/string.rb +86 -7
- data/lib/fathom.rb +51 -88
- data/lib/fathom/behaviors/attribute_system.rb +91 -0
- data/lib/fathom/behaviors/context_behavior.rb +28 -0
- data/lib/fathom/behaviors/plugins.rb +16 -0
- data/lib/fathom/contexts/network_population.rb +47 -0
- data/lib/fathom/contexts/network_traversal.rb +4 -0
- data/lib/fathom/data/adjacency_matrix.rb +27 -0
- data/lib/fathom/data/definition.rb +22 -0
- data/lib/fathom/data/edge.rb +58 -0
- data/lib/fathom/data/network.rb +35 -0
- data/lib/fathom/data/outcome.rb +30 -0
- data/lib/fathom/data/property.rb +31 -0
- data/lib/fathom/data/variable.rb +59 -0
- data/lib/fathom/roles/general_graph_tools.rb +87 -0
- data/lib/fathom/roles/network_builder.rb +61 -0
- data/spec/fathom/behaviors/attribute_system_spec.rb +141 -0
- data/spec/fathom/behaviors/context_behavior_spec.rb +15 -0
- data/spec/fathom/behaviors/plugins_spec.rb +80 -0
- data/spec/fathom/contexts/network_population_spec.rb +55 -0
- data/spec/fathom/contexts/network_traversal_spec.rb +11 -0
- data/spec/fathom/data/adjacency_matrix_spec.rb +42 -0
- data/spec/fathom/data/definition_spec.rb +19 -0
- data/spec/fathom/data/edge_spec.rb +77 -0
- data/spec/fathom/data/network_spec.rb +72 -0
- data/spec/fathom/data/outcome_spec.rb +17 -0
- data/spec/fathom/data/property_spec.rb +17 -0
- data/spec/fathom/data/variable_spec.rb +101 -0
- data/spec/fathom/ext/array_spec.rb +17 -0
- data/spec/fathom/ext/string_spec.rb +90 -0
- data/spec/fathom/roles/general_graph_tools_spec.rb +95 -0
- data/spec/fathom/roles/network_builder_spec.rb +90 -0
- data/spec/fathom_spec.rb +28 -49
- data/spec/spec_helper.rb +7 -11
- data/spec/support/context_behavior.rb +14 -0
- data/spec/support/custom_matchers.rb +12 -0
- data/spec/support/files.rb +8 -0
- data/spec/support/network.yml +42 -0
- metadata +133 -174
- data/.bundle/config +0 -2
- data/.gitignore +0 -6
- data/Gemfile.lock +0 -42
- data/TODO.md +0 -127
- data/autotest/discover.rb +0 -1
- data/lib/ext/faster_csv.rb +0 -1
- data/lib/ext/open_struct.rb +0 -17
- data/lib/fathom/agent.rb +0 -48
- data/lib/fathom/agent/agent_cluster.rb +0 -23
- data/lib/fathom/agent/properties.rb +0 -48
- data/lib/fathom/archive/causal_graph.rb +0 -12
- data/lib/fathom/archive/concept.rb +0 -83
- data/lib/fathom/archive/conditional_probability_matrix.rb +0 -119
- data/lib/fathom/archive/inverter.rb +0 -20
- data/lib/fathom/archive/n2.rb +0 -198
- data/lib/fathom/archive/n3.rb +0 -119
- data/lib/fathom/archive/node.rb +0 -97
- data/lib/fathom/archive/noodle.rb +0 -136
- data/lib/fathom/archive/scratch.rb +0 -45
- data/lib/fathom/distributions.rb +0 -8
- data/lib/fathom/distributions/discrete_gaussian.rb +0 -44
- data/lib/fathom/distributions/discrete_uniform.rb +0 -25
- data/lib/fathom/distributions/gaussian.rb +0 -46
- data/lib/fathom/distributions/uniform.rb +0 -35
- data/lib/fathom/import.rb +0 -85
- data/lib/fathom/import/csv_import.rb +0 -59
- data/lib/fathom/import/import_node.rb +0 -17
- data/lib/fathom/import/yaml_import.rb +0 -74
- data/lib/fathom/knowledge_base.rb +0 -46
- data/lib/fathom/knowledge_base/search.rb +0 -19
- data/lib/fathom/monte_carlo_set.rb +0 -152
- data/lib/fathom/node.rb +0 -139
- data/lib/fathom/node/belief_node.rb +0 -121
- data/lib/fathom/node/cpm_node.rb +0 -100
- data/lib/fathom/node/data_collection.rb +0 -97
- data/lib/fathom/node/data_node.rb +0 -22
- data/lib/fathom/node/decision.rb +0 -11
- data/lib/fathom/node/discrete_node.rb +0 -41
- data/lib/fathom/node/fact.rb +0 -24
- data/lib/fathom/node/mc_node.rb +0 -70
- data/lib/fathom/node/node_extensions/enforced_name.rb +0 -12
- data/lib/fathom/node/node_extensions/numeric_methods.rb +0 -68
- data/lib/fathom/node/plausible_range.rb +0 -98
- data/lib/fathom/simulation.rb +0 -59
- data/lib/fathom/simulation/tick_methods.rb +0 -25
- data/lib/fathom/simulation/tick_simulation.rb +0 -12
- data/lib/fathom/value_description.rb +0 -79
- data/lib/options_hash.rb +0 -186
- data/spec/ext/array_spec.rb +0 -10
- data/spec/ext/faster_csv_spec.rb +0 -10
- data/spec/ext/open_struct_spec.rb +0 -20
- data/spec/ext/string_spec.rb +0 -7
- data/spec/fathom/agent/agent_cluster_spec.rb +0 -17
- data/spec/fathom/agent_spec.rb +0 -51
- data/spec/fathom/distributions/discrete_gaussian_spec.rb +0 -64
- data/spec/fathom/distributions/discrete_uniform_spec.rb +0 -0
- data/spec/fathom/distributions/gaussian_spec.rb +0 -64
- data/spec/fathom/distributions/uniform_spec.rb +0 -0
- data/spec/fathom/import/csv_import_spec.rb +0 -52
- data/spec/fathom/import/import_node_spec.rb +0 -10
- data/spec/fathom/import/yaml_import_spec.rb +0 -73
- data/spec/fathom/import_spec.rb +0 -36
- data/spec/fathom/knowledge_base_spec.rb +0 -20
- data/spec/fathom/monte_carlo_set_spec.rb +0 -149
- data/spec/fathom/node/belief_node_spec.rb +0 -180
- data/spec/fathom/node/cpm_node_spec.rb +0 -144
- data/spec/fathom/node/data_collection_spec.rb +0 -26
- data/spec/fathom/node/data_node_spec.rb +0 -102
- data/spec/fathom/node/decision_spec.rb +0 -15
- data/spec/fathom/node/discrete_node_spec.rb +0 -56
- data/spec/fathom/node/fact_spec.rb +0 -33
- data/spec/fathom/node/mc_node_spec.rb +0 -66
- data/spec/fathom/node/node_extensions/enforced_name_spec.rb +0 -15
- data/spec/fathom/node/node_extensions/numeric_methods_spec.rb +0 -124
- data/spec/fathom/node/plausible_range_spec.rb +0 -151
- data/spec/fathom/node_spec.rb +0 -172
- data/spec/fathom/simulation/tick_simulation_spec.rb +0 -32
- data/spec/fathom/simulation_spec.rb +0 -24
- data/spec/fathom/value_description_spec.rb +0 -70
- data/spec/support/demo.yml +0 -17
- data/spec/support/demo_agent.rb +0 -8
- data/spec/support/dummy_numeric_node.rb +0 -8
- data/spec/support/fact.yml +0 -11
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
|
2
|
-
|
|
3
|
-
include Fathom::Distributions
|
|
4
|
-
|
|
5
|
-
class DemoEnforcedNameNode < Fathom::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
|
|
@@ -1,124 +0,0 @@
|
|
|
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 = Distributions::DummyNumericNode.new(@opts)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "should respond to a rand method" do
|
|
18
|
-
@n = Distributions::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 = Distributions::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 = Distributions::DummyNumericNode.new
|
|
47
|
-
@n.mean.should be_nil
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should provide rand, if it has a vector" do
|
|
51
|
-
Distributions::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 = Distributions::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(Distributions::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(Distributions::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(Distributions::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(Distributions::Gaussian.interval_values(:mean => @n.mean, :sd => @n.sd))
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "should have a coefficient_of_variation" do
|
|
84
|
-
@n.coefficient_of_variation.should eql(@n.sd / @n.mean)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
it "should have a cov alias for coefficient_of_variation" do
|
|
88
|
-
@n.cov.should eql(@n.coefficient_of_variation)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "should have a summary hash" do
|
|
92
|
-
@n.should be_respond_to(:summary)
|
|
93
|
-
@n.summary.should be_a(Hash)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should have a mean in the summary" do
|
|
97
|
-
@n.summary[:mean].should eql(@n.mean)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "should have a standard deviation in the summary" do
|
|
101
|
-
@n.summary[:standard_deviation].should eql(@n.standard_deviation)
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "should have a min in the summary" do
|
|
105
|
-
@n.summary[:min].should eql(@n.vector.min)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it "should have a max in the summary" do
|
|
109
|
-
@n.summary[:max].should eql(@n.vector.max)
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "should have a lower_bound in the summary" do
|
|
113
|
-
@n.summary[:lower_bound].should eql(@n.lower_bound)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "should have an upper_bound in the summary" do
|
|
117
|
-
@n.summary[:upper_bound].should eql(@n.upper_bound)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it "should have a coefficient_of_variation in the summary" do
|
|
121
|
-
@n.summary[:coefficient_of_variation].should eql(@n.sd / @n.mean)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
end
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
|
-
|
|
3
|
-
include Fathom
|
|
4
|
-
|
|
5
|
-
describe PlausibleRange do
|
|
6
|
-
|
|
7
|
-
before do
|
|
8
|
-
@d = {:upper_bound => 10, :lower_bound => 1}
|
|
9
|
-
@pr = PlausibleRange.new(@d)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "should require an upper and lower bound" do
|
|
13
|
-
lambda{PlausibleRange.new}.should raise_error(/upper/)
|
|
14
|
-
lambda{PlausibleRange.new(:upper_bound => 10)}.should raise_error(/lower/)
|
|
15
|
-
lambda{PlausibleRange.new(:upper_bound => 10, :lower_bound => 1)}.should_not raise_error
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "should expose the upper bound and lower bound" do
|
|
19
|
-
@pr.upper_bound.should eql(10)
|
|
20
|
-
@pr.lower_bound.should eql(1)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "should use min or max instead of lower_bound or upper_bound" do
|
|
24
|
-
pr = PlausibleRange.new(:min => 1, :max => 10)
|
|
25
|
-
pr.min.should eql(1)
|
|
26
|
-
pr.max.should eql(10)
|
|
27
|
-
pr.lower_bound.should eql(1)
|
|
28
|
-
pr.upper_bound.should eql(10)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "should allow an optional hard_lower_bound" do
|
|
32
|
-
pr = PlausibleRange.new(@d.merge(:hard_lower_bound => 0))
|
|
33
|
-
pr.hard_lower_bound.should eql(0)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "should set the lower_bound to the hard_lower_bound if the hard_lower_bound is greater than the lower_bound" do
|
|
37
|
-
pr = PlausibleRange.new(:lower_bound => 2, :hard_lower_bound => 3, :upper_bound => 4)
|
|
38
|
-
pr.lower_bound.should eql(3)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "should allow an optional hard_upper_bound" do
|
|
42
|
-
pr = PlausibleRange.new(@d.merge(:hard_upper_bound => 20))
|
|
43
|
-
pr.hard_upper_bound.should eql(20)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it "should set the upper_bound to the hard_upper_bound if the hard_upper_bound is less than the upper_bound" do
|
|
47
|
-
pr = PlausibleRange.new(:lower_bound => 2, :hard_upper_bound => 3, :upper_bound => 4)
|
|
48
|
-
pr.upper_bound.should eql(3)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "should have a default confidence interval of 90%" do
|
|
52
|
-
@pr.confidence_interval.should eql(0.9)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "should be able to instantiate with confidence_interval" do
|
|
56
|
-
pr = PlausibleRange.new(@d.merge(:confidence_interval => 0.8))
|
|
57
|
-
pr.confidence_interval.should eql(0.8)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
it "should be able to use ci instead of confidence_interval" do
|
|
61
|
-
pr = PlausibleRange.new(@d.merge(:ci => 0.8))
|
|
62
|
-
pr.ci.should eql(0.8)
|
|
63
|
-
pr.confidence_interval.should eql(0.8)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "should be able to calculate the midpoint" do
|
|
67
|
-
@pr.midpoint.should eql(5.5)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "should be able to calculate the standard deviation" do
|
|
71
|
-
@pr.standard_deviation.should be_within(0.0001).of( 2.7358)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "should be able to use std instead of standard_deviation" do
|
|
75
|
-
@pr.std.should eql(@pr.standard_deviation)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
it "should be able to produce a random value from within the distribution" do
|
|
79
|
-
@pr.should be_respond_to(:rand)
|
|
80
|
-
@pr.rand.should be_a(Float)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "should be able to produce an array of random values" do
|
|
84
|
-
@pr.array_of_random_values.should be_an(Array)
|
|
85
|
-
@pr.array_of_random_values.length.should eql(10)
|
|
86
|
-
@pr.array_of_random_values(13).length.should eql(13)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "should alias array_of_random_values with to_a" do
|
|
90
|
-
@pr.to_a.should be_an(Array)
|
|
91
|
-
@pr.to_a.length.should eql(10)
|
|
92
|
-
@pr.to_a(13).length.should eql(13)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it "should be able to produce a vector of random values" do
|
|
96
|
-
@pr.vector_of_random_values.should be_a(GSL::Vector)
|
|
97
|
-
@pr.vector_of_random_values.length.should eql(10)
|
|
98
|
-
@pr.vector_of_random_values(12).length.should eql(12)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it "should alias vector_of_random_values with to_v" do
|
|
102
|
-
@pr.to_v.should be_a(GSL::Vector)
|
|
103
|
-
@pr.to_v.length.should eql(10)
|
|
104
|
-
@pr.to_v(12).length.should eql(12)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "should record the name, if one is provided" do
|
|
108
|
-
pr = PlausibleRange.new(@d.merge(:name => 'pr1'))
|
|
109
|
-
pr.name.should eql('pr1')
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it "should record the description, if one is provided" do
|
|
113
|
-
pr = PlausibleRange.new(@d.merge(:description => 'some description'))
|
|
114
|
-
pr.description.should eql('some description')
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "should have no problems with a range with matching lower and upper bounds" do
|
|
118
|
-
pr = PlausibleRange.new(:min => 1, :max => 1)
|
|
119
|
-
pr.rand.should eql(1.0)
|
|
120
|
-
pr.midpoint.should eql(1.0)
|
|
121
|
-
pr.std.should eql(0.0)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "should have a name_sym method" do
|
|
125
|
-
pr = PlausibleRange.new(:min => 1, :max => 2, :name => "Demo Node")
|
|
126
|
-
pr.name_sym.should eql(:demo_node)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
it "should not exceed the lower bound if it is set", :slow => true do
|
|
130
|
-
pr = PlausibleRange.new(:max => 100, :hard_lower_bound => 0)
|
|
131
|
-
1_000.times do
|
|
132
|
-
(pr.rand >= 0).should eql(true)
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should not exceed the upper bound if it is set", :slow => true do
|
|
137
|
-
pr = PlausibleRange.new(:min => 0, :hard_upper_bound => 100)
|
|
138
|
-
1_000.times do
|
|
139
|
-
(pr.rand <= 100).should eql(true)
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "should not exceed the lower bound or upper bound if both are set", :slow => true do
|
|
144
|
-
pr = PlausibleRange.new(:hard_upper_bound => 100, :hard_lower_bound => 0)
|
|
145
|
-
1_000.times do
|
|
146
|
-
r = pr.rand
|
|
147
|
-
(r >= 0 and r <= 100).should eql(true)
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
end
|
data/spec/fathom/node_spec.rb
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
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
|
-
it "should define an accessor method for the child node when added" do
|
|
130
|
-
n1 = Node.new(:name => 'n1')
|
|
131
|
-
n2 = Node.new :name => 'n2', :child => n1
|
|
132
|
-
n2.n1.should eql(n1)
|
|
133
|
-
n1.should_not respond_to(:n1)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should define an accessor method for the parent node when added" do
|
|
137
|
-
n1 = Node.new(:name => 'n1')
|
|
138
|
-
n2 = Node.new :parent => n1
|
|
139
|
-
n2.n1.should eql(n1)
|
|
140
|
-
n1.should_not respond_to(:n1)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "should have defined an accessor method for the added child to the parent" do
|
|
144
|
-
n1 = Node.new(:name => 'n1')
|
|
145
|
-
n2 = Node.new :name => 'n2', :child => n1
|
|
146
|
-
n1.n2.should eql(n2)
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
it "should have defined an accessor method for the added parent to the child" do
|
|
150
|
-
n1 = Node.new(:name => 'n1')
|
|
151
|
-
n2 = Node.new :name => 'n2', :parent => n1
|
|
152
|
-
n1.n2.should eql(n2)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
# it "should have introduced the Spira infrastructure by now" do
|
|
156
|
-
# Object.should be_const_defined(:Spira)
|
|
157
|
-
# end
|
|
158
|
-
|
|
159
|
-
# it "should have defined the spira repository" do
|
|
160
|
-
# Spira.repositories[:default].should be_a(RDF::Repository)
|
|
161
|
-
# end
|
|
162
|
-
|
|
163
|
-
# This really changes the interface for everything. So, either I re-purpose a node, or something...
|
|
164
|
-
# Next steps: read the Spira source and figure out what's easier to do: replace the functionality
|
|
165
|
-
# or change my interfaces. (btw, 9 issues, only.
|
|
166
|
-
# Mostly just tied to creating the node accessors (n1.n2 type thing))
|
|
167
|
-
|
|
168
|
-
# it "should have Spira included" do
|
|
169
|
-
# Node.included_modules.should be_include(Spira::Resource)
|
|
170
|
-
# end
|
|
171
|
-
|
|
172
|
-
end
|