internal DualVector3(DualNumber x, DualNumber y, DualNumber z) : this() { this.x = x; this.y = y; this.z = z; }
internal DualVector3(Vector3 value, Vector3 derivative) : this() { x = new DualNumber(value.x, derivative.x); y = new DualNumber(value.y, derivative.y); z = new DualNumber(value.z, derivative.z); }
internal DualVector3(Vector3 value, int whichIndexIsVariable = -1) : this() { x = new DualNumber(value.x, whichIndexIsVariable == 0 ? 1f : 0f); y = new DualNumber(value.y, whichIndexIsVariable == 1 ? 1f : 0f); z = new DualNumber(value.z, whichIndexIsVariable == 2 ? 1f : 0f); }
/// <summary> /// Calculates an absolute value of dual number /// </summary> public static DualNumber Abs(DualNumber value) { return(new DualNumber(SMath.Abs(value.Value), value.Derivative * SMath.Sign(value.Value))); }
/// <summary> /// Turns an autodiff function to a normal function, assuming that the argument is actually variable /// </summary> /// <param name="fn">Autodiff function, such as AutoDiff.Math.Log</param> /// <returns>A function that takes a float and calculates f(x) and f'(x)</returns> public static Func <float, DualNumber> Parameterize(Func <DualNumber, DualNumber> fn) { return(value => fn(DualNumber.Variable(value))); }
/// <summary> /// Calculates a square of dual number /// </summary> public static DualNumber Squared(this DualNumber value) { return(new DualNumber((float)SMath.Pow(value.Value, 2f), value.Derivative * 2f * value.Value)); }
/// <summary> /// Calculates a power of dual number /// </summary> public static DualNumber Pow(DualNumber value, float power) { return(new DualNumber((float)SMath.Pow(value.Value, power), value.Derivative * power * (float)SMath.Pow(value.Value, power - 1f))); }
/// <summary> /// Calculates a natural logarithm of dual number /// </summary> public static DualNumber Log(DualNumber value) { return(new DualNumber((float)SMath.Log(value.Value), value.Derivative / value.Value)); }
/// <summary> /// Calculates an exponent of dual number /// </summary> public static DualNumber Exp(DualNumber value) { return(new DualNumber((float)SMath.Exp(value.Value), value.Derivative * (float)SMath.Exp(value.Value))); }
/// <summary> /// Calculates a cosine of dual number /// </summary> public static DualNumber Cos(DualNumber value) { return(new DualNumber((float)SMath.Cos(value.Value), -value.Derivative * (float)SMath.Sin(value.Value))); }