from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import contextlib from caffe2.proto import caffe2_pb2 # Python 2 and 3 compatibility: test if basestring exists try: basestring # NOQA except NameError: # This is python3 so we define basestring. basestring = str # The name scope and device scope when creating a new operator. NAMESCOPE = '' DEVICESCOPE = None _NAMESCOPE_SEPARATOR = '/' # NOTE: using NameScope is NOT thread-safe! (TODO t13621185) @contextlib.contextmanager def NameScope(prefix, reset=False): global NAMESCOPE assert isinstance(prefix, basestring), \ "NameScope takes in a string as its argument." old_scope = NAMESCOPE prefix = prefix + _NAMESCOPE_SEPARATOR if prefix is not '' else '' if reset: NAMESCOPE = prefix else: NAMESCOPE = NAMESCOPE + prefix yield assert NAMESCOPE.endswith(prefix), \ "The namescope variable is changed from outside NameScope() calls." NAMESCOPE = old_scope @contextlib.contextmanager def DeviceScope(scope): assert isinstance(scope, caffe2_pb2.DeviceOption), \ "DeviceScope takes in a caffe2_pb2.DeviceOption as its argument." global DEVICESCOPE old_scope = DEVICESCOPE DEVICESCOPE = scope yield assert DEVICESCOPE == scope, \ "The device scope is changed from outside DeviceScope() calls." DEVICESCOPE = old_scope