Skip to content

Commit b377dfe

Browse files
committed
Align parts across the 3 passes before gptController returns the paper objects
1 parent b2ae2c5 commit b377dfe

File tree

1 file changed

+72
-2
lines changed

1 file changed

+72
-2
lines changed

server/src/gpt-controller.ts

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,77 @@ export class GPTController {
535535
}
536536
}),
537537
);
538-
539-
return paperObjects;
538+
const result = alignPassParts(paperObjects.filter((obj): obj is ai_GPTResponse => obj !== undefined));
539+
return result;
540540
}
541541
}
542+
543+
/**
544+
* Sorts the parts component such that common parts across pass 1, 2 and 3 have the same index in the parts array
545+
* @param passes an array of ai_GPTResponse objects
546+
* @returns a new array of ai_GPTResponse objects with the parts aligned across pass 1, 2 and 3
547+
*/
548+
function alignPassParts(passes: ai_GPTResponse[]): ai_GPTResponse[] {
549+
return passes.map((entry) => {
550+
const prelim_result = sortParts(
551+
entry.pass_1.parts,
552+
entry.pass_2.parts,
553+
entry.pass_3.parts
554+
);
555+
return {
556+
...entry,
557+
pass_1: {
558+
...entry.pass_1,
559+
parts: prelim_result[0]
560+
},
561+
pass_2: {
562+
...entry.pass_2,
563+
parts: prelim_result[1]
564+
},
565+
pass_3: {
566+
...entry.pass_3,
567+
parts: prelim_result[2]
568+
}
569+
};
570+
});
571+
}
572+
573+
function sortParts(
574+
pass_1_parts: ai_part[],
575+
pass_2_parts: ai_part[],
576+
pass_3_parts: ai_part[]
577+
): [ai_part[], ai_part[], ai_part[]] {
578+
// Create sets of part names for each pass
579+
const pass_1_names = new Set(pass_1_parts.map(part => part.name));
580+
const pass_2_names = new Set(pass_2_parts.map(part => part.name));
581+
const pass_3_names = new Set(pass_3_parts.map(part => part.name));
582+
583+
// Find common part names across all passes
584+
const commonNames = new Set(
585+
[...pass_1_names].filter(
586+
name => pass_2_names.has(name) && pass_3_names.has(name)
587+
)
588+
);
589+
590+
// Create maps to quickly lookup parts by name
591+
const pass_1_map = new Map(pass_1_parts.map(part => [part.name, part]));
592+
const pass_2_map = new Map(pass_2_parts.map(part => [part.name, part]));
593+
const pass_3_map = new Map(pass_3_parts.map(part => [part.name, part]));
594+
595+
// Sort common parts based on the order in pass_1
596+
const commonParts_1 = Array.from(commonNames).map(name => pass_1_map.get(name)!);
597+
const commonParts_2 = commonParts_1.map(part => pass_2_map.get(part.name)!);
598+
const commonParts_3 = commonParts_1.map(part => pass_3_map.get(part.name)!);
599+
600+
// Collect uncommon parts for each pass
601+
const uncommonParts_1 = pass_1_parts.filter(part => !commonNames.has(part.name));
602+
const uncommonParts_2 = pass_2_parts.filter(part => !commonNames.has(part.name));
603+
const uncommonParts_3 = pass_3_parts.filter(part => !commonNames.has(part.name));
604+
605+
// Combine common and uncommon parts
606+
const sorted_pass_1 = [...commonParts_1, ...uncommonParts_1];
607+
const sorted_pass_2 = [...commonParts_2, ...uncommonParts_2];
608+
const sorted_pass_3 = [...commonParts_3, ...uncommonParts_3];
609+
610+
return [sorted_pass_1, sorted_pass_2, sorted_pass_3];
611+
}

0 commit comments

Comments
 (0)