public DiscourseEntity retain()

in opennlp-coref/src/main/java/opennlp/tools/coref/resolver/MaxentResolver.java [262:329]


  public DiscourseEntity retain(MentionContext mention, DiscourseModel dm) {
    if (ResolverMode.TRAIN == mode) {
      DiscourseEntity de = null;
      boolean referentFound = false;
      boolean hasReferentialCandidate = false;
      boolean nonReferentFound = false;
      for (int ei = 0; ei < getNumEntities(dm); ei++) {
        DiscourseEntity cde = dm.getEntity(ei);
        MentionContext entityMention = cde.getLastExtent();
        if (outOfRange(mention, cde)) {
          if (mention.getId() != -1 && !referentFound) {
            // what is or was 'ec' here?
            // logger.debug("Referent out of range: {} {}", ec.toText(), ec.parse.getSpan());
          }
          break;
        }
        if (excluded(mention, cde)) {
          if (showExclusions) {
            if (mention.getId() != -1 && entityMention.getId() == mention.getId()) {
              logger.debug("Referent excluded: ({}) {} {} -> ({}) {} {}", mention.getId(), mention.toText(),
                      mention.getIndexSpan(), entityMention.getId(), entityMention.toText(), entityMention.getSpan());
            }
          }
        }
        else {
          hasReferentialCandidate = true;
          boolean useAsDifferentExample = defaultReferent(cde);
          //if (!sampleSelection || (mention.getId() != -1 && entityMention.getId() == mention.getId())
          // || (!nonReferentFound && useAsDifferentExample)) {
            List<String> features = getFeatures(mention, cde);

            // add Event to Model
            if (DEBUG) {
              logger.debug("Retain: {} {}  -> {} {}", mention.getId(), mention.toText(), entityMention.getId(), cde);
            }

            if (mention.getId() != -1 && entityMention.getId() == mention.getId()) {
              referentFound = true;
              events.add(new Event(SAME, features.toArray(new String[0])));
              de = cde;
              logger.debug("Retain: resolved at {}", ei);
              // incrementing count for key 'ei'
              distances.merge(ei, 1, Integer::sum);
            }
            else if (!pairedSampleSelection || (!nonReferentFound && useAsDifferentExample)) {
              nonReferentFound = true;
              events.add(new Event(DIFF, features.toArray(new String[0])));
            }
          //}
        }
        if (pairedSampleSelection && referentFound && nonReferentFound) {
          break;
        }
        if (preferFirstReferent && referentFound) {
          break;
        }
      }
      // doesn't refer to anything
      if (hasReferentialCandidate) {
        nonReferentialResolver.addEvent(mention);
      }

      return de;
    }
    else {
      return super.retain(mention, dm);
    }
  }