//package uk.ac.man.cs.lethe.internal.dl
//
//import java.io.{BufferedWriter, File, FileWriter}
//
//import scala.collection.JavaConverters._
//import org.semanticweb.owlapi.apibinding.OWLManager
//import org.semanticweb.owlapi.model.{OWLAxiom, OWLEntity, OWLOntology}
//import org.semanticweb.owlapi.model.parameters.Imports
//import uk.ac.man.cs.lethe.internal.dl.owlapi.ModuleExtractor.genuineModule
//import uk.ac.man.cs.lethe.internal.dl.owlapi.{ModuleExtractor, OWLApiInterface}
//
//import scala.collection.mutable
//import scala.util.Random
//
//object SignatureGenerator {
//
//  def main(args: Array[String]) = {
//    if(args.isEmpty){
//      println("Usage: ")
//      println("SignatureGenerator [moduleBased|axiomBased|random] OWL_ONTOLOGY SIGNATURE_SIZE SAMPLE_SIZE")
//      System.exit(0)
//    }
//
//    val ontPath = args(1)
//
//    val ontology = OWLManager.createOWLOntologyManager().loadOntologyFromOntologyDocument(new File(ontPath))
//
//    val signatureGenerator = args(0) match {
//      case "moduleBased" => moduleBased(ontology)
//      case "axiomBased" => axiomBased(ontology)
//      case "random" => randomSignatureGenerator(ontology)
//    }
//
//    val sigSize = args(2).toInt
//    val sampleSize = args(3).toInt
//
//    for(i <- 1 to sampleSize) {
//
//
//      val file = new File(ontPath+"."+i+".signature")
//
//      if(!file.exists()) {
//
//        val signature = signatureGenerator.getSignature(sigSize)
//
//        val bw = new BufferedWriter(new FileWriter(file))
//        signature.foreach(s => bw.write(s.toString + "\n"))
//        bw.close()
//      }
//    }
//  }
//
//  def moduleBased(owlOntology: OWLOntology) = new SignatureGenerator {
//    val axioms = mutable.ArraySeq() ++ owlOntology.logicalAxioms(Imports.EXCLUDED).iterator().asScala
//
//    val signatureSize = owlOntology.signature(Imports.EXCLUDED).iterator().asScala.size
//
//    override def getSignature(size: Int): Set[OWLEntity] = {
//
//      assert(size<signatureSize)
//
//      var excludeAxioms = Set[OWLAxiom]()
//
//      var currentSig = Set[OWLEntity]()
//
//      while(currentSig.size<=size) {
//
//        assert(excludeAxioms.size<axioms.size)
//
//        val randomAxiom = axioms(Random.nextInt(axioms.size))
//        if(!excludeAxioms.contains(randomAxiom)) {
//          val module = ModuleExtractor.genuineModule(owlOntology, randomAxiom)
//          println("Module size: " + module.size)
//          module.foreach(_.signature().forEach(currentSig += _))
//          excludeAxioms ++= module
//        }
//      }
//
//      Random.shuffle(currentSig).take(size).toSet
//    }
//
//
//  }
//
//  def axiomBased(owlOntology: OWLOntology) = new SignatureGenerator {
//    val axioms = mutable.ArraySeq() ++ owlOntology.logicalAxioms(Imports.EXCLUDED).iterator().asScala
//
//
//    val signatureSize = owlOntology.signature(Imports.EXCLUDED).iterator().asScala.size
//
//    override def getSignature(size: Int): Set[OWLEntity] = {
//
//      var excludeAxioms = Set[OWLAxiom]()
//
//      assert(size<signatureSize)
//
//      println("extracting..")
//
//      var result = Set[OWLEntity]()
//
//      while(result.size<size){
//        val axiom = axioms(Random.nextInt(axioms.size))
//        var sigS: Set[OWLEntity] = axiom.classesInSignature().iterator().asScala.toSet ++
//        axiom.objectPropertiesInSignature().iterator.asScala.toSet
//        sigS --= result
//        val sig = sigS.toList
//        if(sig.isEmpty) {
//          excludeAxioms += axiom
//          assert(excludeAxioms.size < axioms.size)
//        } else {
//          val entity = sig(Random.nextInt(sig.size))
//          println(entity)
//          result += entity
//        }
//      }
//
//      result
//    }
//  }
//
//  def randomSignatureGenerator(owlOntology: OWLOntology) = new SignatureGenerator {
//    val signature = owlOntology.classesInSignature(Imports.EXCLUDED).iterator().asScala.toList ++
//      owlOntology.objectPropertiesInSignature(Imports.EXCLUDED).iterator().asScala.toList
//    override def getSignature(size: Int) = {
//
//      Random.shuffle(signature).take(size).toSet
//    }
//  }
//
//}
//
//trait SignatureGenerator {
//  def getSignature(size: Int): Set[OWLEntity]
//}