@@ -282,3 +282,134 @@ extension Collection {
282
282
/// Returns the `n`th position in `self`.
283
283
func index( atOffset n: Int ) -> Index { index ( startIndex, offsetBy: n) }
284
284
}
285
+
286
+ extension Optional : EuclideanDifferentiable
287
+ where Wrapped: EuclideanDifferentiable {
288
+ public var differentiableVectorView : TangentVector { . init( self ? . differentiableVectorView) }
289
+ }
290
+
291
+ extension Optional . TangentVector : ElementaryFunctions
292
+ where Wrapped. TangentVector: ElementaryFunctions {
293
+ /// The square root of `x`.
294
+ ///
295
+ /// For real types, if `x` is negative the result is `.nan`. For complex
296
+ /// types there is a branch cut on the negative real axis.
297
+ public static func sqrt( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
298
+
299
+ /// The cosine of `x`, interpreted as an angle in radians.
300
+ public static func cos( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
301
+
302
+ /// The sine of `x`, interpreted as an angle in radians.
303
+ public static func sin( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
304
+
305
+ /// The tangent of `x`, interpreted as an angle in radians.
306
+ public static func tan( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
307
+
308
+ /// The inverse cosine of `x` in radians.
309
+ public static func acos( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
310
+
311
+ /// The inverse sine of `x` in radians.
312
+ public static func asin( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
313
+
314
+ /// The inverse tangent of `x` in radians.
315
+ public static func atan( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
316
+
317
+ /// The hyperbolic cosine of `x`.
318
+ public static func cosh( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
319
+
320
+ /// The hyperbolic sine of `x`.
321
+ public static func sinh( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
322
+
323
+ /// The hyperbolic tangent of `x`.
324
+ public static func tanh( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
325
+
326
+ /// The inverse hyperbolic cosine of `x`.
327
+ public static func acosh( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
328
+
329
+ /// The inverse hyperbolic sine of `x`.
330
+ public static func asinh( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
331
+
332
+ /// The inverse hyperbolic tangent of `x`.
333
+ public static func atanh( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
334
+
335
+ /// The exponential function applied to `x`, or `e**x`.
336
+ public static func exp( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
337
+
338
+ /// Two raised to to power `x`.
339
+ public static func exp2( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
340
+
341
+ /// Ten raised to to power `x`.
342
+ public static func exp10( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
343
+
344
+ /// `exp(x) - 1` evaluated so as to preserve accuracy close to zero.
345
+ public static func expm1( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
346
+
347
+ /// The natural logarithm of `x`.
348
+ public static func log( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
349
+
350
+ /// The base-two logarithm of `x`.
351
+ public static func log2( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
352
+
353
+ /// The base-ten logarithm of `x`.
354
+ public static func log10( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
355
+
356
+ /// `log(1 + x)` evaluated so as to preserve accuracy close to zero.
357
+ public static func log1p( _ x: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
358
+
359
+ /// `exp(y log(x))` computed without loss of intermediate precision.
360
+ ///
361
+ /// For real types, if `x` is negative the result is NaN, even if `y` has
362
+ /// an integral value. For complex types, there is a branch cut on the
363
+ /// negative real axis.
364
+ public static func pow( _ x: Self , _ y: Self ) -> Self { . init( x. value. map ( Wrapped . TangentVector. sqrt) ) }
365
+
366
+ /// `x` raised to the `n`th power.
367
+ ///
368
+ /// The product of `n` copies of `x`.
369
+ public static func pow( _ x: Self , _ n: Int ) -> Self { . init( x. value. map ( { x in Wrapped . TangentVector. pow ( x, n) } ) ) }
370
+
371
+ /// The `n`th root of `x`.
372
+ ///
373
+ /// For real types, if `x` is negative and `n` is even, the result is NaN.
374
+ /// For complex types, there is a branch cut along the negative real axis.
375
+ public static func root( _ x: Self , _ n: Int ) -> Self { . init( x. value. map ( { x in Wrapped . TangentVector. root ( x, n) } ) ) }
376
+ }
377
+
378
+ extension Optional . TangentVector : PointwiseMultiplicative
379
+ where Wrapped. TangentVector: PointwiseMultiplicative {
380
+ public static var one : Self {
381
+ . init( Wrapped . TangentVector. one)
382
+ }
383
+
384
+ public var reciprocal : Self { . init( value. map { $0. reciprocal } ) }
385
+
386
+ public static func .* ( lhs: Self , rhs: Self ) -> Self {
387
+ switch ( lhs. value, rhs. value) {
388
+ case let ( x? , y? ) : return Self ( x .* y)
389
+ default : return Self ( nil )
390
+ }
391
+ }
392
+
393
+ public static func .*= ( lhs: inout Self , rhs: Self ) {
394
+ lhs = lhs .* rhs
395
+ }
396
+ }
397
+
398
+ extension Optional . TangentVector : VectorProtocol
399
+ where Wrapped. TangentVector: VectorProtocol {
400
+ public typealias VectorSpaceScalar = Wrapped . TangentVector . VectorSpaceScalar
401
+
402
+ public func adding( _ x: VectorSpaceScalar ) -> Self { . init( value. map { $0. adding ( x) } ) }
403
+
404
+ public mutating func add( _ x: VectorSpaceScalar ) { value? . add ( x) }
405
+
406
+ public func subtracting( _ x: VectorSpaceScalar ) -> Self { . init( value. map { $0. subtracting ( x) } ) }
407
+
408
+ public mutating func subtract( _ x: VectorSpaceScalar ) { value? . subtract ( x) }
409
+
410
+ public func scaled( by scale: VectorSpaceScalar ) -> Self { . init( value. map { $0. scaled ( by: scale) } ) }
411
+
412
+ public mutating func scale( by scale: VectorSpaceScalar ) {
413
+ value? . scale ( by: scale)
414
+ }
415
+ }
0 commit comments