docs: public void nextStep(O observation, Collection<S> candidates,
              Map<S, Double> emissionLogProbabilities,
              Map<Transition<S>, Double> transitionLogProbabilities,
              Map<Transition<S>, D> transitionDescriptors) {
          if (message == null) {
              throw new IllegalStateException(
                      "startWithInitialStateProbabilities() or startWithInitialObservation() "
                      + "must be called first.");
          }
          if (isBroken) {
              throw new IllegalStateException("Method must not be called after an HMM break.");
          }
  
          // Forward step
          ForwardStepResult<S, O, D> forwardStepResult = forwardStep(observation, prevCandidates,
                  candidates, message, emissionLogProbabilities, transitionLogProbabilities,
                  transitionDescriptors);
          isBroken = hmmBreak(forwardStepResult.newMessage);
          if (isBroken) return;
          if (messageHistory != null) {
              messageHistory.add(forwardStepResult.newMessage);
          }
          message = forwardStepResult.newMessage;
          lastExtendedStates = forwardStepResult.newExtendedStates;
  
          prevCandidates = new ArrayList<>(candidates); // Defensive copy.
      }