@SuppressWarnings("unchecked")
  public void setUp() {
    ParametricFactorGraphBuilder builder = new ParametricFactorGraphBuilder();

    // Create a plate for each input/output pair.
    DiscreteVariable outputVar = new DiscreteVariable("tf", Arrays.asList("T", "F"));
    ObjectVariable tensorVar = new ObjectVariable(Tensor.class);
    builder.addPlate(
        "plateVar",
        new VariableNumMap(
            Ints.asList(0, 1), Arrays.asList("x", "y"), Arrays.asList(tensorVar, outputVar)),
        10);

    // Factor connecting each x to the corresponding y.
    all =
        new VariableNumMap(
            Ints.asList(0, 1),
            Arrays.asList("plateVar/?(0)/x", "plateVar/?(0)/y"),
            Arrays.asList(tensorVar, outputVar));
    x = all.getVariablesByName("plateVar/?(0)/x");
    y = all.getVariablesByName("plateVar/?(0)/y");
    ConditionalLogLinearFactor f =
        new ConditionalLogLinearFactor(
            x, y, VariableNumMap.EMPTY, DiscreteVariable.sequence("foo", 4));
    builder.addFactor(
        "classifier",
        f,
        VariableNumPattern.fromTemplateVariables(
            all, VariableNumMap.EMPTY, builder.getDynamicVariableSet()));

    // Factor connecting adjacent y's
    VariableNumMap adjacentVars =
        new VariableNumMap(
            Ints.asList(0, 1),
            Arrays.asList("plateVar/?(0)/y", "plateVar/?(1)/y"),
            Arrays.asList(outputVar, outputVar));
    builder.addFactor(
        "adjacent",
        DiscreteLogLinearFactor.createIndicatorFactor(adjacentVars),
        VariableNumPattern.fromTemplateVariables(
            adjacentVars, VariableNumMap.EMPTY, builder.getDynamicVariableSet()));
    sequenceModel = builder.build();

    // Construct some training data.
    List<Assignment> inputAssignments = Lists.newArrayList();
    for (int i = 0; i < 8; i++) {
      double[] values = new double[4];
      values[0] = (i % 2) * 2 - 1;
      values[1] = ((i / 2) % 2) * 2 - 1;
      values[2] = ((i / 4) % 2) * 2 - 1;
      values[3] = 1;
      inputAssignments.add(x.outcomeArrayToAssignment(SparseTensor.vector(0, 4, values)));
    }

    Assignment yf = y.outcomeArrayToAssignment("F");
    Assignment yt = y.outcomeArrayToAssignment("T");

    trainingData = Lists.newArrayList();
    trainingData.add(
        getListVarAssignment(
            Arrays.asList(inputAssignments.get(3), inputAssignments.get(5)),
            Arrays.asList(yt, yt)));
    trainingData.add(
        getListVarAssignment(
            Arrays.asList(inputAssignments.get(0), inputAssignments.get(2)),
            Arrays.asList(yf, yf)));
  }