3
3
and manipulation of arrays and party objects.
4
4
"""
5
5
6
+ from typing import Any , Iterable
6
7
from nada_dsl import (
7
8
Party ,
8
9
SecretInteger ,
@@ -30,20 +31,20 @@ def parties(num: int, prefix: str = "Party") -> list:
30
31
return [Party (name = f"{ prefix } { i } " ) for i in range (num )]
31
32
32
33
33
- def __from_list ( lst : list , nada_type : Integer | UnsignedInteger ) -> list :
34
+ def __from_numpy ( arr : np . ndarray , nada_type : Integer | UnsignedInteger ) -> list :
34
35
"""
35
- Recursively convert a nested list to a list of NadaInteger objects.
36
+ Recursively convert a n-dimensional NumPy array to a nested list of NadaInteger objects.
36
37
37
38
Args:
38
- lst (list ): A nested list of integers.
39
+ arr (np.ndarray ): A NumPy array of integers.
39
40
nada_type (type): The type of NadaInteger objects to create.
40
41
41
42
Returns:
42
43
list: A nested list of NadaInteger objects.
43
44
"""
44
- if len (lst .shape ) == 1 :
45
- return [nada_type (int (elem )) for elem in lst ]
46
- return [__from_list ( lst [i ], nada_type ) for i in range (len ( lst ) )]
45
+ if len (arr .shape ) == 1 :
46
+ return [nada_type (int (elem )) for elem in arr ]
47
+ return [__from_numpy ( arr [i ], nada_type ) for i in range (arr . shape [ 0 ] )]
47
48
48
49
49
50
def from_list (lst : list , nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
@@ -59,15 +60,15 @@ def from_list(lst: list, nada_type: Integer | UnsignedInteger = Integer) -> Nada
59
60
"""
60
61
if not isinstance (lst , np .ndarray ):
61
62
lst = np .array (lst )
62
- return NadaArray (np .array (__from_list (lst , nada_type )))
63
+ return NadaArray (np .array (__from_numpy (lst , nada_type )))
63
64
64
65
65
- def ones (dims : list , nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
66
+ def ones (dims : Iterable [ int ] , nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
66
67
"""
67
68
Create a cleartext NadaArray filled with ones.
68
69
69
70
Args:
70
- dims (list ): A list of integers representing the dimensions of the array.
71
+ dims (Iterable[int] ): A list of integers representing the dimensions of the array.
71
72
nada_type (type, optional): The type of NadaInteger objects to create. Defaults to Integer.
72
73
73
74
Returns:
@@ -76,12 +77,28 @@ def ones(dims: list, nada_type: Integer | UnsignedInteger = Integer) -> NadaArra
76
77
return from_list (np .ones (dims ), nada_type )
77
78
78
79
79
- def zeros (dims : list , nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
80
+ def ones_like (a : np .ndarray | NadaArray , nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
81
+ """
82
+ Create a cleartext NadaArray filled with one with the same shape and type as a given array.
83
+
84
+ Args:
85
+ a (np.ndarray | NadaArray): A reference array.
86
+ nada_type (type, optional): The type of NadaInteger objects to create. Defaults to Integer.
87
+
88
+ Returns:
89
+ NadaArray: The created NadaArray filled with ones.
90
+ """
91
+ if isinstance (a , NadaArray ):
92
+ a = a .inner
93
+ return from_list (np .ones_like (a ), nada_type )
94
+
95
+
96
+ def zeros (dims : Iterable [int ], nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
80
97
"""
81
98
Create a cleartext NadaArray filled with zeros.
82
99
83
100
Args:
84
- dims (list ): A list of integers representing the dimensions of the array.
101
+ dims (Iterable[int] ): A list of integers representing the dimensions of the array.
85
102
nada_type (type, optional): The type of NadaInteger objects to create. Defaults to Integer.
86
103
87
104
Returns:
@@ -90,8 +107,56 @@ def zeros(dims: list, nada_type: Integer | UnsignedInteger = Integer) -> NadaArr
90
107
return from_list (np .zeros (dims ), nada_type )
91
108
92
109
110
+ def zeros_like (a : np .ndarray | NadaArray , nada_type : Integer | UnsignedInteger = Integer ) -> NadaArray :
111
+ """
112
+ Create a cleartext NadaArray filled with zeros with the same shape and type as a given array.
113
+
114
+ Args:
115
+ a (np.ndarray | NadaArray): A reference array.
116
+ nada_type (type, optional): The type of NadaInteger objects to create. Defaults to Integer.
117
+
118
+ Returns:
119
+ NadaArray: The created NadaArray filled with zeros.
120
+ """
121
+ if isinstance (a , NadaArray ):
122
+ a = a .inner
123
+ return from_list (np .zeros_like (a ), nada_type )
124
+
125
+
126
+ def alphas (dims : Iterable [int ], alpha : Any ) -> NadaArray :
127
+ """
128
+ Create a NadaArray filled with a certain constant value.
129
+
130
+ Args:
131
+ dims (Iterable[int]): A list of integers representing the dimensions of the array.
132
+ alpha (Any): Some constant value.
133
+
134
+ Returns:
135
+ NadaArray: NadaArray filled with constant value.
136
+ """
137
+ ones_array = np .ones (dims )
138
+ return NadaArray (np .frompyfunc (lambda _ : alpha , 1 , 1 )(ones_array ))
139
+
140
+
141
+ def alphas_like (a : np .ndarray | NadaArray , alpha : Any ) -> NadaArray :
142
+ """
143
+ Create a NadaArray filled with a certain constant value with the same shape and type as a given array.
144
+
145
+ Args:
146
+ a (np.ndarray | NadaArray): Reference array.
147
+ alpha (Any): Some constant value.
148
+
149
+ Returns:
150
+ NadaArray: NadaArray filled with constant value.
151
+ """
152
+ if isinstance (a , NadaArray ):
153
+ a = a .inner
154
+ ones_array = np .ones_like (a )
155
+ return NadaArray (np .frompyfunc (lambda _ : alpha , 1 , 1 )(ones_array ))
156
+
157
+
93
158
def array (
94
- dims : list ,
159
+ dims : Iterable [ int ] ,
95
160
party : Party ,
96
161
prefix : str ,
97
162
nada_type : (
@@ -102,7 +167,7 @@ def array(
102
167
Create a NadaArray with the specified dimensions and elements of the given type.
103
168
104
169
Args:
105
- dims (list ): A list of integers representing the dimensions of the array.
170
+ dims (Iterable[int] ): A list of integers representing the dimensions of the array.
106
171
party (Party): The party object.
107
172
prefix (str): A prefix for naming the array elements.
108
173
nada_type (type, optional): The type of elements to create. Defaults to SecretInteger.
@@ -114,13 +179,13 @@ def array(
114
179
115
180
116
181
def random (
117
- dims : list , nada_type : SecretInteger | SecretUnsignedInteger = SecretInteger
182
+ dims : Iterable [ int ] , nada_type : SecretInteger | SecretUnsignedInteger = SecretInteger
118
183
) -> NadaArray :
119
184
"""
120
185
Create a random NadaArray with the specified dimensions.
121
186
122
187
Args:
123
- dims (list ): A list of integers representing the dimensions of the array.
188
+ dims (Iterable[int] ): A list of integers representing the dimensions of the array.
124
189
nada_type (type, optional): The type of elements to create. Defaults to SecretInteger.
125
190
126
191
Returns:
0 commit comments