예제 #1
0
  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);
    }
  }
예제 #2
0
  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();
  }