def _init_discrete_filter_masks(self):
"""Create an array of passing ids for every discrete valued filter.
:rtype: dict `{filter_name: {value: [ids]}}`"""
translated = tuple(TRANSLATION.get(f,f) for f in ['variant_id']+DISCRETE_FILTER_NAMES)
cursor = connections[self.db].cursor()
cursor.execute("SELECT {} FROM variants".format(','.join(translated)))
# Create a variants mask per couple (filter, value), with 1 at indices corresponding to passing variants
variant_masks = {t:defaultdict(partial(np.zeros, self._N, dtype=np.bool_)) for t in DISCRETE_FILTER_NAMES}
enum_values = {t:set() for t in DISCRETE_FILTER_NAMES}
irange = range(1,len(translated))
for row in cursor:
vid = row[0] # variant id
for i in irange:
val = row[i]
fname = DISCRETE_FILTER_NAMES[i-1]
variant_masks[fname][val][vid-1] = 1
enum_values[fname].add(val)
# Pack and cache the result
for fname in DISCRETE_FILTER_NAMES:
for val, mask in variant_masks[fname].items():
mask = masking.pack(mask)
self.save_mask(mask, fname, val)
self.save_enum_values(enum_values)
self._masks_ready = True
评论列表
文章目录