Skip to content
This repository was archived by the owner on Feb 2, 2024. It is now read-only.

Commit 2d37924

Browse files
author
Ehsan Totoni
committed
dict int32 int32 support
1 parent 07ce0ac commit 2d37924

3 files changed

Lines changed: 196 additions & 6 deletions

File tree

hpat/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import numba
44
from numba import *
55
import hpat.dict_ext
6-
from hpat.dict_ext import DictIntInt, dict_int_int_type
6+
from hpat.dict_ext import DictIntInt, DictInt32Int32, dict_int_int_type, dict_int32_int32_type
77
import hpat.str_ext
88

99
def jit(signature_or_function=None, **options):

hpat/_dict_ext.cpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ int64_t dict_int_int_min(std::unordered_map<int64_t, int64_t>* m);
1414
int64_t dict_int_int_max(std::unordered_map<int64_t, int64_t>* m);
1515
bool dict_int_int_not_empty(std::unordered_map<int64_t, int64_t>* m);
1616

17+
// -- int32 versions --
18+
void* init_dict_int32_int32();
19+
void dict_int32_int32_setitem(std::unordered_map<int, int>* m, int index, int value);
20+
void dict_int32_int32_print(std::unordered_map<int, int>* m);
21+
int dict_int32_int32_get(std::unordered_map<int, int>* m, int index, int default_val);
22+
int dict_int32_int32_getitem(std::unordered_map<int, int>* m, int index);
23+
int dict_int32_int32_pop(std::unordered_map<int, int>* m, int index);
24+
void* dict_int32_int32_keys(std::unordered_map<int, int>* m);
25+
int dict_int32_int32_min(std::unordered_map<int, int>* m);
26+
int dict_int32_int32_max(std::unordered_map<int, int>* m);
27+
bool dict_int32_int32_not_empty(std::unordered_map<int, int>* m);
28+
29+
1730
PyMODINIT_FUNC PyInit_hdict_ext(void) {
1831
PyObject *m;
1932
static struct PyModuleDef moduledef = {
@@ -42,6 +55,27 @@ PyMODINIT_FUNC PyInit_hdict_ext(void) {
4255
PyLong_FromVoidPtr((void*)(&dict_int_int_max)));
4356
PyObject_SetAttrString(m, "dict_int_int_not_empty",
4457
PyLong_FromVoidPtr((void*)(&dict_int_int_not_empty)));
58+
// ---- int32 versions ----
59+
PyObject_SetAttrString(m, "init_dict_int32_int32",
60+
PyLong_FromVoidPtr((void*)(&init_dict_int32_int32)));
61+
PyObject_SetAttrString(m, "dict_int32_int32_setitem",
62+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_setitem)));
63+
PyObject_SetAttrString(m, "dict_int32_int32_print",
64+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_print)));
65+
PyObject_SetAttrString(m, "dict_int32_int32_get",
66+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_get)));
67+
PyObject_SetAttrString(m, "dict_int32_int32_getitem",
68+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_getitem)));
69+
PyObject_SetAttrString(m, "dict_int32_int32_pop",
70+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_pop)));
71+
PyObject_SetAttrString(m, "dict_int32_int32_keys",
72+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_keys)));
73+
PyObject_SetAttrString(m, "dict_int32_int32_min",
74+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_min)));
75+
PyObject_SetAttrString(m, "dict_int32_int32_max",
76+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_max)));
77+
PyObject_SetAttrString(m, "dict_int32_int32_not_empty",
78+
PyLong_FromVoidPtr((void*)(&dict_int32_int32_not_empty)));
4579
return m;
4680
}
4781

