def runAsMedianMedianProblemTest(medianHistory):
    """Runs AsMedian, requires to be installed. I got it from:
    https://sites.google.com/site/andrewweixu/Home/software/asmedian
    """
    #Dump to disk
    tempFile = os.path.join(os.getcwd(), "simulatedGenomeTempFile.txt")
    fileHandle = open(tempFile, 'w')
    fileHandle.write(medianHistory.getLeafGenomeString())
    fileHandle.close()
    #-cp /Users/benedictpaten/Desktop/ASMedian-1.0 
    popenCatch("java BIOMedian %s" % tempFile)
    os.remove(tempFile)
    #Parse in
    fileHandle = open(tempFile + ".rst", 'r')
    input = fileHandle.readlines()
    fileHandle.close()
    os.remove(tempFile + ".rst")
    asMedianMedianGenome = Genome(chromosomeNumber=0, elementNumber=0)
    for line in input[1:]:
        if line[0] == '#':
            break
        asMedianChromosome = Chromosome()
        for element in line.split()[1:]:
            asMedianChromosome.append(int(element))
        asMedianMedianGenome.addChromosome(asMedianChromosome)
    return asMedianMedianGenome
def runReferenceMedianProblemTest(medianHistory, greedyIterations,theta):
    """Runs the reference problem for a given median history
    """
    #Make adjacencies
    stubNumber = 2
    nodeNumber = len(medianHistory.getMedianGenome().getElements()) * 2 + stubNumber;
    weights = {}
    for genome in medianHistory.getLeafGenomes():
        for node1, node2, distance in genome.getTransitiveAdjacencies():
            if (node1, node2) in weights:
                weights[(node1, node2)] += weightFn(distance, theta)
            else:
                weights[(node1, node2)] = weightFn(distance, theta)
    def translateLeftSideOfElementToNode(element):
        assert element != 0
        if element < 0:        
            return abs(element) * 2
        return element * 2 + 1
    def translateLeftNodeToElement(node):
        assert node >= stubNumber
        assert node < nodeNumber
        element = node / 2 
        if (node % 2) == 0:
            element *= -1
        return element
    #Now print out the 
    input = "%i\t%i\t%i\t%i\t%s" % (greedyIterations, nodeNumber, stubNumber, len(weights.keys()), "\t".join([ "%i\t%i\t%f" % (translateLeftSideOfElementToNode(-node1), translateLeftSideOfElementToNode(node2), weights[(node1, node2)]) for (node1, node2) in weights.keys()]))
    #Command
    command = os.path.join(os.path.split(os.path.abspath(matchingAndOrdering.tests.simulatedGenome.__file__))[0], "testBin", "referenceMedianProblemTest2")
    output = popenCatch(command, input)
    medianChromosome = Chromosome()
    for adjacency in output.split():
        medianChromosome.append(translateLeftNodeToElement(int(adjacency)))
    medianGenome = Genome(chromosomeNumber=0, elementNumber=0)
    medianGenome.addChromosome(medianChromosome)
    assert medianGenome.getElements() == medianHistory.getMedianGenome().getElements()
    return medianGenome
 def testGenome(self):
     """Test basic functions of a genome
     """
     d = Genome(elementNumber=10, chromosomeNumber=3)
     self.assertEqual(d.getChromosomeNumber(), 3)
     self.assertEqual(d.getElements(), set(range(1, 11)))
     
     #Test clone
     self.assertEqual(str(d), str(d.clone()))
     
     #Test inversions
     for i in xrange(100):
         e = d.clone()
         self.assertEquals(d.getOutOfOrderDistance(e), 0)
         self.assertEquals(d.getCircularDcjDistance(e), 0)
         e.permuteByInversion()
         self.assertEquals(e.getChromosomeNumber(), 3)
         self.assertEquals(e.getElements(), d.getElements())
         self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
         self.assertTrue(d.getCircularDcjDistance(e) in [ 0, 1 ])
         
     #Test dcj
     for i in xrange(100):
         e = d.clone()
         self.assertEquals(d.getOutOfOrderDistance(e), 0)
         self.assertEquals(d.getCircularDcjDistance(e), 0)
         e.permuteByDcj()
         self.assertEquals(e.getElements(), d.getElements())
         self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
         self.assertTrue(d.getCircularDcjDistance(e) in [ 0, 1, 2 ])
     
     #Test translocations
     for i in xrange(100):
         e = d.clone()
         self.assertEquals(d.getOutOfOrderDistance(e), 0)
         self.assertEquals(d.getCircularDcjDistance(e), 0)
         e.permuteByTranslocation()
         self.assertEquals(e.getElements(), d.getElements())
         self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
         self.assertTrue(d.getCircularDcjDistance(e) in [ 0, 1, 2 ])
    def testGenome(self):
        """Test basic functions of a genome
        """
        d = Genome(elementNumber=10, chromosomeNumber=3)
        self.assertEqual(d.getChromosomeNumber(), 3)
        self.assertEqual(d.getElements(), set(range(1, 11)))

        #Test clone
        self.assertEqual(str(d), str(d.clone()))

        #Test inversions
        for i in xrange(100):
            e = d.clone()
            self.assertEquals(d.getOutOfOrderDistance(e), 0)
            self.assertEquals(d.getCircularDcjDistance(e), 0)
            e.permuteByInversion()
            self.assertEquals(e.getChromosomeNumber(), 3)
            self.assertEquals(e.getElements(), d.getElements())
            self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
            self.assertTrue(d.getCircularDcjDistance(e) in [0, 1])

        #Test dcj
        for i in xrange(100):
            e = d.clone()
            self.assertEquals(d.getOutOfOrderDistance(e), 0)
            self.assertEquals(d.getCircularDcjDistance(e), 0)
            e.permuteByDcj()
            self.assertEquals(e.getElements(), d.getElements())
            self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
            self.assertTrue(d.getCircularDcjDistance(e) in [0, 1, 2])

        #Test translocations
        for i in xrange(100):
            e = d.clone()
            self.assertEquals(d.getOutOfOrderDistance(e), 0)
            self.assertEquals(d.getCircularDcjDistance(e), 0)
            e.permuteByTranslocation()
            self.assertEquals(e.getElements(), d.getElements())
            self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
            self.assertTrue(d.getCircularDcjDistance(e) in [0, 1, 2])