1. import collections
  2. import functools
  3. def resolve_dependencies(records):
  4. """
  5. Resolves dependencies between records for monitoring, optimized for memory.
  6. Args:
  7. records: A dictionary where keys are record IDs and values are lists of
  8. record IDs that the key record depends on.
  9. Returns:
  10. A dictionary where keys are record IDs and values are lists of record IDs
  11. that depend on the key record. Returns an empty dictionary if no dependencies
  12. are found or if the input is invalid.
  13. """
  14. if not isinstance(records, dict):
  15. return {}
  16. dependencies = collections.defaultdict(list)
  17. in_degree = collections.defaultdict(int)
  18. # Initialize in-degree for all records
  19. for record in records:
  20. in_degree[record] = 0
  21. # Build in-degree counts
  22. for record, deps in records.items():
  23. for dep in deps:
  24. if dep not in records:
  25. continue #ignore dependencies on non-existent records
  26. in_degree[record] += 1
  27. # Find records with no dependencies (starting points)
  28. queue = [record for record, degree in in_degree.items() if degree == 0]
  29. # Perform topological sort (dependency resolution)
  30. resolved_dependencies = collections.defaultdict(list)
  31. processed = set()
  32. while queue:
  33. record = queue.pop(0)
  34. processed.add(record)
  35. # Find records that depend on the current record
  36. for dependent_record, deps in records.items():
  37. if record in deps and dependent_record not in processed:
  38. resolved_dependencies[record].append(dependent_record)
  39. in_degree[dependent_record] -= 1
  40. if in_degree[dependent_record] == 0:
  41. queue.append(dependent_record)
  42. # Check for cycles (if not all records are processed)
  43. if len(processed) != len(records):
  44. return {} # Indicate a cycle
  45. return resolved_dependencies

Add your comment