biopsy 0.1.0.alpha → 0.1.1.alpha
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 +24 -1
- data/lib/biopsy/base_extensions.rb +2 -5
- data/lib/biopsy/experiment.rb +58 -21
- data/lib/biopsy/objective_handler.rb +21 -50
- data/lib/biopsy/optimisers/parameter_sweeper.rb +14 -1
- data/lib/biopsy/optimisers/tabu_search.rb +32 -4
- data/lib/biopsy/settings.rb +4 -23
- data/lib/biopsy/target.rb +71 -56
- data/lib/biopsy/version.rb +1 -1
- data/lib/biopsy.rb +0 -1
- data/test/helper.rb +35 -58
- data/test/test_experiment.rb +14 -27
- data/test/test_objective_handler.rb +10 -13
- data/test/test_settings.rb +2 -11
- data/test/test_target.rb +29 -18
- metadata +32 -52
- data/lib/biopsy/domain.rb +0 -156
- data/test/test_domain.rb +0 -61
data/lib/biopsy/domain.rb
DELETED
@@ -1,156 +0,0 @@
|
|
1
|
-
# todo: ensure testing accounts for situation where there are multiple
|
2
|
-
# input or output files defined in the spec
|
3
|
-
module Biopsy
|
4
|
-
|
5
|
-
class DomainLoadError < Exception
|
6
|
-
end
|
7
|
-
|
8
|
-
class Domain
|
9
|
-
|
10
|
-
attr_reader :name
|
11
|
-
attr_reader :input_filetypes
|
12
|
-
attr_reader :output_filetypes
|
13
|
-
attr_reader :objectives
|
14
|
-
attr_reader :keep_intermediates
|
15
|
-
attr_reader :gzip_intermediates
|
16
|
-
|
17
|
-
require 'yaml'
|
18
|
-
require 'pp'
|
19
|
-
|
20
|
-
# Return a new Domain object containing the specification of the
|
21
|
-
# currently active domain.
|
22
|
-
def initialize domain=nil
|
23
|
-
@name = domain.nil? ? self.get_current_domain : domain
|
24
|
-
|
25
|
-
@keep_intermediates = false
|
26
|
-
@gzip_intermediates = false
|
27
|
-
self.load_by_name @name
|
28
|
-
end
|
29
|
-
|
30
|
-
# Return the name of the currently active domain.
|
31
|
-
def get_current_domain
|
32
|
-
Settings.instance.domain
|
33
|
-
rescue
|
34
|
-
raise "You must specify the domain to use in the biopsy settings file or at the command line."
|
35
|
-
end
|
36
|
-
|
37
|
-
# Return the path to the YAML definition file for domain with +:name+.
|
38
|
-
# All +:domain_dirs+ in Settings are searched and the first matching
|
39
|
-
# file is returned.
|
40
|
-
def locate_definition name
|
41
|
-
Settings.instance.locate_config :domain_dir, name
|
42
|
-
end
|
43
|
-
|
44
|
-
# Check and apply the settings in +:config+ (Hash).
|
45
|
-
def apply_config config
|
46
|
-
[:input_filetypes, :output_filetypes, :objectives].each do |key|
|
47
|
-
raise DomainLoadError.new("Domain definition is missing the required key #{key}") unless config.has_key? key
|
48
|
-
self.instance_variable_set('@' + key.to_s, config[key])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Load and apply the domain definition with +:name+
|
53
|
-
def load_by_name name
|
54
|
-
path = self.locate_definition name
|
55
|
-
raise DomainLoadError.new("Domain definition file does not exist for #{name}") if path.nil?
|
56
|
-
config = YAML::load_file(path)
|
57
|
-
raise DomainLoadError.new("Domain definition file #{path} is not valid YAML") if config.nil?
|
58
|
-
self.apply_config config.deep_symbolize
|
59
|
-
end
|
60
|
-
|
61
|
-
# Validate a Target, returning true if the target meets
|
62
|
-
# the specification of this Domain, and false otherwise.
|
63
|
-
# +:target+, the Target object to validate.
|
64
|
-
def target_valid? target
|
65
|
-
l = []
|
66
|
-
@input_filetypes.each do |input|
|
67
|
-
l << [target[:input_files], input]
|
68
|
-
end
|
69
|
-
@output_filetypes.each do |output|
|
70
|
-
l << [target[:output_files], output]
|
71
|
-
end
|
72
|
-
errors = []
|
73
|
-
l.each do |pair|
|
74
|
-
testcase, definition = pair
|
75
|
-
errors += self.validate_target_filetypes(testcase, definition)
|
76
|
-
end
|
77
|
-
errors
|
78
|
-
end
|
79
|
-
|
80
|
-
# Returns an empty array if +:testcase+ conforms to definition,
|
81
|
-
# otherwise returns an array of strings describing the
|
82
|
-
# errors found.
|
83
|
-
def validate_target_filetypes testcase, definition
|
84
|
-
errors = []
|
85
|
-
# check extensions
|
86
|
-
testcase.each_pair do |key, f|
|
87
|
-
ext = File.extname(f)
|
88
|
-
unless definition[:allowed_extensions].include? ext
|
89
|
-
errors << %Q{input file #{f} doesn't match any of the filetypes
|
90
|
-
allowed for this domain}
|
91
|
-
end
|
92
|
-
end
|
93
|
-
# check number of files
|
94
|
-
in_count = testcase.size
|
95
|
-
if definition.has_key? :n
|
96
|
-
unless in_count == definition[:n]
|
97
|
-
errors << %Q{the number of input files (#{in_count}) doesn't
|
98
|
-
match the domain specification (#{definition[:n]})}
|
99
|
-
end
|
100
|
-
end
|
101
|
-
if definition.has_key? :min
|
102
|
-
unless in_count >= definition[:min]
|
103
|
-
errors << %Q{the number of input files (#{in_count}) is lower
|
104
|
-
than the minimum for this domain (#{definition[:n]})}
|
105
|
-
end
|
106
|
-
end
|
107
|
-
if definition.has_key? :max
|
108
|
-
unless in_count >= definition[:max]
|
109
|
-
errors << %Q{the number of input files (#{in_count}) is greater
|
110
|
-
than the maximum for this domain (#{definition[:n]})}
|
111
|
-
end
|
112
|
-
end
|
113
|
-
errors
|
114
|
-
end
|
115
|
-
|
116
|
-
# Write out a template Domain definition to +:filename+
|
117
|
-
def write_template filename
|
118
|
-
data = {
|
119
|
-
:input_filetypes => [
|
120
|
-
{
|
121
|
-
:min => 1,
|
122
|
-
:max => 2,
|
123
|
-
:allowed_extensions => [
|
124
|
-
'txt',
|
125
|
-
'csv',
|
126
|
-
'tsv'
|
127
|
-
]
|
128
|
-
},
|
129
|
-
{
|
130
|
-
:n => 2,
|
131
|
-
:allowed_extensions => [
|
132
|
-
'png'
|
133
|
-
]
|
134
|
-
}
|
135
|
-
],
|
136
|
-
:output_filetypes => [
|
137
|
-
{
|
138
|
-
:n => 1,
|
139
|
-
:allowed_extensions => [
|
140
|
-
'pdf',
|
141
|
-
'xls'
|
142
|
-
]
|
143
|
-
}
|
144
|
-
],
|
145
|
-
:objectives => [
|
146
|
-
'objective1', 'objective2'
|
147
|
-
]
|
148
|
-
}
|
149
|
-
::File.open(filename, 'w') do |f|
|
150
|
-
f.puts data.to_yaml
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
end # end of class Domain
|
155
|
-
|
156
|
-
end # end of module Biopsy
|
data/test/test_domain.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestDomain < Test::Unit::TestCase
|
4
|
-
|
5
|
-
require 'fileutils'
|
6
|
-
|
7
|
-
context "Domain" do
|
8
|
-
|
9
|
-
setup do
|
10
|
-
@h = Helper.new
|
11
|
-
@h.setup_tmp_dir
|
12
|
-
|
13
|
-
# we need a domain
|
14
|
-
@h.setup_domain
|
15
|
-
domain_name = @h.create_valid_domain
|
16
|
-
@domain = Biopsy::Domain.new domain_name
|
17
|
-
end
|
18
|
-
|
19
|
-
teardown do
|
20
|
-
@h.cleanup
|
21
|
-
end
|
22
|
-
|
23
|
-
should "be able to find the current domain" do
|
24
|
-
assert_equal 'test_domain', @domain.get_current_domain
|
25
|
-
end
|
26
|
-
|
27
|
-
should "be able to find a definition" do
|
28
|
-
assert_equal @h.domain_path, @domain.locate_definition('test_domain')
|
29
|
-
end
|
30
|
-
|
31
|
-
should "fail to find a non-existent definition" do
|
32
|
-
assert_equal nil, @domain.locate_definition('fake_filename')
|
33
|
-
end
|
34
|
-
|
35
|
-
should "reject any invalid config" do
|
36
|
-
# generate all trivial invalid configs
|
37
|
-
@h.domain_data.keys.each do |key|
|
38
|
-
d = @h.domain_data.clone
|
39
|
-
d.delete key
|
40
|
-
filepath = File.join(@h.domain_dir, 'broken_thing.yml')
|
41
|
-
File.open(filepath, 'w') do |f|
|
42
|
-
f.puts d.to_yaml
|
43
|
-
end
|
44
|
-
|
45
|
-
assert_raise Biopsy::DomainLoadError do
|
46
|
-
@domain.load_by_name 'broken_thing'
|
47
|
-
end
|
48
|
-
|
49
|
-
File.delete filepath if File.exists? filepath
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
should "write a template that can be loaded as a valid definition" do
|
54
|
-
@domain.write_template File.join(@h.domain_dir, 'template.yml')
|
55
|
-
@domain.load_by_name 'template'
|
56
|
-
assert_equal ['objective1', 'objective2'], @domain.objectives
|
57
|
-
end
|
58
|
-
|
59
|
-
end # Domain context
|
60
|
-
|
61
|
-
end # TestDomain
|