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.plumelib.util.Intern; 009 010public final class SequenceSum extends UnaryDerivation { 011 // We are Serializable, so we specify a version to allow changes to 012 // method signatures without breaking serialization. If you add or 013 // remove fields, you should change this number to the current date. 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 SequenceSum derived variables should be generated. */ 019 public static boolean dkconfig_enabled = false; 020 021 public SequenceSum(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 long result = 0; 038 for (int i = 0; i < val_array.length; i++) { 039 result += val_array[i]; 040 } 041 return new ValueAndModified(Intern.internedLong(result), source_mod); 042 } else if (val instanceof double[]) { 043 double[] val_array = (double[]) val; 044 double result = 0; 045 for (int i = 0; i < val_array.length; i++) { 046 result += val_array[i]; 047 } 048 return new ValueAndModified(Intern.internedDouble(result), source_mod); 049 050 } else { 051 return ValueAndModified.MISSING_NONSENSICAL; 052 } 053 } 054 055 @Override 056 protected VarInfo makeVarInfo() { 057 return VarInfo.make_scalar_seq_func("sum", null, base, 0); 058 } 059 060 @Pure 061 @Override 062 public boolean isSameFormula(Derivation other) { 063 return (other instanceof SequenceSum); 064 } 065}