@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); }