You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
4.3 KiB

import json
import os
# 获取当前目录下的JSON文件路径
file_path = os.path.join(os.path.dirname(__file__), 'Alpha_candidates.json')
if not os.path.exists(file_path):
print('not find json file')
exit(1)
with open(file_path, 'r', encoding='utf-8') as file:
json_data = json.load(file)
# 打开输出文件
output_path = os.path.join(os.path.dirname(__file__), 'output.txt')
with open(output_path, 'w', encoding='utf-8') as output_file:
first_alpha = True # 用于控制空行
total_expressions = 0 # 统计生成的表达式总数
for formula_template, data in json_data.items():
# 获取占位符和候选数据
placeholder_candidates = data.get('placeholder_candidates', {})
if not placeholder_candidates:
# 如果没有占位符,直接输出原始公式
if not first_alpha:
output_file.write('\n') # 空一行
output_file.write(formula_template + '\n')
first_alpha = False
total_expressions += 1
continue
# 收集所有占位符的候选值
placeholder_values = []
placeholder_names = []
for placeholder_name, candidate_info in placeholder_candidates.items():
candidates = candidate_info.get('candidates', [])
values = [candidate['id'] for candidate in candidates]
placeholder_values.append(values)
placeholder_names.append(placeholder_name)
# 计算该公式会生成多少表达式(每个占位符候选数的乘积)
formula_count = 1
for values in placeholder_values:
formula_count *= len(values)
# 生成所有可能的组合(笛卡尔积)
def generate_combinations(values_list, current_index=0, current_combination=None):
if current_combination is None:
current_combination = {}
if current_index == len(values_list):
# 生成最终的表达式
expression = formula_template
for placeholder_name, value in current_combination.items():
expression = expression.replace(placeholder_name, value)
yield expression
else:
placeholder_name = placeholder_names[current_index]
for value in values_list[current_index]:
current_combination[placeholder_name] = value
yield from generate_combinations(values_list, current_index + 1, current_combination.copy())
# 输出所有生成的表达式
expressions_generated = 0
for expression in generate_combinations(placeholder_values):
# if not first_alpha:
# output_file.write('\n') # 空一行
output_file.write(expression + '\n')
first_alpha = False
expressions_generated += 1
# 验证生成数量是否正确
if expressions_generated != formula_count:
print(f"警告: 公式 '{formula_template}' 预期生成 {formula_count} 个表达式,实际生成 {expressions_generated}")
total_expressions += expressions_generated
print(f"Alpha表达式已生成到: {output_path}")
print(f"共处理了 {len(json_data)} 条公式模板")
print(f"总共生成了 {total_expressions} 个alpha表达式")
# 可选:显示每个公式的生成数量统计
print("\n详细统计:")
for formula_template, data in json_data.items():
placeholder_candidates = data.get('placeholder_candidates', {})
if not placeholder_candidates:
print(f" '{formula_template}': 1个表达式(无占位符)")
else:
placeholder_counts = []
for placeholder_name, candidate_info in placeholder_candidates.items():
candidates = candidate_info.get('candidates', [])
placeholder_counts.append(f"{placeholder_name}({len(candidates)}个候选)")
formula_count = 1
for placeholder_name, candidate_info in placeholder_candidates.items():
candidates = candidate_info.get('candidates', [])
formula_count *= len(candidates)
placeholders_str = " × ".join(placeholder_counts)
print(f" '{formula_template}': {formula_count}个表达式 ({placeholders_str})")