-
Notifications
You must be signed in to change notification settings - Fork 0
/
Mapping.py
133 lines (116 loc) · 4.96 KB
/
Mapping.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import math
class Mapping(object):
"""
class to map numbers from one range to another range
"""
def _init__(self):
pass
@staticmethod
def clip_value(value, minimum, maximum):
if minimum > maximum:
minimum, maximum = maximum, minimum
if value < minimum:
return minimum
elif value > maximum:
return maximum
else:
return value
@staticmethod
def linlin(value, in_min, in_max, out_min, out_max, clip=True):
"""
maps value \in [in_min,in_max] linearly to the corresponding value \in [out_min, out_max]
(extrapolating if needed)
e.g. linlin(0.3,0,1,10,20) = 13
:param value: value to be mapped
:param in_min: input range minimum
:param in_max: input range maximum
:param out_min: what input range minimum is mapped to
:param out_max: what input range maximum is mapped to
:param clip: if True, the output value is clipped to range [out_min, out_max]
:return: linear mapping from value in input range to value in output range (extrapolating if needed)
example: linlin(0.2, 0, 1, 10, 20) = 13
"""
if in_min == in_max:
if value == in_min and out_min == out_max:
return out_min
return None
output = ((out_min + out_max) + (out_max - out_min) * (
(2 * value - (in_min + in_max)) / float(in_max - in_min))) / 2.0
if clip:
output = Mapping.clip_value(output, out_min, out_max)
return output
@staticmethod
def linexp(value, in_min, in_max, out_min, out_max, clip=True):
"""
maps value \in linear range [in_min,in_max] corresponding value \in exponential range [out_min, out_max]
(extrapolating if needed)
:param value: value to be mapped
:param in_min: input range minimum
:param in_max: input range maximum
:param out_min: what input range minimum is mapped to
:param out_max: what input range maximum is mapped to
:param clip: if True, the output value is clipped to range [out_min, out_max]
:return: mapping from value in linear input range to value in exponential output range (extrapolating if needed)
"""
if out_min == 0:
return None
if in_min == in_max:
if value == in_min and out_min == out_max:
return out_min
return None
output = math.pow(out_max / out_min, (value - in_min) / (in_max - in_min)) * out_min
if clip:
output = Mapping.clip_value(output, out_min, out_max)
return output
@staticmethod
def explin(value, in_min, in_max, out_min, out_max, clip=True):
"""
maps value \in exponential range [in_min,in_max] corresponding value \in linear range [out_min, out_max]
(extrapolating if possible)
:param value: value to be mapped
:param in_min: input range minimum
:param in_max: input range maximum
:param out_min: what input range minimum is mapped to
:param out_max: what input range maximum is mapped to
:param clip: if True, the output value is clipped to range [out_min, out_max]
:return: mapping from value in exponential input range to value in linear output range
(extrapolating if possible)
"""
if in_min == 0:
return None
if (value / in_min) <= 0:
return None
if (in_max / in_min) <= 0:
return None
output = math.log(value / in_min) / math.log(in_max / in_min) * (out_max - out_min) + out_min
if clip:
output = Mapping.clip_value(output, out_min, out_max)
return output
@staticmethod
def expexp(value, in_min, in_max, out_min, out_max, clip=True):
"""
maps value \in exponential range [in_min,in_max] corresponding value \in exponential range [out_min, out_max]
(extrapolating if possible)
:param value: value to be mapped
:param in_min: input range minimum
:param in_max: input range maximum
:param out_min: what input range minimum is mapped to
:param out_max: what input range maximum is mapped to
:param clip: if True, the output value is clipped to range [out_min, out_max]
:return: mapping from value in exponential input range to value in exponential output range
(extrapolating if possible)
"""
if out_min:
return None
if value == 0:
return None
if value / in_min <= 0:
return None
if in_min == 0:
return None
if (in_max - in_min) <= 0:
return None
output = math.pow(out_max / out_min, math.log(value / in_min) / math.log(in_max / in_min)) * out_min
if clip:
output = Mapping.clip_value(output, out_min, out_max)
return output