示例#1
0
 private void step(ISet<DMIElem> mSet, ISet<DMIElem> outLinks) {
   int cnt = mSet.size();
   for (int i = 0; i < cnt; i++) {
     DMIElem m = mSet.get(i);
     step(m, null, outLinks);
   }
 }
示例#2
0
 private void classifyConcept(DMIElem m, ISet<DMIElem> outNodes, ISet<DMIElem> outLinks) {
   if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0)
     Tracing.gTraceFile.println("adding: " + m.itsIndex);
   setVisited(m);
   if (m.isStatement()) outLinks.add(m);
   else outNodes.add(m);
 }
示例#3
0
 public ISet<DMIElem> traverse(
     ISet<DMIElem> inNodes,
     BoundFork inPatterns,
     boolean infer,
     boolean loop,
     ISet<DMIElem> suggested) {
   if (infer) {
     ISet<DMIElem> ans = new XSetList<DMIElem>(XSetList.AsSet);
     ISet<DMIElem> xV = new XSetList<DMIElem>(XSetList.AsSet);
     for (; ; ) {
       IList<InferredRelationship> inferSet = new XSetList<InferredRelationship>();
       ISet<DMIElem> res = traverse(inNodes, inPatterns, inferSet, suggested);
       ans.merge(res);
       for (int i = 0; i < inferSet.size(); i++) {
         InferredRelationship ifr = inferSet.get(i);
         int cnt = itsConceptMgr.itsGraph.getMaxIndex();
         DMIElem m = itsConceptMgr.enterStatement(ifr.sb, ifr.vb, ifr.ob, false);
         ans.add(m);
         ans.add(ifr.sb);
         ans.add(ifr.ob);
         if (itsConceptMgr.itsGraph.getMaxIndex() > cnt) xV.add(m);
       }
       if (loop && xV.size() > 0) continue;
       break;
     }
     return ans; // xV; only the inferred nodes
   }
   return traverse(inNodes, inPatterns, null, suggested);
 }
