summaryrefslogtreecommitdiff
path: root/test/test_examples_util.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_examples_util.rb')
-rwxr-xr-x[-rw-r--r--]test/test_examples_util.rb231
1 files changed, 189 insertions, 42 deletions
diff --git a/test/test_examples_util.rb b/test/test_examples_util.rb
index 09f7d6c..a5f2867 100644..100755
--- a/test/test_examples_util.rb
+++ b/test/test_examples_util.rb
@@ -4,21 +4,46 @@ module ValidationExamples
class Util
@@dataset_uris = {}
+ @@prediction_features = {}
- def self.upload_dataset(file, dataset_service=@@config[:services]["opentox-dataset"], file_type="application/x-yaml")
+ def self.upload_dataset(file, subjectid=nil, dataset_service=CONFIG[:services]["opentox-dataset"]) #, file_type="application/x-yaml")
raise "File not found: "+file.path.to_s unless File.exist?(file.path)
if @@dataset_uris[file.path.to_s]==nil
- data = File.read(file.path)
- data_uri = OpenTox::RestClientWrapper.post(dataset_service,{:content_type => file_type},data).to_s.chomp
- @@dataset_uris[file.path.to_s] = data_uri
- LOGGER.debug "uploaded dataset: "+data_uri
+ LOGGER.debug "uploading file: "+file.path.to_s
+ if (file.path =~ /yaml$/)
+ data = File.read(file.path)
+ #data_uri = OpenTox::RestClientWrapper.post(dataset_service,{:content_type => file_type},data).to_s.chomp
+ #@@dataset_uris[file.path.to_s] = data_uri
+ #LOGGER.debug "uploaded dataset: "+data_uri
+ d = OpenTox::Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid)
+ d.load_yaml(data)
+ d.save( subjectid )
+ @@dataset_uris[file.path.to_s] = d.uri
+ elsif (file.path =~ /csv$/)
+ d = OpenTox::Dataset.create_from_csv_file(file.path, subjectid)
+ raise "num features not 1 (="+d.features.keys.size.to_s+"), what to predict??" if d.features.keys.size != 1
+ @@prediction_features[file.path.to_s] = d.features.keys[0]
+ @@dataset_uris[file.path.to_s] = d.uri
+ elsif (file.path =~ /rdf$/)
+ d = OpenTox::Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid)
+ d.load_rdfxml_file(file, subjectid)
+ d.save(subjectid)
+ @@dataset_uris[file.path.to_s] = d.uri
+ else
+ raise "unknown file type: "+file.path.to_s
+ end
+ LOGGER.debug "uploaded dataset: "+d.uri
else
LOGGER.debug "file already uploaded: "+@@dataset_uris[file.path.to_s]
end
return @@dataset_uris[file.path.to_s]
end
- def self.build_compare_report(validation_examples)
+ def self.prediction_feature_for_file(file)
+ @@prediction_features[file.path.to_s]
+ end
+
+ def self.build_compare_report(validation_examples, subjectid)
@comp = validation_examples[0].algorithm_uri==nil ? :model_uri : :algorithm_uri
return nil if @comp == :model_uri
@@ -27,39 +52,55 @@ module ValidationExamples
to_compare << v.validation_uri if v.validation_uri and v.validation_error==nil
end
return nil if to_compare.size < 2
- begin
- return validation_post "report/algorithm_comparison",{ :validation_uris => to_compare.join("\n") }
- rescue => ex
- return "error creating comparison report "+ex.message
- end
+ #begin
+ return validation_post "report/algorithm_comparison",{ :validation_uris => to_compare.join("\n") }, subjectid
+ #rescue => ex
+ #return "error creating comparison report "+ex.message
+ #end
end
- def self.validation_post(uri, params)
+ def self.validation_post(uri, params, subjectid, waiting_task=nil )
+
+ params[:subjectid] = subjectid if subjectid
if $test_case
- #puts "posting: "+uri+","+params.inspect
- $test_case.post uri,params
+ $test_case.post uri,params
return wait($test_case.last_response.body)
else
- return OpenTox::RestClientWrapper.post(File.join(@@config[:services]["opentox-validation"],uri),params)
+ return OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],uri),params,nil,waiting_task).to_s
end
end
- def self.validation_get(uri, accept_header='application/rdf+xml')
+ def self.validation_get(uri, subjectid, accept_header='application/rdf+xml')
+ params = {}
+ params[:subjectid] = subjectid if subjectid
if $test_case
#puts "getting "+uri+","+accept_header
- $test_case.get uri,nil,'HTTP_ACCEPT' => accept_header
+ $test_case.get uri,params,'HTTP_ACCEPT' => accept_header
+ return wait($test_case.last_response.body)
+ else
+ params[:accept] = accept_header
+ return OpenTox::RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"],uri),params)
+ end
+ end
+
+ def self.validation_delete(uri, accept_header='application/rdf+xml')
+
+ if $test_case
+ $test_case.delete uri,{:subjectid => SUBJECTID},'HTTP_ACCEPT' => accept_header
return wait($test_case.last_response.body)
else
- return OpenTox::RestClientWrapper.get(File.join(@@config[:services]["opentox-validation"],uri),{:accept => accept_header})
+ return OpenTox::RestClientWrapper.delete(File.join(CONFIG[:services]["opentox-validation"],uri),{:accept => accept_header,:subjectid => SUBJECTID})
end
end
+
def self.wait(uri)
- if OpenTox::Utils.task_uri?(uri)
- task = OpenTox::Task.find(uri)
+ if uri.task_uri?
+ task = OpenTox::Task.find(uri.to_s.chomp)
task.wait_for_completion
- raise "task failed: "+uri.to_s+", error is:\n"+task.description if task.error?
- uri = task.resultURI
+ #raise "task failed: "+uri.to_s+", description: '"+task.description.to_s+"'" if task.error?
+ LOGGER.error "task failed :\n"+task.to_yaml if task.error?
+ uri = task.result_uri
end
uri
end
@@ -67,14 +108,14 @@ module ValidationExamples
def self.verify_crossvalidation(val_yaml)
val = YAML.load(val_yaml)
- puts val.inspect
+ #puts val.inspect
assert_integer val["random_seed".to_sym],nil,nil,"random_seed"
assert_boolean val["stratified".to_sym],"stratified"
assert_integer val["num_folds".to_sym],0,1000,"num_folds"
num_folds = val["num_folds".to_sym].to_i
- validations = val["validations".to_sym]
+ validations = val["validation_uris".to_sym]
assert_int_equal(num_folds, validations.size, "num_folds != validations.size")
end
@@ -82,7 +123,7 @@ module ValidationExamples
val = YAML.load(val_yaml)
- puts val.inspect
+ #puts val.inspect
assert_integer val["num_instances".to_sym],0,1000,"num_instances"
num_instances = val["num_instances".to_sym].to_i
@@ -103,7 +144,7 @@ module ValidationExamples
class_value_stats.each do |cvs|
class_values << cvs["class_value".to_sym]
end
- puts class_values.inspect
+ #puts class_values.inspect
confusion_matrix = class_stats["confusion_matrix".to_sym]
confusion_matrix_cells = confusion_matrix["confusion_matrix_cell".to_sym]
@@ -118,12 +159,40 @@ module ValidationExamples
end
end
+ def self.compare_yaml_and_owl(hash, owl, nested_params=[] )
+
+ hash.each do |k,v|
+ p = nested_params + [ k.to_s.to_rdf_format ]
+ if (v.is_a?(Hash))
+ compare_yaml_and_owl( v, owl, p )
+ elsif (v.is_a?(Array))
+ v.each do |vv|
+ compare_yaml_and_owl( vv, owl, p )
+ end
+ else
+ owl_value = owl.get_nested( p )
+ if owl_value.size == 0
+ raise "owl_value is nil, yaml value is '"+v.to_s+"'" unless v==nil or v.to_s.size==0
+ elsif owl_value.size == 1
+ assert_equal(v, owl_value[0], p.join(".")+" (yaml != rdf)")
+ else
+ raise p.join(".")+" yaml value '"+v.to_s+"' not included in rdf values '"+
+ owl_value.inspect+"'" unless owl_value.include?(v)
+ end
+ end
+ end
+ end
+
private
def self.assert_not_nil(val,msg_suffix=nil)
raise msg_suffix.to_s+" is nil" if val==nil
end
def self.assert_int_equal(val1,val2,msg_suffix=nil)
+ assert_equal(val1, val2, msg_suffix)
+ end
+
+ def self.assert_equal(val1,val2,msg_suffix=nil)
raise msg_suffix.to_s+" not equal: "+val1.to_s+" != "+val2.to_s unless val1==val2
end
@@ -168,13 +237,14 @@ module ValidationExamples
:split_ratio,
:random_seed,
:num_folds,
- :stratified
+ :stratified,
+ :subjectid
#results
attr_accessor :validation_uri,
:report_uri,
:validation_error,
:report_error
-
+
def upload_files
[[:test_dataset_uri, :test_dataset_file],
[:test_target_dataset_uri, :test_target_dataset_file],
@@ -183,9 +253,16 @@ module ValidationExamples
uri = a[0]
file = a[1]
if send(uri)==nil and send(file)!=nil
- send("#{uri.to_s}=".to_sym, Util.upload_dataset(send(file)))
+ dataset_uri = Util.upload_dataset(send(file), @subjectid)
+ send("#{uri.to_s}=".to_sym, dataset_uri)
+ @uploaded_datasets = [] unless @uploaded_datasets
+ @uploaded_datasets << dataset_uri
end
end
+
+ if (params.include?(:prediction_feature) and @prediction_feature==nil and @dataset_uri and @dataset_file)
+ @prediction_feature = Util.prediction_feature_for_file(@dataset_file)
+ end
end
def check_requirements
@@ -194,30 +271,78 @@ module ValidationExamples
end
end
- def report
- begin
- @report_uri = Util.validation_post '/report/'+report_type,{:validation_uris => @validation_uri}
- rescue => ex
- @report_error = ex.message
+ def delete
+ #begin
+ if @validation_uri =~ /crossvalidation/
+ cv = "crossvalidation/"
+ else
+ cv = ""
+ end
+ Util.validation_delete '/'+cv+@validation_uri.split('/')[-1] if @validation_uri
+ #rescue => ex
+ #puts "Could not delete validation: "+ex.message
+ #end
+ #begin
+ Util.validation_delete '/report/'+report_type+'/'+@report_uri.split('/')[-1] if @report_uri
+ #rescue => ex
+ #puts "Could not delete report:' "+@report_uri+" "+ex.message
+ #end
+ @uploaded_datasets.each do |d|
+ # begin
+ puts "deleting dataset "+d
+ OpenTox::RestClientWrapper.delete(d,{:subjectid => SUBJECTID})
+# rescue => ex
+ #puts "Could not delete dataset:' "+d+" "+ex.message
+ #end
end
end
- def validate
- begin
- @validation_uri = Util.validation_post '/'+validation_type, get_params
- rescue => ex
- @validation_error = ex.message
- LOGGER.error ex.message
+ def report( waiting_task=nil )
+ #begin
+ @report_uri = Util.validation_post '/report/'+report_type,{:validation_uris => @validation_uri},@subjectid,waiting_task if @validation_uri
+ Util.validation_get "/report/"+report_uri.split("/")[-2]+"/"+report_uri.split("/")[-1], @subjectid if @report_uri
+ #rescue => ex
+ #puts "could not create report: "+ex.message
+ #raise ex
+ #@report_error = ex.message
+ #end
+ end
+
+ def validate( waiting_task=nil )
+ #begin
+ @validation_uri = Util.validation_post '/'+validation_type, get_params, @subjectid, waiting_task
+ #rescue => ex
+ #puts "could not validate: "+ex.message
+ #@validation_error = ex.message
+ #LOGGER.error ex.message
+ #end
+ end
+
+ def compare_yaml_vs_rdf
+ if @validation_uri
+ yaml = YAML.load(Util.validation_get(@validation_uri.split("/")[-1],@subjectid,'application/x-yaml'))
+ owl = OpenTox::Owl.from_data(Util.validation_get(@validation_uri.split("/")[-1],@subjectid),@validation_uri,"Validation")
+ Util.compare_yaml_and_owl(yaml,owl)
+ end
+ if @report_uri
+ yaml = YAML.load(Util.validation_get(@report_uri.split("/")[-3..-1].join("/"),@subjectid,'application/x-yaml'))
+ owl = OpenTox::Owl.from_data(Util.validation_get(@report_uri.split("/")[-3..-1].join("/"),@subjectid),@report_uri,"ValidationReport")
+ Util.compare_yaml_and_owl(yaml,owl)
+ Util.validation_get(@report_uri.split("/")[-3..-1].join("/"),@subjectid,'text/html')
+ else
+ puts "no report"
end
end
+
def verify_yaml
+ raise "cannot very validation, validation_uri is null" unless @validation_uri
if @validation_uri =~ /crossvalidation/
Util.verify_crossvalidation(Util.validation_get("crossvalidation/"+@validation_uri.split("/")[-1],'application/x-yaml'))
Util.validation_get("crossvalidation/"+@validation_uri.split("/")[-1]+"/statistics",'application/x-yaml')
Util.verify_validation(Util.validation_get("crossvalidation/"+@validation_uri.split("/")[-1]+"/statistics",'application/x-yaml'))
else
- Util.verify_validation(Util.validation_get(@validation_uri.split("/")[-1],'application/x-yaml'))
+ Util.verify_validation(Util.validation_get(@validation_uri.split("/")[-1],@subjectid,'application/x-yaml'))
end
end
@@ -252,6 +377,10 @@ module ValidationExamples
def opt_params
[ :prediction_feature, :test_target_dataset_uri ]
end
+
+ def validation_type
+ "test_set_validation"
+ end
end
class TrainingTestValidation < ValidationExample
@@ -262,6 +391,10 @@ module ValidationExamples
def opt_params
[ :algorithm_params, :test_target_dataset_uri ]
end
+
+ def validation_type
+ "training_test_validation"
+ end
end
class SplitTestValidation < ValidationExample
@@ -278,6 +411,20 @@ module ValidationExamples
end
end
+ class BootstrappingValidation < ValidationExample
+ def params
+ [:algorithm_uri, :dataset_uri, :prediction_feature]
+ end
+
+ def opt_params
+ [ :algorithm_params, :random_seed ]
+ end
+
+ def validation_type
+ "bootstrapping"
+ end
+ end
+
class CrossValidation < ValidationExample
def params
[:algorithm_uri, :dataset_uri, :prediction_feature]
@@ -295,4 +442,4 @@ module ValidationExamples
"crossvalidation"
end
end
-end \ No newline at end of file
+end