From 95703c1e7d3f6e98a200cf6dfd1cfef3a0ca0479 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 23 Nov 2011 17:12:14 +0100 Subject: enable reporting with external validations --- report/validation_access.rb | 94 ++++++++++++++++++++++++++++++--------------- report/validation_data.rb | 2 +- 2 files changed, 63 insertions(+), 33 deletions(-) diff --git a/report/validation_access.rb b/report/validation_access.rb index 299b124..3b5335c 100755 --- a/report/validation_access.rb +++ b/report/validation_access.rb @@ -7,27 +7,37 @@ require "lib/validation_db.rb" # class Reports::ValidationDB + def same_service?(uri) + self_uri = URI.parse($url_provider.url) + val_uri = URI.parse(uri) + self_uri.host == val_uri.host && self_uri.port == val_uri.port + end + def resolve_cv_uris(validation_uris, identifier=nil, subjectid=nil) res = {} count = 0 validation_uris.each do |u| + if u.to_s =~ /.*\/crossvalidation\/[0-9]+/ - cv_id = u.split("/")[-1].to_i cv = nil + cv_id = u.split("/")[-1].to_i + val_uris = nil - raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+u.to_s if - AA_SERVER and !OpenTox::Authorization.authorized?(u,"GET",subjectid) -# begin -# #cv = Lib::Crossvalidation.find( cv_id ) -# rescue => ex -# raise "could not access crossvalidation with id "+validation_id.to_s+", error-msg: "+ex.message -# end - cv = Validation::Crossvalidation.get( cv_id ) - raise OpenTox::NotFoundError.new "crossvalidation with id "+cv_id.to_s+" not found" unless cv - raise OpenTox::BadRequestError.new("crossvalidation with id '"+cv_id.to_s+"' not finished") unless cv.finished - #res += Validation::Validation.find( :all, :conditions => { :crossvalidation_id => cv_id } ).collect{|v| v.validation_uri.to_s} - Validation::Validation.find( :crossvalidation_id => cv_id, :validation_type => "crossvalidation" ).each do |v| - res[v.validation_uri.to_s] = identifier ? identifier[count] : nil + if same_service?u + raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+u.to_s if + AA_SERVER and !OpenTox::Authorization.authorized?(u,"GET",subjectid) + cv = Validation::Crossvalidation.get( cv_id ) + raise OpenTox::NotFoundError.new "crossvalidation with id "+cv_id.to_s+" not found" unless cv + raise OpenTox::BadRequestError.new("crossvalidation with id '"+cv_id.to_s+"' not finished") unless cv.finished + #res += Validation::Validation.find( :all, :conditions => { :crossvalidation_id => cv_id } ).collect{|v| v.validation_uri.to_s} + val_uris = Validation::Validation.find( :crossvalidation_id => cv_id, :validation_type => "crossvalidation" ).collect{|v| v.validation_uri.to_s} + else + val_base_uri = u.gsub(/\/crossvalidation\/[0-9]+/,"") + val_uris = OpenTox::RestClientWrapper.get( val_base_uri+"?crossvalidation_id="+cv_id.to_s+"&validation_type=crossvalidation", {:subjectid => subjectid, :accept => "text/uri-list" }).split("\n") + end + + val_uris.each do |v_uri| + res[v_uri] = identifier ? identifier[count] : nil end else res[u.to_s] = identifier ? identifier[count] : nil @@ -43,34 +53,49 @@ class Reports::ValidationDB validation_id = uri.split("/")[-1] raise OpenTox::BadRequestError.new "invalid validation id "+validation_id.to_s unless validation_id!=nil and (validation_id.to_i > 0 || validation_id.to_s=="0" ) + v = nil - raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+uri.to_s if - AA_SERVER and !OpenTox::Authorization.authorized?(uri,"GET",subjectid) - v = Validation::Validation.get(validation_id) + + if same_service? uri + raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+uri.to_s if + AA_SERVER and !OpenTox::Authorization.authorized?(uri,"GET",subjectid) + v = Validation::Validation.get(validation_id) + else + v = YAML::load(OpenTox::RestClientWrapper.get uri, {:subjectid=>subjectid, :accept=>"application/serialize"}) + end raise OpenTox::NotFoundError.new "validation with id "+validation_id.to_s+" not found" unless v raise OpenTox::BadRequestError.new "validation with id "+validation_id.to_s+" is not finished yet" unless v.finished - (Validation::VAL_PROPS + Validation::VAL_CV_PROPS).each do |p| validation.send("#{p.to_s}=".to_sym, v.send(p)) end + # set uris manually, in case external validation is used + validation.validation_uri = uri + validation.crossvalidation_uri = uri.gsub(/\/[0-9]+/,"")+"/crossvalidation/"+validation.crossvalidation_id if validation.crossvalidation_id!=nil + {:classification_statistics => Validation::VAL_CLASS_PROPS, :regression_statistics => Validation::VAL_REGR_PROPS}.each do |subset_name,subset_props| subset = v.send(subset_name) - subset_props.each{ |prop| validation.send("#{prop.to_s}=".to_sym, subset[prop]) } if subset + subset_props.each{ |prop| validation.send("#{prop.to_s}=".to_sym, subset[prop]) } if subset end end def init_validation_from_cv_statistics( validation, cv_uri, subjectid=nil ) raise OpenTox::BadRequestError.new "not a crossvalidation uri: "+cv_uri.to_s unless cv_uri.uri? and cv_uri =~ /crossvalidation.*\/[0-9]+$/ - cv_id = cv_uri.split("/")[-1] - raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+cv_uri.to_s if - AA_SERVER and !OpenTox::Authorization.authorized?(cv_uri,"GET",subjectid) - cv = Validation::Crossvalidation.get(cv_id) - raise OpenTox::NotFoundError.new "crossvalidation with id "+crossvalidation_id.to_s+" not found" unless cv - raise OpenTox::BadRequestError.new "crossvalidation with id "+crossvalidation_id.to_s+" is not finished yet" unless cv.finished - v = Validation::Validation.from_cv_statistics(cv_id, subjectid) + + if same_service?cv_uri + cv_id = cv_uri.split("/")[-1] + raise OpenTox::NotAuthorizedError.new "Not authorized: GET "+cv_uri.to_s if + AA_SERVER and !OpenTox::Authorization.authorized?(cv_uri,"GET",subjectid) + cv = Validation::Crossvalidation.get(cv_id) + raise OpenTox::NotFoundError.new "crossvalidation with id "+crossvalidation_id.to_s+" not found" unless cv + raise OpenTox::BadRequestError.new "crossvalidation with id "+crossvalidation_id.to_s+" is not finished yet" unless cv.finished + v = Validation::Validation.from_cv_statistics(cv_id, subjectid) + else + cv = YAML::load(OpenTox::RestClientWrapper.get cv_uri, {:subjectid=>subjectid, :accept=>"application/serialize"}) + v = YAML::load(OpenTox::RestClientWrapper.get cv_uri+"/statistics", {:subjectid=>subjectid, :accept=>"application/serialize"}) + end (Validation::VAL_PROPS + Validation::VAL_CV_PROPS).each do |p| validation.send("#{p.to_s}=".to_sym, v.send(p)) end @@ -84,20 +109,25 @@ class Reports::ValidationDB validation.send("#{p.to_s}=".to_sym, cv.send(p.to_s)) end validation.crossvalidation_uri = cv_uri + validation.validation_uri = cv_uri+"/statistics" end - def init_cv(validation) - - #cv = Lib::Crossvalidation.find(validation.crossvalidation_id) - cv = Validation::Crossvalidation.get(validation.crossvalidation_id) - raise OpenTox::BadRequestError.new "no crossvalidation found with id "+validation.crossvalidation_id.to_s unless cv + def init_cv(validation, subjectid) + cv = nil + if same_service?validation.crossvalidation_uri + cv = Validation::Crossvalidation.get(validation.crossvalidation_id) + raise OpenTox::BadRequestError.new "no crossvalidation found with id "+validation.crossvalidation_id.to_s unless cv + else + cv = YAML::load(OpenTox::RestClientWrapper.get validation.crossvalidation_uri, {:subjectid=>subjectid, :accept=>"application/serialize"}) + end Validation::CROSS_VAL_PROPS.each do |p| - validation.send("#{p.to_s}=".to_sym, cv.send(p.to_s)) + validation.send("#{p.to_s}=".to_sym, cv.send(p.to_s)) end end def get_predictions(validation, subjectid=nil, task=nil) + Lib::OTPredictions.new( validation.feature_type, validation.test_dataset_uri, validation.test_target_dataset_uri, validation.prediction_feature, validation.prediction_dataset_uri, validation.predicted_variable, validation.predicted_confidence, subjectid, task) diff --git a/report/validation_data.rb b/report/validation_data.rb index f5ecae7..61761ab 100755 --- a/report/validation_data.rb +++ b/report/validation_data.rb @@ -148,7 +148,7 @@ module Reports # loads all crossvalidation attributes, of the corresponding cv into this object def load_cv_attributes raise "crossvalidation-id not set" unless @crossvalidation_id - Reports.validation_access.init_cv(self) + Reports.validation_access.init_cv(self, @subjectid) # load cv report ids = Reports.persistance.list_reports("crossvalidation",{:crossvalidation=>self.crossvalidation_uri.to_s }) @crossvalidation_report_uri = ReportService.instance.get_uri("crossvalidation",ids[-1]) if ids and ids.size>0 -- cgit v1.2.3