diff options
-rw-r--r-- | EXAMPLES | 4 | ||||
-rw-r--r-- | application.rb | 12 | ||||
-rw-r--r-- | reach_reports/reach_application.rb | 4 | ||||
-rw-r--r-- | reach_reports/reach_test.rb | 5 | ||||
-rw-r--r-- | report/report_application.rb | 79 | ||||
-rw-r--r-- | report/report_factory.rb | 3 | ||||
-rw-r--r-- | report/report_format.rb | 1 | ||||
-rw-r--r-- | report/report_persistance.rb | 2 | ||||
-rw-r--r-- | report/report_service.rb | 4 | ||||
-rw-r--r-- | report/report_test.rb | 2 | ||||
-rw-r--r-- | validation/validation_application.rb | 407 | ||||
-rw-r--r-- | validation/validation_test.rb | 12 |
12 files changed, 349 insertions, 186 deletions
@@ -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 |