code: private ProtoNetwork stage3(final ProtoNetwork network,
              Set<EquivalenceDataIndex> equivalences) {
          beginStage(PHASE2_STAGE3_HDR, "3", NUM_PHASES);
          final StringBuilder bldr = new StringBuilder();
          long t1 = currentTimeMillis();
  
          int pct = stage3Parameter(network, equivalences, bldr);
          stage3Term(network, pct);
          stage3Statement(network, pct);
  
          long t2 = currentTimeMillis();
  
          final int paramct =
                  network.getParameterTable().getTableParameters().size();
          final int termct = network.getTermTable().getTermValues().size();
          final int stmtct = network.getStatementTable().getStatements().size();
  
          bldr.setLength(0);
          bldr.append(stmtct);
          bldr.append(" statements, ");
          bldr.append(termct);
          bldr.append(" terms, ");
          bldr.append(paramct);
          bldr.append(" parameters");
          stageOutput(bldr.toString());
  
          bldr.setLength(0);
          markTime(bldr, t1, t2);
          markEndStage(bldr);
          stageOutput(bldr.toString());
          return network;
      }
docs: Stage three equivalencing, returning the equivalenced proto-network.
  If parameter equivalencing yields a {@code 0} count then term and
  statement equivalencing is not run.
  
  @param network Merged proto-network
  @param equivalences Equivalence data indices
  @return {@link ProtoNetwork}