public static void main(String[] args) {
		
		parseParams(args);
		// TODO Auto-generated method stub
		dbWrapper.initGlobalWrappers();

        //debugPrint.print("Driver finished");
        //read in config file
        loadConfig(configFile);
        int personCount = 1;
        try {
        	
            FileReader fr = new FileReader(nameFile);
            BufferedReader br = new BufferedReader(fr);
            String nameStr = "";
            while((nameStr = br.readLine()) != null) {
            	System.out.println("---------- Person " + personCount++ + " ------------- ");
            	String[] nameArr = nameStr.split("\\|");
            	if(nameArr.length < 2) {
            		debugPrint.print("Error in name parsing, will skip");
            		continue;
            	}
            	String firstName = nameArr[0];
            	String lastName = nameArr[1];
            	debugPrint.print("Experiment on " + firstName  + " " + lastName);
            	//initialize person
                Person experimentPerson = new Person(firstName, lastName, websitesUsed);
                
                //handle case if the person was NOT in the name mapping table
                if(experimentPerson.nameMappingId.equals("ERROR")) {
                	//skip to next person
                	debugPrint.print("Error reading name mapping table for person: " + firstName + " " + lastName);
                	continue;
                }
                
                //populate initial values of person
                if(!experimentPerson.populateInitialAttributes(initialAttributeNames)){
                	debugPrint.print("Could not the sufficient ground truth values for this person");
                	continue;
                } 
                experimentPerson.outputStateToLog("After Initial Attributes Collected");
                //while inference is true, infer
                int round = 1;
                //debugPrint.print("Starting Inference");
                while(experimentPerson.infer()){
                	debugPrint.print("Infering.....round" + round,3);
                	experimentPerson.outputStateToLog("Inference Round " + round);
                	round++;
                }
                experimentPerson.outputStateToLog("After last Inference Round before population");
                //call population engine
                
                if(ExperimentConstants.doPopulationEngine) {
                	experimentPerson.populationInfer();	
                }
                
                
                experimentPerson.outputStateToLog("After last population inference engine");
                
                while(experimentPerson.infer()){
                	debugPrint.print("Infering.....round" + round,3);
                	experimentPerson.outputStateToLog("Inference Round post population" + round);
                	round++;
                }
                experimentPerson.outputStateToLog("After last Inference Round after population");
                
                /*If we find a website id as a cross site attribute, we want to add ALL attributes from
                 * that profile with an equal confidence; I do this after all other inferences finish*/
                experimentPerson.checkForCrossSiteProfiles();
                
                
                //post results to database
        		experimentPerson.outputLogToFile();
        		dbWrapper.db.postExperimentResults(experimentPerson);       	
            }
        }
        catch (IOException e) {
        	e.printStackTrace();
        }   
	}