summaryrefslogtreecommitdiff
path: root/application.rb
blob: 88a2852180a7917436ae17cf697fed4551d85c9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

[ 'rubygems', 'sinatra', 'sinatra/url_for', 'dm-core', 'opentox-ruby-api-wrapper', 'datamapper', 'logger', 'opentox-validation-lib' ].each do |lib|
  require lib
end

load 'validation_service.rb'


# hack: store self in $sinatra to make url_for method accessible in validation_service
# (before is executed in every rest call, problem is that the request object is not set, until the first rest-call )
before {$sinatra = self unless $sinatra}
LOGGER = Logger.new(STDOUT)
LOGGER.datetime_format = "%Y-%m-%d %H:%M:%S "

class Sinatra::Base
  # logging halts (!= 202)
  def halt(status,msg)
    LOGGER.error "halt "+status.to_s+" "+msg.to_s if (status != 202)
    throw :halt, [status, msg] 
  end
end


## REST API
get '/crossvalidations/?' do
  LOGGER.info "list all crossvalidations"
  Crossvalidation.all.collect{ |d| url_for("/crossvalidation/", :full) + d.id.to_s }.join("\n")
end

get '/crossvalidation/:id' do
  LOGGER.info "get crossvalidation with id "+params[:id].to_s
  halt 404, "Crossvalidation #{params[:id]} not found." unless crossvalidation = Crossvalidation.get(params[:id])
  halt 202, crossvalidation.to_yaml  unless crossvalidation.finished
  crossvalidation.to_yaml
end

delete '/crossvalidation/:id/?' do
  LOGGER.info "delete crossvalidation with id "+params[:id].to_s
  halt 404, "Crossvalidation #{params[:id]} not found." unless crossvalidation = Crossvalidation.get(params[:id])
  crossvalidation.delete
end

get '/crossvalidation/:id/validations' do
  LOGGER.info "get all validations for crossvalidation with id "+params[:id].to_s
  halt 404, "Crossvalidation #{params[:id]} not found." unless crossvalidation = Crossvalidation.get(params[:id])
  Validation.all(:crossvalidation_id => params[:id]).collect{ |v| v.uri.to_s }.join("\n")+"\n"
end

post '/crossvalidation/?' do
  LOGGER.info "creating crossvalidation "+params.inspect
  halt 400, "alogrithm_uri and/or dataset_uri missing: "+params.inspect unless params[:dataset_uri] and params[:algorithm_uri]
  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 = Crossvalidation.new cv_params
  cv.create_cv_datasets
  cv.perform_cv params[:feature_service_uri]
  cv.uri
end

get '/validations/?' do
  LOGGER.info "list all validations"
  Validation.all.collect{ |d| url_for("/validation/", :full) + d.id.to_s }.join("\n")
end

get '/validation/:id' do
  LOGGER.info "get validation with id "+params[:id].to_s
  halt 404, "Validation #{params[:id]} not found." unless validation = Validation.get(params[:id])
  halt 202, validation.to_yaml  unless validation.finished
  validation.to_yaml
end

post '/validation/?' do
  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.new :model_uri => params[:model_uri], 
                     :test_dataset_uri => params[:test_dataset_uri]
    v.validate_model
  elsif params[:algorithm_uri] and params[:training_dataset_uri] and params[:test_dataset_uri] and !params[:model_uri]
   v = Validation.new :training_dataset_uri => params[:training_dataset_uri], 
                     :test_dataset_uri => params[:test_dataset_uri]
   v.validate_algorithm( params[:algorithm_uri], params[:feature_service_uri]) 
  else
    halt 400, "illegal param combination, use either (model_uri and test_dataset_uri) OR (algorithm_uri and training_dataset_uri and test_dataset_uri): "+params.inspect
  end
  
  v.uri
end

post '/validation/training_test_split' do
  LOGGER.info "creating training test split "+params.inspect
  halt 400, "dataset_uri missing" unless params[:dataset_uri]
  params.merge!(ValidationUtil.train_test_dataset_split(params[:dataset_uri], params[:split_ratio], params[:random_seed]))
  if (params[:algorithm_uri])
     v = Validation.new :training_dataset_uri => params[:training_dataset_uri], 
                     :test_dataset_uri => params[:test_dataset_uri]
     v.validate_algorithm( params[:algorithm_uri], params[:feature_service_uri]) 
  else
    v = Validation.new :training_dataset_uri => params[:training_dataset_uri], :test_dataset_uri => params[:test_dataset_uri] 
  end
  v.uri
end

get '/validation/:id/:attribute' do
  LOGGER.info "access validation attribute "+params.inspect
  halt 404, "Validation #{params[:id]} not found." unless validation = Validation.get(params[:id])
  begin
    raise unless validation.attribute_loaded?(params[:attribute])
  rescue
    halt 400, "Not a validation attribute: "+params[:attribute].to_s
  end
  return validation.send(params[:attribute])
end

delete '/validation/:id' do
  LOGGER.info "delete validation with id "+params[:id].to_s
  halt 404, "Validation #{params[:id]} not found." unless validation = Validation.get(params[:id])
  validation.delete
end