summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormguetlein <martin.guetlein@gmail.com>2011-11-23 17:12:14 +0100
committermguetlein <martin.guetlein@gmail.com>2011-11-23 17:12:14 +0100
commit95703c1e7d3f6e98a200cf6dfd1cfef3a0ca0479 (patch)
treea2849bb9f0f1bb6e31807cac5b68f1ce52eef72e
parentc16535924b2941e9e7316d982d8836cdb83e6b5a (diff)
enable reporting with external validations
-rwxr-xr-xreport/validation_access.rb94
-rwxr-xr-xreport/validation_data.rb2
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