Source code for ibeis.control.manual_name_funcs

# -*- coding: utf-8 -*-
"""
python -c "import utool as ut; ut.write_modscript_alias('Tgen.sh', 'ibeis.templates.template_generator')"  # NOQA
sh Tgen.sh --key name --invert --Tcfg with_getters=True with_setters=False --modfname manual_name_funcs  # NOQA
sh Tgen.sh --key name --invert --Tcfg with_getters=True with_setters=True --modfname manual_name_funcs --funcname-filter=sex  # NOQA

"""
from __future__ import absolute_import, division, print_function
# TODO: Fix this name it is too special case
import uuid
import functools
import six  # NOQA
#from six.moves import range
from ibeis import constants as const
from ibeis.other import ibsfuncs
import numpy as np
import vtool as vt
from ibeis.control import accessor_decors, controller_inject  # NOQA
import utool as ut
from ibeis.control.controller_inject import make_ibs_register_decorator
print, rrr, profile = ut.inject2(__name__, '[manual_name]')


CLASS_INJECT_KEY, register_ibs_method = make_ibs_register_decorator(__name__)


register_api   = controller_inject.get_ibeis_flask_api(__name__)
register_route = controller_inject.get_ibeis_flask_route(__name__)


ANNOT_ROWID         = 'annot_rowid'
ANNOT_SEMANTIC_UUID = 'annot_semantic_uuid'
NAME_ROWID          = 'name_rowid'

NAME_UUID       = 'name_uuid'
NAME_TEXT       = 'name_text'
NAME_ALIAS_TEXT = 'name_alias_text'
NAME_NOTE       = 'name_note'
NAME_SEX         = 'name_sex'
NAME_TEMP_FLAG  = 'name_temp_flag'


