diff options
Diffstat (limited to 'lazar.rb')
-rw-r--r-- | lazar.rb | 218 |
1 files changed, 166 insertions, 52 deletions
@@ -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 |