netica 0.0.5-java

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/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ log/*
19
+ .rbenv-version
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format specdoc
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in netica.gemspec
4
+ gemspec
5
+
6
+ gem 'rake'
7
+ gem 'rspec'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Disruptive Ventures, Inc.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # Netica
2
+
3
+ The Netica gem provides tools for interacting with Bayesian networks using JRuby and the Netica-J API, published by [Norsys Software Corp.](http://www.norsys.com).
4
+
5
+ ## Installation
6
+
7
+ Download the Netica-J API from Norsys and place the NeticaJ.jar file in your JRuby load path. Possible locations include...
8
+
9
+ /Library/Java/Extensions
10
+ /Network/Library/Java/Extensions
11
+ /System/Library/Java/Extensions
12
+ /usr/lib/java
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'netica'
17
+
18
+ And then execute:
19
+
20
+ $ bundle install
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install netica
25
+
26
+ ## Usage
27
+
28
+ Here's an example, based the Probabilistic Inference example in the Netica-J Manual.
29
+
30
+ Use Netica::Environment.engage to create a Netica Environ singleton object:
31
+
32
+ processor = Netica::Environment.engage
33
+ => true
34
+
35
+ Create an ActiveNetwork, using a `.dne` file created in the Netica Application.
36
+
37
+ my_network = Netica::ActiveNetwork.new("some_identifiying_token", "./examples/ChestClinic.dne")
38
+ => #<Netica::ActiveNetwork:0x58767e95 @network=#<Netica::BayesNetwork:0x4b709592 @current_network=#<Java::NorsysNetica::Net:0x75e82fc2>, @dne_file_path="./examples/ChestClinic.dne">, @token="some_identifiying_token">
39
+
40
+ View the nodes in the network.
41
+
42
+ my_network.network.nodes
43
+ => #<Java::NorsysNetica::NodeList:1738447710 size:8 nodes:["NatureNode:VisitAsia", "NatureNode:Tuberculosis", "NatureNode:Smoking", "NatureNode:Cancer", "NatureNode:TbOrCa", "NatureNode:XRay", "NatureNode:Bronchitis", "NatureNode:Dyspnea"]>
44
+
45
+
46
+ Read the value of a Belief node.
47
+
48
+ tb_node = my_network.network.node("Tuberculosis")
49
+ => #<Java::NorsysNetica::NatureNode:Tuberculosis value:{"present"=>0.010399998165667057, "absent"=>0.9896000027656555}>
50
+
51
+ tb_node.value("present")
52
+ => 0.010399998165667057
53
+
54
+ Set the state of the XRay node to Abnormal.
55
+
56
+ xray_node = my_network.network.node("XRay")
57
+ => #<Java::NorsysNetica::NatureNode:XRay value:{"abnormal"=>0.1102900430560112, "normal"=>0.8897099494934082}>
58
+
59
+ xray_node.value = "abnormal"
60
+ => "abnormal"
61
+
62
+ Then, re-read the value of the Belief node.
63
+
64
+ p tb_node.value("present")
65
+ 0.09241089224815369
66
+ => 0.09241089224815369
67
+
68
+
69
+ ## Contributing
70
+
71
+ 1. Fork it
72
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
73
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
74
+ 4. Push to the branch (`git push origin my-new-feature`)
75
+ 5. Create new Pull Request
76
+
77
+ ## Legal
78
+
79
+ Netica and Norsys are registered trademarks of Norsys Software Corp.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec'
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new do |t|
5
+ t.rspec_opts = %w(--format progress --colour)
6
+ end
@@ -0,0 +1,110 @@
1
+ // ~->[DNET-1]->~
2
+
3
+ // File created by an unlicensed user using Netica 5.04 on 10/01/12 at 20:20:06.
4
+
5
+ bnet ChestClinic {
6
+ autoupdate = FALSE;
7
+
8
+ node VisitAsia {
9
+ kind = NATURE;
10
+ discrete = TRUE;
11
+ chance = CHANCE;
12
+ states = (visit, no_visit);
13
+ statetitles = ("Visited Asia within the last 3 years", );
14
+ parents = ();
15
+ probs =
16
+ // Visited Asia wit no visit
17
+ (0.01, 0.99);
18
+ title = "Visit to Asia";
19
+ };
20
+
21
+ node Tuberculosis {
22
+ kind = NATURE;
23
+ discrete = TRUE;
24
+ chance = CHANCE;
25
+ states = (present, absent);
26
+ parents = (VisitAsia);
27
+ probs =
28
+ // present absent // VisitAsia
29
+ (0.05, 0.95, // Visited Asia wit
30
+ 0.01, 0.99); // no visit ;
31
+ };
32
+
33
+ node Smoking {
34
+ kind = NATURE;
35
+ discrete = TRUE;
36
+ chance = CHANCE;
37
+ states = (smoker, nonsmoker);
38
+ parents = ();
39
+ probs =
40
+ // smoker nonsmoker
41
+ (0.5, 0.5);
42
+ };
43
+
44
+ node Cancer {
45
+ kind = NATURE;
46
+ discrete = TRUE;
47
+ chance = CHANCE;
48
+ states = (present, absent);
49
+ parents = (Smoking);
50
+ probs =
51
+ // present absent // Smoking
52
+ (0.1, 0.9, // smoker
53
+ 0.01, 0.99); // nonsmoker ;
54
+ title = "Lung Cancer";
55
+ };
56
+
57
+ node TbOrCa {
58
+ kind = NATURE;
59
+ discrete = TRUE;
60
+ chance = DETERMIN;
61
+ states = (true, false);
62
+ parents = (Tuberculosis, Cancer);
63
+ functable =
64
+ // Tuberculosis Cancer
65
+ (true, // present present
66
+ true, // present absent
67
+ true, // absent present
68
+ false); // absent absent ;
69
+ equation = "TbOrCa (Tuberculosis, Cancer) = Tuberculosis || Cancer";
70
+ title = "Tuberculosis or Cancer";
71
+ };
72
+
73
+ node XRay {
74
+ kind = NATURE;
75
+ discrete = TRUE;
76
+ chance = CHANCE;
77
+ states = (abnormal, normal);
78
+ parents = (TbOrCa);
79
+ probs =
80
+ // abnormal normal // TbOrCa
81
+ (0.98, 0.02, // true
82
+ 0.05, 0.95); // false ;
83
+ };
84
+
85
+ node Bronchitis {
86
+ kind = NATURE;
87
+ discrete = TRUE;
88
+ chance = CHANCE;
89
+ states = (present, absent);
90
+ parents = (Smoking);
91
+ probs =
92
+ // present absent // Smoking
93
+ (0.6, 0.4, // smoker
94
+ 0.3, 0.7); // nonsmoker ;
95
+ };
96
+
97
+ node Dyspnea {
98
+ kind = NATURE;
99
+ discrete = TRUE;
100
+ chance = CHANCE;
101
+ states = (present, absent);
102
+ parents = (TbOrCa, Bronchitis);
103
+ probs =
104
+ // present absent // TbOrCa Bronchitis
105
+ (0.9, 0.1, // true present
106
+ 0.7, 0.3, // true absent
107
+ 0.8, 0.2, // false present
108
+ 0.1, 0.9); // false absent ;
109
+ };
110
+ };
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env jruby
2
+ require 'netica'
3
+
4
+ # Use Netica::Environment.engage to create a Netica Environ singleton object:
5
+ processor = Netica::Environment.engage
6
+
7
+ # Create an ActiveNetwork, using a `.dne` file created in the Netica Application.
8
+ my_network = Netica::ActiveNetwork.new("some_identifiying_token", "#{File.dirname(__FILE__)}/ChestClinic.dne")
9
+
10
+ # View the nodes in the network.
11
+ p my_network.network.nodes
12
+
13
+ # Read the value of a Belief node.
14
+ tb_node = my_network.network.node("Tuberculosis")
15
+ belief = tb_node.value("present")
16
+ p "The probability of tuberculosis is #{belief}."
17
+
18
+ # Set the state of the XRay node to Abnormal.
19
+ xray_node = my_network.network.node("XRay")
20
+ xray_node.value = "abnormal"
21
+
22
+ # Then, re-read the value of the Belief node.
23
+ belief2 = tb_node.value("present")
24
+ p "Given an abnormal X-ray... The probability of tuberculosis is #{belief2}."
data/lib/netica.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'java'
2
+ require '/lib/NeticaJ.jar'
3
+
4
+ require "netica/version"
5
+ require "netica/environment"
6
+ require "netica/netica_logger"
7
+ require "netica/node"
8
+ require "netica/node_list"
9
+ require "netica/bayes_network"
10
+ require "netica/active_network"
11
+
12
+ module Netica
13
+ include_package "norsys.netica"
14
+ end
@@ -0,0 +1,59 @@
1
+ module Netica
2
+ require 'json'
3
+
4
+ class ActiveNetwork
5
+ attr_accessor :network, :token
6
+
7
+ def initialize(token, filepath = nil)
8
+ Netica::NeticaLogger.info "initializing active network for #{token}"
9
+ self.token = token
10
+ if filepath
11
+ self.network = BayesNetwork.new(filepath)
12
+ end
13
+ processor = Netica::Environment.instance
14
+ processor.active_networks << self
15
+ end
16
+
17
+ def to_s
18
+ token
19
+ end
20
+
21
+ def incr_node(nodeName)
22
+ network.getNode(nodeName).incr() if network
23
+ end
24
+
25
+ def state
26
+ {
27
+ :network => network.state,
28
+ :class => self.class.to_s
29
+ }
30
+ end
31
+
32
+ def save
33
+ if Netica::Environment.instance.redis
34
+ Netica::Environment.instance.redis.set(token, JSON.dump(state))
35
+ end
36
+ end
37
+
38
+ def self.find(token)
39
+ Netica::Environment.instance.active_networks.each do |an|
40
+ return an if an.token == token
41
+ end
42
+ if Netica::Environment.instance.redis
43
+ stored_state = Netica::Environment.instance.redis.get(token)
44
+ if stored_state
45
+ hash = JSON.parse(stored_state)
46
+ active_network = Object.const_get(hash['class']).new(token)
47
+ active_network.load_from_saved_state(hash)
48
+ return active_network
49
+ end
50
+ end
51
+ return nil
52
+ end
53
+
54
+ def load_from_saved_state(hash)
55
+ self.network = BayesNetwork.new(hash["network"]["dne_file_path"])
56
+ network.load_from_state(hash["network"])
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ module Netica
2
+ class BayesNetwork
3
+ attr_accessor :current_network, :dne_file_path
4
+
5
+ def initialize(dne_file_path = nil)
6
+ if dne_file_path
7
+ self.dne_file_path = dne_file_path
8
+ load_dne_file
9
+ end
10
+ end
11
+
12
+ # retrieve a node from the associated network
13
+ # @param String nodeName
14
+ # @return Node
15
+ def node(nodeName)
16
+ nodes.select{ |n| n if n.name == nodeName }[0]
17
+ end
18
+
19
+ def nodes
20
+ current_network.nodes
21
+ end
22
+
23
+ def decision_nodes
24
+ nodes.collect{ |n| n if n.decision_node? }.compact
25
+ end
26
+
27
+ def nature_nodes
28
+ nodes.collect{ |n| n if n.nature_node? }.compact
29
+ end
30
+
31
+ def load_from_state(network_hash)
32
+ NeticaLogger.info "network_hash => #{network_hash}"
33
+ network_hash["decision_nodes"].each do |node_name, node_value|
34
+ getNode(node_name).value = node_value
35
+ end
36
+ end
37
+
38
+ def state
39
+ { :dne_file_path => dne_file_path, :decision_nodes => node_hash(decision_nodes), :nature_nodes => node_hash(nature_nodes) }
40
+ end
41
+
42
+ def node_hash(nodes)
43
+ node_hash = {}
44
+ nodes.collect{|dn| node_hash.store(dn.name, dn.value) }
45
+ node_hash
46
+ end
47
+
48
+ private
49
+
50
+ def load_dne_file
51
+ NeticaLogger.info "Looking for BayesNet .dne file at #{dne_file_path}..."
52
+ streamer = Java::NorsysNetica::Streamer.new(dne_file_path)
53
+ self.current_network = Java::NorsysNetica::Net.new(streamer)
54
+ self.current_network.compile()
55
+ NeticaLogger.info "Initialized BayesNet -- #{self.current_network.object_id}"
56
+ self.decision_nodes.each{ |n| n.value = 0 }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,47 @@
1
+ require 'singleton'
2
+ require 'redis'
3
+
4
+ module Netica
5
+ class Environment
6
+ include Singleton
7
+
8
+ @@active_networks = []
9
+ @@explorations = []
10
+ @@processor = nil
11
+ @@redis = nil
12
+ @@logfile = nil
13
+
14
+ def self.engage(settings = {})
15
+ if settings[:logfile]
16
+ @@logfile = settings[:logfile]
17
+ else
18
+ @@logfile = "#{File.dirname(__FILE__)}/../../log/netica.log"
19
+ end
20
+ if settings[:license_key]
21
+ @@processor = Java::NorsysNetica::Environ.new(settings[:license_key])
22
+ else
23
+ @@processor = Java::NorsysNetica::Environ.new(nil)
24
+ end
25
+ if settings[:redis]
26
+ @@redis = Redis.new(settings[:redis])
27
+ end
28
+ NeticaLogger.info "Initializing the Netica Environment #{@@processor.object_id}"
29
+ end
30
+
31
+ def processor
32
+ @@processor
33
+ end
34
+
35
+ def active_networks
36
+ @@active_networks
37
+ end
38
+
39
+ def redis
40
+ @@redis
41
+ end
42
+
43
+ def logfile_path
44
+ @@logfile
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,18 @@
1
+ module Netica
2
+ class NeticaLogger
3
+ require 'logger'
4
+ require 'date'
5
+
6
+ def self.info(message=nil)
7
+ self.logfile.info(message) unless message.nil?
8
+ end
9
+
10
+ def self.debug(message=nil)
11
+ self.logfile.debug(message) unless message.nil?
12
+ end
13
+
14
+ def self.logfile
15
+ @@my_log ||= Logger.new(File.open(Netica::Environment.instance.logfile_path, File::WRONLY | File::APPEND))
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,104 @@
1
+ class Java::NorsysNetica::Node
2
+ attr_accessor :value
3
+
4
+ # from https://github.com/SixArm/sixarm_ruby_netica
5
+ NODE_KINDS = {
6
+ Java::NorsysNetica::Node::NATURE_NODE => :nature,
7
+ Java::NorsysNetica::Node::DECISION_NODE => :decision,
8
+ Java::NorsysNetica::Node::UTILITY_NODE => :utility,
9
+ Java::NorsysNetica::Node::CONSTANT_NODE => :constant,
10
+ Java::NorsysNetica::Node::DISCONNECTED_NODE => :disconnected,
11
+ }
12
+
13
+ NODE_TYPES = {
14
+ Java::NorsysNetica::Node::DISCRETE_TYPE => :nature,
15
+ Java::NorsysNetica::Node::CONTINUOUS_TYPE => :decision,
16
+ }
17
+
18
+ def name
19
+ getName
20
+ end
21
+
22
+ def kind
23
+ NODE_KINDS[getKind]
24
+ end
25
+
26
+ def type
27
+ NODE_TYPES[getType]
28
+ end
29
+
30
+ def decision_node?
31
+ type == :decision
32
+ end
33
+
34
+ def nature_node?
35
+ type == :nature
36
+ end
37
+
38
+ def beliefs
39
+ states.collect{ |st| getBelief(st.to_s) }
40
+ end
41
+
42
+ def hint
43
+ user().getString("Hint")
44
+ end
45
+
46
+ def top_parent_node
47
+ getParents().sort_by_belief()[0]
48
+ end
49
+
50
+ def value(state_name = nil)
51
+ if decision_node?
52
+ finding().getReal()
53
+ elsif state_name
54
+ states.collect{ |st| return getBelief(st.to_s) if state_name == st.to_s }
55
+ else
56
+ state_values = {}
57
+ states.collect{ |st| state_values.store(st.to_s, getBelief(st.to_s)) }
58
+ state_values
59
+ end
60
+ end
61
+
62
+ def value=(new_value)
63
+ Netica::NeticaLogger.info "Setting #{self.name} to #{new_value}"
64
+ if decision_node?
65
+ finding().setReal(new_value)
66
+ elsif nature_node?
67
+ finding.enterState(new_value)
68
+ end
69
+ end
70
+
71
+ def incr
72
+ if decision_node?
73
+ self.value = value + 1
74
+ end
75
+ end
76
+
77
+ def to_s
78
+ if type == kind
79
+ prefix = type.capitalize
80
+ else
81
+ prefix = "#{type.capitalize}#{kind.capitalize}"
82
+ end
83
+
84
+ "#{prefix}Node:#{name}"
85
+ end
86
+
87
+ def inspect
88
+ "#<Java::NorsysNetica::#{self.to_s} value:#{value}>"
89
+ end
90
+
91
+ def states
92
+ (0...getNumStates()).map{|i| state(i) }
93
+ end
94
+
95
+ def free
96
+ begin
97
+ NeticaLogger.info "Deleting #{self.to_s}"
98
+ finalize()
99
+ delete()
100
+ states.each{|s| s==nil or s.free() }
101
+ rescue Java::NorsysNetica::NeticaException
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,26 @@
1
+ class Java::NorsysNetica::NodeList
2
+ def sort_by_belief
3
+ nodes.sort{|a,b| b.beliefs <=> a.beliefs }
4
+ end
5
+
6
+ def nodes
7
+ (0...size).map{|i| getNode(i) }
8
+ end
9
+
10
+ def to_s
11
+ "NodeList:#{object_id}"
12
+ end
13
+
14
+ def inspect
15
+ "#<Java::NorsysNetica::NodeList:#{object_id} size:#{size} nodes:#{nodes.collect{|n| n.to_s }}>"
16
+ end
17
+
18
+ def free
19
+ begin
20
+ NeticaLogger.info "Deleting #{self.to_s}"
21
+ finalize()
22
+ nodes.each{|n| n==nil or n.free() }
23
+ rescue Java::NorsysNetica::NeticaException
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ class Java::NorsysNetica::State
2
+ def to_s
3
+ "#{getName}"
4
+ end
5
+
6
+ def inspect
7
+ "#{getName}"
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Netica
2
+ VERSION = "0.0.5"
3
+ end
data/netica.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'netica/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "netica"
8
+ gem.version = Netica::VERSION
9
+ gem.authors = ["Jerry Richardson"]
10
+ gem.email = ["jerry@jerryr.com"]
11
+ gem.description = "Netica Bayes Network Management"
12
+ gem.summary = "Tools to manage Bayes Networks with the NeticaJ API"
13
+ gem.homepage = "http://disruptive.github.io/netica/"
14
+ gem.license = "MIT"
15
+ gem.platform = "java"
16
+
17
+ gem.files = `git ls-files`.split($/)
18
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
+ gem.require_paths = ["lib"]
21
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Netica::ActiveNetwork do
4
+ describe "#new" do
5
+ before(:all) do
6
+ Netica::Environment.engage
7
+ end
8
+ after(:all) do
9
+ Netica::Environment.instance.processor.finalize
10
+ end
11
+
12
+ context "with ChestClinic.dne" do
13
+ before(:all) do
14
+ @active_network = Netica::ActiveNetwork.new("fake_token_identifier", "#{File.dirname(__FILE__)}/../../examples/ChestClinic.dne")
15
+ end
16
+
17
+ it "should be an active network" do
18
+ @active_network.should be_an_instance_of(Netica::ActiveNetwork)
19
+ end
20
+
21
+ it "should have 8 nodes" do
22
+ @active_network.network.nodes.length.should == 8
23
+ end
24
+
25
+ it "should export it state as a hash" do
26
+ @active_network.network.state.should be_an_instance_of(Hash)
27
+ end
28
+
29
+ context "the tuberculosis node" do
30
+ it "should be less than 0.02 initially" do
31
+ @active_network.network.node("Tuberculosis").value("present").should be_less_than 0.011
32
+ end
33
+
34
+ it "should be over 0.90 with an abnormal xray" do
35
+ @active_network.network.node("XRay").value = "abnormal"
36
+ @active_network.network.node("Tuberculosis").value("present").should be_greater_than 0.092
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Netica::Environment do
4
+ describe "#engage" do
5
+ it 'should create a Netica environment' do
6
+ Netica::Environment.engage.should be_true
7
+ Netica::Environment.instance.processor.finalize
8
+ end
9
+
10
+ it 'should create a logfile' do
11
+ Netica::Environment.engage
12
+ Netica::NeticaLogger.info "Test logfile entry"
13
+ Netica::Environment.instance.processor.finalize
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Netica do
4
+ it 'should have a version number' do
5
+ Netica::VERSION.should_not be_nil
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'netica'
3
+
4
+ RSpec.configure do |config|
5
+ config.color_enabled = true
6
+ config.formatter = 'progress'
7
+ end
8
+
9
+ RSpec::Matchers.define :be_less_than do |expected|
10
+ match do |actual|
11
+ actual<expected
12
+ end
13
+ end
14
+
15
+ RSpec::Matchers.define :be_greater_than do |expected|
16
+ match do |actual|
17
+ actual>expected
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: netica
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ prerelease:
6
+ platform: java
7
+ authors:
8
+ - Jerry Richardson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-14 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Netica Bayes Network Management
15
+ email:
16
+ - jerry@jerryr.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".gitignore"
22
+ - ".rspec"
23
+ - Gemfile
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - examples/ChestClinic.dne
28
+ - examples/chest_clinic.rb
29
+ - lib/netica.rb
30
+ - lib/netica/active_network.rb
31
+ - lib/netica/bayes_network.rb
32
+ - lib/netica/environment.rb
33
+ - lib/netica/netica_logger.rb
34
+ - lib/netica/node.rb
35
+ - lib/netica/node_list.rb
36
+ - lib/netica/state.rb
37
+ - lib/netica/version.rb
38
+ - netica.gemspec
39
+ - spec/netica/active_network_spec.rb
40
+ - spec/netica/environment_spec.rb
41
+ - spec/netica_spec.rb
42
+ - spec/spec_helper.rb
43
+ homepage: http://disruptive.github.io/netica/
44
+ licenses:
45
+ - MIT
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: !binary |-
55
+ MA==
56
+ none: false
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: !binary |-
62
+ MA==
63
+ none: false
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 1.8.24
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Tools to manage Bayes Networks with the NeticaJ API
70
+ test_files:
71
+ - spec/netica/active_network_spec.rb
72
+ - spec/netica/environment_spec.rb
73
+ - spec/netica_spec.rb
74
+ - spec/spec_helper.rb
75
+ has_rdoc: