summaryrefslogtreecommitdiff
path: root/lazar.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lazar.rb')
-rw-r--r--lazar.rb218
1 files changed, 166 insertions, 52 deletions
diff --git a/lazar.rb b/lazar.rb
index b646ad0..57f6842 100644
--- a/lazar.rb
+++ b/lazar.rb
@@ -1,6 +1,7 @@
require 'rubygems'
require 'opentox-ruby'
require 'test/unit'
+require "./validate-owl.rb"
class Float
def round_to(x)
@@ -12,81 +13,194 @@ class LazarTest < Test::Unit::TestCase
def setup
@predictions = []
- @models = []
+ @compounds = []
+ @files = []
+ @dump_dir = FileUtils.mkdir_p File.join(File.dirname(__FILE__),"dump",File.basename(__FILE__,".rb"))
+ FileUtils.mkdir_p File.join(File.dirname(__FILE__),"reference",File.basename(__FILE__,".rb"))
end
- def teardown
- @predictions.each {|p| p.delete(@@subjectid)}
- @models.each {|m| m.delete(@@subjectid)}
+ def dump(object,file)
+ @files << file
+ FileUtils.mkdir_p File.dirname(file)
+ File.open(file,"w+"){|f| f.puts object.to_yaml}
end
-=begin
-=end
- def test_create_regression_model
- model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => @@regression_training_dataset.uri, :subjectid => @@subjectid}).to_s
- lazar = OpenTox::Model::Lazar.find model_uri, @@subjectid
- @models << lazar
- compound = OpenTox::Compound.from_smiles("c1ccccc1NN")
- prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => @@subjectid).to_s
+ def create_model(params)
+ params[:subjectid] = @@subjectid
+ model_uri = OpenTox::Algorithm::Lazar.new.run(params).to_s
+ @model = OpenTox::Model::Lazar.find model_uri, @@subjectid
+ dump @model, File.join(@dump_dir,caller[0][/`.*'/][1..-2],"model")+".yaml"
+ end
+
+ def predict_compound(compound)
+ @compounds << compound
+ prediction_uri = @model.run(:compound_uri => compound.uri, :subjectid => @@subjectid)
prediction = OpenTox::LazarPrediction.find(prediction_uri, @@subjectid)
@predictions << prediction
- #assert_equal prediction.value(compound).round_to(4), 0.3469.round_to(4)
- assert_equal prediction.value(compound).round_to(4), 0.3996.round_to(4)
- #assert_equal prediction.confidence(compound).round_to(4), 0.3223.round_to(4)
- assert_equal prediction.confidence(compound).round_to(4), 0.2758.round_to(4)
- #assert_equal prediction.neighbors(compound).size, 73
- assert_equal prediction.neighbors(compound).size, 61
- assert_equal 219, lazar.features.size
- #assert_equal 185, lazar.features.size
+ dump prediction, File.join(@dump_dir,caller[0][/`.*'/][1..-2],"compound_prediction")+@compounds.size.to_s+".yaml"
end
- def test_classification_model
-
- # create model
- model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => @@classification_training_dataset.uri, :subjectid => @@subjectid}).to_s
- lazar = OpenTox::Model::Lazar.find model_uri, @@subjectid
- @models << lazar
- assert_equal lazar.features.size, 52
-
- # single prediction
- compound = OpenTox::Compound.from_smiles("c1ccccc1NN")
- prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => @@subjectid)
+ def predict_dataset(dataset)
+ prediction_uri = @model.run(:dataset_uri => dataset.uri, :subjectid => @@subjectid)
prediction = OpenTox::LazarPrediction.find(prediction_uri, @@subjectid)
@predictions << prediction
- assert_equal prediction.value(compound), false
- assert_equal prediction.confidence(compound).round_to(4), 0.3067.round_to(4)
- assert_equal prediction.neighbors(compound).size, 14
+ dump prediction, File.join(@dump_dir,caller[0][/`.*'/][1..-2],"dataset_prediction")+".yaml"
+ end
- # dataset activity
- compound = OpenTox::Compound.from_smiles("CNN")
- prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => @@subjectid)
- prediction = OpenTox::LazarPrediction.find prediction_uri, @@subjectid
- @predictions << prediction
- assert !prediction.measured_activities(compound).empty?
- assert_equal prediction.measured_activities(compound).first, true
- assert prediction.value(compound).nil?
+ def cleanup # executed only when assertions succeed (teardown is called even when assertions fail)
+ @files.each do |f|
+ reference = f.sub(/dump/,"reference")
+ FileUtils.mkdir_p File.dirname(reference)
+ FileUtils.cp f, reference
+ FileUtils.rm f
+ end
+ @predictions.each do |dataset|
+ dataset.delete(@@subjectid)
+ end
+ @model.delete(@@subjectid)
+ end
+=begin
+=end
+ def test_create_regression_model
+ create_model :dataset_uri => @@regression_training_dataset.uri
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 0.421.round_to(2), @predictions.first.value(@compounds.first).round_to(2)
+ assert_equal 0.262.round_to(3), @predictions.first.confidence(@compounds.first).round_to(3)
+ assert_equal 123, @predictions.first.neighbors(@compounds.first).size
+ cleanup
+ end
+
+ def test_create_regression_prop_model
+ create_model :dataset_uri => @@regression_training_dataset.uri, :local_svm_kernel => "propositionalized"
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 0.262.round_to(3), @predictions.first.confidence(@compounds.first).round_to(3)
+ assert_equal 123, @predictions.first.neighbors(@compounds.first).size
+ assert_equal 131, @model.features.size
+ cleanup
+ end
+
+ def test_classification_model
+ create_model :dataset_uri => @@classification_training_dataset.uri
+ # single prediction
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ # dataset activity
+ predict_compound OpenTox::Compound.from_smiles("CNN")
# dataset prediction
- test_dataset = OpenTox::Dataset.create_from_csv_file("data/multicolumn.csv", @@subjectid)
- prediction = OpenTox::LazarPrediction.find lazar.run(:dataset_uri => test_dataset.uri, :subjectid => @@subjectid), @@subjectid
- @predictions << prediction
- assert_equal prediction.compounds.size, 4
- compound = OpenTox::Compound.from_smiles "CC(=Nc1ccc2c(c1)Cc1ccccc21)O"
- assert_equal prediction.value(compound), nil
- assert_equal prediction.measured_activities(compound).first, true
+ predict_dataset OpenTox::Dataset.create_from_csv_file("data/multicolumn.csv", @@subjectid)
+ # assertions
+ # single prediction
+ assert_equal "false", @predictions[0].value(@compounds[0])
+ assert_equal 0.2938.round_to(4), @predictions[0].confidence(@compounds[0]).round_to(4)
+ assert_equal 16, @predictions[0].neighbors(@compounds[0]).size
+ # dataset activity
+ assert !@predictions[1].measured_activities(@compounds[1]).empty?
+ assert_equal "true", @predictions[1].measured_activities(@compounds[1]).first.to_s
+ assert @predictions[1].value(@compounds[1]).nil?
+ # dataset prediction
+ c = OpenTox::Compound.from_smiles("CC(=Nc1ccc2c(c1)Cc1ccccc21)O")
+ assert_equal nil, @predictions[2].value(c)
+ assert_equal "true", @predictions[2].measured_activities(c).first.to_s
+ c = OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal "false", @predictions[2].value(c)
+ assert_equal 0.2938.round_to(4) , @predictions[2].confidence(c).round_to(4)
+ # model
+ assert_equal 41, @model.features.size
+ cleanup
+ end
+
+ def test_classification_svm_model
+
+ create_model :dataset_uri => @@classification_training_dataset.uri, :prediction_algorithm => "local_svm_classification"
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ predict_dataset OpenTox::Dataset.create_from_csv_file("data/multicolumn.csv", @@subjectid)
+
+ assert_equal "false", @predictions[0].value(@compounds[0])
+ assert_equal 0.3952.round_to(4), @predictions[0].confidence(@compounds[0]).round_to(4)
+ assert_equal 16, @predictions[0].neighbors(@compounds[0]).size
+
+ c = OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 4, @predictions[1].compounds.size
+ assert_equal "false", @predictions[1].value(c)
+
+ assert_equal 41, @model.features.size
+ cleanup
+ end
+
+ def test_classification_svm_prop_model
+
+ create_model :dataset_uri => @@classification_training_dataset.uri, :prediction_algorithm => "local_svm_classification", :local_svm_kernel => "propositionalized"
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ predict_dataset OpenTox::Dataset.create_from_csv_file("data/multicolumn.csv", @@subjectid)
+
+ assert_equal "false", @predictions[0].value(@compounds[0])
+ #assert_equal 0.2938.round_to(4), @predictions[0].confidence(@compounds[0]).round_to(4)
+ assert_equal 0.3952.round_to(4), @predictions[0].confidence(@compounds[0]).round_to(4)
+ assert_equal 16, @predictions[0].neighbors(@compounds[0]).size
+
+ c = OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 4, @predictions[1].compounds.size
+ assert_equal "false", @predictions[1].value(c)
+
+ assert_equal 41, @model.features.size
+ cleanup
+ end
+
+ def test_regression_mlr_prop_model
+ create_model :dataset_uri => @@regression_training_dataset.uri, :prediction_algorithm => "local_mlr_prop"
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 0.262, @predictions.first.confidence(@compounds.first).round_to(3)
+ assert_equal 0.168, @predictions.first.value(@compounds.first).round_to(3)
+ assert_equal 123, @predictions.first.neighbors(@compounds.first).size
+ assert_equal 131, @model.features.size
+ end
+
+ def test_regression_mlr_prop_conf_stdev
+ create_model :dataset_uri => @@regression_training_dataset.uri, :prediction_algorithm => "local_mlr_prop", :conf_stdev => "true"
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 0.056, @predictions.first.confidence(@compounds.first).round_to(3)
+ assert_equal 0.168, @predictions.first.value(@compounds.first).round_to(3)
+ assert_equal 123, @predictions.first.neighbors(@compounds.first).size
+ assert_equal 131, @model.features.size
+ end
+
+
+ def test_regression_mlr_prop_weighted_model
+ create_model :dataset_uri => @@regression_training_dataset.uri, :prediction_algorithm => "local_mlr_prop", :nr_hits => "true"
+ predict_compound OpenTox::Compound.from_smiles("c1ccccc1NN")
+ assert_equal 0.453, @predictions.first.confidence(@compounds.first).round_to(3)
+ assert_equal 0.265, @predictions.first.value(@compounds.first).round_to(3)
+ assert_equal 253, @predictions.first.neighbors(@compounds.first).size
+ assert_equal 131, @model.features.size
+ end
+
+ def test_conf_stdev
+ params = {:sims => [0.6,0.72,0.8], :acts => [1,1,1], :neighbors => [1,1,1], :conf_stdev => true} # stdev = 0
+ params2 = {:sims => [0.6,0.7,0.8], :acts => [3.4,2,0.6], :neighbors => [1,1,1,1], :conf_stdev => true } # stev ~ 1.4
+ params3 = {:sims => [0.6,0.7,0.8], :acts => [1,1,1], :neighbors => [1,1,1], }
+ params4 = {:sims => [0.6,0.7,0.8], :acts => [3.4,2,0.6], :neighbors => [1,1,1] }
+ 2.times {
+ assert_in_delta OpenTox::Algorithm::Neighbors::get_confidence(params), 0.72, 0.0001
+ assert_in_delta OpenTox::Algorithm::Neighbors::get_confidence(params2), 0.172617874759125, 0.0001
+ assert_in_delta OpenTox::Algorithm::Neighbors::get_confidence(params3), 0.7, 0.0001
+ assert_in_delta OpenTox::Algorithm::Neighbors::get_confidence(params4), 0.7, 0.0001
+ }
end
+
=begin
def test_ambit_classification_model
# create model
- dataset_uri = "http://apps.ideaconsult.net:8080/ambit2/dataset/9"
+ dataset_uri = "http://apps.ideaconsult.net:8080/ambit2/dataset/9?max=400"
feature_uri ="http://apps.ideaconsult.net:8080/ambit2/feature/21573"
#model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => dataset_uri, :prediction_feature => feature_uri}).to_s
#lazar = OpenTox::Model::Lazar.find model_uri
model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => dataset_uri, :prediction_feature => feature_uri, :subjectid => @@subjectid}).to_s
+ validate_owl model_uri,@@subjectid
lazar = OpenTox::Model::Lazar.find model_uri, @@subjectid
- assert_equal lazar.features.size, 6609
+ puts lazar.features.size
+ assert_equal lazar.features.size, 1874
#puts "Model: #{lazar.uri}"
#puts lazar.features.size
@@ -98,7 +212,7 @@ class LazarTest < Test::Unit::TestCase
prediction = OpenTox::LazarPrediction.find(prediction_uri, @@subjectid)
#puts "Prediction: #{prediction.uri}"
#puts prediction.value(compound)
- assert_equal prediction.value(compound), true
+ assert_equal prediction.value(compound), "3.0"
#puts @prediction.confidence(compound).round_to(4)
#assert_equal @prediction.confidence(compound).round_to(4), 0.3005.round_to(4)
#assert_equal @prediction.neighbors(compound).size, 15