Skip to content

Commit dd112a0

Browse files
authored
Non-linear functions (#53)
* feat: adding project example with non-linear functions * feat: integrate non-linear functions into nada-numpy library * fix: pylint and mypy rules * feat: add test programs under test_all.py
1 parent 8dbf08c commit dd112a0

11 files changed

+3283
-52
lines changed

nada_numpy/array.py

Lines changed: 662 additions & 2 deletions
Large diffs are not rendered by default.

nada_numpy/funcs.py

Lines changed: 543 additions & 0 deletions
Large diffs are not rendered by default.

nada_numpy/types.py

Lines changed: 1705 additions & 49 deletions
Large diffs are not rendered by default.

tests/nada-tests/nada-project.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,16 @@ prime_size = 128
180180

181181
[[programs]]
182182
path = "src/type_guardrails.py"
183+
prime_size = 128
184+
185+
[[programs]]
186+
path = "src/fxpmath_funcs.py"
187+
prime_size = 128
188+
189+
[[programs]]
190+
path = "src/fxpmath_methods.py"
191+
prime_size = 128
192+
193+
[[programs]]
194+
path = "src/fxpmath_arrays.py"
183195
prime_size = 128
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import numpy as np
2+
from nada_dsl import *
3+
4+
import nada_numpy as na
5+
6+
7+
def nada_main():
8+
9+
parties = na.parties(2)
10+
11+
# We use na.SecretRational to create a secret rational number for party 0
12+
a = na.secret_rational("my_input_0", parties[0])
13+
14+
c = na.NadaArray(np.array([a, na.rational(1.5)]))
15+
16+
result_sign = c.sign()
17+
result_abs = c.abs()
18+
result_exp = c.exp()
19+
result_log = c.log()
20+
result_rec_NR = c.reciprocal(method="NR")
21+
result_rec_log = c.reciprocal(method="log")
22+
result_isqrt = c.inv_sqrt()
23+
result_sqrt = c.sqrt()
24+
result_sin = c.sin()
25+
result_cos = c.cos()
26+
result_tan = c.tan()
27+
result_tanh = c.tanh()
28+
result_tanh_che = c.tanh(method="chebyshev")
29+
result_tanh_motz = c.tanh(method="motzkin")
30+
result_sig = c.sigmoid()
31+
result_sig_che = c.sigmoid(method="chebyshev")
32+
result_sig_motz = c.sigmoid(method="motzkin")
33+
result_gelu = c.gelu()
34+
result_gelu_motz = c.gelu(method="motzkin")
35+
result_silu = c.silu()
36+
result_silu_che = c.silu(method_sigmoid="chebyshev")
37+
result_silu_motz = c.silu(method_sigmoid="motzkin")
38+
39+
final_result = (
40+
result_sign.output(parties[1], "result_sign")
41+
+ result_abs.output(parties[1], "result_abs")
42+
+ result_exp.output(parties[1], "result_exp")
43+
+ result_log.output(parties[1], "result_log")
44+
+ result_rec_NR.output(parties[1], "result_rec_NR")
45+
+ result_rec_log.output(parties[1], "result_rec_log")
46+
+ result_isqrt.output(parties[1], "result_isqrt")
47+
+ result_sqrt.output(parties[1], "result_sqrt")
48+
+ result_sin.output(parties[1], "result_sin")
49+
+ result_cos.output(parties[1], "result_cos")
50+
+ result_tan.output(parties[1], "result_tan")
51+
+ result_tanh.output(parties[1], "result_tanh")
52+
+ result_tanh_che.output(parties[1], "result_tanh_che")
53+
+ result_tanh_motz.output(parties[1], "result_tanh_motz")
54+
+ result_sig.output(parties[1], "result_sig")
55+
+ result_sig_che.output(parties[1], "result_sig_che")
56+
+ result_sig_motz.output(parties[1], "result_sig_motz")
57+
+ result_gelu.output(parties[1], "result_gelu")
58+
+ result_gelu_motz.output(parties[1], "result_gelu_motz")
59+
+ result_silu.output(parties[1], "result_silu")
60+
+ result_silu_che.output(parties[1], "result_silu_che")
61+
+ result_silu_motz.output(parties[1], "result_silu_motz")
62+
)
63+
64+
return final_result

tests/nada-tests/src/fxpmath_funcs.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from nada_dsl import *
2+
3+
import nada_numpy as na
4+
5+
6+
def nada_main():
7+
8+
parties = na.parties(2)
9+
10+
# We use na.SecretRational to create a secret rational number for party 0
11+
a = na.secret_rational("my_input_0", parties[0])
12+
13+
result_exp = na.exp(a * na.rational(2))
14+
result_log = na.log(a * na.rational(100))
15+
result_rec_NR = na.reciprocal(a * na.rational(2), method="NR")
16+
result_rec_log = na.reciprocal(a * na.rational(4), method="log")
17+
result_isqrt = na.inv_sqrt(a * na.rational(210))
18+
result_sqrt = na.sqrt(a * na.rational(16))
19+
result_sin = na.sin(a * na.rational(2.1))
20+
result_cos = na.cos(a * na.rational(2.1))
21+
result_tan = na.tan(a * na.rational(4.8))
22+
result_tanh = na.tanh(a * na.rational(1.3))
23+
result_tanh_che = na.tanh(a * na.rational(0.3), method="chebyshev")
24+
result_tanh_motz = na.tanh(a * na.rational(0.4), method="motzkin")
25+
result_sig = na.sigmoid(a * na.rational(0.1))
26+
result_sig_che = na.sigmoid(a * na.rational(-0.1), method="chebyshev")
27+
result_sig_motz = na.sigmoid(a * na.rational(10), method="motzkin")
28+
result_gelu = na.gelu(a * na.rational(-13))
29+
result_gelu_motz = na.gelu(a * na.rational(-13), method="motzkin")
30+
result_silu = na.silu(a * na.rational(10))
31+
result_silu_che = na.silu(a * na.rational(-10), method_sigmoid="chebyshev")
32+
result_silu_motz = na.silu(a * na.rational(0), method_sigmoid="motzkin")
33+
34+
return [
35+
Output(result_exp.value, "result_exp", parties[1]),
36+
Output(result_log.value, "result_log", parties[1]),
37+
Output(result_rec_NR.value, "result_rec_NR", parties[1]),
38+
Output(result_rec_log.value, "result_rec_log", parties[1]),
39+
Output(result_isqrt.value, "result_isqrt", parties[1]),
40+
Output(result_sqrt.value, "result_sqrt", parties[1]),
41+
Output(result_sin.value, "result_sin", parties[1]),
42+
Output(result_cos.value, "result_cos", parties[1]),
43+
Output(result_tan.value, "result_tan", parties[1]),
44+
Output(result_tanh.value, "result_tanh", parties[1]),
45+
Output(result_tanh_che.value, "result_tanh_che", parties[1]),
46+
Output(result_tanh_motz.value, "result_tanh_motz", parties[1]),
47+
Output(result_sig.value, "result_sig", parties[1]),
48+
Output(result_sig_che.value, "result_sig_che", parties[1]),
49+
Output(result_sig_motz.value, "result_sig_motz", parties[1]),
50+
Output(result_gelu.value, "result_gelu", parties[1]),
51+
Output(result_gelu_motz.value, "result_gelu_motz", parties[1]),
52+
Output(result_silu.value, "result_silu", parties[1]),
53+
Output(result_silu_che.value, "result_silu_che", parties[1]),
54+
Output(result_silu_motz.value, "result_silu_motz", parties[1]),
55+
]
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from nada_dsl import *
2+
3+
import nada_numpy as na
4+
5+
6+
def nada_main():
7+
8+
parties = na.parties(2)
9+
10+
# We use na.SecretRational to create a secret rational number for party 0
11+
a = na.secret_rational("my_input_0", parties[0])
12+
13+
result_exp = (a * na.rational(2)).exp()
14+
result_log = (a * na.rational(100)).log()
15+
result_rec_NR = (a * na.rational(2)).reciprocal(method="NR")
16+
result_rec_log = (a * na.rational(4)).reciprocal(method="log")
17+
result_isqrt = (a * na.rational(210)).inv_sqrt()
18+
result_sqrt = (a * na.rational(16)).sqrt()
19+
result_sin = (a * na.rational(2.1)).sin()
20+
result_cos = (a * na.rational(2.1)).cos()
21+
result_tan = (a * na.rational(4.8)).tan()
22+
result_tanh = (a * na.rational(1.3)).tanh()
23+
result_tanh_che = (a * na.rational(0.3)).tanh(method="chebyshev")
24+
result_tanh_motz = (a * na.rational(0.4)).tanh(method="motzkin")
25+
result_sig = (a * na.rational(0.1)).sigmoid()
26+
result_sig_che = (a * na.rational(-0.1)).sigmoid(method="chebyshev")
27+
result_sig_motz = (a * na.rational(10)).sigmoid(method="motzkin")
28+
result_gelu = (a * na.rational(-13)).gelu()
29+
result_gelu_motz = (a * na.rational(-13)).gelu(method="motzkin")
30+
result_silu = (a * na.rational(10)).silu()
31+
result_silu_che = (a * na.rational(-10)).silu(method_sigmoid="chebyshev")
32+
result_silu_motz = (a * na.rational(0)).silu(method_sigmoid="motzkin")
33+
34+
return [
35+
Output(result_exp.value, "result_exp", parties[1]),
36+
Output(result_log.value, "result_log", parties[1]),
37+
Output(result_rec_NR.value, "result_rec_NR", parties[1]),
38+
Output(result_rec_log.value, "result_rec_log", parties[1]),
39+
Output(result_isqrt.value, "result_isqrt", parties[1]),
40+
Output(result_sqrt.value, "result_sqrt", parties[1]),
41+
Output(result_sin.value, "result_sin", parties[1]),
42+
Output(result_cos.value, "result_cos", parties[1]),
43+
Output(result_tan.value, "result_tan", parties[1]),
44+
Output(result_tanh.value, "result_tanh", parties[1]),
45+
Output(result_tanh_che.value, "result_tanh_che", parties[1]),
46+
Output(result_tanh_motz.value, "result_tanh_motz", parties[1]),
47+
Output(result_sig.value, "result_sig", parties[1]),
48+
Output(result_sig_che.value, "result_sig_che", parties[1]),
49+
Output(result_sig_motz.value, "result_sig_motz", parties[1]),
50+
Output(result_gelu.value, "result_gelu", parties[1]),
51+
Output(result_gelu_motz.value, "result_gelu_motz", parties[1]),
52+
Output(result_silu.value, "result_silu", parties[1]),
53+
Output(result_silu_che.value, "result_silu_che", parties[1]),
54+
Output(result_silu_motz.value, "result_silu_motz", parties[1]),
55+
]
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
---
2+
program: fxpmath_arrays
3+
inputs:
4+
my_input_0:
5+
SecretInteger: "3"
6+
expected_outputs:
7+
result_sig_0:
8+
SecretInteger: "32711"
9+
result_sqrt_1:
10+
Integer: "80265"
11+
result_sig_motz_1:
12+
Integer: "53477"
13+
result_silu_0:
14+
SecretInteger: "1"
15+
result_gelu_0:
16+
SecretInteger: "1"
17+
result_tan_1:
18+
Integer: "888645"
19+
result_tanh_1:
20+
Integer: "59434"
21+
result_tan_0:
22+
SecretInteger: "0"
23+
result_exp_0:
24+
SecretInteger: "65536"
25+
result_sig_1:
26+
Integer: "53644"
27+
result_silu_motz_1:
28+
Integer: "80215"
29+
result_gelu_motz_1:
30+
Integer: "91629"
31+
result_sig_che_1:
32+
Integer: "53580"
33+
result_log_0:
34+
SecretInteger: "-614828"
35+
result_sqrt_0:
36+
SecretInteger: "45"
37+
result_silu_che_0:
38+
SecretInteger: "1"
39+
result_rec_NR_1:
40+
Integer: "43692"
41+
result_tanh_che_1:
42+
Integer: "65536"
43+
result_gelu_motz_0:
44+
SecretInteger: "103"
45+
result_exp_1:
46+
Integer: "292119"
47+
result_isqrt_1:
48+
Integer: "53510"
49+
result_cos_1:
50+
Integer: "4846"
51+
result_tanh_motz_1:
52+
Integer: "59394"
53+
result_cos_0:
54+
SecretInteger: "65536"
55+
result_sig_che_0:
56+
SecretInteger: "32768"
57+
result_rec_log_0:
58+
SecretInteger: "65040192"
59+
result_sig_motz_0:
60+
SecretInteger: "32686"
61+
result_log_1:
62+
Integer: "26359"
63+
result_tanh_0:
64+
SecretInteger: "-114"
65+
result_sin_1:
66+
Integer: "65710"
67+
result_gelu_1:
68+
Integer: "91839"
69+
result_silu_che_1:
70+
Integer: "80370"
71+
result_tanh_motz_0:
72+
SecretInteger: "-160"
73+
result_tanh_che_0:
74+
SecretInteger: "2"
75+
result_rec_NR_0:
76+
SecretInteger: "451510139"
77+
result_rec_log_1:
78+
Integer: "34575"
79+
result_silu_1:
80+
Integer: "80466"
81+
result_isqrt_0:
82+
SecretInteger: "989647"
83+
result_silu_motz_0:
84+
SecretInteger: "1"
85+
result_sin_0:
86+
SecretInteger: "0"
87+
result_sign_1:
88+
Integer: "65536"
89+
result_sign_0:
90+
SecretInteger: "65536"
91+
result_abs_1:
92+
Integer: "98304"
93+
result_abs_0:
94+
SecretInteger: "3"
95+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
program: fxpmath_funcs
3+
inputs:
4+
my_input_0:
5+
SecretInteger: "65536"
6+
expected_outputs:
7+
result_gelu:
8+
SecretInteger: "-13"
9+
result_cos:
10+
SecretInteger: "-32566"
11+
result_isqrt:
12+
SecretInteger: "-2341"
13+
result_gelu_motz:
14+
SecretInteger: "0"
15+
result_silu:
16+
SecretInteger: "655340"
17+
result_sin:
18+
SecretInteger: "57328"
19+
result_tanh_che:
20+
SecretInteger: "19089"
21+
result_tanh_motz:
22+
SecretInteger: "24917"
23+
result_silu_che:
24+
SecretInteger: "0"
25+
result_sig_motz:
26+
SecretInteger: "65536"
27+
result_tanh:
28+
SecretInteger: "56624"
29+
result_rec_log:
30+
SecretInteger: "15552"
31+
result_sig_che:
32+
SecretInteger: "31130"
33+
result_sig:
34+
SecretInteger: "34401"
35+
result_tan:
36+
SecretInteger: "-922765"
37+
result_sqrt:
38+
SecretInteger: "262128"
39+
result_log:
40+
SecretInteger: "298843"
41+
result_exp:
42+
SecretInteger: "480249"
43+
result_rec_NR:
44+
SecretInteger: "32768"
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
program: fxpmath_methods
3+
inputs:
4+
my_input_0:
5+
SecretInteger: "65536"
6+
expected_outputs:
7+
result_gelu:
8+
SecretInteger: "-13"
9+
result_cos:
10+
SecretInteger: "-32566"
11+
result_isqrt:
12+
SecretInteger: "-2341"
13+
result_gelu_motz:
14+
SecretInteger: "0"
15+
result_silu:
16+
SecretInteger: "655340"
17+
result_sin:
18+
SecretInteger: "57328"
19+
result_tanh_che:
20+
SecretInteger: "19089"
21+
result_tanh_motz:
22+
SecretInteger: "24917"
23+
result_silu_che:
24+
SecretInteger: "0"
25+
result_sig_motz:
26+
SecretInteger: "65536"
27+
result_tanh:
28+
SecretInteger: "56624"
29+
result_rec_log:
30+
SecretInteger: "15552"
31+
result_sig_che:
32+
SecretInteger: "31130"
33+
result_sig:
34+
SecretInteger: "34401"
35+
result_tan:
36+
SecretInteger: "-922765"
37+
result_sqrt:
38+
SecretInteger: "262128"
39+
result_log:
40+
SecretInteger: "298843"
41+
result_exp:
42+
SecretInteger: "480249"
43+
result_rec_NR:
44+
SecretInteger: "32768"

tests/test_all.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@
4949
# Not supported yet
5050
# "unsigned_matrix_inverse",
5151
"private_inverse",
52-
# "unsigned_matrix_inverse_2"
52+
# "unsigned_matrix_inverse_2",
53+
"fxpmath_funcs",
54+
"fxpmath_arrays",
55+
"fxpmath_methods"
5356
]
5457

5558
EXAMPLES = [

0 commit comments

Comments
 (0)