class SvmEgoSimulatorTest(unittest.TestCase):
    def setUp(self):
        logging.basicConfig(stream=sys.stdout, level=logging.INFO)
        dataDir = PathDefaults.getDataDir() + "infoDiffusion/"
        #dataDir = "/home/charanpal/Private/Postdoc/Code/APGL/data/"
        matFileName = dataDir + "EgoAlterTransmissions.mat"
        self.svmEgoSimulator = SvmEgoSimulator(matFileName)

    def testSampleExamples(self):
        self.svmEgoSimulator.sampleExamples(100)

        self.assertEquals(self.svmEgoSimulator.examplesList.getNumSampledExamples(), 100)

    def testModelSelection(self):
        Cs = [1.0, 2.0]
        kernel = "linear"
        kernelParams = [0.0]
        errorCosts = [0.1, 0.2]
        folds = 5
        sampleSize = 1000
        
        CVal, kernelParamVal, errorCost, error = self.svmEgoSimulator.modelSelection(Cs, kernel, kernelParams, errorCosts, folds, sampleSize)

        self.assertTrue(CVal in Cs)
        self.assertTrue(kernelParamVal in kernelParams)
        self.assertTrue(errorCost in errorCosts)
        self.assertTrue(error >= 0.0 and error < 1.0)

    def testEvaluateClassifier(self):
        CVal = 1.0
        kernel = "linear"
        kernelParamVal = 0.0
        errorCost = 0.5
        folds = 6
        sampleSize = 1000
        invert = False

        (means, vars) = self.svmEgoSimulator.evaluateClassifier(CVal, kernel, kernelParamVal, errorCost, folds, sampleSize, invert)


    def testTrainClassifier(self):
        CVal = 1.0
        kernel = "linear"
        kernelParamVal = 0.0
        errorCost = 0.5
        folds = 6
        sampleSize = 1000

        self.svmEgoSimulator.trainClassifier(CVal, kernel, kernelParamVal, errorCost, sampleSize)

    def testGenerateRandomGraph(self):
        egoFileName = PathDefaults.getDataDir() + "infoDiffusion/EgoData.csv"
        alterFileName = PathDefaults.getDataDir()  + "infoDiffusion/AlterData.csv"
        numVertices = 1000
        infoProb = 0.1

        
        p = 0.1
        neighbours = 10
        generator = SmallWorldGenerator(p, neighbours)
        graph = SparseGraph(VertexList(numVertices, 0))
        graph = generator.generate(graph)

        self.svmEgoSimulator.generateRandomGraph(egoFileName, alterFileName, infoProb, graph)

    def testRunSimulation(self):
        egoFileName = PathDefaults.getDataDir() + "infoDiffusion/EgoData.csv"
        alterFileName = PathDefaults.getDataDir()  + "infoDiffusion/AlterData.csv"
        numVertices = 1000
        infoProb = 0.1
        p = 0.1
        neighbours = 10

        generator = SmallWorldGenerator(p, neighbours)
        graph = SparseGraph(VertexList(numVertices, 0))
        graph = generator.generate(graph)
        
        CVal = 1.0
        kernel = "linear"
        kernelParamVal = 0.0
        errorCost = 0.5
        folds = 6
        sampleSize = 1000

        maxIterations = 5

        self.svmEgoSimulator.trainClassifier(CVal, kernel, kernelParamVal, errorCost, sampleSize)
        self.svmEgoSimulator.generateRandomGraph(egoFileName, alterFileName, infoProb, graph)
        self.svmEgoSimulator.runSimulation(maxIterations)
#List of the numbers we want to store at each simulation
quantitiesArray = numpy.zeros((simulationRepetitions, maxIterations+1))
genderDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numGenders))
ageDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numAges))
educationDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numEducations))
professionDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numProfessions))
foodRiskDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numFoodRisks))
experienceDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numExperiences))
internetFreqDistributions = numpy.zeros((simulationRepetitions, maxIterations+3, numInternets))

for i in range(0, simulationRepetitions):
    vList = VertexList(numVertices, 0)
    graph = SparseGraph(vList)
    graph = generator.generate(graph)
    simulator.generateRandomGraph(egoFileName, alterFileName, infoProb, graph)
    (totalInfo, transmissions) = simulator.runSimulation(maxIterations)

    alters = []
    egos = numpy.unique(transmissions[0][:, 0])
    quantitiesArray[i, 0] = egos.shape[0]

    for j in range(len(transmissions)):
        alters.append(numpy.unique(transmissions[j][:, 1]))
        quantitiesArray[i, 1+j] = alters[j].shape[0]

    """
    The commented features have very large ranges - we need to bin them appropriately.
    Either that, or ignore them.
    """

    genderDistributions[i, :, :] = getDistributions(genderIndex, numVertices, egos, alters, numGenders)