/// <summary> /// Applies the operation to the input array /// </summary> /// <typeparam name="Ta">The type of input data to operate on</typeparam> /// <typeparam name="Tb">The type of output data to generate</typeparam> /// <param name="op">The operation to perform</param> /// <param name="in1">The input argument</param> /// <param name="out">The output target</param> public static NdArray <Tb> Apply <Ta, Tb>(IUnaryConvOp <Ta, Tb> op, NdArray <Ta> in1, NdArray <Tb> @out = null) { var method = typeof(UFunc).GetMethod("Apply_Entry_UnaryConv", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); var gm = method.MakeGenericMethod(typeof(Ta), typeof(Tb), op.GetType()); return((NdArray <Tb>)gm.Invoke(null, new object[] { op, in1, @out })); }
internal static void UnaryConvOp <Ta, Tb, C>(IUnaryConvOp <Ta, Tb> op, NdArray <Ta> in1, NdArray <Tb> @out) where C : struct, IUnaryConvOp <Ta, Tb> { if ((SINGLE_CORE_THREAD || _no_blocks > 1) && @out.Shape.Dimensions[0].Length >= _no_blocks) { int totalblocks = _no_blocks; in1.DataAccessor.Allocate(); @out.DataAccessor.Allocate(); _threads.RunParallel((block) => UFunc.UFunc_Op_Inner_UnaryConv_Flush( op, Reshape(in1, block, totalblocks), Reshape(@out, block, totalblocks) ) ); } else { UFunc.UFunc_Op_Inner_UnaryConv_Flush(op, in1, @out); } }
/// <summary> /// Register a pending conversion operation on the underlying array /// </summary> /// <param name="operation">The operation performed</param> /// <param name="output">The output operand</param> /// <param name="input">The input operand</param> public virtual void AddConversionOperation <Ta>(IUnaryConvOp <Ta, T> operation, NdArray <T> output, NdArray <Ta> input) { m_clock = LazyAccessorCollector.AddOperation(new PendingUnaryConversionOperation <T, Ta>(operation, output, input)); }