File size: 923 Bytes
64c992d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""Decodes the release's fixed-point integer encoding for shieldings and similar fields.

Values are stored as whole numbers equal to the real value times `scale`, with a reserved marker for
values that were never computed. This turns them back into real values (NaN where missing); float
input passes through untouched, so the same decoder reads either the released int32 encoding or an
older plain-float copy.
"""
import numpy as np

FIXED_POINT_SCALE = 1e4
MISSING_MARKER = -2147483648


def decode_fixed_point(values, scale=FIXED_POINT_SCALE, missing_marker=MISSING_MARKER):
    """Convert fixed-point integers back to real-valued floats, mapping the missing marker to NaN."""
    values = np.asarray(values)
    if np.issubdtype(values.dtype, np.integer):
        out = values.astype(np.float64) / scale
        out[values == missing_marker] = np.nan
        return out
    return np.asarray(values, dtype=np.float64)