maximum recursion depth exceeded in comparison
Receiving the following error when :
2024-07-09 12:48:43.996 | SUCCESS | repo_agent.log:set_logger_level_from_config:74 - Log level set to INFO!
parsing parent relationship: 0%| parsing parent relationship: 100%|█████████████████████████████████████████████████████████████████████████████| 2/2 [00:00<00:00, 8184.01it/s]
Loading MetaInfo: /home/jovyan/work/Documentation/Arya/wiki/hierarchy_files
MetaInfo is Refreshed and Saved
2024-07-09 12:48:44.015 | INFO | repo_agent.runner:first_generate:104 - Starting to generate documentation
parsing bidirectional reference: 0%| | 0/2 [00:00<?, ?it/s]2024-07-09 12:48:44.198 | INFO | repo_agent.doc_meta_info:find_all_referencer:293 - Error occurred: column parameter (6) is not in a valid range (0-0) for line 205 ('\n').
2024-07-09 12:48:44.198 | INFO | repo_agent.doc_meta_info:find_all_referencer:294 - Parameters: variable_name=Embed, file_path=wikiv1.py, line_number=205, column_number=6
2024-07-09 12:48:44.208 | INFO | repo_agent.doc_meta_info:find_all_referencer:293 - Error occurred: line parameter is not in a valid range.
2024-07-09 12:48:44.208 | INFO | repo_agent.doc_meta_info:find_all_referencer:294 - Parameters: variable_name=create_collection, file_path=wikiv1.py, line_number=284, column_number=4
parsing bidirectional reference: 50%|█████████████████████████████████████▌ | 1/2 [00:00<00:00, 5.17it/s]2024-07-09 12:48:44.212 | INFO | repo_agent.doc_meta_info:find_all_referencer:293 - Error occurred: column parameter (6) is not in a valid range (0-0) for line 205 ('\n').
2024-07-09 12:48:44.213 | INFO | repo_agent.doc_meta_info:find_all_referencer:294 - Parameters: variable_name=Embed, file_path=.ipynb_checkpoints/wikiv1-checkpoint.py, line_number=205, column_number=6
2024-07-09 12:48:44.220 | INFO | repo_agent.doc_meta_info:find_all_referencer:293 - Error occurred: line parameter is not in a valid range.
2024-07-09 12:48:44.220 | INFO | repo_agent.doc_meta_info:find_all_referencer:294 - Parameters: variable_name=create_collection, file_path=.ipynb_checkpoints/wikiv1-checkpoint.py, line_number=284, column_number=4
parsing bidirectional reference: 100%|███████████████████████████████████████████████████████████████████████████| 2/2 [00:00<00:00, 9.74it/s]
parsing topology task-list: 0%| | 0/10 [00:00<?, ?it/s]Traceback (most recent call last):
File "/home/jovyan/work/repoagent/RepoAgent/repo_agent/main.py", line 312, in
I hit the same crash in repo_agent/doc_meta_info.py at “parsing topology task-list”. I fixed it by switching the membership checks in get_task_manager to identity so DocItem.__eq__ never runs on cycles. I think this works because what we actually want is “did I already process this exact object instance?”, and id(...) answers that without recursing.
Try switching the get_task_manager method with this:
def get_task_manager(self, now_node: DocItem, task_available_func) -> TaskManager:
"""先写一个退化的版本,只考虑拓扑引用关系"""
doc_items = now_node.get_travel_list()
if self.white_list != None:
def in_white_list(item: DocItem):
for cont in self.white_list:
if (
item.get_file_name() == cont["file_path"]
and item.obj_name == cont["id_text"]
):
return True
return False
doc_items = list(filter(in_white_list, doc_items))
doc_items = list(filter(task_available_func, doc_items))
doc_items = sorted(doc_items, key=lambda x: x.depth) # 叶子节点在前面
deal_items = []
task_manager = TaskManager()
bar = tqdm(total=len(doc_items), desc="parsing topology task-list")
while doc_items:
min_break_level = 1e7
target_item = None
for item in doc_items:
"""一个任务依赖于所有引用者和他的子节点,我们不能保证引用不成环(也许有些仓库的废代码会出现成环)。
这时就只能选择一个相对来说遵守程度最好的了
有特殊情况func-def中的param def可能会出现循环引用
另外循环引用真实存在,对于一些bind类的接口真的会发生,比如:
ChatDev/WareHouse/Gomoku_HumanAgentInteraction_20230920135038/main.py里面的: on-click、show-winner、restart
"""
best_break_level = 0
second_best_break_level = 0
for _, child in item.children.items():
if task_available_func(child) and all(id(child) != id(d) for d in deal_items):
best_break_level += 1
for referenced, special in zip(item.reference_who, item.special_reference_type):
if task_available_func(referenced) and all(id(referenced) != id(d) for d in deal_items):
best_break_level += 1
if (
task_available_func(referenced)
and not special
and all(id(referenced) != id(d) for d in deal_items)
):
second_best_break_level += 1
if best_break_level == 0:
min_break_level = -1
target_item = item
break
if second_best_break_level < min_break_level:
target_item = item
min_break_level = second_best_break_level
if min_break_level > 0:
print(
f"circle-reference(second-best still failed), level={min_break_level}: {target_item.get_full_name()}"
)
item_denp_task_ids = []
for _, child in target_item.children.items():
if child.multithread_task_id != -1:
assert child.multithread_task_id in task_manager.task_dict.keys()
item_denp_task_ids.append(child.multithread_task_id)
for referenced_item in target_item.reference_who:
if referenced_item.multithread_task_id in task_manager.task_dict.keys():
item_denp_task_ids.append(referenced_item.multithread_task_id)
item_denp_task_ids = list(set(item_denp_task_ids)) # 去重
if task_available_func == None or task_available_func(target_item):
task_id = task_manager.add_task(
dependency_task_id=item_denp_task_ids, extra=target_item
)
target_item.multithread_task_id = task_id
deal_items.append(target_item)
doc_items.remove(target_item)
bar.update(1)
return task_manager