boolean modificandLabelP = modificandLabel == S;
boolean modificandLabelP = modificandLabel == NPA;
  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, side);    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 == S;      boolean modLabelP = modLabel == CC;      debugFlag = (modificandLabelP && side == Constants.LEFT &&		   modificand.start() <= 35 && modificand.end() == 38);      /*      if (debugFlag)	Debug.level = 21;      */    }    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 <= logOfZero) {      if (debugFlag) {	System.err.println(className +			   ".join: couldn't join because logProbMod=logOfZero");      }      Debug.level = 0;      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);	System.err.println("where logModProb=" + logModProb);      }    }    // 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());    }    newItem.hasAntecedent(modificand);    newItem.hasAntecedent(modifier);    boolean added = chart.add(lowerIndex, higherIndex, newItem);    if (!added) {      chart.reclaimItem(newItem);      if (debugFlag)	System.err.println(className + ".join: couldn't add item");    }    if (debugJoin) {      Debug.level = 0;    }  }