@@ -456,6 +456,7 @@ function generic_normMinusInf(x)
456
456
y === nothing && break
457
457
(v, s) = y
458
458
vnorm = norm (v)
459
+ ismissing (vnorm) && return missing
459
460
minabs = ifelse (isnan (minabs) | (minabs < vnorm), minabs, vnorm)
460
461
end
461
462
return float (minabs)
@@ -464,11 +465,13 @@ end
464
465
function generic_normInf (x)
465
466
(v, s) = iterate (x):: Tuple
466
467
maxabs = norm (v)
468
+ ismissing (maxabs) && return missing
467
469
while true
468
470
y = iterate (x, s)
469
471
y === nothing && break
470
472
(v, s) = y
471
473
vnorm = norm (v)
474
+ ismissing (vnorm) && return missing
472
475
maxabs = ifelse (isnan (maxabs) | (maxabs > vnorm), maxabs, vnorm)
473
476
end
474
477
return float (maxabs)
477
480
function generic_norm1 (x)
478
481
(v, s) = iterate (x):: Tuple
479
482
av = float (norm (v))
483
+ ismissing (av) && return missing
480
484
T = typeof (av)
481
485
sum:: promote_type (Float64, T) = av
482
486
while true
@@ -485,6 +489,7 @@ function generic_norm1(x)
485
489
(v, s) = y
486
490
sum += norm (v)
487
491
end
492
+ ismissing (sum) && return missing
488
493
return convert (T, sum)
489
494
end
490
495
@@ -495,7 +500,7 @@ norm_sqr(x::Union{T,Complex{T},Rational{T}}) where {T<:Integer} = abs2(float(x))
495
500
496
501
function generic_norm2 (x)
497
502
maxabs = normInf (x)
498
- (maxabs == 0 || isinf (maxabs)) && return maxabs
503
+ (ismissing (maxabs) || maxabs == 0 || isinf (maxabs)) && return maxabs
499
504
(v, s) = iterate (x):: Tuple
500
505
T = typeof (maxabs)
501
506
if isfinite (length (x)* maxabs* maxabs) && maxabs* maxabs != 0 # Scaling not necessary
@@ -506,6 +511,7 @@ function generic_norm2(x)
506
511
(v, s) = y
507
512
sum += norm_sqr (v)
508
513
end
514
+ ismissing (sum) && return missing
509
515
return convert (T, sqrt (sum))
510
516
else
511
517
sum = abs2 (norm (v)/ maxabs)
@@ -515,6 +521,7 @@ function generic_norm2(x)
515
521
(v, s) = y
516
522
sum += (norm (v)/ maxabs)^ 2
517
523
end
524
+ ismissing (sum) && return missing
518
525
return convert (T, maxabs* sqrt (sum))
519
526
end
520
527
end
@@ -525,7 +532,7 @@ function generic_normp(x, p)
525
532
(v, s) = iterate (x):: Tuple
526
533
if p > 1 || p < - 1 # might need to rescale to avoid overflow
527
534
maxabs = p > 1 ? normInf (x) : normMinusInf (x)
528
- (maxabs == 0 || isinf (maxabs)) && return maxabs
535
+ (ismissing (maxabs) || maxabs == 0 || isinf (maxabs)) && return maxabs
529
536
T = typeof (maxabs)
530
537
else
531
538
T = typeof (float (norm (v)))
@@ -539,15 +546,18 @@ function generic_normp(x, p)
539
546
(v, s) = y
540
547
sum += norm (v)^ spp
541
548
end
549
+ ismissing (sum) && return missing
542
550
return convert (T, sum^ inv (spp))
543
551
else # rescaling
544
552
sum = (norm (v)/ maxabs)^ spp
553
+ ismissing (sum) && return missing
545
554
while true
546
555
y = iterate (x, s)
547
556
y === nothing && break
548
557
(v, s) = y
549
558
sum += (norm (v)/ maxabs)^ spp
550
559
end
560
+ ismissing (sum) && return missing
551
561
return convert (T, maxabs* sum^ inv (spp))
552
562
end
553
563
end
0 commit comments