public static Symbolic ReduceMean(Vector vector) { if (vector.Rank == 0) { throw new RankException("can't get mean of vector with rank of 0"); } else { Symbolic sum = new Symbolic(vector._values[0].Value, vector._values[0].Grads); for (int i = 1; i < vector.Rank; i++) { sum += vector._values[i]; } sum /= vector.Rank; return(new Symbolic( (Context context) => { return sum.Value(context); }, (Context context) => { return sum.Grads(context); } )); } }
public static SymbolicVector All(Func <Diffable, Symbolic> func, Vector arg1) { Symbolic[] output = new Symbolic[arg1.Rank]; for (int i = 0; i < arg1.Rank; i++) { output[i] = func(arg1._values[i]); } return(new SymbolicVector(output)); }
public static SymbolicVector operator -(Vector vector) { var output = new Symbolic[vector.Rank]; for (int i = 0; i < vector.Rank; i++) { output[i] = -vector._values[i]; } return(new SymbolicVector(output)); }
private static SymbolicVector Add(Vector vector, Diffable scalar) { Symbolic[] output = new Symbolic[vector.Rank]; for (int i = 0; i < vector.Rank; i++) { output[i] = vector._values[i] + scalar; } return(new SymbolicVector(output)); }
public static SymbolicVector All(Func <Diffable, Diffable, Symbolic> func, Vector arg1, Vector arg2) { if (arg1.Rank != arg2.Rank) { throw new RankException("arg1 and arg2's ranks do not match"); } Symbolic[] output = new Symbolic[arg1.Rank]; for (int i = 0; i < arg1.Rank; i++) { output[i] = func(arg1._values[i], arg2._values[i]); } return(new SymbolicVector(output)); }