Сильные компоненты ориентированного графа
ComponentWisp переносит вопросы направленной связности в диалог о проекте на Windows. Передайте представление смежности совместимой модели и проверьте обход сильных компонент: одной достижимости недостаточно для включения всех вершин в одну группу.
def strong_components(graph):
if type(graph) is not list or len(graph) > 64:
raise ValueError("scc.graph")
n = len(graph)
if any(type(row) is not set or any(type(v) is not int or not 0 <= v < n for v in row) for row in graph):
raise ValueError("scc.edge")
seen, order = set(), []
for start in range(n):
if start in seen:
continue
seen.add(start)
stack = [(start, iter(sorted(graph[start])))]
while stack:
node, edges = stack[-1]
target = next(edges, None)
if target is None:
order.append(node)
stack.pop()
elif target not in seen:
seen.add(target)
stack.append((target, iter(sorted(graph[target]))))
reverse = [set() for _ in graph]
for node, edges in enumerate(graph):
for target in edges:
reverse[target].add(node)
seen, result = set(), []
for start in reversed(order):
if start in seen:
continue
group, pending = [], [start]
seen.add(start)
while pending:
node = pending.pop()
group.append(node)
for target in reverse[node]-seen:
seen.add(target)
pending.append(target)
result.append(sorted(group))
return sorted(result)
Проверьте перед применением
Сравните фактическое поведение с ожидаемым. Если проверка не проходит, разберитесь в причине перед следующими изменениями.
Подключение
Базовый URL, учётные данные и доступный сервер.
Проект
Проверьте циклы, отдельные вершины и пустой граф, отклоняя неверные элементы без изменения множеств смежности.
def strong_components(graph):
if type(graph) is not list or len(graph) > 64:
raise ValueError("scc.graph")
n = len(graph)
if any(type(row) is not set or any(type(v) is not int or not 0 <= v < n for v in row) for row in graph):
raise ValueError("scc.edge")
seen, order = set(), []
for start in range(n):
if start in seen:
continue
seen.add(start)
stack = [(start, iter(sorted(graph[start])))]
while stack:
node, edges = stack[-1]
target = next(edges, None)
if target is None:
order.append(node)
stack.pop()
elif target not in seen:
seen.add(target)
stack.append((target, iter(sorted(graph[target]))))
reverse = [set() for _ in graph]
for node, edges in enumerate(graph):
for target in edges:
reverse[target].add(node)
seen, result = set(), []
for start in reversed(order):
if start in seen:
continue
group, pending = [], [start]
seen.add(start)
while pending:
node = pending.pop()
group.append(node)
for target in reverse[node]-seen:
seen.add(target)
pending.append(target)
result.append(sorted(group))
return sorted(result)
Придайте группам зависимостей смысл, полезный приложению
ComponentWisp — рабочая среда программирования с ИИ в Windows для разработчиков, прослеживающих связи в данных и коде проекта. Добавьте в обсуждение представление графа и потребителя его групп. Попросите помощника изучить смысл ориентированного ребра до предложения изменения группировки. Результат полезен, только если сохраняемые связи соответствуют вопросу, на который отвечает приложение.
Задача с strong_components.py может рассматривать группы вершин, достижимых друг из друга по ориентированным путям. На небольшом примере зависимостей отличите взаимную достижимость от односторонней связи, затем проверьте реализацию и порядок вывода. Если применяете код к зависимостям, явно задайте соответствие реальных объектов вершинам: одна функция не может установить смысл этих зависимостей.
После прочтения предложения запустите проверки проекта с циклом, односторонней связью и изолированными вершинами. Изучите потребителя, чтобы подтвердить согласованную обработку групп. ComponentWisp подключается к поддерживаемым конечным точкам, совместимым с OpenAI, или Anthropic с учётными данными при необходимости. Модели без ограничений можно выбирать там, где они предлагаются; ограничения, инструменты и пределы контекста определяются моделью и сервером. Сохраняйте смысл рёбер и ожидаемые группы в обсуждении, чтобы последующие правки соблюдали то же программное требование.
Вопросы о коде группировки зависимостей
Достаточно ли односторонней зависимости для объединения объектов?
Не для группы, определённой взаимной ориентированной достижимостью. Укажите правило группировки и приведите односторонний пример, чтобы реализация случайно не приняла ориентированное отношение за неориентированную связь.
Как сопоставить реальные объекты проекта вершинам?
Сохраняйте явное соответствие, по которому потребитель сможет интерпретировать результаты. Изучите удаление или переупорядочение объектов и проверьте, что возвращаемые группы по-прежнему ссылаются на нужные объекты проекта.
Определяет ли группировка зависимостей порядок выполнения?
Она отвечает на другой вопрос. Приложению может понадобиться дополнительная логика упорядочения групп или обработки циклов. Задайте требование отдельно и изучите потребителя, не считая разбиение полным планом выполнения.
Зачем включать изолированные вершины в проверки?
Они позволяют убедиться, что объекты без рёбер получают ожидаемое представление. Проверьте вывод функции и представление потребителя, особенно если рефакторинг строит промежуточные структуры перебором только существующих связей.
ComponentWisp · Обновлено 2026-10-25