internal TensorIndexExpression(TensorExpression expr) : base(expr.LinqExpression) { if (!(expr.LinqExpression is UnaryExpression || expr.LinqExpression is BinaryExpression || expr.LinqExpression is MethodCallExpression)) { throw new ArgumentException("This tensor expression cannot be used as a tensor index expression"); } ExpressionShape = expr.Shape; }
public TensorExpression GetDimensionProductExpression() { Shape exprShape = this.IndexSet != null ? this.IndexSet.Tensor.Shape : this.ExpressionShape; TensorExpression mulExpr = exprShape.Count() > 1 ? (Scalar)exprShape[0] * (Scalar)exprShape[1] : (Scalar)exprShape[0]; for (int i = 2; i < exprShape.Count(); i++) { mulExpr = mulExpr * (Scalar)exprShape[i]; } return(mulExpr); }
private static MethodCallExpression GetOpMethodCall(string op, params TensorIndexExpression[] args) { return(Expression.Call(TensorExpression.GetOpMethodInfo <TensorIndexExpression>("Op_" + op, args.Length), args.Select(a => Expression.Convert(a, typeof(TensorIndexExpression))).ToArray())); }
public TensorExpressionException(TensorExpression expr, string message) : base(message) { TensorExpression = expr; }
public static TensorIndexExpression Min(TensorExpression l) => new TensorIndexExpression(GetOpMethodCall("Min", (TensorIndexExpression)l), new Dimension(0));
public static TensorIndexExpression Product(TensorExpression l) => new TensorIndexExpression(GetOpMethodCall("Product", (TensorIndexExpression)l), new Dimension(0));
public TensorIndexExpression this[TensorExpression e] => Operation(new TensorIndexExpression(e));
public static TensorExpression Square(TensorExpression l) => l * l;
private static TensorExpression Op_Sqrt(TensorExpression l) => null;
public static TensorExpression Sqrt(TensorExpression l) => new TensorExpression(Expression.Call(TensorExpression.GetOpMethodInfo <TensorExpression>("Op_Sqrt", 1), Expression.Convert(l.LinqExpression, typeof(TensorExpression))));
private static TensorIndexExpression DummyBinary(TensorIndexExpression l, TensorExpression r) => null;