[docs]def testdata_ibs(defaultdb='testdb1'): import ibeis ibs = ibeis.opendb(defaultdb=defaultdb) config2_ = None # qreq_.qparams return ibs, config2_
@register_ibs_method @accessor_decors.ider def _get_all_known_name_rowids(ibs): r""" Returns: list_ (list): all nids of known animals (does not include unknown names) """ #all_known_nids = ibs._get_all_known_lblannot_rowids(const.INDIVIDUAL_KEY) all_known_nids = ibs.db.get_all_rowids(const.NAME_TABLE) return all_known_nids @register_ibs_method @accessor_decors.ider def _get_all_name_rowids(ibs): r""" Returns: list_ (list): all nids of known animals (does not include unknown names) """ #all_known_nids = ibs._get_all_known_lblannot_rowids(const.INDIVIDUAL_KEY) all_known_nids = ibs.db.get_all_rowids(const.NAME_TABLE) return all_known_nids @register_ibs_method def _get_all_known_nids(ibs): r""" alias """ return _get_all_known_name_rowids(ibs) @register_ibs_method @accessor_decors.adder @register_api('/api/name/', methods=['POST'])
[docs]def add_names(ibs, name_text_list, name_uuid_list=None, name_note_list=None): r""" Adds a list of names. Returns: name_rowid_list (list): their nids RESTful: Method: POST URL: /api/name/ """ if name_note_list is None: name_note_list = [''] * len(name_text_list) # Get random uuids if name_uuid_list is None: name_uuid_list = [uuid.uuid4() for _ in range(len(name_text_list))] get_rowid_from_superkey = functools.partial(ibs.get_name_rowids_from_text, ensure=False) superkey_paramx = (1,) colnames = [NAME_UUID, NAME_TEXT, NAME_NOTE] params_iter = list(zip(name_uuid_list, name_text_list, name_note_list)) name_rowid_list = ibs.db.add_cleanly(const.NAME_TABLE, colnames, params_iter, get_rowid_from_superkey, superkey_paramx) return name_rowid_list # OLD WAY # # nid_list_ = [namenid_dict[name] for name in name_list_] #name_text_list_ = ibs.sanitize_name_texts(name_text_list) # # All names are individuals and so may safely receive the INDIVIDUAL_KEY lblannot #lbltype_rowid = ibs.lbltype_ids[const.INDIVIDUAL_KEY] #lbltype_rowid_list = [lbltype_rowid] * len(name_text_list_) #nid_list = ibs.add_lblannots(lbltype_rowid_list, name_text_list_, note_list) ##nid_list = [const.UNKNOWN_NAME_ROWID if rowid is None else rowid for rowid in nid_list] #return nid_list #def init_default_speciesvalue(): # #const.KEY_DEFAULTS[const.SPECIES_KEY] # note_list = ['default value'] # # Get random uuids # import uuid # lblannot_uuid_list = [uuid.UUID('00000000-0000-0000-0000-000000000001')] # value_list = [const.KEY_DEFAULTS[const.SPECIES_KEY]] # colnames = ['species_uuid', 'species_rowid', 'species_text', 'species_note'] # params_iter = list(zip(lblannot_uuid_list, lbltype_rowid_list, value_list, note_list)) # get_rowid_from_superkey = ibs.get_species_rowid_from_species_text # superkey_paramx = (1, 2) # species_rowid_list = ibs.db.add_cleanly(const.SPECIES_TABLE, colnames, params_iter, # get_rowid_from_superkey, superkey_paramx)
@register_ibs_method @register_api('/api/name/sanitize/', methods=['PUT'])
[docs]def sanitize_name_texts(ibs, name_text_list): r""" RESTful: Method: PUT URL: /api/name/sanitize """ ibsfuncs.assert_valid_names(name_text_list) name_text_list_ = [None if name_text == const.UNKNOWN else name_text for name_text in name_text_list] return name_text_list_
@register_ibs_method @accessor_decors.deleter @register_api('/api/name/', methods=['DELETE'])
[docs]def delete_names(ibs, name_rowid_list, safe=True, strict=False, verbose=ut.VERBOSE): r""" deletes names from the database CAREFUL. YOU PROBABLY DO NOT WANT TO USE THIS at least ensure that no annot is associated with any of these nids RESTful: Method: DELETE URL: /api/name/ Example: >>> # UNPORTED_DOCTEST >>> gpath_list = grabdata.get_test_gpaths(ndata=None)[0:4] >>> gid_list = ibs.add_images(gpath_list) >>> bbox_list = [(0, 0, 100, 100)]*len(gid_list) >>> name_list = ['a', 'b', 'a', 'd'] >>> aid_list = ibs.add_annots(gid_list, bbox_list=bbox_list, name_list=name_list) >>> assert len(aid_list) != 0, "No annotations added" >>> nid_list = ibs.get_valid_nids() >>> assert len(nid_list) != 0, "No names added" >>> nid = nid_list[0] >>> assert nid is not None, "nid is None" >>> ibs.delete_names(nid) >>> all_nids = ibs.get_valid_nids() >>> assert nid not in all_nids, "NID not deleted" """ if verbose: print('[ibs] deleting %d names' % len(name_rowid_list)) if safe: aids_list = ibs.get_name_aids(name_rowid_list) aid_list = ut.flatten(aids_list) if strict: assert len(aid_list) == 0, 'should not be any annots belonging to a deleted name' ibs.delete_annot_nids(aid_list) ibs.db.delete_rowids(const.NAME_TABLE, name_rowid_list) #return len(name_rowid_list) #ibs.delete_lblannots(nid_list)
@register_ibs_method @accessor_decors.ider @register_api('/api/name/empty_nids/', methods=['GET'])
[docs]def get_empty_nids(ibs): r""" get name rowids that do not have any annotations (not including UNKONWN) Returns: list: nid_list - all names without any animals (does not include unknown names) an nid is not invalid if it has a valid alias CommandLine: python -m ibeis.control.manual_name_funcs --test-get_empty_nids RESTful: Method: GET URL: /api/name/empty_nids/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> new_nid_list = ibs.make_next_nids(num=2) >>> empty_nids = ibs.get_empty_nids() >>> assert len(empty_nids) == 2, 'get_empty_nids fails1' >>> assert new_nid_list == empty_nids, 'get_empty_nids fails2' >>> ibs.delete_empty_nids() >>> empty_nids2 = ibs.get_empty_nids() >>> assert len(empty_nids2) == 0, 'get_empty_nids fails3' >>> result = str(empty_nids2) >>> print(result) [] """ _nid_list = ibs._get_all_known_name_rowids() nRois_list = ibs.get_name_num_annotations(_nid_list) # Filter names with rois isempty_list = (nRois <= 0 for nRois in nRois_list) nid_list = list(ut.iter_compress(_nid_list, isempty_list)) # Filter names with aliases (TODO: use transitivity to determine validity) hasalias_list = [alias_text is not None for alias_text in ibs.get_name_alias_texts(nid_list)] nid_list = list(ut.ifilterfalse_items(nid_list, hasalias_list)) return nid_list
@register_ibs_method @register_api('/api/name/empty_nids/', methods=['DELETE'])
[docs]def delete_empty_nids(ibs): r""" Removes names that have no Rois from the database RESTful: Method: DELETE URL: /api/name/empty_nids/ """ print('[ibs] deleting empty nids') invalid_nids = ibs.get_empty_nids() print('[ibs] ... %d empty nids' % (len(invalid_nids),)) ibs.delete_names(invalid_nids)
@register_ibs_method @accessor_decors.getter_1toM @register_api('/api/name/aids/', methods=['GET'])
[docs]def get_name_aids(ibs, nid_list, enable_unknown_fix=True): r""" # TODO: Rename to get_anot_rowids_from_name_rowid Returns: list: aids_list a list of list of aids in each name RESTful: Method: GET URL: /api/name/aids/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> # Map annotations to name ids >>> aid_list = ibs.get_valid_aids() >>> nid_list = ibs.get_annot_name_rowids(aid_list) >>> # Get annotation ids for each name >>> aids_list = ibs.get_name_aids(nid_list) >>> # Run Assertion Test >>> groupid2_items = ut.group_items(aids_list, nid_list) >>> grouped_items = list(six.itervalues(groupid2_items)) >>> passed_iter = map(ut.allsame, grouped_items) >>> passed_list = list(passed_iter) >>> assert all(passed_list), 'problem in get_name_aids' >>> # Print gropued items >>> print(ut.dict_str(groupid2_items, newlines=False)) Ignore; from ibeis.control.manual_name_funcs import * # NOQA import ibeis #ibs = ibeis.opendb('testdb1') #ibs = ibeis.opendb('PZ_MTEST') ibs = ibeis.opendb('PZ_Master0') #ibs = ibeis.opendb('GZ_ALL') nid_list = ibs.get_valid_nids() nid_list_ = [const.UNKNOWN_NAME_ROWID if nid <= 0 else nid for nid in nid_list] with ut.Timer('sql'): #aids_list1 = ibs.get_name_aids(nid_list, enable_unknown_fix=False) aids_list1 = ibs.db.get(const.ANNOTATION_TABLE, (ANNOT_ROWID,), nid_list_, id_colname=NAME_ROWID, unpack_scalars=False) with ut.Timer('hackquery + group'): opstr = ''' SELECT annot_rowid, name_rowid FROM annotations WHERE name_rowid IN (%s) ORDER BY name_rowid ASC, annot_rowid ASC ''' % (', '.join(map(str, nid_list))) pair_list = ibs.db.connection.execute(opstr).fetchall() aids = np.array(ut.get_list_column(pair_list, 0)) nids = np.array(ut.get_list_column(pair_list, 1)) unique_nids, groupx = vt.group_indices(nids) grouped_aids_ = vt.apply_grouping(aids, groupx) aids_list5 = [sorted(arr.tolist()) for arr in grouped_aids_] for aids1, aids5 in zip(aids_list1, aids_list5): if (aids1) != (aids5): print(aids1) print(aids5) print('-----') ut.assert_lists_eq(list(map(tuple, aids_list5)), list(map(tuple, aids_list1))) with ut.Timer('numpy'): # alt method valid_aids = np.array(ibs.get_valid_aids()) valid_nids = np.array(ibs.get_annot_name_rowids(valid_aids, distinguish_unknowns=False)) aids_list2 = [valid_aids.take(np.flatnonzero(valid_nids == nid)).tolist() for nid in nid_list_] with ut.Timer('numpy2'): # alt method valid_aids = np.array(ibs.get_valid_aids()) valid_nids = np.array(ibs.get_annot_name_rowids(valid_aids, distinguish_unknowns=False)) aids_list3 = [valid_aids.take(np.flatnonzero(np.equal(valid_nids, nid))).tolist() for nid in nid_list_] with ut.Timer('numpy3'): # alt method valid_aids = np.array(ibs.get_valid_aids()) valid_nids = np.array(ibs.db.get_all_col_rows(const.ANNOTATION_TABLE, NAME_ROWID)) aids_list4 = [valid_aids.take(np.flatnonzero(np.equal(valid_nids, nid))).tolist() for nid in nid_list_] assert aids_list2 == aids_list3 assert aids_list3 == aids_list4 assert aids_list1 == aids_list2 valid_aids = ibs.get_valid_aids() %timeit ibs.db.get_all_col_rows('annotations', 'rowid') %timeit ibs.db.get_all_col_rows('annotations', 'name_rowid') %timeit ibs.get_annot_name_rowids(valid_aids, distinguish_unknowns=False) %timeit ibs.get_valid_aids() %timeit ibs.get_annot_name_rowids(ibs.get_valid_aids(), distinguish_unknowns=False) valid_nids1 = ibs.get_annot_name_rowids(valid_aids, distinguish_unknowns=False) valid_nids2 = ibs.db.get_all_col_rows('annotations', 'name_rowid') assert valid_nids1 == valid_nids2 ibs.db.fname ibs.db.fpath import sqlite3 con = sqlite3.connect(ibs.db.fpath) opstr = ''' SELECT annot_rowid, name_rowid FROM annotations WHERE name_rowid IN (SELECT name_rowid FROM name) ORDER BY name_rowid ASC, annot_rowid ASC ''' annot_rowid_list = con.execute(opstr).fetchall() aid_list = ut.get_list_column(annot_rowid_list, 0) nid_list = ut.get_list_column(annot_rowid_list, 1) # HACKY HACKY HACK with ut.Timer('hackquery + group'): #nid_list = ibs.get_valid_nids()[10:15] nid_list = ibs.get_valid_nids() opstr = ''' SELECT annot_rowid, name_rowid FROM annotations WHERE name_rowid IN (%s) ORDER BY name_rowid ASC, annot_rowid ASC ''' % (', '.join(map(str, nid_list))) pair_list = ibs.db.connection.execute(opstr).fetchall() aids = np.array(ut.get_list_column(pair_list, 0)) nids = np.array(ut.get_list_column(pair_list, 1)) unique_nids, groupx = vt.group_indices(nids) grouped_aids_ = vt.apply_grouping(aids, groupx) grouped_aids = [arr.tolist() for arr in grouped_aids_] SELECT name_rowid, COUNT(annot_rowid) AS number, GROUP_CONCAT(annot_rowid) AS aid_list FROM annotations WHERE name_rowid in (SELECT name_rowid FROM name) GROUP BY name_rowid ORDER BY name_rowid ASC import vtool as vt vt vt.aid_list[0] annot_rowid_list = con.execute(opstr).fetchall() opstr = ''' SELECT annot_rowid FROM annotations WHERE name_rowid=? ''' cur = ibs.db.connection.cursor() cur = con.execute('BEGIN IMMEDIATE TRANSACTION') cur = ibs.db.connection res = [cur.execute(opstr, (nid,)).fetchall() for nid in nid_list_] cur.execute('COMMIT TRANSACTION') res = [ibs.db.cur.execute(opstr, (nid,)).fetchall() for nid in nid_list_] """ # FIXME: THIS FUNCTION IS VERY SLOW # ADD A LOCAL CACHE TO FIX THIS SPEED # ALSO FIX GET_IMAGE_AIDS # really a getter for the annotation table not the name table #return [[] for nid in nid_list] # TODO: should a query of the UNKNOWN_NAME_ROWID return anything? # TODO: don't even run negative aids as queries nid_list_ = [const.UNKNOWN_NAME_ROWID if nid <= 0 else nid for nid in nid_list] USE_GROUPING_HACK = False if USE_GROUPING_HACK: # This code doesn't work because it doesn't respect empty names input_list, inverse_unique = np.unique(nid_list_, return_inverse=True) input_str = ', '.join(list(map(str, input_list))) opstr = ''' SELECT annot_rowid, name_rowid FROM {ANNOTATION_TABLE} WHERE name_rowid IN ({input_str}) ORDER BY name_rowid ASC, annot_rowid ASC '''.format(input_str=input_str, ANNOTATION_TABLE=const.ANNOTATION_TABLE) pair_list = ibs.db.connection.execute(opstr).fetchall() aidscol = np.array(ut.get_list_column(pair_list, 0)) nidscol = np.array(ut.get_list_column(pair_list, 1)) unique_nids, groupx = vt.group_indices(nidscol) grouped_aids_ = vt.apply_grouping(aidscol, groupx) #aids_list = [sorted(arr.tolist()) for arr in grouped_aids_] structured_aids_list = [arr.tolist() for arr in grouped_aids_] aids_list = np.array(structured_aids_list)[inverse_unique].tolist() else: USE_NUMPY_IMPL = True #USE_NUMPY_IMPL = False # Use qt if getting one at a time otherwise perform bulk operation USE_NUMPY_IMPL = len(nid_list_) > 1 #USE_NUMPY_IMPL = len(nid_list_) > 10 if USE_NUMPY_IMPL: # This seems to be 30x faster for bigger inputs valid_aids = np.array(ibs._get_all_aids()) valid_nids = np.array(ibs.db.get_all_col_rows(const.ANNOTATION_TABLE, NAME_ROWID)) #np.array(ibs.get_annot_name_rowids(valid_aids, distinguish_unknowns=False)) # MEMORY HOG LIKE A SON OF A BITCH # aids_list = [ # valid_aids.take(np.flatnonzero( # np.equal(valid_nids, nid))).tolist() # for nid in nid_list_ # ] temp = np.zeros((len(valid_nids), ), dtype=np.bool) aids_dict = {} nid_list_unique = np.unique(nid_list_) for nid in nid_list_unique: bool_list = np.equal(valid_nids, nid, out=temp) flattened = np.flatnonzero(bool_list) aid_list = [] if nid < 0 else valid_aids.take(flattened) aid_list = aid_list.tolist() aids_dict[nid] = aid_list aids_list = ut.dict_take(aids_dict, nid_list_) else: # SQL IMPL aids_list = ibs.db.get(const.ANNOTATION_TABLE, (ANNOT_ROWID,), nid_list_, id_colname=NAME_ROWID, unpack_scalars=False) if enable_unknown_fix: #enable_unknown_fix == distinguish_unknowns # negative name rowids correspond to unknown annoations wherex annot_rowid = -name_rowid #aids_list = [None if nid is None else ([-nid] if nid < 0 else aids) # for nid, aids in zip(nid_list, aids_list)] # Not sure if this should fail or return empty list on None nid aids_list = [[] if nid is None else ([-nid] if nid < 0 else aids) for nid, aids in zip(nid_list, aids_list)] #aids_list = [[-nid] if nid < 0 else aids # for nid, aids in zip(nid_list, aids_list)] return aids_list
@register_ibs_method @accessor_decors.getter_1toM @register_api('/api/name/exemplar_aids/', methods=['GET'])
[docs]def get_name_exemplar_aids(ibs, nid_list): r""" Returns: list_ (list): a list of list of cids in each name CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_exemplar_aids RESTful: Method: GET URL: /api/name/exemplar_aids/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> aid_list = ibs.get_valid_aids() >>> nid_list = ibs.get_annot_name_rowids(aid_list) >>> exemplar_aids_list = ibs.get_name_exemplar_aids(nid_list) >>> result = exemplar_aids_list >>> print(result) [[], [2, 3], [2, 3], [], [5, 6], [5, 6], [7], [8], [], [10], [], [12], [13]] """ # Get all annot ids for each name aids_list = ibs.get_name_aids(nid_list, enable_unknown_fix=True) # Flag any annots that are not exemplar and remove them flags_list = ibsfuncs.unflat_map(ibs.get_annot_exemplar_flags, aids_list) exemplar_aids_list = [ut.compress(aids, flags) for aids, flags in zip(aids_list, flags_list)] return exemplar_aids_list
@register_ibs_method @accessor_decors.getter_1toM @register_api('/api/name/gids/', methods=['GET'])
[docs]def get_name_gids(ibs, nid_list): r""" Returns: list_ (list): the image ids associated with name ids RESTful: Method: GET URL: /api/name/gids/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> nid_list = ibs._get_all_known_name_rowids() >>> gids_list = ibs.get_name_gids(nid_list) >>> result = gids_list >>> print(result) [[2, 3], [5, 6], [7], [8], [10], [12], [13]] """ # TODO: Optimize aids_list = ibs.get_name_aids(nid_list, enable_unknown_fix=True) gids_list = ibsfuncs.unflat_map(ibs.get_annot_gids, aids_list) return gids_list
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/uuids/', methods=['GET'])
[docs]def get_name_uuids(ibs, nid_list): r""" Returns: list_ (list): uuids_list - name uuids RESTful: Method: GET URL: /api/name/uuids/ """ uuids_list = ibs.db.get(const.NAME_TABLE, (NAME_UUID,), nid_list) #notes_list = ibs.get_lblannot_notes(nid_list) return uuids_list
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/notes/', methods=['GET'])
[docs]def get_name_notes(ibs, name_rowid_list): r""" Returns: list_ (list): notes_list - name notes RESTful: Method: GET URL: /api/name/notes/ """ notes_list = ibs.db.get(const.NAME_TABLE, (NAME_NOTE,), name_rowid_list) #notes_list = ibs.get_lblannot_notes(nid_list) return notes_list
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/num_annotations/', methods=['GET'])
[docs]def get_name_num_annotations(ibs, nid_list): r""" Returns: list_ (list): the number of annotations for each name CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_num_annotations RESTful: Method: GET URL: /api/name/num_annotations/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> nid_list = ibs._get_all_known_name_rowids() >>> result = get_name_num_annotations(ibs, nid_list) >>> print(result) [2, 2, 1, 1, 1, 1, 1] """ # TODO: Optimize return list(map(len, ibs.get_name_aids(nid_list, enable_unknown_fix=True)))
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/num_exemplar_annotations/', methods=['GET'])
[docs]def get_name_num_exemplar_annotations(ibs, nid_list): r""" Returns: list_ (list): the number of annotations, which are exemplars for each name RESTful: Method: GET URL: /api/name/num_exemplar_annotations/ """ return list(map(len, ibs.get_name_exemplar_aids(nid_list)))
@register_ibs_method @register_api('/api/name/temp_flag/', methods=['GET'])
[docs]def get_name_temp_flag(ibs, name_rowid_list, eager=True, nInput=None): r""" name_temp_flag_list <- name.name_temp_flag[name_rowid_list] gets data from the "native" column "name_temp_flag" in the "name" table Args: name_rowid_list (list): Returns: list: name_temp_flag_list TemplateInfo: Tgetter_table_column col = name_temp_flag tbl = name CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_temp_flag RESTful: Method: GET URL: /api/name/temp_flag/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> ibs, config2_ = testdata_ibs() >>> name_rowid_list = ibs._get_all_name_rowids() >>> eager = True >>> name_temp_flag_list = ibs.get_name_temp_flag(name_rowid_list, eager=eager) >>> assert len(name_rowid_list) == len(name_temp_flag_list) """ id_iter = name_rowid_list colnames = (NAME_TEMP_FLAG,) name_temp_flag_list = ibs.db.get( const.NAME_TABLE, colnames, id_iter, id_colname='rowid', eager=eager, nInput=nInput) return name_temp_flag_list
@register_ibs_method @register_api('/api/name/temp_flag/', methods=['PUT'])
[docs]def set_name_temp_flag(ibs, name_rowid_list, name_temp_flag_list, duplicate_behavior='error'): r""" name_temp_flag_list -> name.name_temp_flag[name_rowid_list] Args: name_rowid_list name_temp_flag_list TemplateInfo: Tsetter_native_column tbl = name col = name_temp_flag RESTful: Method: PUT URL: /api/name/temp_flag/ """ id_iter = name_rowid_list colnames = (NAME_TEMP_FLAG,) ibs.db.set(const.NAME_TABLE, colnames, name_temp_flag_list, id_iter, duplicate_behavior=duplicate_behavior)
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/alias_texts/', methods=['GET'])
[docs]def get_name_alias_texts(ibs, name_rowid_list): r""" Returns: list_ (list): name_alias_text_list CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_texts CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_alias_texts RESTful: Method: GET URL: /api/name/alias_texts/ Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> # build test data >>> ibs = ibeis.opendb('testdb1') >>> name_rowid_list = ibs.get_valid_nids() >>> # execute function >>> name_alias_text_list = get_name_alias_texts(ibs, name_rowid_list) >>> # verify results >>> result = str(name_alias_text_list) >>> print(result) [None, None, None, None, None, None, None] """ name_alias_text_list = ibs.db.get(const.NAME_TABLE, (NAME_ALIAS_TEXT,), name_rowid_list) return name_alias_text_list
@register_ibs_method @accessor_decors.cache_invalidator(const.ANNOTATION_TABLE, [ANNOT_SEMANTIC_UUID], rowidx=None) @accessor_decors.setter @register_api('/api/name/alias_texts/', methods=['PUT'])
[docs]def set_name_alias_texts(ibs, name_rowid_list, name_alias_text_list): r""" Returns: list_ (list): name_alias_text_list CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_texts RESTful: Method: PUT URL: /api/name/alias_texts/ """ #ibsfuncs.assert_valid_names(name_alias_text_list) val_list = ((value,) for value in name_alias_text_list) ibs.db.set(const.NAME_TABLE, (NAME_ALIAS_TEXT,), val_list, name_rowid_list) # TODO: ibs.update_annot_semantic_uuids(aid_list)
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/texts/', methods=['GET'])
[docs]def get_name_texts(ibs, name_rowid_list, apply_fix=True): r""" Returns: list_ (list): text names CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_texts RESTful: Method: GET URL: /api/name/texts/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> name_rowid_list = ibs._get_all_known_name_rowids() >>> name_text_list = get_name_texts(ibs, name_rowid_list) >>> result = str(name_text_list) >>> print(result) [u'easy', u'hard', u'jeff', u'lena', u'occl', u'polar', u'zebra'] """ # FIXME: Use standalone name table # TODO: # Change the temporary negative indexes back to the unknown NID for the # SQL query. Then augment the lblannot list to distinguish unknown lblannots #name_text_list = ibs.get_lblannot_values(nid_list, const.INDIVIDUAL_KEY) #name_text_list = ibs.get_lblannot_values(nid_list, const.INDIVIDUAL_KEY) name_text_list = ibs.db.get(const.NAME_TABLE, (NAME_TEXT,), name_rowid_list) if apply_fix: name_text_list = [const.UNKNOWN if rowid == const.UNKNOWN_NAME_ROWID or name_text is None else name_text for name_text, rowid in zip(name_text_list, name_rowid_list)] return name_text_list
@register_ibs_method @register_api('/api/name/num/', methods=['GET'])
[docs]def get_num_names(ibs, **kwargs): r""" Number of valid names CommandLine: python -m ibeis.control.manual_name_funcs --test-get_num_names RESTful: Method: GET URL: /api/name/num/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> result = get_num_names(ibs) >>> print(result) 7 """ nid_list = ibs.get_valid_nids(**kwargs) return len(nid_list)
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/rowids_from_text/', methods=['GET'])
[docs]def get_name_rowids_from_text(ibs, name_text_list, ensure=True): r""" Args: ibs (IBEISController): ibeis controller object name_text_list (list): ensure (bool): adds as new names if non-existant (default = True) Returns: name_rowid_list (list): Creates one if it doesnt exist CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_rowids_from_text:0 python -m ibeis.control.manual_name_funcs --test-get_name_rowids_from_text:1 TODO: should ensure be defaulted to False? RESTful: Method: GET URL: /api/name/rowids_from_text/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> import utool as ut >>> ibs = ibeis.opendb('testdb1') >>> name_text_list = [u'Fred', u'Sue', '____', u'zebra_grevys', 'TYPO', '____'] >>> ensure = False >>> name_rowid_list = ibs.get_name_rowids_from_text(name_text_list, ensure) >>> print(ut.list_str(list(zip(name_text_list, name_rowid_list)))) >>> ensure = True >>> name_rowid_list = ibs.get_name_rowids_from_text(name_text_list, ensure) >>> print(ut.list_str(list(zip(name_text_list, name_rowid_list)))) >>> ibs.print_name_table() >>> result = str(name_rowid_list) + '\n' >>> typo_rowids = ibs.get_name_rowids_from_text(['TYPO', 'Fred', 'Sue', 'zebra_grevys']) >>> ibs.delete_names(typo_rowids) >>> result += str(ibs._get_all_known_name_rowids()) >>> print('----') >>> ibs.print_name_table() >>> print(result) [8, 9, 0, 10, 11, 0] [1, 2, 3, 4, 5, 6, 7] """ if ensure: name_rowid_list = ibs.add_names(name_text_list) else: name_rowid_list = ibs.get_name_rowids_from_text_(name_text_list) return name_rowid_list
@register_ibs_method @accessor_decors.getter_1to1
[docs]def get_name_rowids_from_text_(ibs, name_text_list, ensure=True): r""" Args: ibs (IBEISController): ibeis controller object name_text_list (list): Returns: name_rowid_list (list): CommandLine: python -m ibeis.control.manual_name_funcs --test-get_name_rowids_from_text_ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> import utool as ut # NOQA >>> ibs = ibeis.opendb('testdb1') >>> name_text_list = [u'Fred', 'easy', u'Sue', '____', u'zebra_grevys', 'TYPO', 'jeff'] >>> name_rowid_list = ibs.get_name_rowids_from_text_(name_text_list) >>> ibs.print_name_table() >>> result = str(name_rowid_list) >>> print(result) [None, 1, None, 0, None, None, 3] """ name_text_list_ = ibs.sanitize_name_texts(name_text_list) name_rowid_list = ibs.db.get(const.NAME_TABLE, (NAME_ROWID,), name_text_list_, id_colname=NAME_TEXT) name_rowid_list = [const.UNKNOWN_NAME_ROWID if text is None or text == const.UNKNOWN else rowid for rowid, text in zip(name_rowid_list, name_text_list_)] return name_rowid_list
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/nids_from_uuid/', methods=['GET'])
[docs]def get_name_rowids_from_uuid(ibs, uuid_list, nid_hack=False, ensure=True): r""" Args: ibs (IBEISController): ibeis controller object name_text_list (list): Returns: name_rowid_list (list): """ name_rowid_list = ibs.db.get(const.NAME_TABLE, (NAME_ROWID,), uuid_list, id_colname=NAME_UUID) if nid_hack: name_rowid_list = [ name_uuid if name_rowid is None else name_rowid for name_uuid, name_rowid in zip(uuid_list, name_rowid_list) ] return name_rowid_list
@register_ibs_method @register_api('/api/name/nids_with_gids/', methods=['GET'])
[docs]def get_name_nids_with_gids(ibs, nid_list=None): if nid_list is None: nid_list = sorted(ibs.get_valid_nids()) name_list = ibs.get_name_texts(nid_list) gids_list = ibs.get_name_gids(nid_list) zipped = zip(nid_list, name_list, gids_list) combined_dict = { name : (nid, gid_list) for nid, name, gid_list in zipped } return combined_dict
@register_ibs_method @accessor_decors.ider @register_api('/api/name/', methods=['GET'])
[docs]def get_valid_nids(ibs, imgsetid=None, filter_empty=False, min_pername=None): r""" Returns: list_ (list): all valid names with at least one animal (does not include unknown names) RESTful: Method: GET URL: /api/name/ """ if imgsetid is None: _nid_list = ibs._get_all_known_name_rowids() else: _nid_list = ibs.get_imageset_nids(imgsetid) # HACK FOR UNKNOWN. Makes things crash #_nid_list += [0] nid_list = _nid_list if filter_empty: min_pername = 1 if min_pername is None else max(min_pername, 1) if min_pername is not None: nAnnot_list = ibs.get_name_num_annotations(nid_list) flag_list = np.array(nAnnot_list) >= min_pername nid_list = ut.compress(nid_list, flag_list) return nid_list
@register_ibs_method @accessor_decors.setter @register_api('/api/name/notes/', methods=['PUT'])
[docs]def set_name_notes(ibs, name_rowid_list, notes_list): r""" Sets a note for each name (multiple annotations) RESTful: Method: PUT URL: /api/name/notes/ """ #ibsfuncs.assert_lblannot_rowids_are_type(ibs, nid_list, ibs.lbltype_ids[const.INDIVIDUAL_KEY]) #ibs.set_lblannot_notes(nid_list, notes_list) val_list = ((value,) for value in notes_list) ibs.db.set(const.NAME_TABLE, (NAME_NOTE,), val_list, name_rowid_list)
@register_ibs_method @accessor_decors.setter @register_api('/api/name/texts/', methods=['PUT'])
[docs]def set_name_texts(ibs, name_rowid_list, name_text_list, verbose=False): r""" Changes the name text. Does not affect the animals of this name. Effectively just changes the TEXT UUID CommandLine: python -m ibeis.control.manual_name_funcs --test-set_name_texts RESTful: Method: PUT URL: /api/name/texts/ Example: >>> # DISABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> import ibeis >>> ibs = ibeis.opendb('testdb1') >>> nid_list = ibs.get_valid_nids()[0:2] >>> name_list = ibs.get_name_texts(nid_list) >>> # result = set_name_texts(ibs, nid_list, name_list) >>> print(result) """ if verbose: print('[ibs] setting %d name texts' % (len(name_rowid_list),)) ibsfuncs.assert_valid_names(name_text_list) #sanitize_name_texts(ibs, name_text_list): #ibsfuncs.assert_lblannot_rowids_are_type(ibs, nid_list, ibs.lbltype_ids[const.INDIVIDUAL_KEY]) #ibs.set_lblannot_values(nid_list, name_list) val_list = ((value,) for value in name_text_list) ibs.db.set(const.NAME_TABLE, (NAME_TEXT,), val_list, name_rowid_list)
@register_ibs_method @register_api('/api/name/sex/', methods=['GET'])
[docs]def get_name_sex(ibs, name_rowid_list, eager=True, nInput=None): r""" name_sex_list <- name.name_sex[name_rowid_list] gets data from the "native" column "name_sex" in the "name" table Args: name_rowid_list (list): Returns: list: name_sex_list TemplateInfo: Tgetter_table_column col = name_sex tbl = name RESTful: Method: GET URL: /api/name/sex/ Example: >>> # ENABLE_DOCTEST >>> from ibeis.control.manual_name_funcs import * # NOQA >>> ibs, config2_ = testdata_ibs() >>> name_rowid_list = ibs._get_all_name_rowids() >>> eager = True >>> name_sex_list = ibs.get_name_sex(name_rowid_list, eager=eager) >>> assert len(name_rowid_list) == len(name_sex_list) """ id_iter = name_rowid_list colnames = (NAME_SEX,) name_sex_list = ibs.db.get( const.NAME_TABLE, colnames, id_iter, id_colname='rowid', eager=eager, nInput=nInput) return name_sex_list
@register_ibs_method @accessor_decors.setter @register_api('/api/name/sex/', methods=['PUT'])
[docs]def set_name_sex(ibs, name_rowid_list, name_sex_list, duplicate_behavior='error'): r""" name_sex_list -> name.name_sex[name_rowid_list] Args: name_rowid_list name_sex_list TemplateInfo: Tsetter_native_column tbl = name col = name_sex RESTful: Method: PUT URL: /api/name/sex/ """ id_iter = name_rowid_list colnames = (NAME_SEX,) ibs.db.set(const.NAME_TABLE, colnames, name_sex_list, id_iter, duplicate_behavior=duplicate_behavior)
@register_ibs_method @accessor_decors.getter_1to1 @register_api('/api/name/sex_text/', methods=['GET'])
[docs]def get_name_sex_text(ibs, name_rowid_list, eager=True, nInput=None): r""" RESTful: Method: GET URL: /api/name/sex_text/ """ name_sex_list = ibs.get_name_sex(name_rowid_list, eager=eager, nInput=nInput) name_sex_text_list = ut.dict_take(const.SEX_INT_TO_TEXT, name_sex_list) return name_sex_text_list
@register_ibs_method @accessor_decors.setter @register_api('/api/name/sex_text/', methods=['PUT'])
[docs]def set_name_sex_text(ibs, name_rowid_list, name_sex_text_list): r""" RESTful: Method: PUT URL: /api/name/sex_text/ """ name_sex_list = ut.dict_take(const.SEX_TEXT_TO_INT, name_sex_text_list) return ibs.set_name_sex(name_rowid_list, name_sex_list)
@register_ibs_method @register_api('/api/name/age_months_est_min/', methods=['GET'])
[docs]def get_name_age_months_est_min(ibs, name_rowid_list): r""" RESTful: Method: GET URL: /api/name/age_months_est_min/ """ aids_list = ibs.get_name_aids(name_rowid_list) age_list = [ ibs.get_annot_age_months_est_min(aid_list) for aid_list in aids_list ] return age_list
@register_ibs_method @register_api('/api/name/age_months_est_max/', methods=['GET'])
[docs]def get_name_age_months_est_max(ibs, name_rowid_list): r""" RESTful: Method: GET URL: /api/name/age_months_est_max/ """ aids_list = ibs.get_name_aids(name_rowid_list) age_list = [ ibs.get_annot_age_months_est_max(aid_list) for aid_list in aids_list ] return age_list
@register_ibs_method @register_api('/api/name/imgsetids/', methods=['GET'])
[docs]def get_name_imgsetids(ibs, nid_list): r""" RESTful: Method: GET URL: /api/name/imgsetids/ """ import utool as ut name_aids_list = ibs.get_name_aids(nid_list) name_aid_list = ut.flatten(name_aids_list) name_gid_list = ibs.get_annot_gids(name_aid_list) name_imgsetids_list = ibs.get_image_imgsetids(name_gid_list) name_imgsetid_list = ut.flatten(name_imgsetids_list) name_imgsetids = list(set(name_imgsetid_list)) return name_imgsetids #def get_imageset_nids(ibs,
if __name__ == '__main__': r""" CommandLine: python -m ibeis.control.manual_name_funcs python -m ibeis.control.manual_name_funcs --allexamples python -m ibeis.control.manual_name_funcs --allexamples --noface --nosrc RESTful: Method: GET URL: /api/name/imgsetids/ """ import multiprocessing multiprocessing.freeze_support() # for win32 import utool as ut # NOQA ut.doctest_funcs()