(question: str, contexts: str=None, direct_result=None, decompose_result=None, depth=None, log=None)
| 137 | return contractd_thought, contractd_question, contraction_result |
| 138 | |
| 139 | async def atom(question: str, contexts: str=None, direct_result=None, decompose_result=None, depth=None, log=None): |
| 140 | # Initialize logging |
| 141 | log = log if log else {} |
| 142 | index = len(log) |
| 143 | if depth == 0: |
| 144 | return None, log |
| 145 | log[index] = {} |
| 146 | |
| 147 | # Get results from different approaches |
| 148 | direct_args = (question, contexts) if module == "multi-hop" else (question,) |
| 149 | direct_result = direct_result if direct_result else await direct(*direct_args) |
| 150 | |
| 151 | decompose_args = {"contexts": contexts} if module == "multi-hop" else {} |
| 152 | decompose_result = decompose_result if decompose_result else await decompose(question, **decompose_args) |
| 153 | |
| 154 | # Set recursion depth |
| 155 | depth = depth if depth else min(ATOM_DEPTH, calculate_depth(decompose_result["sub-questions"])) |
| 156 | |
| 157 | # Separate independent and dependent sub-questions |
| 158 | independent_subqs = [sub_q for sub_q in decompose_result["sub-questions"] if len(sub_q["depend"]) == 0] |
| 159 | dependent_subqs = [sub_q for sub_q in decompose_result["sub-questions"] if sub_q not in independent_subqs] |
| 160 | |
| 161 | # Get contraction result |
| 162 | merging_args = { |
| 163 | "question": question, |
| 164 | "decompose_result": decompose_result, |
| 165 | "independent_subqs": independent_subqs, |
| 166 | "dependent_subqs": dependent_subqs |
| 167 | } |
| 168 | if module == "multi-hop": |
| 169 | merging_args["contexts"] = contexts |
| 170 | |
| 171 | contractd_thought, contractd_question, contraction_result = await merging(**merging_args) |
| 172 | |
| 173 | # Update contraction result with additional information |
| 174 | contraction_result["contraction_thought"] = contractd_thought |
| 175 | contraction_result["sub-questions"] = independent_subqs + [{ |
| 176 | "description": contractd_question, |
| 177 | "response": contraction_result.get("response", ""), |
| 178 | "answer": contraction_result.get("answer", ""), |
| 179 | "depend": [] |
| 180 | }] |
| 181 | |
| 182 | # Get ensemble result |
| 183 | ensemble_args = [question] |
| 184 | ensemble_args.append([direct_result["response"], decompose_result["response"], contraction_result["response"]]) |
| 185 | if module == "multi-hop": |
| 186 | ensemble_args.append(contexts) |
| 187 | |
| 188 | ensemble_result = await ensemble(*ensemble_args) |
| 189 | ensemble_answer = ensemble_result.get("answer", "") |
| 190 | |
| 191 | # Calculate scores |
| 192 | scores = [] |
| 193 | # Check if all results have "answer" key before comparison |
| 194 | results_list = [direct_result, decompose_result, contraction_result] |
| 195 | all_have_answers = all(isinstance(result, dict) and "answer" in result for result in results_list) |
| 196 |
no test coverage detected