private void generateCvtFormulas() throws FileNotFoundException { List<BinaryFormulaInfo> toAdd = new ArrayList<FbFormulasInfo.BinaryFormulaInfo>(); for (BinaryFormulaInfo innerInfo : binaryFormulaInfoMap.values()) { if (isCvt(innerInfo.expectedType1)) { // if expected type 1 is a CVT Set<Formula> outers = atomicExtype2ToBinaryMap.get( innerInfo.expectedType1); // find those whose expected type 2 is that CVT for (Formula outer : outers) { BinaryFormulaInfo outerInfo = binaryFormulaInfoMap.get(outer); if (!isLegalCvt(innerInfo.formula, outer)) continue; // build new formula LambdaFormula cvtFormula = new LambdaFormula( "x", new JoinFormula( outer, new JoinFormula(innerInfo.formula, new VariableFormula("x")))); BinaryFormulaInfo newFormulaInfo = binaryFormulaInfoMap.get(cvtFormula); if (newFormulaInfo == null) { String exType1 = outerInfo.expectedType1; if (exType1 == null) throw new RuntimeException("Missing expected type 1 for formula: " + outer); List<String> newDescriptions = new LinkedList<String>(); newDescriptions.add(outerInfo.descriptions.get(0)); newDescriptions.add(innerInfo.descriptions.get(0)); newFormulaInfo = new BinaryFormulaInfo( cvtFormula, exType1, innerInfo.expectedType2, newDescriptions, Math.min(outerInfo.popularity, innerInfo.popularity)); toAdd.add(newFormulaInfo); } MapUtils.addToSet(cvtExpansionsMap, innerInfo.formula, newFormulaInfo); MapUtils.addToSet(cvtExpansionsMap, outerInfo.formula, newFormulaInfo); } } } for (BinaryFormulaInfo info : toAdd) { addMappingFromType2ToFormula(info.expectedType2, info.formula); binaryFormulaInfoMap.put(info.formula, info); } }
private void loadFormulaInfo() throws NumberFormatException, IOException { LogInfo.begin_track("Loading formula info..."); LogInfo.logs("Adding schema properties"); binaryFormulaInfoMap = freebaseInfo.createBinaryFormulaInfoMap(); unaryFormulaInfoMap = freebaseInfo.createUnaryFormulaInfoMap(); LogInfo.logs("Current number of binary formulas: " + binaryFormulaInfoMap.size()); LogInfo.logs("Current number of unary formulas: " + unaryFormulaInfoMap.size()); LogInfo.logs("Compuing reverse for schema formulas"); computeReverseFormulaInfo(); LogInfo.logs("Current number of binary formulas: " + binaryFormulaInfoMap.size()); for (BinaryFormulaInfo info : binaryFormulaInfoMap.values()) { MapUtils.addToSet(atomicExtype2ToBinaryMap, info.expectedType2, info.formula); if (!isCvt(info.expectedType1)) { addMappingFromType2ToFormula(info.expectedType2, info.formula); } } LogInfo.logs("Generate formulas through CVTs"); generateCvtFormulas(); // generate formulas for CVTs LogInfo.logs("Current number of binary formulas: " + binaryFormulaInfoMap.size()); LogInfo.end_track(); }