示例#4
0
  private ISet<DMIElem> traverse(
      ISet<DMIElem> inNodes,
      BoundFork inPatterns,
      IList<InferredRelationship> inferSet,
      ISet<DMIElem> suggested) {
    BoundFork currPatterns = inPatterns;

    ISet<DMIElem> currNodes = new XSetList<DMIElem>(XSetList.AsSet);
    ISet<DMIElem> currLinks = new XSetList<DMIElem>(XSetList.AsSet);

    for (DMIElem src : inNodes) if (src != null) setVisited(src);

    for (DMIElem src : inNodes) if (src != null) stepFromConcept(src, currNodes, currLinks);

    if (suggested != null) {
      for (DMIElem src : suggested) classifyConcept(src, currNodes, currLinks);
    }

    ISet<DMIElem> ansSet = new XSetList<DMIElem>(XSetList.AsSet);
    ISet<BoundFrame> nonRejectedCandidates = new XSetList<BoundFrame>(XSetList.AsSet);

    int iterCnt = 0;

    for (; ; ) {
      ++iterCnt;

      if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0)
        Tracing.gTraceFile.println("---- Iteration " + iterCnt + " ----");

      // pattern match exhausted?  if so, there's nothing left to match.
      if (currPatterns.isEmpty()) break;

      IList<BoundFrame> lbf = currPatterns.getFrames();
      int cnt = lbf.size();

      if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0) {
        Tracing.gTraceFile.println("frames for iteration:");
        for (int i = 0; i < cnt; i++) {
          BoundFrame fr = lbf.get(i);
          fr.traceOut();
        }
        Tracing.gTraceFile.println("==========");
      }

      // Pass 1 search new frames for successes or success roots
      for (int i = 0; i < cnt; i++) {
        BoundFrame fr = lbf.get(i);
        if (fr.succcessPathComplete()) {
          if (fr.couldBeRejected()) {
            if (fr.markAsSuccessRoot()) {

              if ((Tracing.gTraceSet & Tracing.TraceWave) != 0) {
                Tracing.gTraceFile.println("$$$ Adding frame root: ");
                fr.traceOut();
              }

              boolean b = nonRejectedCandidates.add(fr);

              if (!b && (Tracing.gTraceSet & Tracing.TraceWave) != 0)
                Tracing.gTraceFile.println(" ****** was already on root list");
            }
          } else if (fr.completed(ansSet, inferSet, null)) {

            if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0) {
              Tracing.gTraceFile.print("$$$Taking result frame: ");
              int st = Tracing.gTraceSet;
              Tracing.gTraceSet |= Tracing.TraceFrameX;
              fr.traceOut();
              Tracing.gTraceFile.println();
              Tracing.gTraceSet = st;
            }

            if (fr.whenCompletedisFinished()) lbf.clear(i);
          }
        }
      }

      // Pass 2 search for rejections
      for (int i = 0; i < cnt; i++) {
        BoundFrame fr = lbf.get(i);
        if (fr != null) {
          if (fr.rejected()) {
            lbf.clear(i);
            BoundFrame successRoot = fr.getSuccessRoot();

            if (successRoot != null) nonRejectedCandidates.remove(successRoot);

            if ((Tracing.gTraceSet & Tracing.TraceWave) != 0) {
              Tracing.gTraceFile.println("$$$ Rejecting frame: ");
              fr.traceOut();
              if (successRoot != null) {
                Tracing.gTraceFile.println(" Which takes out root frame: ");
                successRoot.traceOut();
              }
            }
          }
        }
      }
      lbf.trim();

      if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0) {
        Tracing.gTraceFile.println("frames after checking success:");
        for (int i = 0; i < lbf.size(); i++) {
          BoundFrame fr = lbf.get(i);
          fr.traceOut();
        }
        Tracing.gTraceFile.println("==========");
      }

      cnt = currNodes.size();
      for (int i = 0; i < cnt; i++) {
        DMIElem m = currNodes.get(i);
        stepFromNode(m, currLinks);
      }

      // input set exhausted?  if so, there's nothing left to traverse.
      if (currLinks.isEmpty()) break;

      BoundFork nextPatterns = new BoundFork();
      ISet<DMIElem> nextNodes = new XSetList<DMIElem>(XSetList.AsSet);
      ISet<DMIElem> nextLinks = new XSetList<DMIElem>(XSetList.AsSet);
      ISet<BoundFork[]> updatedSubpatterns = new XSetList<BoundFork[]>(XSetList.AsSet);

      cnt = currLinks.size();
      for (int i = 0; i < cnt; i++) {
        DMIElem m = currLinks.get(i);
        if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0)
          Tracing.gTraceFile.println("visiting: " + m.itsIndex);

        // all patterns have to see all statements,
        //  even newly generated patterns from current generation
        BoundFork morePatterns = new BoundFork();
        accept(m, nextPatterns, morePatterns, nextNodes, nextLinks, updatedSubpatterns);
        nextPatterns.mergeIntoFork(morePatterns);

        // existing patterns have to see all statements,
        // and if they cannot advance, they'll be retired this generation
        accept(m, currPatterns, nextPatterns, nextNodes, nextLinks, updatedSubpatterns);
      }

      // $21$: carry frames over whose subforks are modified
      lbf = currPatterns.getFrames();
      cnt = lbf.size();
      for (int i = 0; i < cnt; i++) {
        BoundFrame fr = lbf.get(i);
        if (fr.usesSubForkIn(updatedSubpatterns)) {
          if ((Tracing.gTraceSet & Tracing.TraceFrame) != 0)
            Tracing.gTraceFile.println("carrying over frame #" + fr.itsIndex);
          nextPatterns.addFrame(fr);
        }
      }

      currNodes = nextNodes; // switch over to new set of nodes
      currLinks = nextLinks; // switch over to new set of links
      currPatterns = nextPatterns; // retire all patterns, having seen a full step
    }

    // process nonRejectedCandidates list
    for (int i = 0; i < nonRejectedCandidates.size(); i++) {
      BoundFrame fr = nonRejectedCandidates.get(i);
      boolean y = fr.completed(ansSet, inferSet, null);
      if (y && (Tracing.gTraceSet & Tracing.TraceFrame) != 0)
        Tracing.gTraceFile.println("took: " + fr.itsIndex);
    }

    return ansSet;
  }