code: void join(final MiniSatStyleSolver s, final LNGIntVector lits, int rhs) {
      assert this.incrementalStrategy == MaxSATConfig.IncrementalStrategy.ITERATIVE;
      final LNGIntVector leftCardinalityOutlits = new LNGIntVector(this.cardinalityOutlits);
      int oldCardinality = this.currentCardinalityRhs;
      if (lits.size() > 1)
        this.build(s, lits, rhs < lits.size() ? rhs : lits.size());
      else {
        assert lits.size() == 1;
        this.cardinalityOutlits.clear();
        this.cardinalityOutlits.push(lits.get(0));
      }
      final LNGIntVector rightCardinalityOutlits = new LNGIntVector(this.cardinalityOutlits);
      this.cardinalityOutlits.clear();
      for (int i = 0; i < leftCardinalityOutlits.size() + rightCardinalityOutlits.size(); i++) {
        final int p = mkLit(s.nVars(), false);
        MaxSAT.newSATVariable(s);
        this.cardinalityOutlits.push(p);
      }
      this.currentCardinalityRhs = rhs;
      this.adder(s, leftCardinalityOutlits, rightCardinalityOutlits, this.cardinalityOutlits);
      this.currentCardinalityRhs = oldCardinality;
    }
docs: Joins two constraints.  The given constraint is added to the current one.
  @param s    the solver
  @param lits the literals of the constraint
  @param rhs  the right hand side of the constraint