| 324 | } |
| 325 | |
| 326 | Status Member::MergeDeviceNames(const Member& other, |
| 327 | bool allow_soft_placement) { |
| 328 | // Assuming the "requested is a specialization of assigned and resource |
| 329 | // devices" invariant holds for this and `other`, it will hold after the |
| 330 | // merges below. |
| 331 | DeviceNameUtils::ParsedName assigned_device_name_copy = assigned_device_name_; |
| 332 | TF_RETURN_IF_ERROR(DeviceNameUtils::MergeDevNames( |
| 333 | &assigned_device_name_copy, other.assigned_device_name_)); |
| 334 | |
| 335 | DeviceNameUtils::ParsedName resource_device_name_copy = resource_device_name_; |
| 336 | TF_RETURN_IF_ERROR(DeviceNameUtils::MergeDevNames( |
| 337 | &resource_device_name_copy, other.resource_device_name_)); |
| 338 | |
| 339 | DeviceNameUtils::ParsedName requested_device_name_copy = |
| 340 | requested_device_name_; |
| 341 | TF_RETURN_IF_ERROR(DeviceNameUtils::MergeDevNames( |
| 342 | &requested_device_name_copy, other.requested_device_name_, |
| 343 | allow_soft_placement)); |
| 344 | |
| 345 | DeviceNameUtils::EnsureSpecification(&requested_device_name_copy, |
| 346 | assigned_device_name_copy); |
| 347 | DeviceNameUtils::EnsureSpecification(&requested_device_name_copy, |
| 348 | resource_device_name_copy); |
| 349 | |
| 350 | // We checked for all errors, now change the devices. |
| 351 | assigned_device_name_ = assigned_device_name_copy; |
| 352 | resource_device_name_ = resource_device_name_copy; |
| 353 | requested_device_name_ = requested_device_name_copy; |
| 354 | return Status::OK(); |
| 355 | } |
| 356 | |
| 357 | // Updates this to contain the intersection of the device types in |
| 358 | // this and "other". |