ChatDev/ecl/ece.py
2024-06-21 11:46:46 +08:00

147 lines
5.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import json
import re
import numpy as np
import argparse
point = 0.95
eliminate_threshold = 0.95
def retrieve_eliminate(Path_directory,UsedMemory_directory,Evolved_directory):
experiences_use = []
content = []
content1 = []
experiences_total = []
usetime_total = []
exp_dict = {}
eliminated_exp = []
directories = [os.path.join(Path_directory, d) for d in os.listdir(Path_directory) if os.path.isdir(os.path.join(Path_directory, d))]
for subdir in directories:
directory = subdir
logdir = [filename for filename in os.listdir(directory) if filename.endswith(".log")]
logdir = os.path.join(directory, logdir[0])
content1 = open(logdir, "r", encoding='UTF-8').read()
pattern1 = re.compile(r'the source code MIDs is (.*?),', re.S)
experiences_sourceMIDs = re.findall(pattern1, content1)
pattern2 = re.compile(r'the target code MIDs is (.*?)\n',re.S)
experiences_targetMIDs = re.findall(pattern2, content1)
pattern3 = re.compile(r'And the (.*?) similarity is',re.S)
experiences_type = re.findall(pattern3,content1)
for i in range(0,len(experiences_sourceMIDs)):
sourceMID = experiences_sourceMIDs[i]
targetMID = experiences_targetMIDs[i]
type = experiences_type[i]
experiences_use.append((sourceMID,targetMID,type))
with open(UsedMemory_directory) as file:
content1 = json.load(file)
new_content = []
for memorypiece in content1:
experiences = memorypiece.get("experiences")
if experiences != None:
experiences_total.extend(experiences)
for experience in experiences:
experience["use_time"] = 0
for experience in experiences_use:
for experience_t in experiences_total:
if experience[0] == experience_t["sourceMID"] and experience[1] == experience_t["targetMID"]:
experience_t["use_time"] += 1
for i,experience_t in enumerate(experiences_total):
usetime_total.append(experience_t["use_time"])
exp_dict[i] = experience_t["use_time"]
file.close()
usetime_sort = sorted(usetime_total)[::-1]
total = np.sum(usetime_sort)
for i in range(len(usetime_sort)):
if np.sum(usetime_sort[:i])/total >= point:
# print("α",i)
alpha= i
break
index=0
for k in sorted(exp_dict,key=exp_dict.__getitem__,reverse=True):
if index <= alpha:
eliminated_exp.append(experiences_total[k])
index += 1
else:
break
for memorypiece in content1:
experiences = memorypiece.get("experiences")
retrieve_eliminated_experienceList = []
if experiences != None:
for experience in experiences:
if experience in eliminated_exp:
retrieve_eliminated_experienceList.append(experience)
memorypiece["experiences"] = retrieve_eliminated_experienceList
new_content.append(memorypiece)
with open(Evolved_directory, 'w') as file:
json.dump(new_content, file)
# Quality score gain Elimination
def gain_eliminate(NewMemory_directory,Evolved_directory):
content2 = []
with open(NewMemory_directory) as file:
content2 = json.load(file)
new_content2 = []
for memorypiece in content2:
experiences = memorypiece.get("experiences")
gain_eliminated_experienceList = []
if experiences != None:
# print("origin:", len(experiences))
for experience in experiences:
valueGain = experience.get("valueGain")
# print(valueGain)
if valueGain >= eliminate_threshold:
gain_eliminated_experienceList.append(experience)
# print(len(experiences))
memorypiece["experiences"] = gain_eliminated_experienceList
new_content2.append(memorypiece)
else:
new_content2.append(memorypiece)
file.close()
with open(Evolved_directory, 'r') as file:
new_content = json.load(file)
new_content = new_content + new_content2
with open(Evolved_directory, 'w') as file:
json.dump(new_content, file)
def recount_experience(Evolved_directory):
with open(Evolved_directory, 'r') as file:
content = json.load(file)
with open(Evolved_directory, 'w') as file:
i = 0
for memorypiece in content:
memorypiece["total"] = i
i += 1
json.dump(content, file)
def main():
parser = argparse.ArgumentParser(description="Process memory with some directories.")
parser.add_argument("Path_directory", type = str, help="The directory of software")
parser.add_argument("UsedMemory_directory", type=str, help="The directory of MemoryCards")
parser.add_argument("NewMemory_directory", type=str, help="The directory of NewMemoryCards")
parser.add_argument("Evolved_directory", type= str, help="The directory for output")
args = parser.parse_args()
retrieve_eliminate(args.Path_directory,args.UsedMemory_directory,args.Evolved_directory)
gain_eliminate(args.NewMemory_directory,args.Evolved_directory)
recount_experience(args.Evolved_directory)
if __name__ == "__main__":
main()