@@ -117,3 +151,78 @@ bool dict_int_int_not_empty(std::unordered_map<int64_t, int64_t>* m)
117151
{
118152
return !m->empty();
119153
}
154+
155+
156+
// --------- int32 versions ------
157+
void* init_dict_int32_int32()
158+
{
159+
return new std::unordered_map<int, int>();
160+
}
161+
162+
void dict_int32_int32_setitem(std::unordered_map<int, int>* m, int index, int value)
163+
{
164+
(*m)[index] = value;
165+
return;
166+
}
167+
168+
void dict_int32_int32_print(std::unordered_map<int, int>* m)
169+
{
170+
// TODO: return python string and print in native mode
171+
for (auto& x: *m) {
172+
std::cout << x.first << ": " << x.second << std::endl;
173+
}
174+
return;
175+
}
176+
177+
int dict_int32_int32_get(std::unordered_map<int, int>* m, int index, int default_val)
178+
{
179+
auto val = m->find(index);
180+
if (val==m->end())
181+
return default_val;
182+
return (*val).second;
183+
}
184+
185+
int dict_int32_int32_getitem(std::unordered_map<int, int>* m, int index)
186+
{
187+
return m->at(index);
188+
}
189+
190+
int dict_int32_int32_pop(std::unordered_map<int, int>* m, int index)
191+
{
192+
int val = m->at(index);
193+
m->erase(index);
194+
return val;
195+
}
196+
197+
void* dict_int32_int32_keys(std::unordered_map<int, int>* m)
198+
{
199+
// TODO: return actual iterator
200+
return m;
201+
}
202+
203+
int dict_int32_int32_min(std::unordered_map<int, int>* m)
204+
{
205+
// TODO: use actual iterator
206+
int res = std::numeric_limits<int>::max();
207+
for (auto& x: *m) {
208+
if (x.first<res)
209+
res = x.first;
210+
}
211+
return res;
212+
}
213+
214+
int dict_int32_int32_max(std::unordered_map<int, int>* m)
215+
{
216+
// TODO: use actual iterator
217+
int res = std::numeric_limits<int>::min();
218+
for (auto& x: *m) {
219+
if (x.first>res)
220+
res = x.first;
221+
}
222+
return res;
223+
}
224+
225+
bool dict_int32_int32_not_empty(std::unordered_map<int, int>* m)
226+
{
227+
return !m->empty();
228+
}

hpat/dict_ext.py

Lines changed: 86 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def __init__(self, key_typ, val_typ):
117117
'DictKeyIteratorType{}{}'.format(key_typ, val_typ))
118118

119119
dict_key_iterator_int_int_type = DictKeyIteratorType(types.intp, types.intp)
120+
dict_key_iterator_int32_int32_type = DictKeyIteratorType(types.int32, types.int32)
120121

121122
register_model(DictKeyIteratorType)(models.OpaqueModel)
122123

@@ -139,6 +140,19 @@ def generic(self, args, kws):
139140
ll.add_symbol('dict_int_int_max', hdict_ext.dict_int_int_max)
140141
ll.add_symbol('dict_int_int_not_empty', hdict_ext.dict_int_int_not_empty)
141142

143+
# int32 versions
144+
ll.add_symbol('init_dict_int32_int32', hdict_ext.init_dict_int32_int32)
145+
ll.add_symbol('dict_int32_int32_setitem', hdict_ext.dict_int32_int32_setitem)
146+
ll.add_symbol('dict_int32_int32_print', hdict_ext.dict_int32_int32_print)
147+
ll.add_symbol('dict_int32_int32_get', hdict_ext.dict_int32_int32_get)
148+
ll.add_symbol('dict_int32_int32_getitem', hdict_ext.dict_int32_int32_getitem)
149+
ll.add_symbol('dict_int32_int32_pop', hdict_ext.dict_int32_int32_pop)
150+
ll.add_symbol('dict_int32_int32_keys', hdict_ext.dict_int32_int32_keys)
151+
ll.add_symbol('dict_int32_int32_min', hdict_ext.dict_int32_int32_min)
152+
ll.add_symbol('dict_int32_int32_max', hdict_ext.dict_int32_int32_max)
153+
ll.add_symbol('dict_int32_int32_not_empty', hdict_ext.dict_int32_int32_not_empty)
154+
155+
142156
@lower_builtin(DictIntInt)
143157
def impl_dict_int_int(context, builder, sig, args):
144158
fnty = lir.FunctionType(lir.IntType(8).as_pointer(), [])
@@ -151,7 +165,7 @@ def setitem_dict(context, builder, sig, args):
151165
fn = builder.module.get_or_insert_function(fnty, name="dict_int_int_setitem")
152166
return builder.call(fn, args)
153167

154-
@lower_builtin("print_item", DictType)
168+
@lower_builtin("print_item", dict_int_int_type)
155169
def print_dict(context, builder, sig, args):
156170
# pyapi = context.get_python_api(builder)
157171
# strobj = pyapi.unserialize(pyapi.serialize_object("hello!"))
@@ -180,26 +194,93 @@ def lower_dict_pop(context, builder, sig, args):
180194
fn = builder.module.get_or_insert_function(fnty, name="dict_int_int_pop")
181195
return builder.call(fn, args)
182196

183-
@lower_builtin("dict.keys", DictType)
197+
@lower_builtin("dict.keys", dict_int_int_type)
184198
def lower_dict_keys(context, builder, sig, args):
185199
fnty = lir.FunctionType(lir.IntType(8).as_pointer(), [lir.IntType(8).as_pointer()])
186200
fn = builder.module.get_or_insert_function(fnty, name="dict_int_int_keys")
187201
return builder.call(fn, args)
188202

189-
@lower_builtin(min, DictKeyIteratorType)
203+
@lower_builtin(min, dict_key_iterator_int_int_type)
190204
def lower_dict_min(context, builder, sig, args):
191205
fnty = lir.FunctionType(lir.IntType(64), [lir.IntType(8).as_pointer()])
192206
fn = builder.module.get_or_insert_function(fnty, name="dict_int_int_min")
193207
return builder.call(fn, args)
194208

