summaryrefslogtreecommitdiff
path: root/report/validation_access.rb
diff options
context:
space:
mode:
authorMartin Gütlein <martin.guetlein@gmail.com>2009-11-13 11:51:21 +0100
committerMartin Gütlein <martin.guetlein@gmail.com>2009-11-13 11:51:21 +0100
commit41e5d1e6160115356c54d2907552b9a943126ae1 (patch)
tree8b011c251ecfbd69d2435d07b91e275f56fc1682 /report/validation_access.rb
parent14904ee55e85000b97fa7b735c22a82529fbdf10 (diff)
merged reports into this rep
Diffstat (limited to 'report/validation_access.rb')
-rw-r--r--report/validation_access.rb230
1 files changed, 230 insertions, 0 deletions
diff --git a/report/validation_access.rb b/report/validation_access.rb
new file mode 100644
index 0000000..b89599c
--- /dev/null
+++ b/report/validation_access.rb
@@ -0,0 +1,230 @@
+
+load "lib/validation_db.rb"
+
+# = Reports::ValidationAccess
+#
+# service that connects to the validation-service
+#
+class Reports::ValidationAccess
+
+ # initialize validation object with
+ def init_validation(validation, uri)
+ raise "not implemented"
+ end
+
+ def init_cv(validation)
+ raise "not implemented"
+ end
+
+ def get_predictions( test_dataset_uri, prediction_dataset_uri)
+ raise "not implemented"
+ end
+
+ def resolve_cv_uris(uri_list)
+ raise "not implemented"
+ end
+end
+
+class Reports::ValidationDB < Reports::ValidationAccess
+
+ def resolve_cv_uris(uri_list)
+ res = []
+ uri_list.each do |u|
+ if u.to_s =~ /.*\/crossvalidation\/[0-9]+/
+ cv_id = u.split("/")[-1].to_i
+ res += Lib::Validation.all(:crossvalidation_id => cv_id).collect{|v| v.uri.to_s}
+ else
+ res += [u.to_s]
+ end
+ end
+ res
+ end
+
+
+ def init_validation(validation, uri)
+
+ raise Reports::BadRequest.new "not a validation uri: "+uri.to_s unless uri =~ /.*\/validation\/[0-9]+/
+ validation_id = uri.split("/")[-1]
+ v = Lib::Validation.get(validation_id)
+ raise Reports::BadRequest.new "no validation found with id "+validation_id.to_s unless v
+
+ (OpenTox::Validation::VAL_PROPS + OpenTox::Validation::VAL_CV_PROPS).each do |p|
+ validation.send("#{p.to_s}=".to_sym, v.send("#{p.to_s}"))
+ end
+
+ {OpenTox::Validation::VAL_CLASS_PROP => OpenTox::Validation::VAL_CLASS_PROPS}.each do |subset_name,subset_props|
+ subset = v[subset_name]
+ subset_props.each{ |prop| validation.send("#{prop.to_s}=".to_sym, subset[prop]) } if subset
+ end
+ end
+
+ def init_cv(validation)
+
+ cv = Lib::Crossvalidation.get(validation.crossvalidation_id)
+ raise Reports::BadRequest.new "no crossvalidation found with id "+validation.crossvalidation_id.to_s unless cv
+
+ OpenTox::Validation::CROSS_VAL_PROPS.each do |p|
+ validation.send("#{p.to_s}=".to_sym, cv["#{p.to_s}".to_sym])
+ end
+ end
+
+ def get_predictions( test_dataset_uri, prediction_dataset_uri)
+ Lib::Predictions.new( test_dataset_uri, prediction_dataset_uri)
+ end
+end
+
+
+class Reports::ValidationWebservice < Reports::ValidationAccess
+
+ def resolve_cv_uris(uri_list)
+ res = []
+ uri_list.each do |u|
+ if u.to_s =~ /.*\/crossvalidation\/.*/
+ uri = u.to_s+"/validations"
+ begin
+ vali_uri_list = RestClient.get uri
+ rescue => ex
+ raise Reports::BadRequest.new "cannot get validations for cv at '"+uri.to_s+"', error msg: "+ex.message
+ end
+ res += vali_uri_list.split("\n")
+ else
+ res += [u.to_s]
+ end
+ end
+ res
+ end
+
+
+ def init_validation(validation, uri)
+
+ begin
+ data = YAML.load(RestClient.get uri)
+ rescue => ex
+ raise Reports::BadRequest.new "cannot get validation at '"+uri.to_s+"', error msg: "+ex.message
+ end
+
+ OpenTox::Validation::VAL_PROPS.each do |p|
+ validation.send("#{p.to_s}=".to_sym, data[p])
+ end
+
+ {OpenTox::Validation::VAL_CV_PROP => OpenTox::Validation::VAL_CV_PROPS,
+ OpenTox::Validation::VAL_CLASS_PROP => OpenTox::Validation::VAL_CLASS_PROPS}.each do |subset_name,subset_props|
+ subset = data[subset_name]
+ subset_props.each{ |prop| validation.send("#{prop.to_s}=".to_sym, subset[prop]) } if subset
+ end
+ end
+
+ def init_cv(validation)
+
+ raise "cv-id not set" unless validation.crossvalidation_id
+
+ cv_uri = validation.uri.split("/")[0..-3].join("/")+"/crossvalidation/"+validation.crossvalidation_id.to_s
+ begin
+ data = YAML.load(RestClient.get cv_uri)
+ rescue => ex
+ raise Reports::BadRequest.new "cannot get crossvalidation at '"+cv_uri.to_s+"', error msg: "+ex.message
+ end
+
+ OpenTox::Validation::CROSS_VAL_PROPS.each do |p|
+ validation.send("#{p.to_s}=".to_sym, data["#{p.to_s}".to_sym])
+ end
+ end
+
+ def get_predictions( test_dataset_uri, prediction_dataset_uri)
+ Lib::Predictions.new( test_dataset_uri, prediction_dataset_uri)
+ end
+end
+
+# = Reports::OTMockLayer
+#
+# does not connect to other services, provides randomly generated data
+#
+class Reports::ValidationMockLayer < Reports::ValidationAccess
+
+ NUM_DATASETS = 1
+ NUM_ALGS = 4
+ NUM_FOLDS = 5
+ NUM_PREDICTIONS = 30
+ ALGS = ["naive-bayes", "c4.5", "svm", "knn", "lazar", "id3"]
+ DATASETS = ["hamster", "mouse" , "rat", "dog", "cat", "horse", "bug", "ant", "butterfly", "rabbit", "donkey", "monkey", "dragonfly", "frog", "dragon", "dinosaur"]
+ FOLDS = [1,2,3,4,5,6,7,8,9,10]
+
+ def initialize
+
+ super
+ @algs = []
+ @datasets = []
+ @folds = []
+ sum = NUM_DATASETS*NUM_ALGS*NUM_FOLDS
+ (0..sum-1).each do |i|
+ @folds[i] = FOLDS[i%NUM_FOLDS]
+ @algs[i] = ALGS[(i/NUM_FOLDS)%NUM_ALGS]
+ @datasets[i] = DATASETS[((i/NUM_FOLDS)/NUM_ALGS)%NUM_DATASETS]
+ end
+ @count = 0
+ end
+
+ def resolve_cv_uris(uri_list)
+ res = []
+ uri_list.each do |u|
+ if u.to_s =~ /.*crossvalidation.*/
+ res += ["validation_x"]*NUM_FOLDS
+ else
+ res += [u.to_s]
+ end
+ end
+ res
+ end
+
+ def init_validation(validation, uri)
+
+ validation.model_uri = @algs[@count]
+ validation.test_dataset_uri = @datasets[@count]
+ validation.prediction_dataset_uri = "bla"
+
+ cv_id = @count/NUM_FOLDS
+ validation.crossvalidation_id = cv_id
+ validation.crossvalidation_fold = @folds[@count]
+
+ validation.auc = 0.5 + cv_id*0.02 + rand/3.0
+ validation.acc = 0.5 + cv_id*0.02 + rand/3.0
+ validation.tp = 1
+ validation.fp = 1
+ validation.tn = 1
+ validation.fn = 1
+
+ validation.algorithm_uri = @algs[@count]
+ validation.training_dataset_uri = @datasets[@count]
+ validation.test_dataset_uri = @datasets[@count]
+
+ @count += 1
+ end
+
+ def init_cv(validation)
+
+ raise "cv-id not set" unless validation.crossvalidation_id
+
+ validation.num_folds = NUM_FOLDS
+ validation.algorithm_uri = @algs[validation.crossvalidation_id.to_i * NUM_FOLDS]
+ validation.dataset_uri = @datasets[validation.crossvalidation_id.to_i * NUM_FOLDS]
+ validation.stratified = true
+ validation.random_seed = 1
+ #validation.CV_dataset_name = @datasets[validation.crossvalidation_id.to_i * NUM_FOLDS]
+ end
+
+ def get_predictions(test_dataset_uri, prediction_dataset_uri)
+
+ p = Array.new
+ c = Array.new
+ conf = Array.new
+ u = Array.new
+ (0..NUM_PREDICTIONS).each do |i|
+ p.push rand(2)
+ c.push rand(2)
+ conf.push rand
+ u.push("compound no"+(i+1).to_s)
+ end
+ Lib::MockPredictions.new( p, c, conf, u )
+ end
+
+ end