@Override
  public Predictor<I, O> train(Iterable<Example<I, O>> trainingData) {
    ParametricFactorGraph model = constructGraphicalModel(trainingData);

    Converter<I, DynamicAssignment> inputConverter = getInputConverter(model);
    Converter<O, DynamicAssignment> outputConverter = getOutputConverter(model);
    Converter<Example<I, O>, Example<DynamicAssignment, DynamicAssignment>> exampleConverter =
        Example.converter(inputConverter, outputConverter);
    List<Example<DynamicAssignment, DynamicAssignment>> trainingDataAssignments =
        Lists.newArrayList(Iterables.transform(trainingData, exampleConverter));

    SufficientStatistics initialParameters = model.getNewSufficientStatistics();
    initialParameters.perturb(parameterPerturbation);
    System.out.println(initialParameters);
    SufficientStatistics finalParameters =
        trainer.train(model, initialParameters, trainingDataAssignments);

    Predictor<DynamicAssignment, DynamicAssignment> assignmentPredictor =
        new FactorGraphPredictor(
            model.getModelFromParameters(finalParameters),
            getOutputVariables(model),
            new JunctionTree());

    return ForwardingPredictor.create(assignmentPredictor, inputConverter, outputConverter);
  }