195-
@lower_builtin(max, DictKeyIteratorType)
209+
@lower_builtin(max, dict_key_iterator_int_int_type)
196210
def lower_dict_max(context, builder, sig, args):
197211
fnty = lir.FunctionType(lir.IntType(64), [lir.IntType(8).as_pointer()])
198212
fn = builder.module.get_or_insert_function(fnty, name="dict_int_int_max")
199213
return builder.call(fn, args)
200214

201-
@lower_cast(DictType, types.boolean)
215+
@lower_cast(dict_int_int_type, types.boolean)
202216
def dict_empty(context, builder, fromty, toty, val):
203217
fnty = lir.FunctionType(lir.IntType(1), [lir.IntType(8).as_pointer()])
204218
fn = builder.module.get_or_insert_function(fnty, name="dict_int_int_not_empty")
205219
return builder.call(fn, (val,))
220+
221+
222+
# ------ int32 versions ------
223+
@lower_builtin(DictInt32Int32)
224+
def impl_dict_int_int(context, builder, sig, args):
225+
fnty = lir.FunctionType(lir.IntType(8).as_pointer(), [])
226+
fn = builder.module.get_or_insert_function(fnty, name="init_dict_int32_int32")
227+
return builder.call(fn, [])
228+
229+
@lower_builtin('setitem', DictType, types.int32, types.int32)
230+
def setitem_dict(context, builder, sig, args):
231+
fnty = lir.FunctionType(lir.VoidType(), [lir.IntType(8).as_pointer(), lir.IntType(32), lir.IntType(32)])
232+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_setitem")
233+
return builder.call(fn, args)
234+
235+
@lower_builtin("print_item", dict_int32_int32_type)
236+
def print_dict(context, builder, sig, args):
237+
# pyapi = context.get_python_api(builder)
238+
# strobj = pyapi.unserialize(pyapi.serialize_object("hello!"))
239+
# pyapi.print_object(strobj)
240+
# pyapi.decref(strobj)
241+
# return context.get_dummy_value()
242+
fnty = lir.FunctionType(lir.VoidType(), [lir.IntType(8).as_pointer()])
243+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_print")
244+
return builder.call(fn, args)
245+
246+
@lower_builtin("dict.get", DictType, types.int32, types.int32)
247+
def lower_dict_get(context, builder, sig, args):
248+
fnty = lir.FunctionType(lir.IntType(32), [lir.IntType(8).as_pointer(), lir.IntType(32), lir.IntType(32)])
249+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_get")
250+
return builder.call(fn, args)
251+
252+
@lower_builtin("getitem", DictType, types.int32)
253+
def lower_dict_getitem(context, builder, sig, args):
254+
fnty = lir.FunctionType(lir.IntType(32), [lir.IntType(8).as_pointer(), lir.IntType(32)])
255+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_getitem")
256+
return builder.call(fn, args)
257+
258+
@lower_builtin("dict.pop", DictType, types.int32)
259+
def lower_dict_pop(context, builder, sig, args):
260+
fnty = lir.FunctionType(lir.IntType(32), [lir.IntType(8).as_pointer(), lir.IntType(32)])
261+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_pop")
262+
return builder.call(fn, args)
263+
264+
@lower_builtin("dict.keys", dict_int32_int32_type)
265+
def lower_dict_keys(context, builder, sig, args):
266+
fnty = lir.FunctionType(lir.IntType(8).as_pointer(), [lir.IntType(8).as_pointer()])
267+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_keys")
268+
return builder.call(fn, args)
269+
270+
@lower_builtin(min, dict_key_iterator_int32_int32_type)
271+
def lower_dict_min(context, builder, sig, args):
272+
fnty = lir.FunctionType(lir.IntType(32), [lir.IntType(8).as_pointer()])
273+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_min")
274+
return builder.call(fn, args)
275+
276+
@lower_builtin(max, dict_key_iterator_int32_int32_type)
277+
def lower_dict_max(context, builder, sig, args):
278+
fnty = lir.FunctionType(lir.IntType(32), [lir.IntType(8).as_pointer()])
279+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_max")
280+
return builder.call(fn, args)
281+
282+
@lower_cast(dict_int32_int32_type, types.boolean)
283+
def dict_empty(context, builder, fromty, toty, val):
284+
fnty = lir.FunctionType(lir.IntType(1), [lir.IntType(8).as_pointer()])
285+
fn = builder.module.get_or_insert_function(fnty, name="dict_int32_int32_not_empty")
286+
return builder.call(fn, (val,))

0 commit comments

Comments
 (0)