/**
   * Creates a {@code IndicatorLogLinearFactor} over {@code variables}, parameterized by {@code
   * features}. The returned factor is sparse, and assignments with a 0 weight in {@code
   * initialWeights} will be assigned 0 weight in all constructed factors.
   *
   * @param vars
   * @param features
   */
  public IndicatorLogLinearFactor(VariableNumMap variables, DiscreteFactor initialWeights) {
    super(variables);
    this.initialWeights = Preconditions.checkNotNull(initialWeights);

    List<Assignment> assignments = initialWeights.getNonzeroAssignments();
    DiscreteVariable featureNameDictionary =
        new DiscreteVariable("indicator features", assignments);
    this.featureVars = VariableNumMap.singleton(0, "features", featureNameDictionary);
  }