if (logModProb <= Constants.logOfZero)
if (logModProb <= logOfZero)
  protected void joinItems(CKYItem modificand, CKYItem modifier,                           boolean side)  throws RemoteException {    Symbol modLabel = (Symbol)modifier.label();    Subcat thisSideSubcat = (Subcat)modificand.subcat(side);    Subcat oppositeSideSubcat = modificand.subcat(!side);    boolean thisSideSubcatContainsMod = thisSideSubcat.contains(modLabel);    if (!thisSideSubcatContainsMod &&	Language.training.isArgumentFast(modLabel))      return;    if (isomorphicTreeConstraints) {      if (modificand.getConstraint().isViolatedByChild(modifier)) {        if (debugConstraints)          System.err.println("constraint " + modificand.getConstraint() +                             " violated by child item(" +                            modifier.start() + "," + modifier.end() + "): " +                            modifier);        return;      }    }    /*    SexpList thisSidePrevMods = getPrevMods(modificand,					    modificand.prevMods(side),                                            modificand.children(side));    */    /*    SexpList thisSidePrevMods = modificand.prevMods(side);    */    tmpChildrenList.set(modifier, modificand.children(side));    SexpList thisSidePrevMods = getPrevMods(modificand, tmpChildrenList);    SexpList oppositeSidePrevMods = modificand.prevMods(!side);    WordList previousWords = getPrevModWords(modificand, tmpChildrenList);    int thisSideEdgeIndex = modifier.edgeIndex(side);    int oppositeSideEdgeIndex = modificand.edgeIndex(!side);    boolean thisSideContainsVerb =      modificand.verb(side) || modifier.containsVerb();    boolean oppositeSideContainsVerb = modificand.verb(!side);    ModifierEvent modEvent = lookupModEvent;    modEvent.set(modifier.headWord(),                 modificand.headWord(),                 modLabel,                 thisSidePrevMods,                 previousWords,                 (Symbol)modificand.label(),                 modificand.headLabel(),                 modificand.subcat(side),                 modificand.verb(side),                 side);    boolean debugFlag = false;    if (debugJoin) {      Symbol modificandLabel = (Symbol)modificand.label();      boolean modificandLabelP = modificandLabel == NPA;      boolean modLabelP = modLabel == RRC;      debugFlag = (modificandLabelP && modLabelP && side == Constants.RIGHT &&		   ((modificand.start() == 0 && modificand.end() == 3 &&		     modifier.start() == 4 && modifier.end() == 10)));    }    if (!futurePossible(modEvent, side, debugFlag))      return;    if (debugJoin) {    }    int lowerIndex = Math.min(thisSideEdgeIndex, oppositeSideEdgeIndex);    int higherIndex = Math.max(thisSideEdgeIndex, oppositeSideEdgeIndex);    double logModProb = server.logProbMod(id, modEvent);    if (logModProb <= Constants.logOfZero)      return;    double logTreeProb =      modificand.logTreeProb() + modifier.logTreeProb() + logModProb;    double logPrior = modificand.logPrior();    double logProb = logTreeProb + logPrior;    if (debugJoin) {      if (debugFlag) {	System.err.println(className + ".join: trying to extend modificand\n" +			   modificand + "\nwith modifier\n" + modifier);      }    }    // if this side's subcat contains the the current modifier's label as one    // of its requirements, make a copy of it and remove the requirement    if (thisSideSubcatContainsMod) {      thisSideSubcat = (Subcat)thisSideSubcat.copy();      thisSideSubcat.remove(modLabel);    }    SLNode thisSideChildren = new SLNode(modifier, modificand.children(side));    SLNode oppositeSideChildren = modificand.children(!side);    CKYItem newItem = chart.getNewItem();    newItem.set((Symbol)modificand.label(), modificand.headWord(),                null, null, modificand.headChild(), null, null, null, null,                lowerIndex, higherIndex, false, false, false,		logTreeProb, logPrior, logProb);    tmpChildrenList.set(null, thisSideChildren);    SexpList thisSideNewPrevMods = getPrevMods(modificand, tmpChildrenList);    newItem.setSideInfo(side,                        thisSideSubcat, thisSideChildren,                        thisSideNewPrevMods, thisSideEdgeIndex,                        thisSideContainsVerb);    newItem.setSideInfo(!side,                        oppositeSideSubcat, oppositeSideChildren,                        oppositeSidePrevMods, oppositeSideEdgeIndex,                        oppositeSideContainsVerb);    if (isomorphicTreeConstraints) {      if (debugConstraints)        System.err.println("assigning partially-satisfied constraint " +                           modificand.getConstraint() + " to " + newItem);      newItem.setConstraint(modificand.getConstraint());    }    boolean added = chart.add(lowerIndex, higherIndex, newItem);    if (!added)      chart.reclaimItem(newItem);    if (debugJoin) {    }  }