summaryrefslogtreecommitdiff
path: root/example.rb
blob: f9a5529cf1dfbe82d784aad9607977aa762c4721 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

class Example
  
  @@file=File.new("data/hamster_carcinogenicity.owl","r")
  @@model=File.join @@config[:services]["opentox-model"],"1"
  @@feature="http://www.epa.gov/NCCT/dsstox/CentralFieldDef.html#ActivityOutcome_CPDBAS_Hamster"
  @@alg = File.join @@config[:services]["opentox-algorithm"],"lazar"
  @@alg_params = "feature_generation_uri="+File.join(@@config[:services]["opentox-algorithm"],"fminer")
  @@data=File.join @@config[:services]["opentox-dataset"],"1"
  @@train_data=File.join @@config[:services]["opentox-dataset"],"2"
  @@test_data=File.join @@config[:services]["opentox-dataset"],"3"
  
  @@summary=""
  
  # replaces placeholdes ( in <> brackets ) in EXAMPLE file with uris and ids
  def self.transform_example
  
    file = File.new("EXAMPLES", "r")
    res = ""
    while (line = file.gets) 
      res += line
    end
    file.close
    
    sub = { "validation_service" => @@config[:services]["opentox-validation"].chomp("/"), 
            "validation_id" => "1",
            "model_uri" => @@model,
            "dataset_uri" => @@data,
            "training_dataset_uri" => @@train_data,
            "test_dataset_uri" => @@test_data,
            "prediction_feature" => @@feature,
            "algorithm_uri" => @@alg,
            "algorithm_params" => @@alg_params,
            "crossvalidation_id" => "1",
            "validation_report_id" => "1",
            "crossvalidation_report_id" => "1",
            }
    
    sub.each do |k,v|
      res.gsub!(/<#{k}>/,v)
    end
    res
  end
  
  # creates the resources that are requested by the examples
  def self.prepare_example_resources
    
    @@summary = ""
    delete_all(@@config[:services]["opentox-dataset"])
    
    log "upload dataset"
    data = File.read(@@file.path)
    data_uri = OpenTox::RestClientWrapper.post @@config[:services]["opentox-dataset"], data, :content_type => "application/rdf+xml"

    log "train-test-validation"
    Lib::Validation.auto_migrate!
    delete_all(@@config[:services]["opentox-model"])
    split_params = Validation::Util.train_test_dataset_split(data_uri, 0.9, 1)
    v = Validation::Validation.new :training_dataset_uri => split_params[:training_dataset_uri], 
                   :test_dataset_uri => split_params[:test_dataset_uri],
                   :prediction_feature => @@feature
    v.validate_algorithm( @@alg, @@alg_params) 
    
    log "crossvalidation"
    Lib::Crossvalidation.auto_migrate!
    cv = Validation::Crossvalidation.new({ :dataset_uri => data_uri, :algorithm_uri => @@alg, :num_folds => 5, :stratified => false })
    cv.create_cv_datasets( @@feature )
    cv.perform_cv( @@alg_params )
    
    log "create validation report"
    rep = Reports::ReportService.new(File.join(@@config[:services]["opentox-validation"],"report"))
    rep.delete_all_reports("validation")
    rep.create_report("validation",v.uri)
    
    log "create crossvalidation report"
    rep.delete_all_reports("crossvalidation")
    rep.create_report("crossvalidation",cv.uri)
    
    log "done"
    @@summary
  end
  
  # performs all curl calls listed in examples after ">>>", next line is added if line ends with "\"
  def self.test_examples
    lines = transform_example.split("\n")
    curl_call = false
    curl_calls = []
    
    lines.each do |line|
      if line =~ /^\s*>>>\s*.*/
        line.gsub!(/^\s*>>>\s*/,"")
        if line =~ /.*\s*\\s*$/
          curl_call = true
          line.gsub!(/\s*\\s*$/," ")
        else
          curl_call = false
        end
        curl_calls.push( line )
      elsif curl_call
        if line =~ /.*\s*\\s*$/
          curl_call = true
          line.gsub!(/\s*\\s*$/," ")
        else
          curl_call = false
        end
        curl_calls[-1] = curl_calls[-1]+line
      end
    end
    
    @@summary = ""
    num = 0
    suc = 0
    curl_calls.each do |cmd|
      num += 1
      log "testing: "+cmd
      result = ""
      IO.popen(cmd.to_s+" 2> /dev/null") do |f| 
        while line = f.gets
          result += line
        end
      end
      result.gsub!(/\n/, " \\n ")
      if ($?==0)
        log "ok ( " +result.to_s[0,50]+" )"
        suc += 1
      else
        log "failed ( " +result.to_s[0,50]+" )"
      end
    end
    log num.to_s+"/"+num.to_s+" curls succeeded"
    @@summary  
  end
  
  private
  # deletes resources listed by service
  def self.delete_all(uri_list_service)
    uri_list = OpenTox::RestClientWrapper.get(uri_list_service)
    uri_list.split("\n").each do |uri|
      OpenTox::RestClientWrapper.delete(uri)
    end
  end
  
  # logs string and and adds to summary
  def self.log(log_string)
    LOGGER.info log_string
    @@summary += log_string+"\n"
  end
  
end