summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--EXAMPLES4
-rw-r--r--application.rb12
-rw-r--r--reach_reports/reach_application.rb4
-rw-r--r--reach_reports/reach_test.rb5
-rw-r--r--report/report_application.rb79
-rw-r--r--report/report_factory.rb3
-rw-r--r--report/report_format.rb1
-rw-r--r--report/report_persistance.rb2
-rw-r--r--report/report_service.rb4
-rw-r--r--report/report_test.rb2
-rw-r--r--validation/validation_application.rb407
-rw-r--r--validation/validation_test.rb12
12 files changed, 349 insertions, 186 deletions
diff --git a/EXAMPLES b/EXAMPLES
index 3653ed5..8af2316 100644
--- a/EXAMPLES
+++ b/EXAMPLES
@@ -40,7 +40,7 @@ validate model on test-dateset
>>> curl -X POST -d model_uri="<model_uri>" \
-d test_dataset_uri="<test_dataset_uri>" \
-d test_target_dataset_uri="<dataset_uri>" \
- <validation_service>
+ <validation_service>/test_set_validation
optional params:
test_target_dataset_uri, default is test_dataset_uri
@@ -61,7 +61,7 @@ validate an algorithm on a training- and test-dataset
-d test_target_dataset_uri="<dataset_uri>" \
-d prediction_feature="<prediction_feature>" \
-d algorithm_params="<algorithm_params>" \
- <validation_service>
+ <validation_service>/training_test_validation
optional params:
algorithm_params, default is empty
diff --git a/application.rb b/application.rb
index 5e875c1..2cdbe32 100644
--- a/application.rb
+++ b/application.rb
@@ -1,5 +1,5 @@
require 'rubygems'
-gem 'opentox-ruby-api-wrapper', '= 1.6.2'
+gem 'opentox-ruby-api-wrapper', '= 1.6.2.1'
[ 'sinatra', 'sinatra/url_for', 'opentox-ruby-api-wrapper' ].each do |lib|
require lib
end
@@ -13,8 +13,14 @@ require "example.rb"
get '/examples/?' do
LOGGER.info "list examples"
- content_type "text/plain"
- Example.transform_example
+
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ content_type "text/html"
+ OpenTox.text_to_html Example.transform_example
+ else
+ content_type "text/plain"
+ Example.transform_example
+ end
end
get '/prepare_examples/?' do
diff --git a/reach_reports/reach_application.rb b/reach_reports/reach_application.rb
index 4afaf51..e63c2a4 100644
--- a/reach_reports/reach_application.rb
+++ b/reach_reports/reach_application.rb
@@ -34,9 +34,9 @@ post '/reach_report/:type' do
result_uri = ReachReports.create_report(type,params,request.env["rack.input"])
if OpenTox::Utils.task_uri?(result_uri)
- halt 202,result_uri
+ halt 202,result_uri+"\n"
else
- result_uri
+ result_uri+"\n"
end
end
diff --git a/reach_reports/reach_test.rb b/reach_reports/reach_test.rb
index 2f07302..44f37ff 100644
--- a/reach_reports/reach_test.rb
+++ b/reach_reports/reach_test.rb
@@ -114,13 +114,16 @@ class ReachTest < Test::Unit::TestCase
# post "/reach_report/qmrf/8"
# puts last_response.body
+ #model_uri = "http://ambit.uni-plovdiv.bg:8080/ambit2/model/173393"
model_uri = "http://localhost/model/1"
#model_uri = "http://localhost/majority/regr/model/12"
- #model_uri = "http://localhost/majority/class/model/1"
+ # model_uri = "http://localhost/majority/class/model/91"
#model_uri = "http://apps.ideaconsult.net:8080/ambit2/model/2"
post '/reach_report/qmrf',:model_uri=>model_uri #http://localhost/model/1"
##post '/reach_report/qprf',:compound_uri=>"http://localhost/compound/XYZ"
uri = last_response.body
+ puts "task: "+uri.to_s
+ uri = Lib::TestUtil.wait_for_task(uri)
id = uri.split("/")[-1]
puts uri
diff --git a/report/report_application.rb b/report/report_application.rb
index 5c8c1c8..95913cd 100644
--- a/report/report_application.rb
+++ b/report/report_application.rb
@@ -43,15 +43,38 @@ end
get '/report/?' do
perform do |rs|
- content_type "text/uri-list"
- rs.get_report_types
+ case request.env['HTTP_ACCEPT'].to_s
+ when /text\/html/
+ related_links =
+ "All validations: "+$sinatra.url_for("/",:full)
+ description =
+ "A list of all report types."
+ content_type "text/html"
+ OpenTox.text_to_html rs.get_report_types,related_links,description
+ else
+ content_type "text/uri-list"
+ rs.get_report_types
+ end
end
end
get '/report/:report_type' do
perform do |rs|
- content_type "text/uri-list"
- rs.get_all_reports(params[:report_type], params)
+ case request.env['HTTP_ACCEPT'].to_s
+ when /text\/html/
+ related_links =
+ "Available report types: "+$sinatra.url_for("/report",:full)+"\n"+
+ "Single validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Crossvalidations: "+$sinatra.url_for("/crossvalidation",:full)
+ description =
+ "A list of all "+params[:report_type]+" reports. To create a report, use the POST method."
+ post_params = [[:validation_uris]]
+ content_type "text/html"
+ OpenTox.text_to_html rs.get_all_reports(params[:report_type], params),related_links,description,post_params
+ else
+ content_type "text/uri-list"
+ rs.get_all_reports(params[:report_type], params)
+ end
end
end
@@ -60,7 +83,7 @@ post '/report/:type/:id/format_html' do
perform do |rs|
rs.get_report(params[:type],params[:id],"text/html",true,params)
content_type "text/uri-list"
- rs.get_uri(params[:type],params[:id])
+ rs.get_uri(params[:type],params[:id])+"\n"
end
end
@@ -70,27 +93,14 @@ get '/report/:type/:id' do
perform do |rs|
accept_header = request.env['HTTP_ACCEPT']
- if accept_header =~ /MSIE/
- LOGGER.info "Changing MSIE accept-header to text/html"
- accept_header = "text/html"
- end
- #request.env['HTTP_ACCEPT'] = "application/pdf"
-
- #QMRF-STUB
- if params[:type] == Reports::ReportFactory::RT_QMRF
- #raise Reports::BadRequest.new("only 'application/qmrf-xml' provided so far") if accept_header != "application/qmrf-xml"
- content_type "application/qmrf-xml"
- result = body(OpenTox::RestClientWrapper.get("http://ecb.jrc.ec.europa.eu/qsar/qsar-tools/qrf/QMRF_v1.2_FishTox.xml"))
+ report = rs.get_report(params[:type],params[:id],accept_header)
+ format = Reports::ReportFormat.get_format(accept_header)
+ content_type format
+ #PENDING: get_report should return file or string, check for result.is_file instead of format
+ if format=="application/x-yaml" or format=="application/rdf+xml"
+ report
else
- report = rs.get_report(params[:type],params[:id],accept_header)
- format = Reports::ReportFormat.get_format(accept_header)
- content_type format
- #PENDING: get_report should return file or string, check for result.is_file instead of format
- if format=="application/x-yaml" or format=="application/rdf+xml"
- report
- else
- result = body(File.new(report))
- end
+ result = body(File.new(report))
end
end
end
@@ -107,7 +117,6 @@ get '/report/:type/:id/:resource' do
end
delete '/report/:type/:id' do
- halt 400,"delete temporarily disabled"
perform do |rs|
content_type "text/plain"
rs.delete_report(params[:type],params[:id])
@@ -117,23 +126,9 @@ end
post '/report/:type' do
task_uri = OpenTox::Task.as_task("Create report",url_for("/report/"+params[:type], :full), params) do
perform do |rs|
- content_type "text/uri-list"
rs.create_report(params[:type],params[:validation_uris]?params[:validation_uris].split(/\n|,/):nil)
end
end
- halt 202,task_uri
-end
-
-
-post '/report/:type/:id' do
- perform do |rs|
- #QMRF-STUB
- if params[:type] == Reports::ReportFactory::RT_QMRF
- #raise Reports::BadRequest.new("only 'application/qmrf-xml' provided so far") if request.content_type != "application/qmrf-xml"
- input = request.env["rack.input"].read
- "save qmrf would have been successfull, received data with "+input.to_s.size.to_s+" characters, this is just a stub, changes discarded"
- else
- "operation not supported yet"
- end
- end
+ content_type "text/uri-list"
+ halt 202,task_uri+"\n"
end
diff --git a/report/report_factory.rb b/report/report_factory.rb
index 38d144b..7e63e32 100644
--- a/report/report_factory.rb
+++ b/report/report_factory.rb
@@ -20,9 +20,8 @@ module Reports::ReportFactory
RT_VALIDATION = "validation"
RT_CV = "crossvalidation"
RT_ALG_COMP = "algorithm_comparison"
- RT_QMRF = "qmrf"
- REPORT_TYPES = [RT_VALIDATION, RT_CV, RT_ALG_COMP, RT_QMRF ]
+ REPORT_TYPES = [RT_VALIDATION, RT_CV, RT_ALG_COMP ]
# creates a report of a certain type according to the validation data in validation_set
#
diff --git a/report/report_format.rb b/report/report_format.rb
index 29d67d7..e61d9be 100644
--- a/report/report_format.rb
+++ b/report/report_format.rb
@@ -14,7 +14,6 @@ module Reports::ReportFormat
# returns report-format, according to header value
def self.get_format(accept_header_value)
- return "text/html" if accept_header_value =~ /\*\/\*/
begin
content_type = MIMEParse::best_match(CONTENT_TYPES, accept_header_value)
raise RuntimeException.new unless content_type
diff --git a/report/report_persistance.rb b/report/report_persistance.rb
index acb29c6..424d5ca 100644
--- a/report/report_persistance.rb
+++ b/report/report_persistance.rb
@@ -222,8 +222,6 @@ module Reports
end
def list_reports(type, filter_params={})
- #QMRF-STUB
- return "1" if type == ReportFactory::RT_QMRF
filter_params["report_type"]=type unless filter_params.has_key?("report_type")
ReportData.find_like(filter_params).collect{ |r| r.id }
end
diff --git a/report/report_service.rb b/report/report_service.rb
index 9aaa2e0..2187493 100644
--- a/report/report_service.rb
+++ b/report/report_service.rb
@@ -20,7 +20,7 @@ module Reports
def get_report_types
LOGGER.info "list all report types"
- Reports::ReportFactory::REPORT_TYPES.collect{ |t| get_uri(t) }.join("\n")
+ Reports::ReportFactory::REPORT_TYPES.collect{ |t| get_uri(t) }.join("\n")+"\n"
end
# lists all stored reports of a certain type, returns a list of uris
@@ -32,7 +32,7 @@ module Reports
LOGGER.info "get all reports of type '"+type.to_s+"', filter_params: '"+filter_params.inspect+"'"
check_report_type(type)
- @persistance.list_reports(type, filter_params).collect{ |id| get_uri(type,id) }.join("\n")
+ @persistance.list_reports(type, filter_params).collect{ |id| get_uri(type,id) }.join("\n")+"\n"
end
# creates a report of a certain type, __validation_uris__ must contain be a list of validation or cross-validation-uris
diff --git a/report/report_test.rb b/report/report_test.rb
index 0256702..9ea1a89 100644
--- a/report/report_test.rb
+++ b/report/report_test.rb
@@ -23,7 +23,7 @@ class Reports::ApplicationTest < Test::Unit::TestCase
# puts OpenTox::RestClientWrapper.post("http://localhost/validation/report/qmrf/1",{:content_type => "application/qmrf-xml"},data).to_s.chomp
#get "/report/qmrf/1",nil,'HTTP_ACCEPT' => "application/qmrf-xml"#"application/rdf+xml"#"application/x-yaml"
- get "/report/validation?model=http://localhost/model/1" #,nil,'HTTP_ACCEPT' => "application/rdf+xml"#"application/x-yaml"
+ get "/report/validation" # ?model=http://localhost/model/1" #,nil,'HTTP_ACCEPT' => "application/rdf+xml"#"application/x-yaml"
puts last_response.body.to_s
#Reports::XMLReport.generate_demo_xml_report.write_to
diff --git a/validation/validation_application.rb b/validation/validation_application.rb
index 1fdf8a4..983f3bd 100644
--- a/validation/validation_application.rb
+++ b/validation/validation_application.rb
@@ -10,8 +10,42 @@ require 'validation/validation_service.rb'
get '/crossvalidation/?' do
LOGGER.info "list all crossvalidations"
+ uri_list = Validation::Crossvalidation.find_like(params).collect{ |d| url_for("/crossvalidation/", :full) + d.id.to_s }.join("\n")+"\n"
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ related_links =
+ "Single validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Crossvalidation reports: "+$sinatra.url_for("/report/crossvalidation",:full)
+ description =
+ "A list of all crossvalidations.\n"+
+ "Use the POST method to perform a crossvalidation."
+ post_params = [[:dataset_uri,:algorithm_uri,:prediction_feature,[:num_folds,10],[:random_seed,1],[:stratified,false],[:algorithm_params,""]]]
+ content_type "text/html"
+ OpenTox.text_to_html uri_list,related_links,description,post_params
+ else
+ content_type "text/uri-list"
+ uri_list
+ end
+end
+
+post '/crossvalidation/?' do
content_type "text/uri-list"
- Validation::Crossvalidation.find_like(params).collect{ |d| url_for("/crossvalidation/", :full) + d.id.to_s }.join("\n")+"\n"
+ task_uri = OpenTox::Task.as_task( "Perform crossvalidation", url_for("/crossvalidation", :full), params ) do
+ LOGGER.info "creating crossvalidation "+params.inspect
+ halt 400, "dataset_uri missing" unless params[:dataset_uri]
+ halt 400, "algorithm_uri missing" unless params[:algorithm_uri]
+ halt 400, "prediction_feature missing" unless params[:prediction_feature]
+ halt 400, "illegal param-value num_folds: '"+params[:num_folds].to_s+"', must be integer >1" unless params[:num_folds]==nil or
+ params[:num_folds].to_i>1
+
+ cv_params = { :dataset_uri => params[:dataset_uri],
+ :algorithm_uri => params[:algorithm_uri] }
+ [ :num_folds, :random_seed, :stratified ].each{ |sym| cv_params[sym] = params[sym] if params[sym] }
+ cv = Validation::Crossvalidation.new cv_params
+ cv.create_cv_datasets( params[:prediction_feature] )
+ cv.perform_cv( params[:algorithm_params])
+ cv.crossvalidation_uri
+ end
+ halt 202,task_uri+"\n"
end
post '/crossvalidation/cleanup/?' do
@@ -49,18 +83,57 @@ get '/crossvalidation/:id' do
case request.env['HTTP_ACCEPT'].to_s
when "application/rdf+xml"
content_type "application/rdf+xml"
- result = crossvalidation.to_rdf
- when /application\/x-yaml|\*\/\*|/ # matches 'text/x-yaml', '*/*', ''
+ crossvalidation.to_rdf
+ when /application\/x-yaml/
content_type "application/x-yaml"
- result = crossvalidation.to_yaml
+ crossvalidation.to_yaml
+ when /text\/html/
+ related_links =
+ "Search for corresponding cv report: "+$sinatra.url_for("/report/crossvalidation?crossvalidation="+crossvalidation.crossvalidation_uri,:full)+"\n"+
+ "Statistics for this crossvalidation: "+$sinatra.url_for("/crossvalidation/"+params[:id]+"/statistics",:full)+"\n"+
+ "All crossvalidations: "+$sinatra.url_for("/crossvalidation",:full)+"\n"+
+ "All crossvalidation reports: "+$sinatra.url_for("/report/crossvalidation",:full)
+ description =
+ "A crossvalidation resource."
+ content_type "text/html"
+ OpenTox.text_to_html crossvalidation.to_yaml,related_links,description
else
- halt 400, "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported."
+ halt 400, "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported, valid Accept-Headers: \"application/rdf+xml\", \"application/x-yaml\", \"text/html\"."
+ end
+end
+
+get '/crossvalidation/:id/statistics' do
+ LOGGER.info "get merged validation-result for crossvalidation with id "+params[:id].to_s
+ begin
+ crossvalidation = Validation::Crossvalidation.find(params[:id])
+ rescue ActiveRecord::RecordNotFound => ex
+ halt 404, "Crossvalidation '#{params[:id]}' not found."
+ end
+
+ Lib::MergeObjects.register_merge_attributes( Validation::Validation,
+ Lib::VAL_MERGE_AVG,Lib::VAL_MERGE_SUM,Lib::VAL_MERGE_GENERAL-[:validation_uri]) unless
+ Lib::MergeObjects.merge_attributes_registered?(Validation::Validation)
+
+ v = Lib::MergeObjects.merge_array_objects( Validation::Validation.find( :all, :conditions => { :crossvalidation_id => params[:id] } ) )
+ v.validation_uri = nil
+ v.date = nil
+ v.id = nil
+
+ case request.env['HTTP_ACCEPT'].to_s
+ when /text\/html/
+ related_links =
+ "The corresponding crossvalidation resource: "+$sinatra.url_for("/crossvalidation/"+params[:id],:full)
+ description =
+ "The averaged statistics for the crossvalidation."
+ content_type "text/html"
+ OpenTox.text_to_html v.to_yaml,related_links,description
+ else
+ content_type "application/x-yaml"
+ v.to_yaml
end
- result
end
delete '/crossvalidation/:id/?' do
- halt 400,"delete temporarily disabled"
LOGGER.info "delete crossvalidation with id "+params[:id].to_s
content_type "text/plain"
begin
@@ -82,27 +155,6 @@ get '/crossvalidation/:id/validations' do
Validation::Validation.find( :all, :conditions => { :crossvalidation_id => params[:id] } ).collect{ |v| v.validation_uri.to_s }.join("\n")+"\n"
end
-
-get '/crossvalidation/:id/statistics' do
- LOGGER.info "get merged validation-result for crossvalidation with id "+params[:id].to_s
- begin
- crossvalidation = Validation::Crossvalidation.find(params[:id])
- rescue ActiveRecord::RecordNotFound => ex
- halt 404, "Crossvalidation '#{params[:id]}' not found."
- end
-
- Lib::MergeObjects.register_merge_attributes( Validation::Validation,
- Lib::VAL_MERGE_AVG,Lib::VAL_MERGE_SUM,Lib::VAL_MERGE_GENERAL-[:validation_uri]) unless
- Lib::MergeObjects.merge_attributes_registered?(Validation::Validation)
-
- v = Lib::MergeObjects.merge_array_objects( Validation::Validation.find( :all, :conditions => { :crossvalidation_id => params[:id] } ) )
- v.validation_uri = nil
- v.date = nil
- v.id = nil
- content_type "application/x-yaml"
- v.to_yaml
-end
-
get '/crossvalidation/:id/predictions' do
LOGGER.info "get predictions for crossvalidation with id "+params[:id].to_s
begin
@@ -115,154 +167,222 @@ get '/crossvalidation/:id/predictions' do
Lib::OTPredictions.to_array( validations.collect{ |v| v.compute_validation_stats_with_model(nil, true) } ).to_yaml
end
-
-post '/crossvalidation/?' do
- content_type "text/uri-list"
- task_uri = OpenTox::Task.as_task( "Perform crossvalidation", url_for("/crossvalidation", :full), params ) do
- LOGGER.info "creating crossvalidation "+params.inspect
- halt 400, "dataset_uri missing" unless params[:dataset_uri]
- halt 400, "algorithm_uri missing" unless params[:algorithm_uri]
- halt 400, "prediction_feature missing" unless params[:prediction_feature]
- halt 400, "illegal param-value num_folds: '"+params[:num_folds].to_s+"', must be integer >1" unless params[:num_folds]==nil or
- params[:num_folds].to_i>1
-
- cv_params = { :dataset_uri => params[:dataset_uri],
- :algorithm_uri => params[:algorithm_uri] }
- [ :num_folds, :random_seed, :stratified ].each{ |sym| cv_params[sym] = params[sym] if params[sym] }
- cv = Validation::Crossvalidation.new cv_params
- cv.create_cv_datasets( params[:prediction_feature] )
- cv.perform_cv( params[:algorithm_params])
+get '/?' do
+ LOGGER.info "list all validations, params: "+params.inspect
+ uri_list = Validation::Validation.find_like(params).collect{ |d| url_for("/", :full) + d.id.to_s }.join("\n")+"\n"
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ related_links =
+ "To perform a validation:\n"+
+ "* "+$sinatra.url_for("/test_set_validation",:full)+"\n"+
+ "* "+$sinatra.url_for("/training_test_validation",:full)+"\n"+
+ "* "+$sinatra.url_for("/bootstrapping",:full)+"\n"+
+ "* "+$sinatra.url_for("/training_test_split",:full)+"\n"+
+ "* "+$sinatra.url_for("/crossvalidation",:full)+"\n"+
+ "Validation reports: "+$sinatra.url_for("/report/validation",:full)+"\n"+
+ "Examples for using this service: "+$sinatra.url_for("/examples",:full)+"\n"
+ description =
+ "A validation web service for the OpenTox project ( http://opentox.org ).\n"+
+ "In the root directory (this is where you are now), a list of all validation resources is returned."
+ content_type "text/html"
+ OpenTox.text_to_html uri_list,related_links,description
+ else
content_type "text/uri-list"
- cv.crossvalidation_uri
+ uri_list
end
- halt 202,task_uri
end
-
-get '/training_test_split' do
- halt 400, "GET operation not supported, use POST to perform a training_test_split, see "+url_for("/", :full)+" for validation results"
-end
-
-
-get '/bootstrapping' do
- halt 400, "GET operation not supported, use POST to perform a bootstrapping, see "+url_for("/", :full)+" for validation results"
+post '/?' do
+ halt 400, "Post not supported, to perfom a validation use '/test_set_validation', '/training_test_validation', 'bootstrapping', 'training_test_split'"
end
-
-get '/?' do
- LOGGER.info "list all validations, params: "+params.inspect
+post '/test_set_validation' do
content_type "text/uri-list"
- Validation::Validation.find_like(params).collect{ |d| url_for("/", :full) + d.id.to_s }.join("\n")+"\n"
-end
-
-get '/:id' do
- LOGGER.info "get validation with id "+params[:id].to_s+" '"+request.env['HTTP_ACCEPT'].to_s+"'"
- begin
- validation = Validation::Validation.find(params[:id])
- rescue ActiveRecord::RecordNotFound => ex
- halt 404, "Validation '#{params[:id]}' not found."
+ LOGGER.info "creating test-set-validation "+params.inspect
+ if params[:model_uri] and params[:test_dataset_uri] and !params[:training_dataset_uri] and !params[:algorithm_uri]
+ task_uri = OpenTox::Task.as_task( "Perform test-set-validation", url_for("/", :full), params ) do |task|
+ v = Validation::Validation.new :model_uri => params[:model_uri],
+ :test_dataset_uri => params[:test_dataset_uri],
+ :test_target_dataset_uri => params[:test_target_dataset_uri],
+ :prediction_feature => params[:prediction_feature]
+ v.validate_model
+ v.validation_uri
+ end
+ halt 202,task_uri+"\n"
+ else
+ halt 400, "illegal parameters, pls specify model_uri and test_dataset_uri\n"+
+ "params given: "+params.inspect
end
+end
- case request.env['HTTP_ACCEPT'].to_s
- when "application/rdf+xml"
- content_type "application/rdf+xml"
- result = validation.to_rdf
- when /application\/x-yaml|\*\/\*|^$/ # matches 'application/x-yaml', '*/*', ''
- content_type "application/x-yaml"
- result = validation.to_yaml
+get '/test_set_validation' do
+ LOGGER.info "list all test-set-validations, params: "+params.inspect
+ uri_list = "NOT YET IMPLEMENTED"
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ related_links =
+ "All validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Validation reports: "+$sinatra.url_for("/report/validation",:full)
+ description =
+ "A list of all test-set-validations.\n"+
+ "To perform a test-set-validation use the POST method."
+ post_params = [[:model_uri, :test_dataset_uri, [:test_target_dataset_uri,"same-as-test_dataset_uri"], [:prediction_feature, "dependent-variable-of-model"]]]
+ content_type "text/html"
+ OpenTox.text_to_html uri_list,related_links,description,post_params
else
- halt 400, "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported, valid Accept-Headers are \"application/rdf+xml\" and \"application/x-yaml\"."
+ content_type "text/uri-list"
+ uri_list
end
- result
end
-post '/?' do
+post '/training_test_validation/?' do
content_type "text/uri-list"
- task_uri = OpenTox::Task.as_task( "Perform validation", url_for("/", :full), params ) do |task|
- LOGGER.info "creating validation "+params.inspect
- if params[:model_uri] and params[:test_dataset_uri] and !params[:training_dataset_uri] and !params[:algorithm_uri]
- v = Validation::Validation.new :model_uri => params[:model_uri],
- :test_dataset_uri => params[:test_dataset_uri],
- :test_target_dataset_uri => params[:test_target_dataset_uri],
- :prediction_feature => params[:prediction_feature]
- v.validate_model
- elsif params[:algorithm_uri] and params[:training_dataset_uri] and params[:test_dataset_uri] and params[:prediction_feature] and !params[:model_uri]
- v = Validation::Validation.new :algorithm_uri => params[:algorithm_uri],
+ LOGGER.info "creating training-test-validation "+params.inspect
+ if params[:algorithm_uri] and params[:training_dataset_uri] and params[:test_dataset_uri] and params[:prediction_feature] and !params[:model_uri]
+ task_uri = OpenTox::Task.as_task( "Perform training-test-validation", url_for("/", :full), params ) do |task|
+ v = Validation::Validation.new :algorithm_uri => params[:algorithm_uri],
:training_dataset_uri => params[:training_dataset_uri],
:test_dataset_uri => params[:test_dataset_uri],
:test_target_dataset_uri => params[:test_target_dataset_uri],
:prediction_feature => params[:prediction_feature]
- v.validate_algorithm( params[:algorithm_params])
- else
- halt 400, "illegal parameter combination for validation, use either\n"+
- "* model_uri, test_dataset_uri\n"+
- "* algorithm_uri, training_dataset_uri, test_dataset_uri, prediction_feature\n"+
- "params given: "+params.inspect
+ v.validate_algorithm( params[:algorithm_params])
+ v.validation_uri
end
- content_type "text/uri-list"
- v.validation_uri
+ halt 202,task_uri+"\n"
+ else
+ halt 400, "illegal parameters, pls specify algorithm_uri, training_dataset_uri, test_dataset_uri, prediction_feature\n"+
+ "params given: "+params.inspect
end
- halt 202,task_uri
end
-
-post '/cleanup/?' do
- LOGGER.info "validation cleanup, starting..."
- content_type "text/uri-list"
- deleted = []
- Validation::Validation.find( :all, :conditions => { :prediction_dataset_uri => nil } ).each do |val|
- LOGGER.debug "delete val with id:"+val.id.to_s+" prediction_dataset_uri is nil"
- deleted << url_for("/", :full) + val.id.to_s
- Validation::Validation.delete(val.id)
+get '/training_test_validation' do
+ LOGGER.info "list all training-test-validations, params: "+params.inspect
+ uri_list = "NOT YET IMPLEMENTED"
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ related_links =
+ "All validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Validation reports: "+$sinatra.url_for("/report/validation",:full)
+ description =
+ "A list of all training-test-validations.\n"+
+ "To perform a training-test-validation use the POST method."
+ post_params = [[:algorithm_uri,
+ :training_dataset_uri,
+ :test_dataset_uri,
+ [:test_target_dataset_uri,"same-as-test_dataset_uri"],
+ :prediction_feature,
+ [:algorithm_params, ""]]]
+ content_type "text/html"
+ OpenTox.text_to_html uri_list,related_links,description,post_params
+ else
+ content_type "text/uri-list"
+ uri_list
end
- LOGGER.info "validation cleanup, deleted "+deleted.size.to_s+" validations"
- deleted.join("\n")+"\n"
end
-post '/training_test_split' do
+post '/bootstrapping' do
content_type "text/uri-list"
- task_uri = OpenTox::Task.as_task( "Perform training test split validation", url_for("/training_test_split", :full), params ) do
- LOGGER.info "creating training test split "+params.inspect
+ task_uri = OpenTox::Task.as_task( "Perform bootstrapping validation", url_for("/bootstrapping", :full), params ) do
+ LOGGER.info "performing bootstrapping validation "+params.inspect
halt 400, "dataset_uri missing" unless params[:dataset_uri]
halt 400, "algorithm_uri missing" unless params[:algorithm_uri]
halt 400, "prediction_feature missing" unless params[:prediction_feature]
- params.merge!(Validation::Util.train_test_dataset_split(params[:dataset_uri], params[:prediction_feature], params[:split_ratio], params[:random_seed]))
+ params.merge!(Validation::Util.bootstrapping(params[:dataset_uri], params[:prediction_feature], params[:random_seed]))
v = Validation::Validation.new :training_dataset_uri => params[:training_dataset_uri],
:test_dataset_uri => params[:test_dataset_uri],
:test_target_dataset_uri => params[:dataset_uri],
:prediction_feature => params[:prediction_feature],
:algorithm_uri => params[:algorithm_uri]
v.validate_algorithm( params[:algorithm_params])
- content_type "text/uri-list"
v.validation_uri
end
- halt 202,task_uri
+ halt 202,task_uri+"\n"
end
+get '/bootstrapping' do
+ LOGGER.info "list all bootstrapping-validations, params: "+params.inspect
+ uri_list = "NOT YET IMPLEMENTED"
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ related_links =
+ "All validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Validation reports: "+$sinatra.url_for("/report/validation",:full)
+ description =
+ "A list of all bootstrapping-validations.\n"+
+ "To perform a bootstrapping-validation use the POST method."
+ post_params = [[:algorithm_uri,
+ :dataset_uri,
+ :prediction_feature,
+ [:algorithm_params, ""],
+ [:random_seed, 1]]]
+ content_type "text/html"
+ OpenTox.text_to_html uri_list,related_links,description,post_params
+ else
+ content_type "text/uri-list"
+ uri_list
+ end
+end
-post '/bootstrapping' do
+post '/training_test_split' do
content_type "text/uri-list"
- task_uri = OpenTox::Task.as_task( "Perform bootstrapping validation", url_for("/bootstrapping", :full), params ) do
- LOGGER.info "performing bootstrapping validation "+params.inspect
+ task_uri = OpenTox::Task.as_task( "Perform training test split validation", url_for("/training_test_split", :full), params ) do
+ LOGGER.info "creating training test split "+params.inspect
halt 400, "dataset_uri missing" unless params[:dataset_uri]
halt 400, "algorithm_uri missing" unless params[:algorithm_uri]
halt 400, "prediction_feature missing" unless params[:prediction_feature]
- params.merge!(Validation::Util.bootstrapping(params[:dataset_uri], params[:prediction_feature], params[:random_seed]))
+ params.merge!(Validation::Util.train_test_dataset_split(params[:dataset_uri], params[:prediction_feature], params[:split_ratio], params[:random_seed]))
v = Validation::Validation.new :training_dataset_uri => params[:training_dataset_uri],
:test_dataset_uri => params[:test_dataset_uri],
:test_target_dataset_uri => params[:dataset_uri],
:prediction_feature => params[:prediction_feature],
:algorithm_uri => params[:algorithm_uri]
v.validate_algorithm( params[:algorithm_params])
- content_type "text/uri-list"
v.validation_uri
end
- halt 202,task_uri
+ halt 202,task_uri+"\n"
+end
+
+get '/training_test_split' do
+ LOGGER.info "list all training-test-split-validations, params: "+params.inspect
+ uri_list = "NOT YET IMPLEMENTED"
+ if request.env['HTTP_ACCEPT'] =~ /text\/html/
+ related_links =
+ "All validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Validation reports: "+$sinatra.url_for("/report/validation",:full)
+ description =
+ "A list of all training-test-split-validations.\n"+
+ "To perform a training-test-split-validation use the POST method."
+ post_params = [[:algorithm_uri,
+ :dataset_uri,
+ :prediction_feature,
+ [:algorithm_params, ""],
+ [:random_seed, 1],
+ [:split_ratio, 0.66]]]
+ content_type "text/html"
+ OpenTox.text_to_html uri_list,related_links,description,post_params
+ else
+ content_type "text/uri-list"
+ uri_list
+ end
+end
+
+post '/cleanup/?' do
+ LOGGER.info "validation cleanup, starting..."
+ content_type "text/uri-list"
+ deleted = []
+ Validation::Validation.find( :all, :conditions => { :prediction_dataset_uri => nil } ).each do |val|
+ LOGGER.debug "delete val with id:"+val.id.to_s+" prediction_dataset_uri is nil"
+ deleted << url_for("/", :full) + val.id.to_s
+ Validation::Validation.delete(val.id)
+ end
+ LOGGER.info "validation cleanup, deleted "+deleted.size.to_s+" validations"
+ deleted.join("\n")+"\n"
end
+
+
+
+
+
post '/plain_training_test_split' do
LOGGER.info "creating pure training test split "+params.inspect
halt 400, "dataset_uri missing" unless params[:dataset_uri]
@@ -294,10 +414,9 @@ post '/validate_datasets' do
v = Validation::Validation.new params
v.compute_validation_stats((clazz and !regr),predicted_feature)
end
- content_type "text/uri-list"
v.validation_uri
end
- halt 202,task_uri
+ halt 202,task_uri+"\n"
end
get '/:id/predictions' do
@@ -307,9 +426,20 @@ get '/:id/predictions' do
rescue ActiveRecord::RecordNotFound => ex
halt 404, "Validation '#{params[:id]}' not found."
end
- content_type "text/x-yaml"
p = validation.compute_validation_stats_with_model(nil, true)
- p.to_array.to_yaml
+ case request.env['HTTP_ACCEPT'].to_s
+ when /text\/html/
+ content_type "text/html"
+ description =
+ "The validation predictions as (yaml-)array."
+ related_links =
+ "All validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "Correspoding validation: "+$sinatra.url_for("/"+params[:id],:full)
+ OpenTox.text_to_html p.to_array.to_yaml, related_links, description
+ else
+ content_type "text/x-yaml"
+ p.to_array.to_yaml
+ end
end
get '/:id/:attribute' do
@@ -328,8 +458,37 @@ get '/:id/:attribute' do
return validation.send(params[:attribute])
end
+get '/:id' do
+ LOGGER.info "get validation with id "+params[:id].to_s+" '"+request.env['HTTP_ACCEPT'].to_s+"'"
+ begin
+ validation = Validation::Validation.find(params[:id])
+ rescue ActiveRecord::RecordNotFound => ex
+ halt 404, "Validation '#{params[:id]}' not found."
+ end
+
+ case request.env['HTTP_ACCEPT'].to_s
+ when "application/rdf+xml"
+ content_type "application/rdf+xml"
+ validation.to_rdf
+ when /application\/x-yaml/
+ content_type "application/x-yaml"
+ validation.to_yaml
+ when /text\/html/
+ content_type "text/html"
+ description =
+ "A validation resource."
+ related_links =
+ "Search for corresponding report: "+$sinatra.url_for("/report/validation?validation="+validation.validation_uri,:full)+"\n"+
+ "Get validation predictions: "+$sinatra.url_for("/"+params[:id]+"/predictions",:full)+"\n"+
+ "All validations: "+$sinatra.url_for("/",:full)+"\n"+
+ "All validation reports: "+$sinatra.url_for("/report/validation",:full)
+ OpenTox.text_to_html validation.to_yaml,related_links,description
+ else
+ halt 400, "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported, valid Accept-Headers: \"application/rdf+xml\", \"application/x-yaml\", \"text/html\"."
+ end
+end
+
delete '/:id' do
- halt 400,"delete temporarily disabled"
LOGGER.info "delete validation with id "+params[:id].to_s
begin
validation = Validation::Validation.find(params[:id])
diff --git a/validation/validation_test.rb b/validation/validation_test.rb
index 1265bdc..5e068a3 100644
--- a/validation/validation_test.rb
+++ b/validation/validation_test.rb
@@ -34,6 +34,10 @@ class ValidationTest < Test::Unit::TestCase
def test_it
$test_case = self
+ #get "/report/crossvalidation/15",nil,'HTTP_ACCEPT' => "text/html"
+# get "/",nil,'HTTP_ACCEPT' => "text/html"
+# puts last_response.body
+
# d = OpenTox::Dataset.find("http://ot-dev.in-silico.ch/dataset/307")
# puts d.compounds.inspect
# exit
@@ -52,7 +56,7 @@ class ValidationTest < Test::Unit::TestCase
# #:classification=>"true"}
# puts last_response.body
- #get "/"
+ #post "/crossvalidation/cleanup"
#puts last_response.body
#get "/crossvalidation/4/statistics"
@@ -76,7 +80,7 @@ class ValidationTest < Test::Unit::TestCase
# #:classification=>"true"}
# puts last_response.body
- #run_test("12b"); #,"http://localhost/validation/crossvalidation/2");
+ #run_test("1b")#,"http://localhost/validation/394");
#run_test("11b", "http://localhost/validation/crossvalidation/2" )# //localhost/validation/42")#, "http://localhost/validation/report/validation/8") #,"http://localhost/validation/report/validation/36") #, "http://localhost/validation/321")
@@ -87,8 +91,8 @@ class ValidationTest < Test::Unit::TestCase
#puts Nightly.build_nightly("1")
#prepare_examples
- #do_test_examples # USES CURL, DO NOT FORGET TO RESTART VALIDATION SERVICE
- do_test_examples_ortona
+ do_test_examples # USES CURL, DO NOT FORGET TO RESTART VALIDATION SERVICE
+ #do_test_examples_ortona
end
def app