001package daikon.derive.unary;
002
003import daikon.ValueTuple;
004import daikon.VarInfo;
005import daikon.derive.Derivation;
006import daikon.derive.ValueAndModified;
007import org.checkerframework.dataflow.qual.Pure;
008import org.checkerframework.dataflow.qual.SideEffectFree;
009import org.plumelib.util.ArraysPlume;
010import org.plumelib.util.Intern;
011
012// like SequenceMax; if one changes, change the other, too
013public final class SequenceMin extends UnaryDerivation {
014  static final long serialVersionUID = 20020122L;
015
016  // Variables starting with dkconfig_ should only be set via the
017  // daikon.config.Configuration interface.
018  /** Boolean. True iff SequenceMin derived variables should be generated. */
019  public static boolean dkconfig_enabled = false;
020
021  public SequenceMin(VarInfo vi) {
022    super(vi);
023  }
024
025  @Override
026  public ValueAndModified computeValueAndModifiedImpl(ValueTuple vt) {
027    int source_mod = base.getModified(vt);
028    if (source_mod == ValueTuple.MISSING_NONSENSICAL) {
029      return ValueAndModified.MISSING_NONSENSICAL;
030    }
031    Object val = base.getValue(vt);
032    if (val == null) {
033      return ValueAndModified.MISSING_NONSENSICAL;
034    }
035    if (val instanceof long[]) {
036      long[] val_array = (long[]) val;
037      if (val_array.length == 0) {
038        return ValueAndModified.MISSING_NONSENSICAL;
039      }
040      return new ValueAndModified(Intern.internedLong(ArraysPlume.min(val_array)), source_mod);
041    } else if (val instanceof double[]) {
042      double[] val_array = (double[]) val;
043      if (val_array.length == 0) {
044        return ValueAndModified.MISSING_NONSENSICAL;
045      }
046      return new ValueAndModified(Intern.internedDouble(ArraysPlume.min(val_array)), source_mod);
047
048    } else {
049      return ValueAndModified.MISSING_NONSENSICAL;
050    }
051  }
052
053  @Override
054  protected VarInfo makeVarInfo() {
055    return VarInfo.make_scalar_seq_func("min", null, base, 0);
056  }
057
058  @Pure
059  @Override
060  public boolean isSameFormula(Derivation other) {
061    return (other instanceof SequenceMin);
062  }
063
064  @SideEffectFree
065  @Override
066  public String esc_name(String index) {
067    return String.format("min(%s)", base.esc_name());
068  }
069}