def trainSVM(self, numclass, numfull, numpartial):
        """The trainer function"""

        fio = FileIO()
        normalProb = []

        import os
        path = self.trainingAdress + self.name

        #Check if the save directory exists
        if not os.path.exists(path):
            os.mkdir(path)

        import imp
        try:
            imp.find_module('pycuda')
            found = True
        except ImportError:
            found = False

        #For every group
        for i in range(len(self.files)):
            #Get k for this group
            k = self.klist[i]

            #Saving name for the specific group
            trainingName = '%s_%i__CFPK_%i_%i_%i_%i' % ('training',i, numclass, numfull, numpartial, k)
            trainingpath = path +'/'+ trainingName

            #Get features for this group
            features, isFull, classId, names, folderlist = self.getFeatures(i,numclass,numfull,numpartial,self.getTrainingDataFrom)


            #Get clusters for this group
            if not found:
                if(self.debugMode):
                    print "--------Training is Done With NORMAL CKMEANS--------"

                from complexCKMeans import *
                ckmeans = ComplexCKMeans(features, isFull, classId, k = k)
                kmeansoutput = ckmeans.getCKMeans()
            else:
                if(self.debugMode):
                    print "--------Training is Done With CUDA--------"

                from complexcudackmeans import *
                clusterer = complexCudaCKMeans(features, k, classId, isFull)  # FEATURES : N x 720
                clusters, centers = clusterer.cukmeans()
                kmeansoutput = [clusters, centers]

            #Train svm in this group

            trainer = Trainer(kmeansoutput, classId, features)
            heteClstrFeatureId, heteClstrId = trainer.getHeterogenousClusterId()
            trainer.trainSVM(heteClstrFeatureId, trainingpath)
            fio.saveTraining(names, classId, isFull, features, kmeansoutput,
                             trainingpath, trainingName)


            #NOW CALCULATE THE CENTER OF THE GROUP
            nowCenter = np.zeros(len(features[0]))
            totalNumOfInstances = len(features)
            for cluster in kmeansoutput[0]:
                for instance in cluster:
                    nowCenter += features[instance]
            nowCenter = nowCenter/totalNumOfInstances

            #SAVE THE CENTER
            fio.saveOneFeature(trainingpath +'/' + str(i) + "__Training_Center_",nowCenter)

            #Add total num of instances for calculating normalprob
            normalProb.append(totalNumOfInstances)

        #NOW CREATE Normal PROB
        kj = 0
        for i in normalProb:
            kj += i
        for i in range(len(normalProb)):
            normalProb[i] = float(normalProb[i])/kj


        #Save some important stuff  (MOSTLY FOR PASSING PRIORPROB to the predictor
        trainingInfo = {'normalProb':normalProb, 'numclass':numclass, 'numfull':numfull, 'numpartial':numpartial, 'numTrain':len(self.files),
                        'files':self.files, 'klist':self.klist}
        np.save(path+'/trainingInfo.npy', trainingInfo)