public boolean infer() {
		boolean retVal = false;
		boolean indivResult = false;
		boolean crossResult = false;
		
		//setup value filter list BEFORE the loop for websites
		//otherwise each website will affect the next
		ArrayList<Attribute> filterList = new ArrayList<Attribute>();
		for(Attribute attr: coreAttributes.values()){
			filterList.add(attr);
		}
		
		// Handle Individual Website inference
		for(String website: websites.keySet()) {
			debugPrint.print("Now infering from: " + website, 3);
			ProfileSet ps = websites.get(website);
			ps.clear();
			//debugPrint.print("Getting profiles...");
			ps.getProfiles(firstName, lastName, website, nameMappingId);

			debugPrint.print("Filtering profiles....",3);
			ps.filterProfiles(filterList);
			//debugPrint.print("Calculating individual website attributes....");
			ps.calculateWebsiteAttributes();
			indivResult = updateCore(ps.getAttrAboveThreshold(ExperimentConstants.websiteThreshold));
		}
		
		debugPrint.print("Calculating cross site attributes");
		//handle cross-site inference
		HashMap<Integer, Attribute> crossSiteAttributes = new HashMap<Integer, Attribute>();
		for(String website: websites.keySet()) {
			//can assume probabilities already calculated and profiles filtered
			ProfileSet ps = websites.get(website);
			ArrayList<Attribute> crossSite = ps.getAttrAboveThreshold(ExperimentConstants.crossSiteThreshold);
			for(Attribute attr: crossSite) {
				if(!crossSiteAttributes.containsKey(attr.hashCode())) {
					crossSiteAttributes.put(attr.hashCode(), attr);
				}
				crossSiteAttributes.get(attr.hashCode()).addConfToTotal(attr.confidence);
			}
		}//website for loop
		

		//Iterate across collection of attributes, find those with count > 1, add those to core
		ArrayList<Attribute> crossSiteList = new ArrayList<Attribute>();
		if(ExperimentConstants.doCrossSite) {
			for(Integer i: crossSiteAttributes.keySet()) {
				Attribute curAttr = crossSiteAttributes.get(i);
				//If the attribute occured on more than 1 website
				if(curAttr.getCount() > 1) {
					crossSiteList.add(new Attribute(curAttr.getName(), curAttr.getVal(), curAttr.getAvgConf(), curAttr.getSource() + ",cross-site"));
				    debugPrint.print("Found a cross-site attribute - " + curAttr.getVal(), 4);
				}
			}
			debugPrint.print("Number of possible cross-site values: " + crossSiteList.size(), 3);
		}

		//update the core if any of the cross site attributes are not yet present
		crossResult = updateCore(crossSiteList);
		retVal = indivResult || crossResult;
		debugPrint.print("Did any new values get added to the core or confidences updated? " + retVal, 3);
		return retVal;
	}