/**
  * Generates codebook by clustering all features in training set raw data
  *
  * @return
  */
 public boolean generateCodeBook() {
   boolean operationSuccess = false;
   database.setMode(DBMode.TRAINDATA);
   Model[][] regModels = database.readAllDataofCurrentMode();
   int totalFrames = 0;
   allFeaturesList.clear();
   // extract single list of all features
   for (int i = 0; i < regModels.length; i++) {
     for (int j = 0; j < regModels[i].length; j++) {
       GestureFeature[] gf = getFeature((RawFeature) regModels[i][j]);
       for (int k = 0; k < gf.length; k++) {
         allFeaturesList.add(gf[k]);
         totalFrames++;
       }
     }
   } //
   // single array from list
   GestureFeature[] allFeaturesArr = new GestureFeature[totalFrames];
   allFeaturesArr = allFeaturesList.toArray(new GestureFeature[0]);
   // clustering is done automatically after callng constructor
   Codebook cbk = new Codebook(getPointsFromFeatureVector(allFeaturesArr));
   cbk.saveToFile();
   operationSuccess = true;
   return operationSuccess;
 }