in parlai/core/teachers.py [0:0]
def build_table(self, entry):
"""
Packs an entry into an action-observation dictionary.
:param entry: a tuple in the form described in the class docstring.
"""
if isinstance(entry, (dict, Message)):
# user is already provided things
if 'eval_labels' in entry or 'eval_label' in entry:
raise KeyError(
'Labels are converted to eval_labels automatically. Please do not '
'set them in setup_data.'
)
if 'episode_done' in entry:
raise KeyError(
"episode_done is set automatically for you. Please don't set it "
"in setup_data."
)
if 'label' in entry:
# for convenience, rename to the labels convention automatically
label = entry.pop('label')
assert isinstance(label, str)
entry['labels'] = (label,)
if 'labels' in entry and isinstance(entry['labels'], str):
entry['labels'] = (entry['labels'],)
table = entry.copy()
elif isinstance(entry, (Tuple, List)):
table = {}
if entry[0] is not None:
table['text'] = entry[0]
if len(entry) > 1 and entry[1] is not None:
l = entry[1]
if isinstance(l, str):
l = (l,)
table['labels'] = l
if len(entry) > 2 and entry[2] is not None:
table['reward'] = entry[2]
if len(entry) > 3 and entry[3] is not None:
table['label_candidates'] = entry[3]
if len(entry) > 4 and entry[4] is not None:
img = self.image_loader.load(entry[4])
if img is not None:
table['image'] = img
else:
raise TypeError(
f"items out of setup_data should be dict, Message, list, or tuple. "
f"Got {type(entry)})"
)
if table.get('labels', None) is not None and self.cands is not None:
if self.addedCands:
# remove elements in addedCands
self.cands.difference_update(self.addedCands)
self.addedCands.clear()
for label in table['labels']:
if label not in self.cands:
# add labels, queue them for removal next time
if not self.copied_cands:
self.cands = self.cands.copy()
self.copied_cands = True
self.cands.add(label)
self.addedCands.append(label)
table['label_candidates'] = self.cands
if 'labels' in table and 'label_candidates' in table:
if table['labels'][0] not in table['label_candidates']:
raise RuntimeError('true label missing from candidate labels')
# go ahead and make it a message
if isinstance(table, dict):
table = Message(table)
return table