if (Subcats.get() instanceof SubcatBag) SubcatBag.setUpFastUidMap(nonterminalTable);
  public Decoder(int id, DecoderServerRemote server) {    this.id = id;    this.server = server;    try {      // for static data members      /*      if (posMap == null) {        synchronized (Decoder.class) {          if (posMap == null)            posMap = Collections.synchronizedMap(server.posMap());        }      }      if (nonterminals == null) {        synchronized (Decoder.class) {          if (nonterminals == null) {            CountsTable nonterminalTable = server.nonterminals();            nonterminals = new Symbol[nonterminalTable.size()];            Iterator it = nonterminalTable.keySet().iterator();            for (int i = 0; it.hasNext(); i++)              nonterminals[i] = (Symbol)it.next();          }        }      }      if (leftSubcatMap == null) {        synchronized (Decoder.class) {          if (leftSubcatMap == null)            leftSubcatMap =              Collections.synchronizedMap(server.leftSubcatMap());        }      }      if (rightSubcatMap == null) {        synchronized (Decoder.class) {          if (rightSubcatMap == null)            rightSubcatMap =              Collections.synchronizedMap(server.rightSubcatMap());        }      }      */      this.posMap = server.posMap();      CountsTable nonterminalTable = server.nonterminals();      nonterminals = new Symbol[nonterminalTable.size()];      Iterator it = nonterminalTable.keySet().iterator();      for (int i = 0; it.hasNext(); i++)        nonterminals[i] = (Symbol)it.next();      this.leftSubcatMap = server.leftSubcatMap();      this.rightSubcatMap = server.rightSubcatMap();      this.leftSubcatPS = server.leftSubcatProbStructure().copy();      this.rightSubcatPS = server.rightSubcatProbStructure().copy();      this.leftModNonterminalMap = server.leftModNonterminalMap();      if (leftModNonterminalMap == null)        System.err.println("aiiee!  leftModNonterminalMap is null!!!");      this.rightModNonterminalMap = server.rightModNonterminalMap();      this.leftModNonterminalPS =        server.leftModNonterminalProbStructure().copy();      this.rightModNonterminalPS =        server.rightModNonterminalProbStructure().copy();      prunedPretermsPosMap = new HashMap();      Set prunedPreterms = server.prunedPreterms();      it = prunedPreterms.iterator();      while (it.hasNext()) {        Word word = Language.treebank.makeWord((Sexp)it.next());        prunedPretermsPosMap.put(word.word(), word.tag());      }      System.err.println("prunedPretermsPosMap: " + prunedPretermsPosMap);      prunedPunctuationPosMap = new HashMap();      Set prunedPunctuation = server.prunedPunctuation();      it = prunedPunctuation.iterator();      while (it.hasNext()) {        Word word = Language.treebank.makeWord((Sexp)it.next());        prunedPunctuationPosMap.put(word.word(), word.tag());      }      //System.err.println("prunedPunctuationPosMap: " + prunedPunctuationPosMap);    } catch (RemoteException re) {      System.err.println(re);    }    leftSubcatPSLastLevel = leftSubcatPS.numLevels() - 1;    rightSubcatPSLastLevel = rightSubcatPS.numLevels() - 1;    leftModNonterminalPSLastLevel = leftModNonterminalPS.numLevels() - 1;    rightModNonterminalPSLastLevel = rightModNonterminalPS.numLevels() - 1;    String useCellLimitStr = Settings.get(Settings.decoderUseCellLimit);    boolean useCellLimit = Boolean.valueOf(useCellLimitStr).booleanValue();    if (useCellLimit)      cellLimit = Integer.parseInt(Settings.get(Settings.decoderCellLimit));    String usePruneFactStr = Settings.get(Settings.decoderUsePruneFactor);    boolean usePruneFact = Boolean.valueOf(usePruneFactStr).booleanValue();    if (usePruneFact) {      pruneFact = Math.log(10) *                  Double.parseDouble(Settings.get(Settings.decoderPruneFactor));    }    String useCommaConstraintStr =      Settings.get(Settings.decoderUseCommaConstraint);    useCommaConstraint = Boolean.valueOf(useCommaConstraintStr).booleanValue();    chart = new CKYChart(cellLimit, pruneFact);  }