summaryrefslogtreecommitdiff
path: root/lib/model.rb
blob: 3fb713f8f4534ece7c6ab6b4c0efc9a6beaddda5 (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
module OpenTox
	module Model

		class Generic

      MODEL_ATTRIBS = [:uri, :title, :creator, :date, :format, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :algorithm]
      MODEL_ATTRIBS.each{ |a| attr_accessor(a) }

			def self.find(uri)
				owl = OpenTox::Owl.from_uri(uri, "Model")
        return self.new(owl)
      end
      
      def self.to_rdf(model)
        owl = OpenTox::Owl.create 'Model', model.uri
        (MODEL_ATTRIBS - [:uri]).each do |a|
          owl.set(a.to_s,model.send(a.to_s))
        end
        owl.rdf
      end
      
      protected
      def initialize(owl)
        [:date, :creator, :title, :format, :algorithm, :dependentVariables, 
         :independentVariables, :predictedVariables, :trainingDataset].each do |a|
            self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))
        end
        @uri = owl.uri 
        if ENV['RACK_ENV'] =~ /test|debug/
          begin
            raise "uri invalid" unless Utils.is_uri?(@uri)
            raise "no algorithm" unless @algorithm and @algorithm.size>0
            raise "no dependent variables" unless @dependentVariables and @dependentVariables.size>0 
            raise "no indenpendent variables" unless @independentVariables
            raise "no predicted variables" unless @predictedVariables and @predictedVariables.size>0
          rescue => ex
            RestClientWrapper.raise_uri_error "invalid model: '"+ex.message+"'\n"+self.to_yaml+"\n",@uri.to_s    
          end
        end
			end
	 end
  
   class PredictionModel < Generic
     
     def self.build( algorithm_uri, algorithm_params )
        
       if algorithm_uri =~ /ambit2/
         LOGGER.warn "Ambit hack, replacing 'prediction_feature' with 'target'"
         algorithm_params[:target] = algorithm_params[:prediction_feature]
         algorithm_params.delete(:prediction_feature)
       end
       
       LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s
       uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s
       LOGGER.debug "Build model done: "+uri.to_s
       RestClientWrapper.raise_uri_error("Invalid build model result: '"+uri.to_s+"'", algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri)
       return PredictionModel.find(uri)
     end
    
     def predict_dataset( dataset_uri )

       LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s
       uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri})
       RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri)
       uri
     end
    
     def classification?
       #HACK replace with request to ontology server
       if @title =~ /lazar classification/
         return true
       elsif @uri =~/ntua/ and @title =~ /mlr/
         return false
       elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/
         return false
       elsif @uri =~/ambit2/ and @title =~ /pKa/
         return false
       elsif @uri =~/majority/
         return (@uri =~ /class/) != nil
       else
         raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'"
       end
     end
   end
  
   
		class Lazar < Generic
      
      attr_accessor :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features
      
			def initialize
				@source = "http://github.com/helma/opentox-model"
				@algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar")
				#@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative")
				@features = []
				@effects = {}
				@activities = {}
				@p_values = {}
				@fingerprints = {}
			end

			def save
				@features.uniq!
			  resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
			  resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s
			end

			def self.find_all
				RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n")
			end
		end
	end
end