ortools.service.v1.mathopt.model_pb2
@generated by mypy-protobuf. Do not edit manually! isort:skip_file An encoding format for mathematical optimization problems.
1# -*- coding: utf-8 -*- 2# Generated by the protocol buffer compiler. DO NOT EDIT! 3# NO CHECKED-IN PROTOBUF GENCODE 4# source: ortools/service/v1/mathopt/model.proto 5# Protobuf Python Version: 5.29.3 6"""Generated protocol buffer code.""" 7from google.protobuf import descriptor as _descriptor 8from google.protobuf import descriptor_pool as _descriptor_pool 9from google.protobuf import runtime_version as _runtime_version 10from google.protobuf import symbol_database as _symbol_database 11from google.protobuf.internal import builder as _builder 12_runtime_version.ValidateProtobufRuntimeVersion( 13 _runtime_version.Domain.PUBLIC, 14 5, 15 29, 16 3, 17 '', 18 'ortools/service/v1/mathopt/model.proto' 19) 20# @@protoc_insertion_point(imports) 21 22_sym_db = _symbol_database.Default() 23 24 25from ortools.service.v1.mathopt import sparse_containers_pb2 as ortools_dot_service_dot_v1_dot_mathopt_dot_sparse__containers__pb2 26 27 28DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&ortools/service/v1/mathopt/model.proto\x12&operations_research.service.v1.mathopt\x1a\x32ortools/service/v1/mathopt/sparse_containers.proto\"j\n\x0eVariablesProto\x12\x0b\n\x03ids\x18\x01 \x03(\x03\x12\x14\n\x0clower_bounds\x18\x02 \x03(\x01\x12\x14\n\x0cupper_bounds\x18\x03 \x03(\x01\x12\x10\n\x08integers\x18\x04 \x03(\x08\x12\r\n\x05names\x18\x05 \x03(\t\"\x91\x02\n\x0eObjectiveProto\x12\x10\n\x08maximize\x18\x01 \x01(\x08\x12\x0e\n\x06offset\x18\x02 \x01(\x01\x12\\\n\x13linear_coefficients\x18\x03 \x01(\x0b\x32?.operations_research.service.v1.mathopt.SparseDoubleVectorProto\x12_\n\x16quadratic_coefficients\x18\x04 \x01(\x0b\x32?.operations_research.service.v1.mathopt.SparseDoubleMatrixProto\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x10\n\x08priority\x18\x06 \x01(\x03\"`\n\x16LinearConstraintsProto\x12\x0b\n\x03ids\x18\x01 \x03(\x03\x12\x14\n\x0clower_bounds\x18\x02 \x03(\x01\x12\x14\n\x0cupper_bounds\x18\x03 \x03(\x01\x12\r\n\x05names\x18\x04 \x03(\t\"\x83\x02\n\x18QuadraticConstraintProto\x12U\n\x0clinear_terms\x18\x01 \x01(\x0b\x32?.operations_research.service.v1.mathopt.SparseDoubleVectorProto\x12X\n\x0fquadratic_terms\x18\x02 \x01(\x0b\x32?.operations_research.service.v1.mathopt.SparseDoubleMatrixProto\x12\x13\n\x0blower_bound\x18\x03 \x01(\x01\x12\x13\n\x0bupper_bound\x18\x04 \x01(\x01\x12\x0c\n\x04name\x18\x05 \x01(\t\"\xdc\x01\n\x1eSecondOrderConeConstraintProto\x12R\n\x0bupper_bound\x18\x01 \x01(\x0b\x32=.operations_research.service.v1.mathopt.LinearExpressionProto\x12X\n\x11\x61rguments_to_norm\x18\x02 \x03(\x0b\x32=.operations_research.service.v1.mathopt.LinearExpressionProto\x12\x0c\n\x04name\x18\x03 \x01(\t\"\x87\x01\n\x12SosConstraintProto\x12R\n\x0b\x65xpressions\x18\x01 \x03(\x0b\x32=.operations_research.service.v1.mathopt.LinearExpressionProto\x12\x0f\n\x07weights\x18\x02 \x03(\x01\x12\x0c\n\x04name\x18\x03 \x01(\t\"\xed\x01\n\x18IndicatorConstraintProto\x12\x19\n\x0cindicator_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x18\n\x10\x61\x63tivate_on_zero\x18\x06 \x01(\x08\x12S\n\nexpression\x18\x02 \x01(\x0b\x32?.operations_research.service.v1.mathopt.SparseDoubleVectorProto\x12\x13\n\x0blower_bound\x18\x03 \x01(\x01\x12\x13\n\x0bupper_bound\x18\x04 \x01(\x01\x12\x0c\n\x04name\x18\x05 \x01(\tB\x0f\n\r_indicator_id\"\xdb\r\n\nModelProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12I\n\tvariables\x18\x02 \x01(\x0b\x32\x36.operations_research.service.v1.mathopt.VariablesProto\x12I\n\tobjective\x18\x03 \x01(\x0b\x32\x36.operations_research.service.v1.mathopt.ObjectiveProto\x12i\n\x14\x61uxiliary_objectives\x18\n \x03(\x0b\x32K.operations_research.service.v1.mathopt.ModelProto.AuxiliaryObjectivesEntry\x12Z\n\x12linear_constraints\x18\x04 \x01(\x0b\x32>.operations_research.service.v1.mathopt.LinearConstraintsProto\x12\x61\n\x18linear_constraint_matrix\x18\x05 \x01(\x0b\x32?.operations_research.service.v1.mathopt.SparseDoubleMatrixProto\x12k\n\x15quadratic_constraints\x18\x06 \x03(\x0b\x32L.operations_research.service.v1.mathopt.ModelProto.QuadraticConstraintsEntry\x12y\n\x1dsecond_order_cone_constraints\x18\x0b \x03(\x0b\x32R.operations_research.service.v1.mathopt.ModelProto.SecondOrderConeConstraintsEntry\x12\x61\n\x10sos1_constraints\x18\x07 \x03(\x0b\x32G.operations_research.service.v1.mathopt.ModelProto.Sos1ConstraintsEntry\x12\x61\n\x10sos2_constraints\x18\x08 \x03(\x0b\x32G.operations_research.service.v1.mathopt.ModelProto.Sos2ConstraintsEntry\x12k\n\x15indicator_constraints\x18\t \x03(\x0b\x32L.operations_research.service.v1.mathopt.ModelProto.IndicatorConstraintsEntry\x1ar\n\x18\x41uxiliaryObjectivesEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12\x45\n\x05value\x18\x02 \x01(\x0b\x32\x36.operations_research.service.v1.mathopt.ObjectiveProto:\x02\x38\x01\x1a}\n\x19QuadraticConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12O\n\x05value\x18\x02 \x01(\x0b\x32@.operations_research.service.v1.mathopt.QuadraticConstraintProto:\x02\x38\x01\x1a\x89\x01\n\x1fSecondOrderConeConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12U\n\x05value\x18\x02 \x01(\x0b\x32\x46.operations_research.service.v1.mathopt.SecondOrderConeConstraintProto:\x02\x38\x01\x1ar\n\x14Sos1ConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.operations_research.service.v1.mathopt.SosConstraintProto:\x02\x38\x01\x1ar\n\x14Sos2ConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.operations_research.service.v1.mathopt.SosConstraintProto:\x02\x38\x01\x1a}\n\x19IndicatorConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12O\n\x05value\x18\x02 \x01(\x0b\x32@.operations_research.service.v1.mathopt.IndicatorConstraintProto:\x02\x38\x01\x42\x42\n%com.google.ortools.service.v1.mathoptP\x01\xaa\x02\x16Google.OrTools.Serviceb\x06proto3') 29 30_globals = globals() 31_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 32_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ortools.service.v1.mathopt.model_pb2', _globals) 33if not _descriptor._USE_C_DESCRIPTORS: 34 _globals['DESCRIPTOR']._loaded_options = None 35 _globals['DESCRIPTOR']._serialized_options = b'\n%com.google.ortools.service.v1.mathoptP\001\252\002\026Google.OrTools.Service' 36 _globals['_MODELPROTO_AUXILIARYOBJECTIVESENTRY']._loaded_options = None 37 _globals['_MODELPROTO_AUXILIARYOBJECTIVESENTRY']._serialized_options = b'8\001' 38 _globals['_MODELPROTO_QUADRATICCONSTRAINTSENTRY']._loaded_options = None 39 _globals['_MODELPROTO_QUADRATICCONSTRAINTSENTRY']._serialized_options = b'8\001' 40 _globals['_MODELPROTO_SECONDORDERCONECONSTRAINTSENTRY']._loaded_options = None 41 _globals['_MODELPROTO_SECONDORDERCONECONSTRAINTSENTRY']._serialized_options = b'8\001' 42 _globals['_MODELPROTO_SOS1CONSTRAINTSENTRY']._loaded_options = None 43 _globals['_MODELPROTO_SOS1CONSTRAINTSENTRY']._serialized_options = b'8\001' 44 _globals['_MODELPROTO_SOS2CONSTRAINTSENTRY']._loaded_options = None 45 _globals['_MODELPROTO_SOS2CONSTRAINTSENTRY']._serialized_options = b'8\001' 46 _globals['_MODELPROTO_INDICATORCONSTRAINTSENTRY']._loaded_options = None 47 _globals['_MODELPROTO_INDICATORCONSTRAINTSENTRY']._serialized_options = b'8\001' 48 _globals['_VARIABLESPROTO']._serialized_start=134 49 _globals['_VARIABLESPROTO']._serialized_end=240 50 _globals['_OBJECTIVEPROTO']._serialized_start=243 51 _globals['_OBJECTIVEPROTO']._serialized_end=516 52 _globals['_LINEARCONSTRAINTSPROTO']._serialized_start=518 53 _globals['_LINEARCONSTRAINTSPROTO']._serialized_end=614 54 _globals['_QUADRATICCONSTRAINTPROTO']._serialized_start=617 55 _globals['_QUADRATICCONSTRAINTPROTO']._serialized_end=876 56 _globals['_SECONDORDERCONECONSTRAINTPROTO']._serialized_start=879 57 _globals['_SECONDORDERCONECONSTRAINTPROTO']._serialized_end=1099 58 _globals['_SOSCONSTRAINTPROTO']._serialized_start=1102 59 _globals['_SOSCONSTRAINTPROTO']._serialized_end=1237 60 _globals['_INDICATORCONSTRAINTPROTO']._serialized_start=1240 61 _globals['_INDICATORCONSTRAINTPROTO']._serialized_end=1477 62 _globals['_MODELPROTO']._serialized_start=1480 63 _globals['_MODELPROTO']._serialized_end=3235 64 _globals['_MODELPROTO_AUXILIARYOBJECTIVESENTRY']._serialized_start=2495 65 _globals['_MODELPROTO_AUXILIARYOBJECTIVESENTRY']._serialized_end=2609 66 _globals['_MODELPROTO_QUADRATICCONSTRAINTSENTRY']._serialized_start=2611 67 _globals['_MODELPROTO_QUADRATICCONSTRAINTSENTRY']._serialized_end=2736 68 _globals['_MODELPROTO_SECONDORDERCONECONSTRAINTSENTRY']._serialized_start=2739 69 _globals['_MODELPROTO_SECONDORDERCONECONSTRAINTSENTRY']._serialized_end=2876 70 _globals['_MODELPROTO_SOS1CONSTRAINTSENTRY']._serialized_start=2878 71 _globals['_MODELPROTO_SOS1CONSTRAINTSENTRY']._serialized_end=2992 72 _globals['_MODELPROTO_SOS2CONSTRAINTSENTRY']._serialized_start=2994 73 _globals['_MODELPROTO_SOS2CONSTRAINTSENTRY']._serialized_end=3108 74 _globals['_MODELPROTO_INDICATORCONSTRAINTSENTRY']._serialized_start=3110 75 _globals['_MODELPROTO_INDICATORCONSTRAINTSENTRY']._serialized_end=3235 76# @@protoc_insertion_point(module_scope)
As used below, we define "#variables" = size(VariablesProto.ids).
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Must be nonnegative and strictly increasing. The max(int64) value can't be used.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Should have length equal to #variables, values in [-inf, inf).
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Should have length equal to #variables, values in (-inf, inf].
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Should have length equal to #variables. Value is false for continuous variables and true for integer variables.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
If not set, assumed to be all empty strings. Otherwise, should have length equal to #variables.
All nonempty names must be distinct. TODO(b/169575522): we may relax this.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
false is minimize, true is maximize
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Must be finite and not NaN.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
ObjectiveProto terms that are linear in the decision variables.
Requirements:
- linear_coefficients.ids are elements of VariablesProto.ids.
- VariablesProto not specified correspond to zero.
- linear_coefficients.values must all be finite.
- linear_coefficients.values can be zero, but this just wastes space.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Objective terms that are quadratic in the decision variables.
Requirements in addition to those on SparseDoubleMatrixProto messages:
- Each element of quadratic_coefficients.row_ids and each element of quadratic_coefficients.column_ids must be an element of VariablesProto.ids.
- The matrix must be upper triangular: for each i, quadratic_coefficients.row_ids[i] <= quadratic_coefficients.column_ids[i].
Notes:
- Terms not explicitly stored have zero coefficient.
- Elements of quadratic_coefficients.coefficients can be zero, but this just wastes space.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Parent messages may have uniqueness requirements on this field; e.g., see ModelProto.objectives and AuxiliaryObjectivesUpdatesProto.new_objectives.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
For multi-objective problems, the priority of this objective relative to the others (lower is more important). This value must be nonnegative. Furthermore, each objective priority in the model must be distinct at solve time. This condition is not validated at the proto level, so models may temporarily have objectives with the same priority.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
As used below, we define "#linear constraints" = size(LinearConstraintsProto.ids).
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Must be nonnegative and strictly increasing. The max(int64) value can't be used.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Should have length equal to #linear constraints, values in [-inf, inf).
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Should have length equal to #linear constraints, values in (-inf, inf].
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
If not set, assumed to be all empty strings. Otherwise, should have length equal to #linear constraints.
All nonempty names must be distinct. TODO(b/169575522): we may relax this.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
A single quadratic constraint of the form:
lb <= sum{linear_terms} + sum{quadratic_terms} <= ub.
If a variable involved in this constraint is deleted, it is treated as if it were set to zero.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Terms that are linear in the decision variables.
In addition to requirements on SparseDoubleVectorProto messages we require that:
- linear_terms.ids are elements of VariablesProto.ids.
- linear_terms.values must all be finite and not-NaN.
Notes:
- Variable ids omitted have a corresponding coefficient of zero.
- linear_terms.values can be zero, but this just wastes space.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Terms that are quadratic in the decision variables.
In addition to requirements on SparseDoubleMatrixProto messages we require that:
- Each element of quadratic_terms.row_ids and each element of quadratic_terms.column_ids must be an element of VariablesProto.ids.
- The matrix must be upper triangular: for each i, quadratic_terms.row_ids[i] <= quadratic_terms.column_ids[i].
Notes:
- Terms not explicitly stored have zero coefficient.
- Elements of quadratic_terms.coefficients can be zero, but this just wastes space.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Must have value in [-inf, inf), and be less than or equal to upper_bound
.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Must have value in (-inf, inf], and be greater than or equal to
lower_bound
.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Parent messages may have uniqueness requirements on this field; e.g., see ModelProto.quadratic_constraints and QuadraticConstraintUpdatesProto.new_constraints.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
A single second-order cone constraint of the form:
||arguments_to_norm
||_2 <= upper_bound
,
where upper_bound
and each element of arguments_to_norm
are linear
expressions.
If a variable involved in this constraint is deleted, it is treated as if it were set to zero.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Getter for upper_bound.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Getter for arguments_to_norm.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Parent messages may have uniqueness requirements on this field; e.g., see
ModelProto.second_order_cone_constraints
and
SecondOrderConeConstraintUpdatesProto.new_constraints
.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Data for representing a single SOS1 or SOS2 constraint.
If a variable involved in this constraint is deleted, it is treated as if it were set to zero.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
The expressions over which to apply the SOS constraint:
- SOS1: At most one element takes a nonzero value.
- SOS2: At most two elements take nonzero values, and they must be adjacent in the repeated ordering.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Either empty or of equal length to expressions. If empty, default weights are 1, 2, ... If present, the entries must be unique.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Parent messages may have uniqueness requirements on this field; e.g., see ModelProto.sos1_constraints and SosConstraintUpdatesProto.new_constraints.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Data for representing a single indicator constraint of the form:
Variable(indicator_id) = (activate_on_zero ? 0 : 1) ⇒ lower_bound <= expression <= upper_bound.
If a variable involved in this constraint (either the indicator, or appearing
in expression
) is deleted, it is treated as if it were set to zero. In
particular, deleting the indicator variable means that the indicator
constraint is vacuous if activate_on_zero
is false, and that it is
equivalent to a linear constraint if activate_on_zero
is true.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
An ID corresponding to a binary variable, or unset. If unset, the indicator constraint is ignored. If set, we require that:
- VariablesProto.integers[indicator_id] = true,
- VariablesProto.lower_bounds[indicator_id] >= 0,
- VariablesProto.upper_bounds[indicator_id] <= 1. These conditions are not validated by MathOpt, but if not satisfied will lead to the solver returning an error upon solving.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
If true, then if the indicator variable takes value 0, the implied constraint must hold. Otherwise, if the indicator variable takes value 1, then the implied constraint must hold.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Must be a valid linear expression with respect to the containing model:
- All stated conditions on
SparseDoubleVectorProto
, - All elements of
expression.values
must be finite, expression.ids
are a subset ofVariablesProto.ids
.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Must have value in [-inf, inf); cannot be NaN.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Must have value in (-inf, inf]; cannot be NaN.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Parent messages may have uniqueness requirements on this field; e.g., see
ModelProto.indicator_constraints
and
IndicatorConstraintUpdatesProto.new_constraints
.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
An optimization problem.
MathOpt supports:
- Continuous and integer decision variables with optional finite bounds.
- Linear and quadratic objectives (single or multiple objectives), either minimized or maximized.
- A number of constraints types, including:
- Linear constraints
- Quadratic constraints
- Second-order cone constraints
- Logical constraints > SOS1 and SOS2 constraints > Indicator constraints
By default, constraints are represented in "id-to-data" maps. However, we represent linear constraints in a more efficient "struct-of-arrays" format.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val != None: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1364 def MergeFrom(self, msg): 1365 if not isinstance(msg, cls): 1366 raise TypeError( 1367 'Parameter to MergeFrom() must be instance of same class: ' 1368 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1369 _FullyQualifiedClassName(msg.__class__))) 1370 1371 assert msg is not self 1372 self._Modified() 1373 1374 fields = self._fields 1375 1376 for field, value in msg._fields.items(): 1377 if field.label == LABEL_REPEATED: 1378 field_value = fields.get(field) 1379 if field_value is None: 1380 # Construct a new object to represent this field. 1381 field_value = field._default_constructor(self) 1382 fields[field] = field_value 1383 field_value.MergeFrom(value) 1384 elif field.cpp_type == CPPTYPE_MESSAGE: 1385 if value._is_present_in_parent: 1386 field_value = fields.get(field) 1387 if field_value is None: 1388 # Construct a new object to represent this field. 1389 field_value = field._default_constructor(self) 1390 fields[field] = field_value 1391 field_value.MergeFrom(value) 1392 else: 1393 self._fields[field] = value 1394 if field.containing_oneof: 1395 self._UpdateOneofState(field) 1396 1397 if msg._unknown_fields: 1398 if not self._unknown_fields: 1399 self._unknown_fields = [] 1400 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1423def _Clear(self): 1424 # Clear fields. 1425 self._fields = {} 1426 self._unknown_fields = () 1427 1428 self._oneofs = {} 1429 self._Modified()
Clears all data that was set in the message.
1489 def Modified(self): 1490 """Sets the _cached_byte_size_dirty bit to true, 1491 and propagates this to our listener iff this was a state change. 1492 """ 1493 1494 # Note: Some callers check _cached_byte_size_dirty before calling 1495 # _Modified() as an extra optimization. So, if this method is ever 1496 # changed such that it does stuff even when _cached_byte_size_dirty is 1497 # already true, the callers need to be updated. 1498 if not self._cached_byte_size_dirty: 1499 self._cached_byte_size_dirty = True 1500 self._listener_for_children.dirty = True 1501 self._is_present_in_parent = True 1502 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1265 def IsInitialized(self, errors=None): 1266 """Checks if all required fields of a message are set. 1267 1268 Args: 1269 errors: A list which, if provided, will be populated with the field 1270 paths of all missing required fields. 1271 1272 Returns: 1273 True iff the specified message has all required fields set. 1274 """ 1275 1276 # Performance is critical so we avoid HasField() and ListFields(). 1277 1278 for field in required_fields: 1279 if (field not in self._fields or 1280 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1281 not self._fields[field]._is_present_in_parent)): 1282 if errors is not None: 1283 errors.extend(self.FindInitializationErrors()) 1284 return False 1285 1286 for field, value in list(self._fields.items()): # dict can change size! 1287 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1288 if field.label == _FieldDescriptor.LABEL_REPEATED: 1289 if (field.message_type._is_map_entry): 1290 continue 1291 for element in value: 1292 if not element.IsInitialized(): 1293 if errors is not None: 1294 errors.extend(self.FindInitializationErrors()) 1295 return False 1296 elif value._is_present_in_parent and not value.IsInitialized(): 1297 if errors is not None: 1298 errors.extend(self.FindInitializationErrors()) 1299 return False 1300 1301 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1180 def MergeFromString(self, serialized): 1181 serialized = memoryview(serialized) 1182 length = len(serialized) 1183 try: 1184 if self._InternalParse(serialized, 0, length) != length: 1185 # The only reason _InternalParse would return early is if it 1186 # encountered an end-group tag. 1187 raise message_mod.DecodeError('Unexpected end-group tag.') 1188 except (IndexError, TypeError): 1189 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1190 raise message_mod.DecodeError('Truncated message.') 1191 except struct.error as e: 1192 raise message_mod.DecodeError(e) 1193 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1133 def SerializeToString(self, **kwargs): 1134 # Check if the message has all of its required fields set. 1135 if not self.IsInitialized(): 1136 raise message_mod.EncodeError( 1137 'Message %s is missing required fields: %s' % ( 1138 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1139 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1146 def SerializePartialToString(self, **kwargs): 1147 out = BytesIO() 1148 self._InternalSerialize(out.write, **kwargs) 1149 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1406 def WhichOneof(self, oneof_name): 1407 """Returns the name of the currently set field inside a oneof, or None.""" 1408 try: 1409 field = message_descriptor.oneofs_by_name[oneof_name] 1410 except KeyError: 1411 raise ValueError( 1412 'Protocol message has no oneof "%s" field.' % oneof_name) 1413 1414 nested_field = self._oneofs.get(field, None) 1415 if nested_field is not None and self.HasField(nested_field.name): 1416 return nested_field.name 1417 else: 1418 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1438def _DiscardUnknownFields(self): 1439 self._unknown_fields = [] 1440 for field, value in self.ListFields(): 1441 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1442 if _IsMapField(field): 1443 if _IsMessageMapField(field): 1444 for key in value: 1445 value[key].DiscardUnknownFields() 1446 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1447 for sub_message in value: 1448 sub_message.DiscardUnknownFields() 1449 else: 1450 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1101 def ByteSize(self): 1102 if not self._cached_byte_size_dirty: 1103 return self._cached_byte_size 1104 1105 size = 0 1106 descriptor = self.DESCRIPTOR 1107 if descriptor._is_map_entry: 1108 # Fields of map entry should always be serialized. 1109 key_field = descriptor.fields_by_name['key'] 1110 _MaybeAddEncoder(cls, key_field) 1111 size = key_field._sizer(self.key) 1112 value_field = descriptor.fields_by_name['value'] 1113 _MaybeAddEncoder(cls, value_field) 1114 size += value_field._sizer(self.value) 1115 else: 1116 for field_descriptor, field_value in self.ListFields(): 1117 _MaybeAddEncoder(cls, field_descriptor) 1118 size += field_descriptor._sizer(field_value) 1119 for tag_bytes, value_bytes in self._unknown_fields: 1120 size += len(tag_bytes) + len(value_bytes) 1121 1122 self._cached_byte_size = size 1123 self._cached_byte_size_dirty = False 1124 self._listener_for_children.dirty = False 1125 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Getter for name.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Getter for variables.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
The primary objective in the model.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Auxiliary objectives for use in multi-objective models.
Map key IDs must be in [0, max(int64)). Each priority, and each nonempty
name, must be unique and also distinct from the primary objective
.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Getter for linear_constraints.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
The variable coefficients for the linear constraints.
If a variable involved in this constraint is deleted, it is treated as if it were set to zero.
Requirements:
- linear_constraint_matrix.row_ids are elements of linear_constraints.ids.
- linear_constraint_matrix.column_ids are elements of variables.ids.
- Matrix entries not specified are zero.
- linear_constraint_matrix.values must all be finite.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Mapped constraints (i.e., stored in "constraint ID"-to-"constraint data" map). For each subsequent submessage, we require that:
- Each key is in [0, max(int64)).
- Each key is unique in its respective map (but not necessarily across constraint types)
- Each value contains a name field (called
name
), and each nonempty name must be distinct across all map entries (but not necessarily across constraint types).
Quadratic constraints in the model.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Second-order cone constraints in the model.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
SOS1 constraints in the model, which constrain that at most one
expression
can be nonzero. The optional weights
entries are an
implementation detail used by the solver to (hopefully) converge more
quickly. In more detail, solvers may (or may not) use these weights to
select branching decisions that produce "balanced" children nodes.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
SOS2 constraints in the model, which constrain that at most two entries of
expression
can be nonzero, and they must be adjacent in their ordering.
If no weights
are provided, this ordering is their linear ordering in the
expressions
list; if weights
are presented, the ordering is taken with
respect to these values in increasing order.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Indicator constraints in the model, which enforce that, if a binary "indicator variable" is set to one, then an "implied constraint" must hold.
1305 def FindInitializationErrors(self): 1306 """Finds required fields which are not initialized. 1307 1308 Returns: 1309 A list of strings. Each string is a path to an uninitialized field from 1310 the top-level message, e.g. "foo.bar[5].baz". 1311 """ 1312 1313 errors = [] # simplify things 1314 1315 for field in required_fields: 1316 if not self.HasField(field.name): 1317 errors.append(field.name) 1318 1319 for field, value in self.ListFields(): 1320 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1321 if field.is_extension: 1322 name = '(%s)' % field.full_name 1323 else: 1324 name = field.name 1325 1326 if _IsMapField(field): 1327 if _IsMessageMapField(field): 1328 for key in value: 1329 element = value[key] 1330 prefix = '%s[%s].' % (name, key) 1331 sub_errors = element.FindInitializationErrors() 1332 errors += [prefix + error for error in sub_errors] 1333 else: 1334 # ScalarMaps can't have any initialization errors. 1335 pass 1336 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1337 for i in range(len(value)): 1338 element = value[i] 1339 prefix = '%s[%d].' % (name, i) 1340 sub_errors = element.FindInitializationErrors() 1341 errors += [prefix + error for error in sub_errors] 1342 else: 1343 prefix = name + '.' 1344 sub_errors = value.FindInitializationErrors() 1345 errors += [prefix + error for error in sub_errors] 1346 1347 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- AuxiliaryObjectivesEntry
- AuxiliaryObjectivesEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- QuadraticConstraintsEntry
- QuadraticConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- SecondOrderConeConstraintsEntry
- SecondOrderConeConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- Sos1ConstraintsEntry
- Sos1ConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- Sos2ConstraintsEntry
- Sos2ConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- IndicatorConstraintsEntry
- IndicatorConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors