def exhSearch(self, trainFeatureName, trainData, trainFeatureList, trainLabel, totalK, creterionFunc):
     myClassRules = classRules()
     featureList = []
     featureNoList = []
     n = len(trainFeatureList)
     combinationTuples = self.getCombinations(n, totalK)
     # print len(combinationTuples), type(combinationTuples), type(combinationTuples[0])
     combinationList = [list(i) for i in combinationTuples]
     # print len(combinationList), type(combinationList), type(combinationList[0]), len(combinationList[0]), type(combinationList[0][0])
     # featureNoList = [trainFeatureName[i] for i in combinationList[0]]
     # print featureNoList
     featureNoList = combinationList[0]
     featureList = [trainFeatureList[featureNo] for featureNo in featureNoList]
     maxJ = creterionFunc(myClassRules.DLDA, trainLabel, trainData, featureList)
     # print maxJ
     for combination in combinationList[1 : ]:
         featureList = [trainFeatureList[featureNo] for featureNo in combination]
         jValue = creterionFunc(myClassRules.DLDA, trainLabel, trainData, featureList)
         if jValue > maxJ:
             featureNoList = combination
             maxJ = jValue
     featureNameList = [trainFeatureName[i] for i in featureNoList]  
     print 'maxJ when totalK is', totalK, ':', maxJ
     return featureNameList
 def seqFwdSearch(self, trainFeatureName, trainData, trainFeatureList, trainLabel, totalK, creterionFunc):
     # preserve the original lists
     thisTrainFeatureName = trainFeatureName
     thisTrainFeatureList = trainFeatureList
     myClassRules = classRules()
     featureList = []
     featureNoList = []
     k = 0
     d = len(trainData)
     if totalK > d:
         totalK = d
     roundNo = 1
     while True:
         # print 'this is', roundNo, 'round'
         roundNo = roundNo + 1
         # classRule, trainLabel, trainData, featureData
         # print 'calculating maxJ for the first time'
         # print len(featureList + trainFeatureList[0])
         # currentFeatureList = featureList
         if len(featureList) != 0:
             # print featureList
             newFeatureList = []
             for feature in featureList:
                 newFeatureList.append(feature)
             newFeatureList.append(thisTrainFeatureList[0])
             maxJ = creterionFunc(myClassRules.DLDA, trainLabel, trainData, newFeatureList)
         else:
             maxJ = creterionFunc(myClassRules.DLDA, trainLabel, trainData, [thisTrainFeatureList[0]])
         # print len(featureList)
         # print 'maxJ value is:', maxJ
         bestFeatureNo = 0
         featureNo = 1
         for feature in thisTrainFeatureList[1: ]:
             # print 'doing the feature number:', featureNo, thisTrainFeatureName[featureNo]
             # print feature
             if featureNo in featureNoList:
                 # print 'continue'
                 continue
             # print 'now computing feature number:', featureNo
             if len(featureList) != 0:
                 newFeatureList = []
                 for features in featureList:
                     newFeatureList.append(features)
                 newFeatureList.append(feature)
                 jValue = creterionFunc(myClassRules.DLDA, trainLabel, trainData, newFeatureList)
             else:
                 # print 'no feature yet'
                 jValue = creterionFunc(myClassRules.DLDA, trainLabel, trainData, [feature])
             # print 'jValue is:', jValue
             if jValue > maxJ:
                 maxJ = jValue
                 bestFeatureNo = featureNo
                 # print maxJc
             featureNo = featureNo + 1
         featureNoList.append(thisTrainFeatureName[bestFeatureNo])
         featureList.append(thisTrainFeatureList[bestFeatureNo])
         del thisTrainFeatureList[bestFeatureNo]
         del thisTrainFeatureName[bestFeatureNo]
         # print len(thisTrainFeatureList), len(thisTrainFeatureName)
         # print featureNoList, featureList
         if len(featureNoList) == totalK:
             print 'maxJ when totalK is', totalK, ':', maxJ
             break
     return featureNoList