diff options
Diffstat (limited to 'validation/validation_application.rb')
-rwxr-xr-x[-rw-r--r--] | validation/validation_application.rb | 610 |
1 files changed, 462 insertions, 148 deletions
diff --git a/validation/validation_application.rb b/validation/validation_application.rb index a43a2a6..e07acf0 100644..100755 --- a/validation/validation_application.rb +++ b/validation/validation_application.rb @@ -1,199 +1,454 @@ -[ 'rubygems', 'sinatra', 'sinatra/url_for', 'active_record', 'ar-extensions', 'opentox-ruby-api-wrapper' ].each do |lib| +[ 'rubygems', 'sinatra', 'sinatra/url_for', 'opentox-ruby' ].each do |lib| require lib end -require 'validation/validation_service.rb' require 'lib/merge.rb' +#require 'lib/active_record_setup.rb' +require 'validation/validation_service.rb' get '/crossvalidation/?' do LOGGER.info "list all crossvalidations" + #uri_list = Validation::Crossvalidation.all.collect{ |cv| cv.crossvalidation_uri }.join("\n")+"\n" + uri_list = Lib::DataMapperUtil.all(Validation::Crossvalidation,params).collect{ |cv| cv.crossvalidation_uri }.join("\n")+"\n" + + #uri_list = Validation::Crossvalidation.find_like(params).collect{ |cv| cv.crossvalidation_uri }.join("\n")+"\n" + if request.env['HTTP_ACCEPT'] =~ /text\/html/ + related_links = + "Single validations: "+url_for("/",:full)+"\n"+ + "Crossvalidation reports: "+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,@subjectid,related_links,description,post_params + else + content_type "text/uri-list" + uri_list + end +end + +post '/crossvalidation/?' do + task = OpenTox::Task.create( "Perform crossvalidation", url_for("/crossvalidation", :full) ) do |task| #, params + LOGGER.info "creating crossvalidation "+params.inspect + raise OpenTox::BadRequestError.new "dataset_uri missing" unless params[:dataset_uri] + raise OpenTox::BadRequestError.new "algorithm_uri missing" unless params[:algorithm_uri] + raise OpenTox::BadRequestError.new "prediction_feature missing" unless params[:prediction_feature] + raise OpenTox::BadRequestError.new "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.subjectid = @subjectid + cv.perform_cv( params[:prediction_feature], params[:algorithm_params], task ) + cv.crossvalidation_uri + end + return_task(task) +end + +post '/crossvalidation/cleanup/?' do + LOGGER.info "crossvalidation cleanup, starting..." content_type "text/uri-list" - params.each{ |k,v| halt 400,"no crossvalidation-attribute: "+k.to_s unless Validation::Crossvalidation.column_names.include?(k.gsub(/_like$/,"")) } - Validation::Crossvalidation.find(:all, :conditions => params).collect{ |d| url_for("/crossvalidation/", :full) + d.id.to_s }.join("\n") + deleted = [] + #Validation::Crossvalidation.find_like(params).each do |cv| + Validation::Crossvalidation.all( { :finished => false } ).each do |cv| + #num_vals = Validation::Validation.find( :all, :conditions => { :crossvalidation_id => cv.id } ).size + #num_vals = Validation::Validation.all( :crossvalidation_id => cv.id ).size + #if cv.num_folds != num_vals || !cv.finished + LOGGER.debug "delete cv with id:"+cv.id.to_s+", finished is false" + deleted << cv.crossvalidation_uri + #Validation::Crossvalidation.delete(cv.id) + cv.subjectid = @subjectid + cv.delete + #end + end + LOGGER.info "crossvalidation cleanup, deleted "+deleted.size.to_s+" cvs" + deleted.join("\n")+"\n" end post '/crossvalidation/loo/?' do - halt 500, "not yet implemented" + raise "not yet implemented" end get '/crossvalidation/loo/?' do - halt 400, "GET operation not supported, use POST for performing a loo-crossvalidation, see "+url_for("/crossvalidation", :full)+" for crossvalidation results" + raise OpenTox::BadRequestError.new "GET operation not supported, use POST for performing a loo-crossvalidation, see "+url_for("/crossvalidation", :full)+" for crossvalidation results" end get '/crossvalidation/:id' do LOGGER.info "get 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 +# begin +# #crossvalidation = Validation::Crossvalidation.find(params[:id]) +# rescue ActiveRecord::RecordNotFound => ex +# raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." +# end + crossvalidation = Validation::Crossvalidation.get(params[:id]) + raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." unless crossvalidation 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 /text\/html/ + related_links = + "Search for corresponding cv report: "+url_for("/report/crossvalidation?crossvalidation="+crossvalidation.crossvalidation_uri,:full)+"\n"+ + "Statistics for this crossvalidation: "+url_for("/crossvalidation/"+params[:id]+"/statistics",:full)+"\n"+ + "Predictions of this crossvalidation: "+url_for("/crossvalidation/"+params[:id]+"/predictions",:full)+"\n"+ + "All crossvalidations: "+url_for("/crossvalidation",:full)+"\n"+ + "All crossvalidation reports: "+url_for("/report/crossvalidation",:full) + description = + "A crossvalidation resource." + content_type "text/html" + OpenTox.text_to_html crossvalidation.to_yaml,@subjectid,related_links,description + when /application\/x-yaml|\*\/\*/ content_type "application/x-yaml" - result = crossvalidation.to_yaml + crossvalidation.to_yaml else - halt 400, "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported." - end - result -end - -delete '/crossvalidation/:id/?' do - LOGGER.info "delete crossvalidation with id "+params[:id].to_s - content_type "text/plain" - begin - crossvalidation = Validation::Crossvalidation.find(params[:id]) - rescue ActiveRecord::RecordNotFound => ex - halt 404, "Crossvalidation '#{params[:id]}' not found." - end - Validation::Crossvalidation.delete(params[:id]) -end - -get '/crossvalidation/:id/validations' do - LOGGER.info "get all validations 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." + raise OpenTox::BadRequestError.new "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported, valid Accept-Headers: \"application/rdf+xml\", \"application/x-yaml\", \"text/html\"." end - content_type "text/uri-list" - 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 +# begin + #crossvalidation = Validation::Crossvalidation.find(params[:id]) +# rescue ActiveRecord::RecordNotFound => ex +# raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." +# end + #crossvalidation = Validation::Crossvalidation.find(params[:id]) + crossvalidation = Validation::Crossvalidation.get(params[:id]) + + raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." unless crossvalidation + raise OpenTox::BadRequestError.new "Crossvalidation '"+params[:id].to_s+"' not finished" unless crossvalidation.finished Lib::MergeObjects.register_merge_attributes( Validation::Validation, - Lib::VAL_MERGE_AVG,Lib::VAL_MERGE_SUM,Lib::VAL_MERGE_GENERAL-[:validation_uri]) unless + Lib::VAL_MERGE_AVG,Lib::VAL_MERGE_SUM,Lib::VAL_MERGE_GENERAL-[:date,:validation_uri,:crossvalidation_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 = Lib::MergeObjects.merge_array_objects( Validation::Validation.find( :all, :conditions => { :crossvalidation_id => params[:id] } ) ) + v = Lib::MergeObjects.merge_array_objects( Validation::Validation.all( :crossvalidation_id => params[:id] ) ) v.created_at = nil v.id = nil - content_type "application/x-yaml" - v.to_yaml -end - - -post '/crossvalidation/?' do - content_type "text/uri-list" - task_uri = OpenTox::Task.as_task 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]) - content_type "text/uri-list" - cv.crossvalidation_uri + + case request.env['HTTP_ACCEPT'].to_s + when /text\/html/ + related_links = + "The corresponding crossvalidation resource: "+url_for("/crossvalidation/"+params[:id],:full) + description = + "The averaged statistics for the crossvalidation." + content_type "text/html" + OpenTox.text_to_html v.to_yaml,@subjectid,related_links,description + else + content_type "application/x-yaml" + v.to_yaml 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" +delete '/crossvalidation/:id/?' do + LOGGER.info "delete crossvalidation with id "+params[:id].to_s + content_type "text/plain" +# begin + #crossvalidation = Validation::Crossvalidation.find(params[:id]) +# rescue ActiveRecord::RecordNotFound => ex +# raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." +# end +# Validation::Crossvalidation.delete(params[:id]) + + cv = Validation::Crossvalidation.get(params[:id]) + cv.subjectid = @subjectid + raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." unless cv + cv.delete end -get '/?' do - LOGGER.info "list all validations" - content_type "text/uri-list" - params.each{ |k,v| halt 400,"no validation-attribute: "+k.to_s unless Validation::Validation.column_names.include?(k.gsub(/_like$/,"")) } - Validation::Validation.find(:all, :conditions => params).collect{ |d| url_for("/", :full) + d.id.to_s }.join("\n") -end +#get '/crossvalidation/:id/validations' do +# LOGGER.info "get all validations for crossvalidation with id "+params[:id].to_s +# begin +# crossvalidation = Validation::Crossvalidation.find(params[:id]) +# rescue ActiveRecord::RecordNotFound => ex +# raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." +# end +# content_type "text/uri-list" +# Validation::Validation.find( :all, :conditions => { :crossvalidation_id => params[:id] } ).collect{ |v| v.validation_uri.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+"'" +get '/crossvalidation/:id/predictions' do + LOGGER.info "get predictions for crossvalidation with id "+params[:id].to_s begin - validation = Validation::Validation.find(params[:id]) + #crossvalidation = Validation::Crossvalidation.find(params[:id]) + crossvalidation = Validation::Crossvalidation.get(params[:id]) rescue ActiveRecord::RecordNotFound => ex - halt 404, "Validation '#{params[:id]}' not found." + raise OpenTox::NotFoundError.new "Crossvalidation '#{params[:id]}' not found." end - + raise OpenTox::BadRequestError.new "Crossvalidation '"+params[:id].to_s+"' not finished" unless crossvalidation.finished + + content_type "application/x-yaml" + #validations = Validation::Validation.find( :all, :conditions => { :crossvalidation_id => params[:id] } ) + validations = Validation::Validation.all( :crossvalidation_id => params[:id] ) + p = Lib::OTPredictions.to_array( validations.collect{ |v| v.compute_validation_stats_with_model(nil, true) } ).to_yaml + 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 + when /text\/html/ + content_type "text/html" + description = + "The crossvalidation predictions as (yaml-)array." + related_links = + "All crossvalidations: "+url_for("/crossvalidation",:full)+"\n"+ + "Correspoding crossvalidation: "+url_for("/crossvalidation/"+params[:id],:full) + OpenTox.text_to_html p,@subjectid, related_links, description 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/x-yaml" + p + end +end + +get '/?' do + + LOGGER.info "list all validations, params: "+params.inspect + #uri_list = Validation::Validation.find_like(params).collect{ |v| v.validation_uri }.join("\n")+"\n" + #uri_list = Validation::Validation.all(params).collect{ |v| v.validation_uri }.join("\n")+"\n" + uri_list = Lib::DataMapperUtil.all(Validation::Validation,params).collect{ |v| v.validation_uri }.join("\n")+"\n" + + + if request.env['HTTP_ACCEPT'] =~ /text\/html/ + related_links = + "To perform a validation:\n"+ + "* "+url_for("/test_set_validation",:full)+"\n"+ + "* "+url_for("/training_test_validation",:full)+"\n"+ + "* "+url_for("/bootstrapping",:full)+"\n"+ + "* "+url_for("/training_test_split",:full)+"\n"+ + "* "+url_for("/crossvalidation",:full)+"\n"+ + "Validation reporting: "+url_for("/report",:full)+"\n"+ + "REACH relevant reporting: "+url_for("/reach_report",:full)+"\n"+ + "Examples for using this service: "+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,@subjectid,related_links,description + else + content_type "text/uri-list" + uri_list end - result end post '/?' do - content_type "text/uri-list" - task_uri = OpenTox::Task.as_task 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], + raise OpenTox::BadRequestError.new "Post not supported, to perfom a validation use '/test_set_validation', '/training_test_validation', 'bootstrapping', 'training_test_split'" +end + +post '/test_set_validation' do + 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 = OpenTox::Task.create( "Perform test-set-validation", url_for("/", :full) ) do |task| #, params + v = Validation::Validation.new :validation_type => "test_set_validation", + :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], + v.subjectid = @subjectid + v.validate_model( task ) + v.validation_uri + end + return_task(task) + else + raise OpenTox::BadRequestError.new "illegal parameters, pls specify model_uri and test_dataset_uri\n"+ + "params given: "+params.inspect + end +end + +get '/test_set_validation' do + LOGGER.info "list all test-set-validations, params: "+params.inspect + + #uri_list = Validation::Validation.find( :all, :conditions => { :validation_type => "test_set_validation" } ).collect{ |v| v.validation_uri }.join("\n")+"\n" + #uri_list = Validation::Validation.all( :validation_type => "test_set_validation" ).collect{ |v| v.validation_uri }.join("\n")+"\n" + params[:validation_type] = "test_set_validation" + uri_list = Lib::DataMapperUtil.all(Validation::Validation,params).collect{ |v| v.validation_uri }.join("\n")+"\n" + + if request.env['HTTP_ACCEPT'] =~ /text\/html/ + related_links = + "All validations: "+url_for("/",:full)+"\n"+ + "Validation reports: "+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,@subjectid,related_links,description,post_params + else + content_type "text/uri-list" + uri_list + end +end + +post '/training_test_validation/?' do + 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 = OpenTox::Task.create( "Perform training-test-validation", url_for("/", :full) ) do |task| #, params + v = Validation::Validation.new :validation_type => "training_test_validation", + :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.subjectid = @subjectid + v.validate_algorithm( params[:algorithm_params], task ) + v.validation_uri end + return_task(task) + else + raise OpenTox::BadRequestError.new "illegal parameters, pls specify algorithm_uri, training_dataset_uri, test_dataset_uri, prediction_feature\n"+ + "params given: "+params.inspect + end +end + +get '/training_test_validation' do + LOGGER.info "list all training-test-validations, params: "+params.inspect + #uri_list = Validation::Validation.find( :all, :conditions => { :validation_type => "training_test_validation" } ).collect{ |v| v.validation_uri }.join("\n")+"\n" + #uri_list = Validation::Validation.all( :validation_type => "training_test_validation" ).collect{ |v| v.validation_uri }.join("\n")+"\n" + params[:validation_type] = "training_test_validation" + uri_list = Lib::DataMapperUtil.all(Validation::Validation,params).collect{ |v| v.validation_uri }.join("\n")+"\n" + + if request.env['HTTP_ACCEPT'] =~ /text\/html/ + related_links = + "All validations: "+url_for("/",:full)+"\n"+ + "Validation reports: "+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,@subjectid,related_links,description,post_params + else content_type "text/uri-list" + uri_list + end +end + +post '/bootstrapping' do + task = OpenTox::Task.create( "Perform bootstrapping validation", url_for("/bootstrapping", :full) ) do |task| #, params + LOGGER.info "performing bootstrapping validation "+params.inspect + raise OpenTox::BadRequestError.new "dataset_uri missing" unless params[:dataset_uri] + raise OpenTox::BadRequestError.new "algorithm_uri missing" unless params[:algorithm_uri] + raise OpenTox::BadRequestError.new "prediction_feature missing" unless params[:prediction_feature] + + params.merge!( Validation::Util.bootstrapping( params[:dataset_uri], + params[:prediction_feature], @subjectid, + params[:random_seed], OpenTox::SubTask.create(task,0,33)) ) + v = Validation::Validation.new :validation_type => "bootstrapping", + :test_target_dataset_uri => params[:dataset_uri], + :prediction_feature => params[:prediction_feature], + :algorithm_uri => params[:algorithm_uri] + v.subjectid = @subjectid + v.validate_algorithm( params[:algorithm_params], OpenTox::SubTask.create(task,33,100)) v.validation_uri end - halt 202,task_uri + return_task(task) +end + +get '/bootstrapping' do + LOGGER.info "list all bootstrapping-validations, params: "+params.inspect + #uri_list = Validation::Validation.find( :all, :conditions => { :validation_type => "bootstrapping" } ).collect{ |v| v.validation_uri }.join("\n")+"\n" + #uri_list = Validation::Validation.all( :validation_type => "bootstrapping" ).collect{ |v| v.validation_uri }.join("\n")+"\n" + params[:validation_type] = "bootstrapping" + uri_list = Lib::DataMapperUtil.all(Validation::Validation,params).collect{ |v| v.validation_uri }.join("\n")+"\n" + + if request.env['HTTP_ACCEPT'] =~ /text\/html/ + related_links = + "All validations: "+url_for("/",:full)+"\n"+ + "Validation reports: "+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,@subjectid,related_links,description,post_params + else + content_type "text/uri-list" + uri_list + end end post '/training_test_split' do - content_type "text/uri-list" - task_uri = OpenTox::Task.as_task do + + task = OpenTox::Task.create( "Perform training test split validation", url_for("/training_test_split", :full) ) do |task| #, params 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] + raise OpenTox::BadRequestError.new "dataset_uri missing" unless params[:dataset_uri] + raise OpenTox::BadRequestError.new "algorithm_uri missing" unless params[:algorithm_uri] + raise OpenTox::BadRequestError.new "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])) - v = Validation::Validation.new :training_dataset_uri => params[:training_dataset_uri], + params.merge!( Validation::Util.train_test_dataset_split(params[:dataset_uri], params[:prediction_feature], + @subjectid, params[:split_ratio], params[:random_seed], OpenTox::SubTask.create(task,0,33))) + v = Validation::Validation.new :validation_type => "training_test_split", + :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.subjectid = @subjectid + v.validate_algorithm( params[:algorithm_params], OpenTox::SubTask.create(task,33,100)) v.validation_uri end - halt 202,task_uri + return_task(task) + +end + +get '/training_test_split' do + LOGGER.info "list all training-test-split-validations, params: "+params.inspect + #uri_list = Validation::Validation.find( :all, :conditions => { :validation_type => "training_test_split" } ).collect{ |v| v.validation_uri }.join("\n")+"\n" + #uri_list = Validation::Validation.all( :validation_type => "training_test_split" ).collect{ |v| v.validation_uri }.join("\n")+"\n" + params[:validation_type] = "training_test_split" + uri_list = Lib::DataMapperUtil.all(Validation::Validation,params).collect{ |v| v.validation_uri }.join("\n")+"\n" + + if request.env['HTTP_ACCEPT'] =~ /text\/html/ + related_links = + "All validations: "+url_for("/",:full)+"\n"+ + "Validation reports: "+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,@subjectid,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| + Validation::Validation.all( :finished => false ).each do |val| + LOGGER.debug "delete val with id:"+val.id.to_s+", finished is false" + deleted << val.validation_uri + #Validation::Validation.delete(val.id) + val.subjectid = @subjectid + val.delete + 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] + raise OpenTox::BadRequestError.new "dataset_uri missing" unless params[:dataset_uri] result = Validation::Util.train_test_dataset_split(params[:dataset_uri], params[:prediction_feature], params[:split_ratio], params[:random_seed]) content_type "text/uri-list" @@ -201,56 +456,115 @@ post '/plain_training_test_split' do end post '/validate_datasets' do - content_type "text/uri-list" - task_uri = OpenTox::Task.as_task do + task = OpenTox::Task.create( "Perform dataset validation", url_for("/validate_datasets", :full) ) do |task| #, params LOGGER.info "validating values "+params.inspect - halt 400, "test_dataset_uri missing" unless params[:test_dataset_uri] - halt 400, "prediction_datset_uri missing" unless params[:prediction_dataset_uri] + raise OpenTox::BadRequestError.new "test_dataset_uri missing" unless params[:test_dataset_uri] + raise OpenTox::BadRequestError.new "prediction_datset_uri missing" unless params[:prediction_dataset_uri] + params[:validation_type] = "validate_datasets" if params[:model_uri] v = Validation::Validation.new params - v.compute_validation_stats_with_model() + v.subjectid = @subjectid + v.compute_validation_stats_with_model(nil,false,task) else - halt 400, "please specify 'model_uri' or 'prediction_feature'" unless params[:prediction_feature] - halt 400, "please specify 'model_uri' or 'predicted_feature'" unless params[:predicted_feature] - halt 400, "please specify 'model_uri' or set either 'classification' or 'regression' flag" unless + raise OpenTox::BadRequestError.new "please specify 'model_uri' or 'prediction_feature'" unless params[:prediction_feature] + raise OpenTox::BadRequestError.new "please specify 'model_uri' or 'predicted_feature'" unless params[:predicted_feature] + raise OpenTox::BadRequestError.new "please specify 'model_uri' or set either 'classification' or 'regression' flag" unless params[:classification] or params[:regression] predicted_feature = params.delete("predicted_feature") - clazz = params.delete("classification")!=nil - regr = params.delete("regression")!=nil - v = Validation::Validation.new params - v.compute_validation_stats((clazz and !regr),predicted_feature) + feature_type = "classification" if params.delete("classification")!=nil + feature_type = "regression" if params.delete("regression")!=nil + v = Validation::Validation.new params + v.subjectid = @subjectid + v.compute_validation_stats(feature_type,predicted_feature,nil,nil,false,task) end - content_type "text/uri-list" v.validation_uri end - halt 202,task_uri + return_task(task) end -get '/:id/:attribute' do - LOGGER.info "access validation attribute "+params.inspect +get '/:id/predictions' do + LOGGER.info "get validation predictions "+params.inspect begin - validation = Validation::Validation.find(params[:id]) + #validation = Validation::Validation.find(params[:id]) + validation = Validation::Validation.get(params[:id]) rescue ActiveRecord::RecordNotFound => ex - halt 404, "Validation '#{params[:id]}' not found." + raise OpenTox::NotFoundError.new "Validation '#{params[:id]}' not found." end - begin - raise unless validation.attribute_loaded?(params[:attribute]) - rescue - halt 400, "Not a validation attribute: "+params[:attribute].to_s + raise OpenTox::BadRequestError.new "Validation '"+params[:id].to_s+"' not finished" unless validation.finished + p = validation.compute_validation_stats_with_model(nil, true) + 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: "+url_for("/",:full)+"\n"+ + "Correspoding validation: "+url_for("/"+params[:id],:full) + OpenTox.text_to_html p.to_array.to_yaml,@subjectid, related_links, description + else + content_type "text/x-yaml" + p.to_array.to_yaml + end +end + +#get '/:id/:attribute' do +# LOGGER.info "access validation attribute "+params.inspect +# begin +# validation = Validation::Validation.find(params[:id]) +# rescue ActiveRecord::RecordNotFound => ex +# raise OpenTox::NotFoundError.new "Validation '#{params[:id]}' not found." +# end +# begin +# raise unless validation.attribute_loaded?(params[:attribute]) +# rescue +# raise OpenTox::BadRequestError.new "Not a validation attribute: "+params[:attribute].to_s +# end +# content_type "text/plain" +# 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 +# raise OpenTox::NotFoundError.new "Validation '#{params[:id]}' not found." +# end + validation = Validation::Validation.get(params[:id]) + raise OpenTox::NotFoundError.new "Validation '#{params[:id]}' not found." unless validation + + case request.env['HTTP_ACCEPT'].to_s + when "application/rdf+xml" + content_type "application/rdf+xml" + validation.to_rdf + when /text\/html/ + content_type "text/html" + description = + "A validation resource." + related_links = + "Search for corresponding report: "+url_for("/report/validation?validation="+validation.validation_uri,:full)+"\n"+ + "Get validation predictions: "+url_for("/"+params[:id]+"/predictions",:full)+"\n"+ + "All validations: "+url_for("/",:full)+"\n"+ + "All validation reports: "+url_for("/report/validation",:full) + OpenTox.text_to_html validation.to_yaml,@subjectid,related_links,description + else #default is yaml + content_type "application/x-yaml" + validation.to_yaml end - content_type "text/plain" - return validation.send(params[:attribute]) end delete '/:id' do LOGGER.info "delete validation with id "+params[:id].to_s - begin - validation = Validation::Validation.find(params[:id]) - rescue ActiveRecord::RecordNotFound => ex - halt 404, "Validation '#{params[:id]}' not found." - end +# begin + #validation = Validation::Validation.find(params[:id]) +# rescue ActiveRecord::RecordNotFound => ex +# raise OpenTox::NotFoundError.new "Validation '#{params[:id]}' not found." +# end + validation = Validation::Validation.get(params[:id]) + validation.subjectid = @subjectid + raise OpenTox::NotFoundError.new "Validation '#{params[:id]}' not found." unless validation content_type "text/plain" - Validation::Validation.delete(params[:id]) + validation.delete end
\ No newline at end of file |