@naniteninja/profile-comparison-lib 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naniteninja-profile-comparison-lib.mjs","sources":["../../../projects/profile-comparison-lib/src/lib/services/embedding.service.ts","../../../projects/profile-comparison-lib/src/lib/services/file-conversion.service.ts","../../../projects/profile-comparison-lib/src/lib/services/image-compression.service.ts","../../../projects/profile-comparison-lib/src/lib/services/openai-embedding.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile-comparison-lib.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile.service.ts","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.component.ts","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.component.html","../../../projects/profile-comparison-lib/src/lib/custom-input/custom-input.component.ts","../../../projects/profile-comparison-lib/src/lib/custom-input/custom-input.component.html","../../../projects/profile-comparison-lib/src/lib/documentation/documentation.component.ts","../../../projects/profile-comparison-lib/src/lib/documentation/documentation.component.html","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.module.ts","../../../projects/profile-comparison-lib/src/public-api.ts","../../../projects/profile-comparison-lib/src/naniteninja-profile-comparison-lib.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport * as use from '@tensorflow-models/universal-sentence-encoder';\r\nimport * as tf from '@tensorflow/tfjs';\r\nimport '@tensorflow/tfjs'; // Required TensorFlow.js backend\r\nimport { Observable, from, of, throwError, defer, forkJoin } from 'rxjs';\r\nimport { switchMap, map, catchError, shareReplay } from 'rxjs/operators';\r\nimport { IWordAlignment, IWordPair, IAlignmentRow } from '../interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EmbeddingService {\r\n private model$: Observable<use.UniversalSentenceEncoder> | null = null;\r\n\r\n // Get embedding for a single text (returns Observable)\r\n getEmbedding(text: string): Observable<Float32Array> {\r\n return this.loadModel().pipe(\r\n switchMap((model) => from(model.embed([text]) as unknown as Promise<tf.Tensor>)),\r\n switchMap((embeddings: tf.Tensor) => {\r\n const t2d = embeddings as tf.Tensor2D;\r\n return from(t2d.array()).pipe(\r\n map((arr: number[][]) => {\r\n t2d.dispose();\r\n return Float32Array.from(arr[0]);\r\n })\r\n );\r\n }),\r\n catchError((err) =>\r\n throwError(() => new Error('Model failed to load or embed: ' + err))\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Group-align two lists based on semantic similarity, allowing one-to-many relationships.\r\n *\r\n * Design goals:\r\n * - Semantic relevance takes priority over original order or spacing.\r\n * - Each term in listB is assigned to the single most similar anchor in listA (if above threshold).\r\n * - For an anchor in listA with multiple highly related listB terms, they are emitted as consecutive rows:\r\n * [A, B1], ['-', B2], ['-', B3], ... so they render adjacently and remain visually connected.\r\n * - Low-similarity/unassigned terms from either side are appended at the end and never break groups.\r\n */\r\n groupAlignLists(\r\n listA: string[],\r\n listB: string[],\r\n threshold: number = 0.25,\r\n preserveLeftOrder: boolean = true,\r\n exclusivityMargin: number = 0.06,\r\n leftCohesion: number = 0.23\r\n ): Observable<IAlignmentRow[]> {\r\n // Short-circuit simple cases\r\n if ((!listA || listA.length === 0) && (!listB || listB.length === 0)) {\r\n return of([]);\r\n }\r\n if (!listA || listA.length === 0) {\r\n return of(listB.map((b) => ({ left: '-', right: b, score: 0 })));\r\n }\r\n if (!listB || listB.length === 0) {\r\n return of(listA.map((a) => ({ left: a, right: '-', score: 0 })));\r\n }\r\n\r\n return this.loadModel().pipe(\r\n switchMap((model) =>\r\n forkJoin([\r\n from(model.embed(listA) as unknown as Promise<tf.Tensor>), \r\n from(model.embed(listB) as unknown as Promise<tf.Tensor>)\r\n ]).pipe(\r\n switchMap(([tA, tB]: [tf.Tensor, tf.Tensor]) => {\r\n return forkJoin([from(tA.array() as Promise<number[][]>), from(tB.array() as Promise<number[][]>)]).pipe(\r\n map((tensorArrays: [number[][], number[][]]) => {\r\n const [arrA, arrB] = tensorArrays;\r\n // Dispose tensors to avoid memory leaks\r\n tA.dispose();\r\n tB.dispose();\r\n\r\n const aCount = listA.length;\r\n const bCount = listB.length;\r\n\r\n // Pre-convert to Float32Array for faster cosine computations\r\n const vecA: Float32Array[] = new Array(aCount);\r\n const vecB: Float32Array[] = new Array(bCount);\r\n for (let i = 0; i < aCount; i++)\r\n vecA[i] = Float32Array.from(arrA[i]);\r\n for (let j = 0; j < bCount; j++)\r\n vecB[j] = Float32Array.from(arrB[j]);\r\n\r\n // Build full cross-list similarity matrix S[i][j] = sim(A_i, B_j)\r\n const S: number[][] = new Array(aCount);\r\n for (let i = 0; i < aCount; i++) {\r\n const row: number[] = new Array(bCount);\r\n for (let j = 0; j < bCount; j++) {\r\n const emb = this.cosineSimilarity(vecA[i], vecB[j]);\r\n const lex = this.computeLexicalBoost(listA[i], listB[j]);\r\n // Apply domain gating to prevent mismatched category-vs-activity alignments\r\n const cap = this.domainCompatibilityCap(listA[i], listB[j]);\r\n row[j] = Math.min(Math.max(emb, lex), cap);\r\n }\r\n S[i] = row;\r\n }\r\n\r\n // Build within-list similarity for A (A↔A) to allow left-side extras to attach to cohesive anchors.\r\n // We use the same hybrid semantic/lexical metric.\r\n const SAA: number[][] = new Array(aCount);\r\n for (let i = 0; i < aCount; i++) {\r\n const rowAA: number[] = new Array(aCount);\r\n for (let k = 0; k < aCount; k++) {\r\n if (i === k) {\r\n rowAA[k] = 1; // self\r\n } else {\r\n const embAA = this.cosineSimilarity(vecA[i], vecA[k]);\r\n const lexAA = this.computeLexicalBoost(\r\n listA[i],\r\n listA[k]\r\n );\r\n rowAA[k] = Math.max(embAA, lexAA);\r\n }\r\n }\r\n SAA[i] = rowAA;\r\n }\r\n\r\n // Build thresholded neighborhoods\r\n const neighborsA: Map<number, { j: number; score: number }[]> =\r\n new Map();\r\n const neighborsB: Map<number, { i: number; score: number }[]> =\r\n new Map();\r\n for (let i = 0; i < aCount; i++) {\r\n const row: { j: number; score: number }[] = [];\r\n for (let j = 0; j < bCount; j++) {\r\n const s = S[i][j];\r\n if (s >= threshold) {\r\n row.push({ j, score: s });\r\n const rev = neighborsB.get(j) || [];\r\n rev.push({ i, score: s });\r\n neighborsB.set(j, rev);\r\n }\r\n }\r\n // sort descending for deterministic preference lists\r\n row.sort((a, b) => b.score - a.score);\r\n if (row.length) neighborsA.set(i, row);\r\n }\r\n\r\n // Identify exclusive vs ambiguous B nodes\r\n const exclusiveForA: Map<\r\n number,\r\n { j: number; score: number }[]\r\n > = new Map();\r\n const ambiguousB: number[] = [];\r\n const unassignedB: number[] = [];\r\n for (let j = 0; j < bCount; j++) {\r\n const list = (neighborsB.get(j) || []).sort(\r\n (a, b) => b.score - a.score\r\n );\r\n if (list.length === 0) {\r\n unassignedB.push(j);\r\n } else if (list.length === 1) {\r\n const i = list[0].i;\r\n const arr = exclusiveForA.get(i) || [];\r\n arr.push({ j, score: list[0].score });\r\n exclusiveForA.set(i, arr);\r\n } else {\r\n // If best is significantly better than second-best, treat as exclusive to best\r\n const best = list[0];\r\n const second = list[1];\r\n if (best.score - second.score >= exclusivityMargin) {\r\n const arr = exclusiveForA.get(best.i) || [];\r\n arr.push({ j, score: best.score });\r\n exclusiveForA.set(best.i, arr);\r\n } else {\r\n ambiguousB.push(j);\r\n }\r\n }\r\n }\r\n\r\n // A-side exclusivity: if an anchor A has a clearly dominant best B, prefer that exclusive pairing.\r\n const bOwner: Map<number, { i: number; score: number }> =\r\n new Map();\r\n for (const [i, arr] of exclusiveForA.entries()) {\r\n for (const x of arr) {\r\n const ex = bOwner.get(x.j);\r\n if (!ex || x.score > ex.score)\r\n bOwner.set(x.j, { i, score: x.score });\r\n }\r\n }\r\n const ambSetForA: Set<number> = new Set(ambiguousB);\r\n for (let i = 0; i < aCount; i++) {\r\n const list = (neighborsA.get(i) || [])\r\n .slice()\r\n .sort((a, b) => b.score - a.score);\r\n if (!list.length) continue;\r\n const top = list[0];\r\n const second = list[1];\r\n const hasClearLead =\r\n !second || top.score - second.score >= exclusivityMargin;\r\n if (top.score >= threshold && hasClearLead) {\r\n const current = bOwner.get(top.j);\r\n if (!current || top.score > current.score + 1e-6) {\r\n // Reassign this B exclusively to A=i\r\n // Remove from any previous exclusiveForA groups\r\n for (const [ai, arr] of exclusiveForA.entries()) {\r\n exclusiveForA.set(\r\n ai,\r\n arr.filter((x) => x.j !== top.j)\r\n );\r\n }\r\n const arr = exclusiveForA.get(i) || [];\r\n if (!arr.some((x) => x.j === top.j))\r\n arr.push({ j: top.j, score: top.score });\r\n arr.sort((u, v) => v.score - u.score);\r\n exclusiveForA.set(i, arr);\r\n bOwner.set(top.j, { i, score: top.score });\r\n ambSetForA.delete(top.j);\r\n }\r\n }\r\n }\r\n ambiguousB.splice(\r\n 0,\r\n ambiguousB.length,\r\n ...Array.from(ambSetForA.values())\r\n );\r\n\r\n // Mutual-best pairing stage (within small tolerance) to prioritize exclusive high-similarity pairs\r\n const mutualTolerance = 0.03;\r\n const bestBForA: { j: number; score: number }[] = new Array(\r\n aCount\r\n );\r\n for (let i = 0; i < aCount; i++) {\r\n let bBest = -1;\r\n let bBestScore = -Infinity;\r\n for (let j = 0; j < bCount; j++) {\r\n const s = S[i][j];\r\n if (s > bBestScore) {\r\n bBestScore = s;\r\n bBest = j;\r\n }\r\n }\r\n bestBForA[i] = { j: bBest, score: bBestScore };\r\n }\r\n const bestAForB: { i: number; score: number }[] = new Array(\r\n bCount\r\n );\r\n for (let j = 0; j < bCount; j++) {\r\n let aBest = -1;\r\n let aBestScore = -Infinity;\r\n for (let i = 0; i < aCount; i++) {\r\n const s = S[i][j];\r\n if (s > aBestScore) {\r\n aBestScore = s;\r\n aBest = i;\r\n }\r\n }\r\n bestAForB[j] = { i: aBest, score: aBestScore };\r\n }\r\n\r\n // Promote mutual-best pairs to exclusive, removing from ambiguous list if present\r\n const ambSet: Set<number> = new Set(ambiguousB);\r\n for (let i = 0; i < aCount; i++) {\r\n const b = bestBForA[i].j;\r\n if (b >= 0 && S[i][b] >= threshold) {\r\n const a = bestAForB[b].i;\r\n const score = S[i][b];\r\n // within tolerance of best on both sides\r\n const isWithinA =\r\n score >= bestBForA[i].score - mutualTolerance;\r\n const isWithinB =\r\n score >= bestAForB[b].score - mutualTolerance;\r\n if (a === i && isWithinA && isWithinB) {\r\n // Remove from any previous exclusive lists under other anchors\r\n for (const [ai, arr] of exclusiveForA.entries()) {\r\n exclusiveForA.set(\r\n ai,\r\n arr.filter((x) => x.j !== b)\r\n );\r\n }\r\n // Add as exclusive to this anchor\r\n const arr = exclusiveForA.get(i) || [];\r\n // Avoid duplicate insert\r\n if (!arr.some((x) => x.j === b)) {\r\n arr.push({ j: b, score });\r\n arr.sort((u, v) => v.score - u.score);\r\n exclusiveForA.set(i, arr);\r\n }\r\n // Remove from ambiguous set\r\n ambSet.delete(b);\r\n }\r\n }\r\n }\r\n ambiguousB.splice(\r\n 0,\r\n ambiguousB.length,\r\n ...Array.from(ambSet.values())\r\n );\r\n\r\n // Build symmetric anchor heads from mutual-best pairs (above threshold)\r\n const anchorHeads: Map<number, number> = new Map(); // A_i -> head B_j\r\n for (let i = 0; i < aCount; i++) {\r\n const b = bestBForA[i].j;\r\n if (b >= 0) {\r\n const score = S[i][b];\r\n const isWithinA =\r\n score >= bestBForA[i].score - mutualTolerance;\r\n const isWithinB =\r\n score >= bestAForB[b].score - mutualTolerance;\r\n if (\r\n bestAForB[b].i === i &&\r\n score >= threshold &&\r\n isWithinA &&\r\n isWithinB\r\n ) {\r\n anchorHeads.set(i, b);\r\n }\r\n }\r\n }\r\n\r\n // Resolve ambiguous many-to-many by B-centric greedy assignment:\r\n // each ambiguous B chooses its single most similar A (enables one-to-many on A side).\r\n const matchedAmbigForA: Map<\r\n number,\r\n { j: number; score: number }[]\r\n > = new Map();\r\n for (const j of ambiguousB) {\r\n let bestI = -1;\r\n let bestScore = -Infinity;\r\n for (let i = 0; i < aCount; i++) {\r\n const s = S[i][j];\r\n if (s > bestScore) {\r\n bestScore = s;\r\n bestI = i;\r\n }\r\n }\r\n if (bestI >= 0 && bestScore >= threshold) {\r\n const arr = matchedAmbigForA.get(bestI) || [];\r\n arr.push({ j, score: bestScore });\r\n matchedAmbigForA.set(bestI, arr);\r\n }\r\n }\r\n\r\n // Merge exclusive and matched ambiguous into final assignments per A\r\n const assignedToA: Map<number, { j: number; score: number }[]> =\r\n new Map();\r\n for (let i = 0; i < aCount; i++) {\r\n const list: { j: number; score: number }[] = [];\r\n const ex = exclusiveForA.get(i) || [];\r\n for (const x of ex) list.push(x);\r\n const amb = matchedAmbigForA.get(i) || [];\r\n for (const x of amb) list.push(x);\r\n if (list.length) {\r\n list.sort((a, b) => b.score - a.score);\r\n assignedToA.set(i, list);\r\n }\r\n }\r\n\r\n // Promote anchors for left items that have strong assigned matches even if\r\n // they were not mutual-best. This guarantees group creation around\r\n // semantically coherent anchors such as Fish, so items like Clams attach there.\r\n for (const [i, lst] of assignedToA.entries()) {\r\n if (!anchorHeads.has(i) && lst.length) {\r\n anchorHeads.set(i, lst[0].j); // head = top assigned right item\r\n }\r\n }\r\n\r\n // Track which B have been assigned (exclusive or ambiguous)\r\n const assignedBSet: Set<number> = new Set();\r\n for (const arr of assignedToA.values()) {\r\n for (const x of arr) assignedBSet.add(x.j);\r\n }\r\n // Also mark mutual-best anchor head B's as assigned so they are not appended as leftovers\r\n // even if they weren't already in assignedToA for their group.\r\n for (const [ai, headJ] of anchorHeads.entries()) {\r\n assignedBSet.add(headJ);\r\n }\r\n\r\n // Any B not assigned (and not a head) goes to the bottom unassigned list\r\n const leftoverB: number[] = [];\r\n for (let j = 0; j < bCount; j++) {\r\n if (!assignedBSet.has(j)) leftoverB.push(j);\r\n }\r\n\r\n // Determine ranking for each A_i.\r\n // Priority 1: anchors with at least one assigned B (highly related) go to the TOP.\r\n // Priority 2: among them, sort by descending top assigned similarity.\r\n // Anchors with NO assignment are pushed to the BOTTOM and sorted by their best potential similarity.\r\n const rankA: {\r\n i: number;\r\n score: number;\r\n hasAssignment: boolean;\r\n }[] = [];\r\n for (let i = 0; i < aCount; i++) {\r\n const assigned: { j: number; score: number }[] =\r\n assignedToA.get(i) || [];\r\n let top = 0;\r\n if (assigned.length > 0) {\r\n top = assigned.reduce(\r\n (m: number, x: { j: number; score: number }) =>\r\n x.score > m ? x.score : m,\r\n 0\r\n );\r\n } else {\r\n // If nothing assigned, consider the best potential similarity (even if below threshold)\r\n let best = 0;\r\n for (let j = 0; j < bCount; j++)\r\n best = Math.max(best, S[i][j]);\r\n top = best;\r\n }\r\n rankA.push({\r\n i,\r\n score: top,\r\n hasAssignment: assigned.length > 0,\r\n });\r\n }\r\n rankA.sort(\r\n (x, y) =>\r\n Number(y.hasAssignment) - Number(x.hasAssignment) ||\r\n y.score - x.score\r\n );\r\n\r\n // Within each group, sort assigned B by descending similarity to the anchor\r\n for (const [i, list] of assignedToA.entries()) {\r\n list.sort(\r\n (\r\n a: { j: number; score: number },\r\n b: { j: number; score: number }\r\n ) => b.score - a.score\r\n );\r\n assignedToA.set(i, list);\r\n }\r\n\r\n // Determine anchor groups strictly from symmetric mutual-best pairs\r\n const anchorSet: Set<number> = new Set(anchorHeads.keys());\r\n\r\n // Early-out: if no anchors (no cross-list matches above threshold),\r\n // fall back to simple left-only rows followed by right-only rows\r\n if (anchorSet.size === 0) {\r\n const rowsNoAnchors: IAlignmentRow[] = [];\r\n for (let i = 0; i < aCount; i++)\r\n rowsNoAnchors.push({\r\n left: listA[i],\r\n right: '-',\r\n score: 0,\r\n });\r\n for (const j of leftoverB)\r\n rowsNoAnchors.push({\r\n left: '-',\r\n right: listB[j],\r\n score: 0,\r\n });\r\n return rowsNoAnchors;\r\n }\r\n\r\n // Map each B to its owning anchor A for quick lookup (based on assignedToA)\r\n const ownerOfB: number[] = new Array(bCount).fill(-1);\r\n for (const [ai, lst] of assignedToA.entries()) {\r\n for (const x of lst) ownerOfB[x.j] = ai;\r\n }\r\n\r\n // Build extras for LEFT side: assign leftover A items to the group and specific right item\r\n // they best match (cross-list) or, alternatively, to the anchor left by within-list similarity.\r\n type Extra = { k: number; jPref: number; score: number };\r\n const leftUsed: Set<number> = new Set();\r\n // Mark anchors as used so they won't be re-assigned as extras\r\n for (const ai of anchorSet.values()) leftUsed.add(ai);\r\n\r\n // Pre-bucket extras: group -> (right j within that group) -> extras[]\r\n const extrasByGroup: Map<\r\n number,\r\n Map<number, Extra[]>\r\n > = new Map();\r\n\r\n for (let k = 0; k < aCount; k++) {\r\n if (leftUsed.has(k)) continue; // skip anchors\r\n\r\n let bestGroup = -1;\r\n let bestRightJ = -1;\r\n let bestScore = -Infinity;\r\n\r\n // Evaluate affinity against each anchor group\r\n for (const ai of anchorSet.values()) {\r\n const groupList = assignedToA.get(ai) || [];\r\n // Ensure the head B is present in the consideration list\r\n const headJ = anchorHeads.get(ai)!;\r\n const listWithHead = groupList.some((x) => x.j === headJ)\r\n ? groupList\r\n : [{ j: headJ, score: S[ai][headJ] }, ...groupList];\r\n\r\n // Best cross-list similarity to any right item under this anchor\r\n let localBestJ = -1;\r\n let localBestCross = -Infinity;\r\n for (const x of listWithHead) {\r\n const s = S[k][x.j];\r\n if (s > localBestCross) {\r\n localBestCross = s;\r\n localBestJ = x.j;\r\n }\r\n }\r\n\r\n // Within-list cohesion to the anchor left word\r\n const withinAA = SAA[k][ai];\r\n const combined = Math.max(localBestCross, withinAA);\r\n\r\n if (combined > bestScore) {\r\n bestScore = combined;\r\n bestGroup = ai;\r\n // Prefer the concrete right target when cross-list is stronger;\r\n // otherwise fall back to the group's top right assignment.\r\n bestRightJ =\r\n localBestCross >= withinAA ? localBestJ : headJ;\r\n }\r\n }\r\n\r\n // Attach as extra if cohesive enough to some group\r\n if (\r\n bestGroup >= 0 &&\r\n bestRightJ >= 0 &&\r\n bestScore >= leftCohesion\r\n ) {\r\n let byRight = extrasByGroup.get(bestGroup);\r\n if (!byRight) {\r\n byRight = new Map<number, Extra[]>();\r\n extrasByGroup.set(bestGroup, byRight);\r\n }\r\n const arr = byRight.get(bestRightJ) || [];\r\n arr.push({ k, jPref: bestRightJ, score: bestScore });\r\n byRight.set(bestRightJ, arr);\r\n leftUsed.add(k);\r\n }\r\n }\r\n\r\n // Build grouped rows with left extras rendered directly under the specific right item\r\n // they most strongly match. This ensures highly related words appear exactly below their\r\n // most similar counterpart on the other side.\r\n const rows: IAlignmentRow[] = [];\r\n const anchorIndices: number[] = Array.from(anchorSet.values());\r\n const orderIndices: number[] = preserveLeftOrder\r\n ? anchorIndices.sort((x, y) => x - y)\r\n : anchorIndices.sort((i1, i2) => {\r\n const j1 = anchorHeads.get(i1)!;\r\n const j2 = anchorHeads.get(i2)!;\r\n const diff = S[i2][j2] - S[i1][j1];\r\n if (Math.abs(diff) > 1e-9) return diff;\r\n // Side-invariant tie-breaker using symmetric pair key\r\n const key1 = [\r\n listA[i1].toLowerCase(),\r\n listB[j1].toLowerCase(),\r\n ]\r\n .sort()\r\n .join('|');\r\n const key2 = [\r\n listA[i2].toLowerCase(),\r\n listB[j2].toLowerCase(),\r\n ]\r\n .sort()\r\n .join('|');\r\n return key1.localeCompare(key2);\r\n });\r\n\r\n for (const i of orderIndices) {\r\n const groupOrig: { j: number; score: number }[] =\r\n assignedToA.get(i) || [];\r\n const headJ = anchorHeads.get(i)!;\r\n // Build group with head first, then others by score\r\n const others = groupOrig\r\n .filter((x) => x.j !== headJ)\r\n .sort((a, b) => {\r\n const d = b.score - a.score;\r\n if (Math.abs(d) > 1e-9) return d;\r\n return listB[a.j]\r\n .toLowerCase()\r\n .localeCompare(listB[b.j].toLowerCase());\r\n });\r\n const group = [{ j: headJ, score: S[i][headJ] }, ...others];\r\n\r\n // First row uses the anchor head pair\r\n const first = group[0];\r\n rows.push({\r\n left: listA[i],\r\n right: listB[first.j],\r\n score: first.score,\r\n });\r\n\r\n // Render left extras that prefer this first right item\r\n const byRight = extrasByGroup.get(i);\r\n const extrasForFirst =\r\n (byRight && byRight.get(first.j)) || [];\r\n if (extrasForFirst.length) {\r\n extrasForFirst.sort((e1, e2) => {\r\n const s1 = Math.max(S[e1.k][first.j], SAA[e1.k][i]);\r\n const s2 = Math.max(S[e2.k][first.j], SAA[e2.k][i]);\r\n const d = s2 - s1;\r\n if (Math.abs(d) > 1e-9) return d;\r\n return listA[e1.k]\r\n .toLowerCase()\r\n .localeCompare(listA[e2.k].toLowerCase());\r\n });\r\n for (const ex of extrasForFirst) {\r\n rows.push({\r\n left: listA[ex.k],\r\n right: '-',\r\n score: Math.max(S[ex.k][first.j], SAA[ex.k][i]),\r\n });\r\n }\r\n }\r\n\r\n // Render remaining right items with their own left extras directly beneath\r\n for (let idx = 1; idx < group.length; idx++) {\r\n const g = group[idx];\r\n rows.push({ left: '-', right: listB[g.j], score: g.score });\r\n\r\n const extrasForJ = (byRight && byRight.get(g.j)) || [];\r\n if (extrasForJ.length) {\r\n extrasForJ.sort((e1, e2) => {\r\n const s1 = Math.max(S[e1.k][g.j], SAA[e1.k][i]);\r\n const s2 = Math.max(S[e2.k][g.j], SAA[e2.k][i]);\r\n const d = s2 - s1;\r\n if (Math.abs(d) > 1e-9) return d;\r\n return listA[e1.k]\r\n .toLowerCase()\r\n .localeCompare(listA[e2.k].toLowerCase());\r\n });\r\n for (const ex of extrasForJ) {\r\n rows.push({\r\n left: listA[ex.k],\r\n right: '-',\r\n score: Math.max(S[ex.k][g.j], SAA[ex.k][i]),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Append leftover left items (not anchors and not attached as extras)\r\n for (let i = 0; i < aCount; i++) {\r\n if (!anchorSet.has(i) && !leftUsed.has(i)) {\r\n rows.push({ left: listA[i], right: '-', score: 0 });\r\n }\r\n }\r\n\r\n // Append unassigned B at the end so they do not disrupt highly related groups\r\n for (const j of leftoverB) {\r\n rows.push({ left: '-', right: listB[j], score: 0 });\r\n }\r\n\r\n return rows;\r\n })\r\n );\r\n })\r\n )\r\n ),\r\n catchError((err) =>\r\n throwError(\r\n () => new Error('Failed to create grouped alignment: ' + err)\r\n )\r\n )\r\n );\r\n }\r\n\r\n // Cosine similarity between two vectors\r\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\r\n let dot = 0,\r\n na = 0,\r\n nb = 0;\r\n for (let i = 0; i < a.length; i++) {\r\n dot += a[i] * b[i];\r\n na += a[i] * a[i];\r\n nb += b[i] * b[i];\r\n }\r\n return dot / (Math.sqrt(na) * Math.sqrt(nb) + 1e-12);\r\n }\r\n\r\n /**\r\n * Align words in listA with their most semantically similar words in listB\r\n *\r\n * Algorithm:\r\n * 1. Generate embeddings for all words in both lists using Universal Sentence Encoder\r\n * 2. For each word in listA, compare its embedding with all words in listB\r\n * 3. Find the word in listB with highest cosine similarity score\r\n * 4. Return alignment results with similarity scores\r\n *\r\n * @param listA - Source list of words to align\r\n * @param listB - Target list of words to find matches in\r\n * @returns Observable of alignment results with word, alignedWith, score, and index\r\n */\r\n alignLists(listA: string[], listB: string[]): Observable<IWordAlignment[]> {\r\n return this.loadModel().pipe(\r\n // Step 1: Generate embeddings for both word lists simultaneously\r\n switchMap((model) =>\r\n forkJoin([\r\n from(model.embed(listA) as unknown as Promise<tf.Tensor>), \r\n from(model.embed(listB) as unknown as Promise<tf.Tensor>)\r\n ]).pipe(\r\n // Step 2: Convert tensor embeddings to JavaScript arrays\r\n switchMap(([tA, tB]: [tf.Tensor, tf.Tensor]) => {\r\n return forkJoin([from(tA.array() as Promise<number[][]>), from(tB.array() as Promise<number[][]>)]).pipe(\r\n map((tensorArrays: [number[][], number[][]]) => {\r\n const [arrA, arrB] = tensorArrays;\r\n // Clean up TensorFlow tensors to prevent memory leaks\r\n tA.dispose();\r\n tB.dispose();\r\n\r\n // For each word in listA, find its best match in listB\r\n const results = listA.map((wordA, i) => {\r\n // Get the embedding vector for current word from listA\r\n const vecA = Float32Array.from(arrA[i]);\r\n\r\n // Initialize variables to track the best match\r\n let bestScore = -Infinity;\r\n let bestMatch: string | null = null;\r\n let bestIndex = -1;\r\n\r\n // Compare current word from listA with all words in listB\r\n for (let j = 0; j < listB.length; j++) {\r\n // Get the embedding vector for current word from listB\r\n const vecB = Float32Array.from(arrB[j]);\r\n\r\n // Calculate semantic similarity using cosine similarity\r\n const score = this.cosineSimilarity(vecA, vecB);\r\n\r\n // Update best match if this similarity is higher\r\n if (score > bestScore) {\r\n bestScore = score;\r\n bestMatch = listB[j];\r\n bestIndex = j;\r\n }\r\n }\r\n\r\n // Return alignment result for this word\r\n return {\r\n word: wordA, // Original word from listA\r\n alignedWith: bestMatch, // Best matching word from listB\r\n score: bestScore, // Similarity score (0-1, higher is better)\r\n index: bestIndex, // Index of best match in listB\r\n };\r\n });\r\n\r\n // Return all alignment results\r\n return results;\r\n })\r\n );\r\n })\r\n )\r\n ),\r\n catchError((err) =>\r\n throwError(\r\n () => new Error('Model not loaded or embedding failed: ' + err)\r\n )\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Find best matching pairs between two lists above a similarity threshold\r\n *\r\n * @param listA - Source list of words\r\n * @param listB - Target list of words to match against\r\n * @param threshold - Minimum similarity score (0-1, default: 0.15)\r\n * @returns Observable of word pairs with similarity scores\r\n */\r\n findBestMatchingPairs(\r\n listA: string[],\r\n listB: string[],\r\n threshold: number = 0.15\r\n ): Observable<IWordPair[]> {\r\n return this.alignLists(listA, listB).pipe(\r\n map((alignments) => {\r\n const usedB = new Set<number>();\r\n const pairs: IWordPair[] = [];\r\n // Sort by similarity score (highest first)\r\n alignments.sort(\r\n (a: IWordAlignment, b: IWordAlignment) => b.score - a.score\r\n );\r\n // Debug logging for travel/journey matching\r\n console.log(\r\n 'Embedding Service - All alignments:',\r\n alignments.map((alignment: IWordAlignment) => ({\r\n word: alignment.word,\r\n alignedWith: alignment.alignedWith,\r\n score: alignment.score.toFixed(3),\r\n }))\r\n );\r\n for (const alignment of alignments) {\r\n if (alignment.score >= threshold && !usedB.has(alignment.index)) {\r\n pairs.push({\r\n wordA: alignment.word,\r\n wordB: alignment.alignedWith!,\r\n score: alignment.score,\r\n });\r\n usedB.add(alignment.index);\r\n // Special logging for travel-related matches\r\n if (\r\n alignment.word.toLowerCase().includes('travel') ||\r\n alignment.word.toLowerCase().includes('journey') ||\r\n alignment.alignedWith!.toLowerCase().includes('travel') ||\r\n alignment.alignedWith!.toLowerCase().includes('journey')\r\n ) {\r\n console.log('🎯 Travel/Journey Match Found:', {\r\n wordA: alignment.word,\r\n wordB: alignment.alignedWith,\r\n score: alignment.score.toFixed(3),\r\n threshold: threshold,\r\n });\r\n }\r\n }\r\n }\r\n return pairs;\r\n }),\r\n catchError((err) =>\r\n throwError(\r\n () => new Error('Failed to find best matching pairs: ' + err)\r\n )\r\n )\r\n );\r\n }\r\n\r\n // Calculate similarity between two texts (returns Observable)\r\n calculateSimilarity(\r\n primaryText: string,\r\n comparisonText: string\r\n ): Observable<number> {\r\n return this.getEmbedding(primaryText).pipe(\r\n switchMap((emb1) =>\r\n this.getEmbedding(comparisonText).pipe(\r\n map((emb2) => {\r\n const similarity = this.cosineSimilarity(emb1, emb2);\r\n // Debug logging for travel/journey similarity\r\n if (\r\n primaryText.toLowerCase().includes('travel') ||\r\n primaryText.toLowerCase().includes('journey') ||\r\n comparisonText.toLowerCase().includes('travel') ||\r\n comparisonText.toLowerCase().includes('journey')\r\n ) {\r\n console.log('🔍 Travel/Journey Similarity:', {\r\n primaryText,\r\n comparisonText,\r\n similarity: similarity.toFixed(3),\r\n });\r\n }\r\n return similarity;\r\n })\r\n )\r\n ),\r\n catchError((err) =>\r\n throwError(() => new Error('Failed to calculate similarity: ' + err))\r\n )\r\n );\r\n }\r\n\r\n // Test method to check specific word similarities (Observable only)\r\n testWordSimilarity(word1: string, word2: string): Observable<void> {\r\n return this.calculateSimilarity(word1, word2).pipe(\r\n map((similarity) => {\r\n console.log(\r\n `📊 Similarity between \"${word1}\" and \"${word2}\": ${(\r\n similarity * 100\r\n ).toFixed(1)}%`\r\n );\r\n }),\r\n catchError((error) => {\r\n console.error('Error testing word similarity:', error);\r\n return of();\r\n })\r\n );\r\n }\r\n\r\n // Private methods\r\n\r\n // Domain compatibility cap to avoid mismatched category-versus-activity pairings.\r\n // Example: \"Fish\" (food/animal noun) vs \"Bird watching\" (activity) should not align.\r\n // Returns a cap in [0,1] representing the maximum allowed similarity for the pair.\r\n // Values below the groupAlignLists() threshold (default 0.25) effectively block alignment.\r\n private domainCompatibilityCap(a: string, b: string): number {\r\n const norm = (s: string): string =>\r\n s\r\n .toLowerCase()\r\n .replace(/[_-]+/g, ' ')\r\n .replace(/[^a-z\\s]/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n\r\n const A = norm(a);\r\n const B = norm(b);\r\n\r\n const watching = /\\b[a-z]+\\s*watching\\b|\\bbirdwatching\\b/;\r\n const genericActivities = /\\b(hiking|reading|painting|photography|gardening|blogging|writing|gaming|chess|puzzles|travel(?:ing|ling)?|programming|coding|language learning|pottery|clay\\s*model(?:ing|ling))\\b/;\r\n const isActivity = (s: string) => watching.test(s) || genericActivities.test(s);\r\n\r\n const foodAnimal = /\\b(fish|sea\\s*food|seafood|shell\\s*fish|shellfish|clam|clams|mussel|mussels|oyster|oysters|scallop|scallops|shrimp|prawn|prawns|lobster|crab|meat|beef|pork|chicken|egg|eggs)\\b/;\r\n const isFoodAnimal = (s: string) => foodAnimal.test(s);\r\n\r\n const aAct = isActivity(A);\r\n const bAct = isActivity(B);\r\n const aFood = isFoodAnimal(A);\r\n const bFood = isFoodAnimal(B);\r\n\r\n if ((aAct && bFood) || (bAct && aFood)) {\r\n // Cap below default threshold so these pairs never form groups\r\n return 0.2;\r\n }\r\n return 1.0;\r\n }\r\n\r\n // Lightweight lexical similarity booster to catch cases like \"AI/ML\" ↔ \"AI machine learning\"\r\n // Uses token normalization + targeted synonym/expansion rules and token Jaccard.\r\n private computeLexicalBoost(a: string, b: string): number {\r\n const expand = (s: string): string => {\r\n let x = s.toLowerCase();\r\n // Normalize separators\r\n x = x.replace(/[_-]+/g, ' ');\r\n // Targeted expansions\r\n x = x.replace(/ai\\s*\\/\\s*ml|ai\\s*[- ]?ml/g, 'ai machine learning');\r\n x = x.replace(/\\bml\\b/g, 'machine learning');\r\n x = x.replace(/web\\s*dev(elopment)?/g, 'web development');\r\n // Domain expansions – culinary/food categories (to help cases like Fish ↔ Clams)\r\n x = x.replace(/\\bsea\\s*food\\b/g, 'seafood fish shellfish');\r\n x = x.replace(\r\n /\\bshell\\s*fish\\b/g,\r\n 'shellfish clams mussels oysters scallops seafood'\r\n );\r\n x = x.replace(/\\bfish(es)?\\b/g, 'fish seafood');\r\n x = x.replace(/\\bclam(s)?\\b/g, 'clams shellfish seafood');\r\n x = x.replace(/\\bmussel(s)?\\b/g, 'mussels shellfish seafood');\r\n x = x.replace(/\\boyster(s)?\\b/g, 'oysters shellfish seafood');\r\n x = x.replace(/\\bscallop(s)?\\b/g, 'scallops shellfish seafood');\r\n x = x.replace(/\\bshrimp(s)?\\b/g, 'shrimp seafood');\r\n x = x.replace(/\\bprawn(s)?\\b/g, 'prawns shrimp seafood');\r\n x = x.replace(/\\blobster(s)?\\b/g, 'lobster seafood');\r\n x = x.replace(/\\bcrab(s)?\\b/g, 'crab seafood');\r\n x = x.replace(/ui\\s*\\/\\s*ux|ui\\s*[- ]?ux/g, 'ui ux design');\r\n return x;\r\n };\r\n\r\n const normalize = (s: string): string => {\r\n const x = expand(s)\r\n .replace(/[^a-z0-9\\s]/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n return x;\r\n };\r\n\r\n const A = normalize(a);\r\n const B = normalize(b);\r\n if (!A || !B) return 0;\r\n\r\n // Strong containment boost (e.g., \"ai machine learning\" contains \"machine learning\")\r\n if (A.includes(B) || B.includes(A)) {\r\n return Math.max(\r\n 0.75,\r\n Math.min(0.95, Math.max(A.length, B.length) > 12 ? 0.85 : 0.78)\r\n );\r\n }\r\n\r\n const toTokens = (s: string): string[] => s.split(' ').filter(Boolean);\r\n const setFrom = (arr: string[]) => new Set(arr);\r\n const tA = toTokens(A);\r\n const tB = toTokens(B);\r\n if (!tA.length || !tB.length) return 0;\r\n const sA = setFrom(tA);\r\n const sB = setFrom(tB);\r\n let inter = 0;\r\n for (const t of sA) if (sB.has(t)) inter++;\r\n const union = sA.size + sB.size - inter;\r\n const jaccard = union > 0 ? inter / union : 0;\r\n\r\n // Small extra for sharing big tokens like \"learning\"/\"development\" with qualifiers\r\n const longTokenBonus = Math.min(\r\n 0.1,\r\n [...sA].filter((t) => t.length >= 6 && sB.has(t)).length * 0.03\r\n );\r\n\r\n const score = Math.min(0.95, jaccard + longTokenBonus);\r\n return score;\r\n }\r\n\r\n // Lazy load the model only once, as observable\r\n private loadModel(): Observable<use.UniversalSentenceEncoder> {\r\n if (!this.model$) {\r\n this.model$ = defer(() =>\r\n from(use.load())\r\n ).pipe(shareReplay(1)) as Observable<use.UniversalSentenceEncoder>;\r\n }\r\n return this.model$;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, from, map, switchMap, of } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FileConversionService {\r\n private static readonly MIME_TYPE_JPEG = 'image/jpeg';\r\n private static readonly MIME_TYPE_PNG = 'image/png';\r\n private static readonly MIME_TYPE_WEBP = 'image/webp';\r\n private static readonly FILE_EXTENSION_JPG = '.jpg';\r\n private static readonly FILE_EXTENSION_JPEG = '.jpeg';\r\n private static readonly FILE_EXTENSION_PNG = '.png';\r\n private static readonly FILE_EXTENSION_WEBP = '.webp';\r\n\r\n urlToFile(url: string, fileName: string, mimeType: string): Observable<File> {\r\n return from(fetch(url)).pipe(\r\n switchMap(response => from(response.blob())),\r\n map(blob => new File([blob], fileName, { type: mimeType }))\r\n );\r\n }\r\n\r\n isDataUrl(str: string): boolean {\r\n return typeof str === 'string' && str.startsWith('data:');\r\n }\r\n\r\n dataUrlToFile(dataUrl: string, fileName: string): File {\r\n const [header, data] = dataUrl.split(',');\r\n const mimeMatch = header.match(/data:(.*?);/);\r\n const mime = mimeMatch ? mimeMatch[1] : FileConversionService.MIME_TYPE_PNG;\r\n const binary = atob(data || '');\r\n const len = binary.length;\r\n const u8 = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) u8[i] = binary.charCodeAt(i);\r\n return new File([u8], fileName, { type: mime });\r\n }\r\n\r\n getMimeFromFilename(fileName: string): string {\r\n const lower = (fileName || '').toLowerCase();\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_JPG) || lower.endsWith(FileConversionService.FILE_EXTENSION_JPEG)) return FileConversionService.MIME_TYPE_JPEG;\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_PNG)) return FileConversionService.MIME_TYPE_PNG;\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_WEBP)) return FileConversionService.MIME_TYPE_WEBP;\r\n return FileConversionService.MIME_TYPE_PNG;\r\n }\r\n\r\n getFileForImageString(imageStr: string, fileBaseName: string): Observable<File> {\r\n if (this.isDataUrl(imageStr)) return of(this.dataUrlToFile(imageStr, fileBaseName));\r\n const mime = this.getMimeFromFilename(imageStr);\r\n return this.urlToFile(imageStr, fileBaseName, mime);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IImageCompressionConfig } from '../interfaces';\r\nimport { Observable, from, of, map, switchMap } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ImageCompressionService {\r\n compressImageFile(file: File, config: IImageCompressionConfig, overrides: Partial<IImageCompressionConfig> = {}): Observable<{ file: File; dataUrl: string }> {\r\n const cfg = { ...config, ...overrides } as IImageCompressionConfig;\r\n\r\n return this.loadImageFromFile(file).pipe(\r\n switchMap((img) => {\r\n let width = img.naturalWidth || img.width;\r\n let height = img.naturalHeight || img.height;\r\n const scale = Math.min(cfg.maxWidth / width, cfg.maxHeight / height, 1);\r\n width = Math.max(1, Math.round(width * scale));\r\n height = Math.max(1, Math.round(height * scale));\r\n\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d')!;\r\n\r\n const render = (w: number, h: number) => {\r\n canvas.width = w;\r\n canvas.height = h;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.drawImage(img, 0, 0, w, h);\r\n };\r\n\r\n const process = (w: number, h: number, q: number, attempts: number): Observable<Blob> => {\r\n render(w, h);\r\n return this.canvasToBlob(canvas, cfg.format, q).pipe(\r\n switchMap((blob) => {\r\n if (blob.size > cfg.maxBytes && attempts < 25) {\r\n if (q > cfg.qualityMin + 0.005) {\r\n return process(w, h, Math.max(cfg.qualityMin, q - cfg.qualityStep), attempts + 1);\r\n } else {\r\n const nextW = Math.max(Math.round(w * cfg.downscaleStep), cfg.minWidth);\r\n const nextH = Math.max(Math.round(h * cfg.downscaleStep), cfg.minHeight);\r\n if (nextW === w && nextH === h) return of(blob);\r\n return process(nextW, nextH, cfg.qualityStart, attempts + 1);\r\n }\r\n }\r\n return of(blob);\r\n })\r\n );\r\n };\r\n\r\n return process(width, height, cfg.qualityStart, 0).pipe(\r\n switchMap((finalBlob: Blob) => {\r\n const newName = this.renameFileForFormat(file.name, cfg.format);\r\n const compressedFile = new File([finalBlob], newName, { type: cfg.format, lastModified: Date.now() });\r\n return this.blobToDataURL(finalBlob).pipe(\r\n map((dataUrl) => ({ file: compressedFile, dataUrl }))\r\n );\r\n })\r\n );\r\n })\r\n );\r\n }\r\n\r\n loadImageFromFile(file: File): Observable<HTMLImageElement> {\r\n return new Observable(observer => {\r\n const url = URL.createObjectURL(file);\r\n const img = new Image();\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n observer.next(img);\r\n observer.complete();\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n observer.error(new Error('Failed to load image'));\r\n };\r\n img.src = url;\r\n });\r\n }\r\n\r\n canvasToBlob(canvas: HTMLCanvasElement, type: string, quality: number): Observable<Blob> {\r\n return new Observable(observer => {\r\n if (canvas.toBlob) {\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n observer.next(blob);\r\n observer.complete();\r\n } else {\r\n observer.error(new Error('toBlob null'));\r\n }\r\n }, type, quality);\r\n } else {\r\n try {\r\n const dataUrl = canvas.toDataURL(type, quality);\r\n const base64 = dataUrl.split(',')[1] || '';\r\n const binary = atob(base64);\r\n const u8 = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) u8[i] = binary.charCodeAt(i);\r\n observer.next(new Blob([u8], { type }));\r\n observer.complete();\r\n } catch (e) {\r\n observer.error(e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n blobToDataURL(blob: Blob): Observable<string> {\r\n return new Observable(observer => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = (err) => observer.error(err);\r\n reader.readAsDataURL(blob);\r\n });\r\n }\r\n\r\n renameFileForFormat(name: string, mime: string): string {\r\n const base = name.substring(0, name.lastIndexOf('.')) || name;\r\n if (mime === 'image/jpeg') return `${base}.jpg`;\r\n if (mime === 'image/png') return `${base}.png`;\r\n if (mime === 'image/webp') return `${base}.webp`;\r\n return `${base}.jpg`;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError, of } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { IAlignmentRow, IOpenAIResponse, IOpenAIEmbeddingItem } from '../interfaces';\r\n\r\n/**\r\n * OpenAI Alignment Service\r\n * Uses OpenAI Chat Completions API to align two lists of text in a single request.\r\n * This replaces the previous embedding-based approach to avoid rate limits and reduce complexity.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class OpenAIEmbeddingService {\r\n private static readonly API_URL = 'https://api.openai.com/v1/chat/completions';\r\n private static readonly MODEL = 'gpt-4o';\r\n private static readonly HEADER_CONTENT_TYPE = 'Content-Type';\r\n private static readonly HEADER_AUTHORIZATION = 'Authorization';\r\n private static readonly CONTENT_TYPE_JSON = 'application/json';\r\n private static readonly BEARER_PREFIX = 'Bearer ';\r\n private static readonly SPACER_SMALL = '-';\r\n private static readonly SPACER_LARGE = '----';\r\n\r\n private readonly API_URL = OpenAIEmbeddingService.API_URL;\r\n // Using gpt-4o for maximum intelligence and adherence to complex instructions\r\n private readonly MODEL = OpenAIEmbeddingService.MODEL;\r\n \r\n // Cache for alignment results\r\n // Key: Canonical hash of two lists\r\n // Value: { originalA: string[], originalB: string[], rows: IAlignmentRow[] }\r\n private alignmentCache = new Map<string, { originalA: string[], originalB: string[], rows: IAlignmentRow[] }>();\r\n \r\n // Cache for new spacer-based alignment\r\n private spacerAlignmentCache = new Map<string, { listA: string[], listB: string[] }>();\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Get aligned lists with spacers.\r\n * Now uses a direct LLM call with a specific prompt to generate the aligned lists.\r\n */\r\n getAlignedLists(\r\n listA: string[],\r\n listB: string[],\r\n apiKey: string\r\n ): Observable<{ listA: string[], listB: string[] }> {\r\n \r\n const validA = listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\r\n const validB = listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\r\n\r\n if (validA.length === 0 && validB.length === 0) return of({ listA: [], listB: [] });\r\n\r\n // Cache key\r\n const key = JSON.stringify({ a: validA, b: validB, v: 'spacer-v35' });\r\n if (this.spacerAlignmentCache.has(key)) {\r\n console.log('Alignment cache hit');\r\n return of(this.spacerAlignmentCache.get(key)!); \r\n }\r\n\r\n const headers = new HttpHeaders({\r\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\r\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\r\n });\r\n\r\n const prompt = `\r\n You are an expert semantic alignment engine.\r\n Task: Align the items from List A to List B based on semantic similarity.\r\n Context: This is a heuristic, human-semantic alignment (use embeddings later if you want it algorithmically strict).\r\n \r\n List A: ${JSON.stringify(validA)}\r\n List B: ${JSON.stringify(validB)}\r\n\r\n SEMANTIC STRATEGY (3-PASS PROCESS):\r\n 1. **Pass 1: Exact & Strong Matches**: First, lock in all exact synonyms (e.g., \"Dog\" vs \"Puppy\") and strong category matches (e.g., \"Tennis\" vs \"Badminton\"). These are your anchors.\r\n 2. **Pass 2: Thematic Clustering**: Next, group remaining items by sub-theme (e.g., \"Water Sports\", \"Asian Cuisine\"). Align items within these themes even if they aren't perfect pairs.\r\n 3. **Pass 3: Contextual & Loose Matches**: Look for looser associations (e.g., \"Reading\" vs \"Library\").\r\n 4. **Isolation**: If an item truly has NO relation to anything remaining in the other list, ISOLATE it using \"----\". Do NOT force a bad match.\r\n\r\n Rules:\r\n 1. Align items into clusters with variable dash-gaps to show semantic distance.\r\n 2. Use \"-\" for a small hop (related but distinct).\r\n 3. Use \"----\" for a hard theme switch (different category).\r\n 4. You MUST reorder items to create the best semantic clusters.\r\n 5. Ensure the output arrays \"listA\" and \"listB\" have the SAME length.\r\n 6. If an item has no match, align it with \"-\" or \"----\" as appropriate, or just a gap.\r\n 7. Output MUST be a JSON object with \"listA\" and \"listB\".\r\n 8. **COMPLETENESS**: You MUST include EVERY item from the input List A and List B in the output. Do not omit any items.\r\n 9. **Handling Leftovers**: If you have items left over at the end that don't match well, still include them in the list, aligned with \"-\" if necessary, or grouped together if they are somewhat related.\r\n 10. **Spacer Alignment**: You MUST align \"----\" with \"----\" in both lists. Do NOT align a hard switch \"----\" with a word. If you need a switch on one side, put it on the other side too.\r\n 11. **Strict Side Adherence**: Items from Input List A MUST ONLY appear in Output List A. Items from Input List B MUST ONLY appear in Output List B. Do not mix them up.\r\n 12. **Mandatory Spacers**: You MUST insert a spacer (\"-\" or \"----\") between clusters of related items. Avoid putting \"----\" between every single item; use it only when the topic truly shifts.\r\n 13. **NO TRAILING SPACER**: The last item in both lists MUST be a word. Do NOT put a spacer at the very end.\r\n 14. **Length Mismatch Handling**: If one list is shorter than the other, you MUST fill the empty slots in the shorter list with spacers (\"-\") ONLY. DO NOT invent words or reuse words to fill the space.\r\n 15. **HIGH SIMILARITY CONSOLIDATION (>= 0.8)**: This is CRITICAL for center display:\r\n - When you find a pair with VERY HIGH semantic similarity (>= 0.8), you MUST output the SAME TEXT in both listA and listB at that position.\r\n - Format the combined text as: \"word1 × word2\" OR \"word1 / word2\" OR just use one of the words.\r\n - **Examples of HIGH similarity (>= 0.8) - MUST consolidate**:\r\n * \"AI/ML\" and \"AI machine learning\" -> Output \"AI/ML × AI machine learning\" in BOTH lists\r\n * \"Programming\" and \"software\" -> Output \"Programming × software\" in BOTH lists\r\n * \"Web Development\" and \"Development\" -> Output \"Web Development × Development\" in BOTH lists\r\n * \"Gaming\" and \"Mobile Games\" -> Output \"Gaming × Mobile Games\" in BOTH lists\r\n * \"graphics design\" and \"Design\" -> Output \"graphics design × Design\" in BOTH lists\r\n * \"Startups\" and \"Entrepreneurship\" -> Output \"Startups × Entrepreneurship\" in BOTH lists\r\n * \"Jogging\" and \"Running\" -> Output \"Jogging × Running\" in BOTH lists (GOLD STANDARD)\r\n * \"Hiking\" and \"Trail hikes\" -> Output \"Hiking × Trail hikes\" in BOTH lists\r\n * \"Coffee\" and \"Cafes\" -> Output \"Coffee × Cafes\" in BOTH lists\r\n * \"Gym / lifting\" and \"Working out\" -> Output \"Gym / lifting × Working out\" in BOTH lists\r\n * \"Board games\" and \"Gaming\" -> Output \"Board games × Gaming\" in BOTH lists\r\n * \"Live music\" and \"Live music\" -> Already exact match, keep as is\r\n * \"Innovation\" and \"Innovation\" -> Already exact match, keep as is\r\n - **Examples of LOWER similarity (< 0.8) - Do NOT consolidate**:\r\n * \"Data Science\" and \"Blockchain\" -> Keep separate (different fields)\r\n * \"graphics card\" and \"Hardware\" -> Keep separate (component vs category)\r\n * \"figma\" and \"Design Thinking\" -> Keep separate (tool vs methodology)\r\n * \"Cybersecurity\" and \"Privacy\" -> Keep separate (related but distinct)\r\n * \"Cooking\" and \"Photography\" -> Keep separate (unrelated)\r\n * \"Traveling\" and \"Reading\" -> Keep separate (different activities)\r\n - **Key principle**: If the items are synonyms, very similar activities, or one is a specific type of the other, consolidate them!\r\n - **STRICT CONSTRAINT**: You can ONLY consolidate if BOTH items actually exist in the input lists and are semantically related.\r\n - **NEVER** invent an item for List B just to make a pair with List A. If List A has \"figma\" and List B has NOTHING related, output \"figma\" in List A and \"-\" in List B. DO NOT put \"figma\" in List B.\r\n - **STRICT SYMMETRY**: If you use the \"×\" symbol to consolidate, you MUST output the EXACT SAME string in BOTH \"listA\" and \"listB\" at that index.\r\n - This allows the system to automatically move these items to the center display!\r\n - **NEVER** use \"×\" on one side and a spacer on the other. That is a critical failure.\r\n - **NEVER** include similarity scores or any other numbers in the output strings unless they are part of the original item text.\r\n - **ONLY** use \"×\" as the separator for consolidated items. Do not use \"/\", \"&\", or other symbols for this purpose.\r\n - Example: \"Jogging\" (List A) + \"Running\" (List B) -> \"Jogging × Running\" in BOTH listA and listB.\r\n - **NEVER DROP CONSOLIDATED ITEMS**: If you consolidate \"Jogging\" and \"Running\" into \"Jogging × Running\", you MUST put this string in **BOTH** List A and List B. Do NOT put it in List A and a spacer in List B. That would delete \"Running\" from the output.\r\n - **CRITICAL ERROR PREVENTION**: Do NOT drop items from List B. If \"Running\" is in Input List B, it MUST appear in Output List B (either as \"Running\" or \"Jogging × Running\"). If you output \"Jogging × Running\" in List A but \"-\" in List B, you have FAILED.\r\n - **COMPLETENESS CHECK**: You MUST verify that EVERY item from the input lists is present in the output. If \"Running\" is in Input List B, it MUST be in Output List B (or consolidated). DO NOT DROP ITEMS.\r\n - **DETERMINISM**: Process the list from top to bottom. Do not change your output between runs.\r\n - This allows the system to automatically move these items to the center display!\r\n\r\n NEGATIVE CONSTRAINTS:\r\n - NEVER put an item from List A into List B.\r\n - NEVER put an item from List B into List A.\r\n - NEVER invent new items. Only use items from the input lists.\r\n - **NEVER DUPLICATE ITEMS**. Each item from the input list must appear EXACTLY ONCE in the output.\r\n\r\n VERIFICATION STEP:\r\n Before outputting, verify every single item:\r\n - \"Is this item in Input List A?\" -> If yes, put it in Output List A.\r\n - \"Is this item in Input List B?\" -> If yes, put it in Output List B.\r\n - \"Is this item in neither?\" -> It is a hallucination. DELETE IT.\r\n\r\n CRITICAL: OUTPUT MUST CONTAIN EXACTLY THE SAME ITEMS AS INPUT. NO DELETIONS ALLOWED.\r\n\r\n FINAL SANITY CHECK:\r\n - **HALLUCINATION CHECK**: Go through every word in your Output List A. Is it EXACTLY present in Input List A? If not, DELETE IT. Do the same for List B.\r\n - **DUPLICATION CHECK**: Scan List A and List B. Does ANY word appear more than once? If so, DELETE the extra occurrences immediately. Each item must appear EXACTLY ONCE.\r\n - **COUNT CHECK**: Count the number of non-spacer items in your Output List A. Does it match the number of items in Input List A? If not, you are missing items. FIND THEM AND ADD THEM.\r\n - **COUNT CHECK**: Do the same for List B.\r\n - Look at your generated \"listA\". Are there any items that belong to Input List B? REMOVE THEM immediately.\r\n - Look at your generated \"listB\". Are there any items that belong to Input List A? REMOVE THEM immediately.\r\n - **Did you miss any items from Input List A? ADD THEM NOW.**\r\n - **Did you miss any items from Input List B? ADD THEM NOW.**\r\n - If you are unsure where an item belongs, check the Input Lists provided above. Do NOT guess.\r\n\r\n Example of Desired Output Logic:\r\n - \"Volunteering at animal shelter\" vs \"Dog training\" -> Related? Yes. Similarity >= 0.8? No (different activities)\r\n - NEXT PAIR: \"Trail biking\" vs \"Rock climbing\" -> Is this related to Animals? No. -> INSERT \"----\"\r\n - \"Trail biking\" vs \"Rock climbing\" -> Related? Yes (Outdoors).\r\n - NEXT PAIR: \"Jogging\" vs \"Running\" -> Similarity >= 0.8? YES! -> Output \"Jogging × Running\" in BOTH lists\r\n - \"Jogging\" vs \"Running\" -> Related? Yes (Exercise).\r\n - NEXT PAIR: \"Beach volleyball\" vs \"Salsa dancing\" -> Is this related to Exercise? Yes. -> INSERT \"-\" (Small hop)\r\n - \"Beach volleyball\" vs \"Salsa dancing\" -> Related? Yes (Hobbies). Similarity >= 0.8? No (different hobbies)\r\n - NEXT PAIR: \"Fermenting kimchi\" vs \"Korean cooking\" -> Is this related to Hobbies? No. -> INSERT \"----\"\r\n\r\n JSON Output Structure:\r\n {\r\n \"listA\": [\"Consolidated Item × Match\", \"----\", \"Unique Item A\", \"-\" , \"Unique Item A1\" , \"-\" , \"Unique Item A2\" ,\"----\" , \"Unique Item A3\", \"-\" , \"Unique Item A4 × Unique Item B4\" , \"----\" , Unique Item A5, \"----\" , Uniue Item A6 ],\r\n \"listB\": [\"Consolidated Item × Match\", \"----\", \"Unique Item B\", \"-\" , \"Unique Item B1\" , \"-\" , \"Unique Item B2\" ,\"----\" , \"Unique Item B3\", \"-\" , \"Unique Item A4 × Unique Item B4\" , \"----\" , Unique Item B5, \"----\" , - ]\r\n }\r\n Note: In this case, List A has more items, so the last remaining item is displayed as a single card.In other cases, List B may have more words, and in that situation, the extra word from List B is shown as a single card.\r\n Each unique item in List A has a corresponding unique item in List B that is highly similar in meaning or related in terms of concept.\r\n VARIATION & SIMILARITY CONTROL: Maintain strict consistency. If the same semantic relationship appears multiple times, align it identically every time.\r\n `;\r\n\r\n const body = {\r\n model: this.MODEL,\r\n messages: [\r\n { role: 'system', content: 'You are a helpful assistant that outputs strictly JSON.' },\r\n { role: 'user', content: prompt }\r\n ],\r\n response_format: { type: 'json_object' },\r\n temperature: 0.0, // Zero temperature for maximum determinism\r\n seed: 42 // Fixed seed for reproducibility\r\n };\r\n\r\n return this.http.post<IOpenAIResponse>(this.API_URL, body, { headers }).pipe(\r\n map(response => {\r\n try {\r\n const content = response.choices[0].message.content;\r\n const result = JSON.parse(content);\r\n \r\n // Handle both \"listA/listB\" format and \"alignment\" array format\r\n if (result.alignment && Array.isArray(result.alignment)) {\r\n result.listA = result.alignment.map((row: any) => row.left || row.itemA || '');\r\n result.listB = result.alignment.map((row: any) => row.right || row.itemB || '');\r\n }\r\n\r\n if (!result.listA || !result.listB || !Array.isArray(result.listA) || !Array.isArray(result.listB)) {\r\n console.error('Invalid JSON structure from OpenAI:', result);\r\n throw new Error('Invalid JSON structure from OpenAI');\r\n }\r\n\r\n // Just ensure equal length for safety in UI rendering\r\n const maxLen = Math.max(result.listA.length, result.listB.length);\r\n while (result.listA.length < maxLen) result.listA.push(OpenAIEmbeddingService.SPACER_SMALL);\r\n while (result.listB.length < maxLen) result.listB.push(OpenAIEmbeddingService.SPACER_SMALL);\r\n\r\n // Post-process to ensure consolidated items are in both lists\r\n // If one side has \"A × B\" and the other is a spacer, sync them to ensure center display\r\n for (let i = 0; i < result.listA.length; i++) {\r\n const a = result.listA[i];\r\n const b = result.listB[i];\r\n const isConsolidatedA = a && a.includes(' × ');\r\n const isConsolidatedB = b && b.includes(' × ');\r\n const isSpacerA = !a || a === OpenAIEmbeddingService.SPACER_SMALL || a === OpenAIEmbeddingService.SPACER_LARGE;\r\n const isSpacerB = !b || b === OpenAIEmbeddingService.SPACER_SMALL || b === OpenAIEmbeddingService.SPACER_LARGE;\r\n\r\n if (isConsolidatedA && isSpacerB) {\r\n result.listB[i] = a;\r\n } else if (isConsolidatedB && isSpacerA) {\r\n result.listA[i] = b;\r\n }\r\n }\r\n\r\n // SANITIZATION: Strictly enforce that items belong to their respective lists\r\n const sanitized = this.sanitizeResponse(result.listA, result.listB, validA, validB);\r\n\r\n const finalResult = { listA: sanitized.listA, listB: sanitized.listB };\r\n this.spacerAlignmentCache.set(key, finalResult);\r\n return finalResult;\r\n } catch (e) {\r\n console.error('Failed to parse OpenAI response', e);\r\n throw new Error('Failed to parse alignment result');\r\n }\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n console.error('OpenAI API Error:', error);\r\n return of({ listA: [], listB: [] });\r\n })\r\n );\r\n }\r\n\r\n private sanitizeResponse(\r\n outA: string[], \r\n outB: string[], \r\n inA: string[], \r\n inB: string[]\r\n ): { listA: string[], listB: string[] } {\r\n const cleanA: string[] = [];\r\n const cleanB: string[] = [];\r\n \r\n // Track used items to identify missing ones later\r\n const usedA = new Set<string>();\r\n const usedB = new Set<string>();\r\n \r\n // Helper to check if a string contains an item (exact or consolidated)\r\n const containsItem = (str: string, item: string) => {\r\n const s = str.toLowerCase();\r\n const i = item.toLowerCase();\r\n return s === i || s.includes(`× ${i}`) || s.includes(`${i} ×`) || s.includes(`/ ${i}`) || s.includes(`${i} /`);\r\n };\r\n\r\n for (let i = 0; i < outA.length; i++) {\r\n let itemA = outA[i];\r\n let itemB = outB[i];\r\n \r\n const isSpacerA = !itemA || itemA === OpenAIEmbeddingService.SPACER_SMALL || itemA === OpenAIEmbeddingService.SPACER_LARGE;\r\n const isSpacerB = !itemB || itemB === OpenAIEmbeddingService.SPACER_SMALL || itemB === OpenAIEmbeddingService.SPACER_LARGE;\r\n\r\n // Validate Item A\r\n let validItemA = itemA;\r\n if (!isSpacerA) {\r\n // Check if it belongs to Input A\r\n const originalA = inA.find(a => containsItem(itemA, a));\r\n if (originalA) {\r\n usedA.add(originalA);\r\n } else {\r\n // It's not in Input A. Is it in Input B?\r\n if (inB.some(b => containsItem(itemA, b))) {\r\n // Hallucination! It belongs to B but is in A.\r\n validItemA = OpenAIEmbeddingService.SPACER_SMALL; // Remove it\r\n } else {\r\n // Unknown item (maybe consolidated hallucination). Keep if it looks like a consolidated string, else remove\r\n if (!itemA.includes('×') && !itemA.includes('/')) {\r\n validItemA = OpenAIEmbeddingService.SPACER_SMALL;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Validate Item B\r\n let validItemB = itemB;\r\n if (!isSpacerB) {\r\n // Check if it belongs to Input B\r\n const originalB = inB.find(b => containsItem(itemB, b));\r\n if (originalB) {\r\n usedB.add(originalB);\r\n } else {\r\n // It's not in Input B. Is it in Input A?\r\n if (inA.some(a => containsItem(itemB, a))) {\r\n // Hallucination! It belongs to A but is in B.\r\n validItemB = OpenAIEmbeddingService.SPACER_SMALL; // Remove it\r\n } else {\r\n // Unknown item.\r\n if (!itemB.includes('×') && !itemB.includes('/')) {\r\n validItemB = OpenAIEmbeddingService.SPACER_SMALL;\r\n }\r\n }\r\n }\r\n }\r\n \r\n cleanA.push(validItemA);\r\n cleanB.push(validItemB);\r\n }\r\n\r\n // Restore Missing Items\r\n const missingA = inA.filter(a => !usedA.has(a));\r\n const missingB = inB.filter(b => !usedB.has(b));\r\n \r\n if (missingA.length > 0 || missingB.length > 0) {\r\n console.warn('Restoring missing items:', { missingA, missingB });\r\n \r\n // Add spacer to separate restored items\r\n if (cleanA.length > 0) {\r\n cleanA.push(OpenAIEmbeddingService.SPACER_LARGE);\r\n cleanB.push(OpenAIEmbeddingService.SPACER_LARGE);\r\n }\r\n \r\n // Append missing A items\r\n for (const a of missingA) {\r\n cleanA.push(a);\r\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\r\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL); // Spacer\r\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\r\n }\r\n \r\n // Append missing B items\r\n for (const b of missingB) {\r\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL);\r\n cleanB.push(b);\r\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL); // Spacer\r\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\r\n }\r\n }\r\n\r\n return { listA: cleanA, listB: cleanB };\r\n }\r\n\r\n /**\r\n * Get alignment between two lists using a single OpenAI Chat Completion request.\r\n * Uses canonical caching to ensure A->B and B->A use the same API response.\r\n */\r\n groupAlignLists(\r\n listA: string[],\r\n listB: string[],\r\n threshold: number = 0.25,\r\n preserveLeftOrder: boolean = true,\r\n exclusivityMargin: number = 0.06,\r\n leftCohesion: number = 0.23,\r\n apiKey: string\r\n ): Observable<IAlignmentRow[]> {\r\n \r\n // Filter valid items\r\n const validA = listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\r\n const validB = listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\r\n\r\n if (validA.length === 0 && validB.length === 0) return of([]);\r\n\r\n // Key for (A, B)\r\n const keyDirect = JSON.stringify({ a: validA, b: validB });\r\n // Key for (B, A) - assuming validB passed as first arg\r\n const keyReverse = JSON.stringify({ a: validB, b: validA });\r\n\r\n // Check direct match\r\n if (this.alignmentCache.has(keyDirect)) {\r\n console.log('Alignment cache hit (Direct)');\r\n return of(this.alignmentCache.get(keyDirect)!.rows);\r\n }\r\n\r\n // Check reverse match\r\n if (this.alignmentCache.has(keyReverse)) {\r\n console.log('Alignment cache hit (Reverse) - Swapping results');\r\n const cached = this.alignmentCache.get(keyReverse)!;\r\n // Swap left/right to match current request (A, B)\r\n const swappedRows = cached.rows.map(row => ({\r\n left: row.right,\r\n right: row.left,\r\n score: row.score\r\n }));\r\n return of(swappedRows);\r\n }\r\n\r\n // No cache hit - Make API Call\r\n const headers = new HttpHeaders({\r\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\r\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\r\n });\r\n\r\n // Construct the prompt\r\n const prompt = `\r\n You are an expert semantic alignment engine.\r\n Task: Align the items from List A to List B based on semantic similarity.\r\n \r\n List A: ${JSON.stringify(validA)}\r\n List B: ${JSON.stringify(validB)}\r\n\r\n Rules:\r\n 1. Match items that are semantically similar.\r\n 2. Support One-to-One, One-to-Many, and Many-to-Many matches.\r\n 3. **CRITICAL**: Avoid duplicate alignments. If multiple items in List B are highly similar to a single item in List A, group them ALL under that single List A item.\r\n 4. **CONSISTENCY**: The alignment must be symmetric. If \"Mutton\" matches \"Chicken\" when \"Mutton\" is on the left, it MUST also match \"Chicken\" when \"Mutton\" is on the right.\r\n 5. **ORDER**: You MUST reorder the items from BOTH lists to create the best semantic clusters. Place related groups next to each other (e.g., put all food items together, all tech items together).\r\n 6. If an item in List A has no match in List B, map it to \"-\".\r\n 7. If an item in List B is not matched to anything in List A, add a row with \"-\" on the left.\r\n 8. Output MUST be a JSON object with a single key \"alignment\" containing an array of objects.\r\n 9. Each object in the array must have:\r\n - \"left\": string (item from List A or \"-\")\r\n - \"right\": string (item from List B or \"-\")\r\n - \"score\": number (similarity score between 0 and 1)\r\n\r\n Example Output Format:\r\n {\r\n \"alignment\": [\r\n { \"left\": \"Seafood\", \"right\": \"Fish\", \"score\": 0.9 },\r\n { \"left\": \"Seafood\", \"right\": \"Clams\", \"score\": 0.85 },\r\n { \"left\": \"Seafood\", \"right\": \"Crab\", \"score\": 0.88 },\r\n { \"left\": \"Chicken\", \"right\": \"Meat\", \"score\": 0.8 },\r\n { \"left\": \"Chicken\", \"right\": \"Poultry\", \"score\": 0.9 },\r\n { \"left\": \"Chicken\", \"right\": \"Mutton\", \"score\": 0.85 },\r\n { \"left\": \"Coffee\", \"right\": \"Cafés\", \"score\": 0.9 },\r\n { \"left\": \"Coding\", \"right\": \"-\", \"score\": 0 }\r\n ]\r\n }\r\n `;\r\n\r\n const body = {\r\n model: this.MODEL,\r\n messages: [\r\n { role: 'system', content: 'You are a helpful assistant that outputs strictly JSON.' },\r\n { role: 'user', content: prompt }\r\n ],\r\n response_format: { type: 'json_object' },\r\n temperature: 0.2\r\n };\r\n\r\n console.log('Sending single alignment request to OpenAI...');\r\n\r\n return this.http.post<any>(this.API_URL, body, { headers }).pipe(\r\n map(response => {\r\n try {\r\n const content = response.choices[0].message.content;\r\n const result = JSON.parse(content);\r\n \r\n if (!result.alignment || !Array.isArray(result.alignment)) {\r\n throw new Error('Invalid JSON structure from OpenAI');\r\n }\r\n\r\n const rows: IAlignmentRow[] = result.alignment;\r\n \r\n // --- Post-Processing for Uniqueness, Grouping, Completeness, Reordering, and Validity ---\r\n\r\n // 0. Pre-process Input Lists: Deduplicate and Trim\r\n const validA = Array.from(new Set(listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL).map(i => i.trim())));\r\n const validB = Array.from(new Set(listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL).map(i => i.trim())));\r\n \r\n const validASet = new Set(validA);\r\n const validBSet = new Set(validB);\r\n\r\n // 0.1 Normalize Rows: Trim whitespace from AI response\r\n rows.forEach(row => {\r\n if (row.left) row.left = row.left.trim();\r\n if (row.right) row.right = row.right.trim();\r\n });\r\n\r\n // 0.2 Deduplicate Rows: Remove exact duplicate objects from AI response\r\n const uniqueRows = new Map<string, IAlignmentRow>();\r\n rows.forEach(row => {\r\n const key = `${row.left}|${row.right}`;\r\n if (!uniqueRows.has(key)) {\r\n uniqueRows.set(key, row);\r\n } else {\r\n // If duplicate exists, keep the one with higher score\r\n if (row.score > uniqueRows.get(key)!.score) {\r\n uniqueRows.set(key, row);\r\n }\r\n }\r\n });\r\n const dedupedRows = Array.from(uniqueRows.values());\r\n\r\n // 0.3 Hallucination Guard: Ensure all returned items actually exist in the input lists\r\n dedupedRows.forEach(row => {\r\n if (row.left !== '-' && !validASet.has(row.left)) {\r\n console.warn(`Hallucination detected: Left item '${row.left}' not in input list. Removing.`);\r\n row.left = '-';\r\n }\r\n if (row.right !== '-' && !validBSet.has(row.right)) {\r\n console.warn(`Hallucination detected: Right item '${row.right}' not in input list. Removing.`);\r\n row.right = '-';\r\n }\r\n });\r\n\r\n // 0.5 Exact Match Enforcer: If item exists in BOTH lists, force them to align\r\n const commonItems = validA.filter(a => validBSet.has(a));\r\n commonItems.forEach(item => {\r\n const exactRow = dedupedRows.find(r => r.left === item && r.right === item);\r\n if (exactRow) {\r\n exactRow.score = 1.0; \r\n } else {\r\n dedupedRows.forEach(r => {\r\n if (r.left === item) r.left = '-';\r\n if (r.right === item) r.right = '-';\r\n });\r\n dedupedRows.push({ left: item, right: item, score: 1.0 });\r\n }\r\n });\r\n\r\n // 1. Enforce Right-Side Uniqueness\r\n const rightItemBestMatch = new Map<string, { row: IAlignmentRow, index: number }>();\r\n dedupedRows.forEach((row, index) => {\r\n if (row.right && row.right !== '-') {\r\n if (!rightItemBestMatch.has(row.right)) {\r\n rightItemBestMatch.set(row.right, { row, index });\r\n } else {\r\n const currentBest = rightItemBestMatch.get(row.right)!;\r\n if (row.score > currentBest.row.score) {\r\n currentBest.row.right = '-';\r\n currentBest.row.score = 0;\r\n rightItemBestMatch.set(row.right, { row, index });\r\n } else {\r\n row.right = '-';\r\n row.score = 0;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // 2. Group rows by their 'left' value\r\n const groups = new Map<string, IAlignmentRow[]>();\r\n const unmatchedRightRows: IAlignmentRow[] = [];\r\n \r\n dedupedRows.forEach(row => {\r\n if (row.left === '-') {\r\n unmatchedRightRows.push(row);\r\n } else {\r\n if (!groups.has(row.left)) {\r\n groups.set(row.left, []);\r\n }\r\n groups.get(row.left)!.push(row);\r\n }\r\n });\r\n\r\n // 3. Reconstruct the list respecting AI ORDER\r\n const processedRows: IAlignmentRow[] = [];\r\n const processedLeftItems = new Set<string>();\r\n\r\n dedupedRows.forEach(row => {\r\n if (row.left !== '-' && !processedLeftItems.has(row.left)) {\r\n const itemRows = groups.get(row.left)!;\r\n itemRows.sort((a, b) => b.score - a.score);\r\n itemRows.forEach((r, idx) => {\r\n if (idx > 0) r.left = '-';\r\n processedRows.push(r);\r\n });\r\n processedLeftItems.add(row.left);\r\n }\r\n });\r\n\r\n // 4. Add missing Left items\r\n validA.forEach(item => {\r\n if (!processedLeftItems.has(item)) {\r\n processedRows.push({ left: item, right: '-', score: 0 });\r\n }\r\n });\r\n\r\n // 5. Add unmatched right rows and missing Right items\r\n const validUnmatched = unmatchedRightRows.filter(r => r.right !== '-');\r\n processedRows.push(...validUnmatched);\r\n\r\n const usedB = new Set(processedRows.map(r => r.right).filter(x => x !== '-'));\r\n validB.forEach(bItem => {\r\n if (!usedB.has(bItem)) {\r\n processedRows.push({ left: '-', right: bItem, score: 0 });\r\n }\r\n });\r\n \r\n const finalRows = processedRows.filter(r => r.left !== '-' || r.right !== '-');\r\n const cacheKey = `${keyDirect}_v2`;\r\n \r\n const uniqueFinalRows = new Map<string, IAlignmentRow>();\r\n const finalRowsClean: IAlignmentRow[] = [];\r\n const seenLeftGroups = new Set<string>();\r\n\r\n finalRows.forEach(row => {\r\n const key = `${row.left}|${row.right}`;\r\n if (uniqueFinalRows.has(key)) return;\r\n uniqueFinalRows.set(key, row);\r\n\r\n if (row.left !== '-') {\r\n if (seenLeftGroups.has(row.left)) {\r\n row.left = '-'; \r\n } else {\r\n seenLeftGroups.add(row.left);\r\n }\r\n }\r\n \r\n finalRowsClean.push(row);\r\n });\r\n\r\n this.alignmentCache.set(cacheKey, {\r\n originalA: validA,\r\n originalB: validB,\r\n rows: finalRowsClean\r\n });\r\n \r\n return finalRowsClean;\r\n } catch (e) {\r\n console.error('Failed to parse OpenAI response', e);\r\n throw new Error('Failed to parse alignment result');\r\n }\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n console.error('OpenAI API Error:', error);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Calculate semantic similarity between two texts using OpenAI Embeddings API.\r\n * Returns a cosine similarity score in [0, 1] (0 for empty/invalid inputs).\r\n */\r\n calculateSimilarity(textA: string, textB: string, apiKey: string): Observable<number> {\r\n const a = (textA || '').trim();\r\n const b = (textB || '').trim();\r\n if (!a.length || !b.length) {\r\n return of(0);\r\n }\r\n\r\n const headers = new HttpHeaders({\r\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\r\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\r\n });\r\n\r\n const EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';\r\n const body = {\r\n model: 'text-embedding-3-small',\r\n input: [a, b]\r\n };\r\n\r\n return this.http.post<any>(EMBEDDINGS_URL, body, { headers }).pipe(\r\n map(res => {\r\n const data = res?.data;\r\n if (!Array.isArray(data) || data.length < 2) {\r\n throw new Error('Invalid embeddings response from OpenAI');\r\n }\r\n const v1: number[] | undefined = data[0]?.embedding;\r\n const v2: number[] | undefined = data[1]?.embedding;\r\n if (!v1 || !v2) {\r\n throw new Error('Embeddings not present in OpenAI response');\r\n }\r\n return this.cosineSimilarityVectors(v1, v2);\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'OpenAI embeddings request failed';\r\n return throwError(() => new Error(msg));\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetch embeddings for multiple texts in a single request.\r\n */\r\n getEmbeddings(texts: string[], apiKey: string): Observable<number[][]> {\r\n if (!texts || texts.length === 0) return of([]);\r\n\r\n const headers = new HttpHeaders({\r\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\r\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\r\n });\r\n\r\n const EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';\r\n const body = {\r\n model: 'text-embedding-3-small',\r\n input: texts\r\n };\r\n\r\n return this.http.post<IOpenAIResponse>(EMBEDDINGS_URL, body, { headers }).pipe(\r\n map(res => {\r\n const data = res?.data;\r\n if (!Array.isArray(data)) {\r\n throw new Error('Invalid embeddings response from OpenAI');\r\n }\r\n return data.map((item: IOpenAIEmbeddingItem) => item.embedding);\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'OpenAI embeddings request failed';\r\n return throwError(() => new Error(msg));\r\n })\r\n );\r\n }\r\n\r\n // Private helpers\r\n private cosineSimilarityVectors(a: number[], b: number[]): number {\r\n let dot = 0;\r\n let na = 0;\r\n let nb = 0;\r\n const n = Math.min(a.length, b.length);\r\n for (let i = 0; i < n; i++) {\r\n const ai = a[i];\r\n const bi = b[i];\r\n dot += ai * bi;\r\n na += ai * ai;\r\n nb += bi * bi;\r\n }\r\n if (na === 0 || nb === 0) return 0;\r\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\r\n }\r\n\r\n\r\n clearCache(): void {\r\n this.alignmentCache.clear();\r\n this.spacerAlignmentCache.clear();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IComparisonResult, IProfileConfig } from '../interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ProfileComparisonLibService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Main service for profile comparison functionality\r\n */\r\n compareProfiles(profile1: IProfileConfig, profile2: IProfileConfig): IComparisonResult {\r\n // Placeholder implementation\r\n console.log('Comparing profiles:', profile1, profile2);\r\n return {\r\n similarity: 0.5,\r\n differences: [],\r\n timestamp: new Date()\r\n };\r\n }\r\n\r\n /**\r\n * Get library version\r\n */\r\n getVersion(): string {\r\n return '0.0.0';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, map, retryWhen, concatMap, timer, throwError } from 'rxjs';\r\nimport { IFaceDetectionResult, ISimilarityResponse, IFacePlusPlusResponse, IFacePlusPlusFace } from '../interfaces';\r\nimport type { IFaceBoxWithLandmarks, IFaceLandmarks } from '../interfaces/IFaceDetectionResult.interface';\r\n// Face++ credentials must be provided by the caller (do not import consumer app environments from the library).\r\n\r\nenum FacePlusPlusFormFields {\r\n API_KEY = 'api_key',\r\n API_SECRET = 'api_secret',\r\n IMAGE_BASE64 = 'image_base64',\r\n IMAGE_FILE = 'image_file',\r\n RETURN_LANDMARK = 'return_landmark'\r\n}\r\n\r\nenum FacePlusPlusErrorTypes {\r\n AUTHENTICATION_ERROR = 'authentication_error',\r\n AUTHORIZATION_ERROR = 'authorization_error',\r\n CONCURRENCY_LIMIT_EXCEEDED = 'concurrency_limit_exceeded',\r\n RATE = 'rate'\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ProfileService {\r\n private static readonly BASE_URL = 'https://api.api-ninjas.com/v1/';\r\n private static readonly FACE_PLUS_PLUS_URL = 'https://api-us.faceplusplus.com/facepp/v3/detect';\r\n\r\n private baseUrl = ProfileService.BASE_URL;\r\n private baseUrlf = ProfileService.FACE_PLUS_PLUS_URL;\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n compareInterests(\r\n text_1: string,\r\n text_2: string,\r\n apiKey: string\r\n ): Observable<ISimilarityResponse> {\r\n const headers = new HttpHeaders({\r\n 'X-Api-Key': apiKey,\r\n 'Content-Type': 'application/json',\r\n });\r\n return this.http.post<ISimilarityResponse>(\r\n `${this.baseUrl}textsimilarity`,\r\n { text_1, text_2 },\r\n { headers }\r\n );\r\n }\r\n\r\n detectFace(\r\n image: File | string,\r\n creds?: { apiKey?: string; apiSecret?: string }\r\n ): Observable<IFaceDetectionResult> {\r\n const formData = new FormData();\r\n\r\n // Use Face++ credentials from caller; the library must not depend on consumer application environments\r\n const apiKey = creds?.apiKey ?? '';\r\n const apiSecret = creds?.apiSecret ?? '';\r\n formData.append(FacePlusPlusFormFields.API_KEY, apiKey);\r\n formData.append(FacePlusPlusFormFields.API_SECRET, apiSecret);\r\n\r\n // Provide either image_file (binary) or image_base64\r\n if (typeof image === 'string') {\r\n const isDataUrl = image.startsWith('data:');\r\n const base64 = isDataUrl ? (image.split(',')[1] || '') : image;\r\n formData.append(FacePlusPlusFormFields.IMAGE_BASE64, base64);\r\n } else {\r\n formData.append(FacePlusPlusFormFields.IMAGE_FILE, image, image.name);\r\n }\r\n\r\n // Ask Face++ to return facial landmarks so eyes and nose can be positioned accurately\r\n formData.append(FacePlusPlusFormFields.RETURN_LANDMARK, '1');\r\n\r\n // Map Face++ response to IFaceDetectionResult shape\r\n return this.http.post<IFacePlusPlusResponse>(`${this.baseUrlf}`, formData).pipe(\r\n // Retry once after a short delay on Face++ rate-limit/security responses\r\n retryWhen((errors) =>\r\n errors.pipe(\r\n concatMap((error: HttpErrorResponse, i: number) => {\r\n const status = error?.status;\r\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\r\n if (shouldRetry) {\r\n // Wait 3 seconds before a single retry\r\n return timer(3000);\r\n }\r\n // Propagate other errors (or second failure) to the caller\r\n return throwError(() => error);\r\n })\r\n )\r\n ),\r\n map((raw: IFacePlusPlusResponse) => {\r\n // Face++ sometimes returns HTTP 200 with an error payload containing `error_message`\r\n // e.g. \"AUTHENTICATION_ERROR: api_key and api_secret does not match.\" or\r\n // \"AUTHORIZATION_ERROR:<reason>\" or \"CONCURRENCY_LIMIT_EXCEEDED\".\r\n const errorMessage: string | undefined = raw?.error_message;\r\n if (errorMessage && typeof errorMessage === 'string' && errorMessage.trim().length > 0) {\r\n const lower = errorMessage.toLowerCase();\r\n let status = 400;\r\n if (lower.includes(FacePlusPlusErrorTypes.AUTHENTICATION_ERROR)) status = 401;\r\n else if (lower.includes(FacePlusPlusErrorTypes.AUTHORIZATION_ERROR)) status = 403;\r\n else if (lower.includes(FacePlusPlusErrorTypes.CONCURRENCY_LIMIT_EXCEEDED) || lower.includes(FacePlusPlusErrorTypes.RATE)) status = 429;\r\n\r\n // Throw an error-like object so subscribers hit the error path and can show a modal\r\n throw { status, error: { message: errorMessage } };\r\n }\r\n\r\n const faces: IFaceBoxWithLandmarks[] = Array.isArray(raw?.faces)\r\n ? raw.faces\r\n .map((f: IFacePlusPlusFace) => {\r\n const rect = f?.face_rectangle || f?.faceRect || f?.rect;\r\n if (!rect || typeof rect.left !== 'number' || typeof rect.top !== 'number') {\r\n return null;\r\n }\r\n let landmarks: IFaceLandmarks | undefined = undefined;\r\n const lm = f?.landmark;\r\n if (lm && typeof lm === 'object') {\r\n landmarks = {};\r\n for (const key of Object.keys(lm)) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') {\r\n (landmarks as IFaceLandmarks)[key] = { x: pt.x, y: pt.y };\r\n }\r\n }\r\n }\r\n return {\r\n x: rect.left,\r\n y: rect.top,\r\n width: rect.width,\r\n height: rect.height,\r\n landmarks,\r\n } as IFaceBoxWithLandmarks;\r\n })\r\n .filter((v: IFaceBoxWithLandmarks | null): v is IFaceBoxWithLandmarks => !!v)\r\n : [];\r\n\r\n const imageUrl = typeof image === 'string' && image.startsWith('http') ? image : '';\r\n const result: IFaceDetectionResult = { imageUrl, faces };\r\n return result;\r\n })\r\n );\r\n }\r\n\r\n // Note: Face++ credentials and request fields are handled directly above.\r\n}\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n ElementRef,\r\n Renderer2,\r\n AfterViewInit,\r\n ViewChild,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n EventEmitter,\r\n} from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n IProfileConfig,\r\n IBoundingBox,\r\n IPoint,\r\n IFaceDetectionResult,\r\n IFaceBoxWithLandmarks,\r\n IFaceLandmarks,\r\n IAlignmentRow,\r\n FileInputEvent,\r\n FaceDetectionData,\r\n IImageCompressionConfig,\r\n IMatrixData\r\n} from './interfaces';\r\nimport { take, tap } from 'rxjs/operators';\r\nimport {\r\n ProfileService,\r\n OpenAIEmbeddingService,\r\n FileConversionService,\r\n ImageCompressionService\r\n} from './services';\r\nimport {\r\n forkJoin,\r\n map,\r\n Observable,\r\n of,\r\n switchMap,\r\n from,\r\n firstValueFrom,\r\n mergeMap,\r\n catchError,\r\n toArray,\r\n concatMap,\r\n Subscription,\r\n} from 'rxjs';\r\nimport { FormGroup, FormControl } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'lib-profile-comparison',\r\n templateUrl: './profile-comparison-lib.component.html',\r\n styleUrls: ['./profile-comparison-lib.component.scss'],\r\n standalone: false\r\n})\r\nexport class ProfileComparisonLibComponent implements OnInit, AfterViewInit, OnChanges {\r\n private static readonly DEFAULT_OBJECT_POSITION = '50% 50%';\r\n private static readonly DEFAULT_EYE_ALIGNMENT_BIAS_PX = 50;\r\n private static readonly DEFAULT_IMAGE_FORMAT = 'image/jpeg';\r\n private static readonly DEFAULT_IMAGE_QUALITY_START = 0.85;\r\n private static readonly DEFAULT_IMAGE_QUALITY_MIN = 0.5;\r\n private static readonly DEFAULT_IMAGE_QUALITY_STEP = 0.05;\r\n private static readonly DEFAULT_MAX_BYTES = 2 * 1024 * 1024;\r\n private static readonly DEFAULT_DOWNSCALE_STEP = 0.9;\r\n private static readonly DEFAULT_MIN_WIDTH = 400;\r\n private static readonly DEFAULT_MIN_HEIGHT = 400;\r\n private static readonly DEFAULT_MAX_WIDTH = 1600;\r\n private static readonly DEFAULT_MAX_HEIGHT = 1600;\r\n private static readonly SPACER_SMALL = '-';\r\n private static readonly SPACER_LARGE = '----';\r\n private static readonly CONSOLIDATION_SEPARATOR_X = '×';\r\n private static readonly CONSOLIDATION_SEPARATOR_SLASH = '/';\r\n private static readonly FACEPP_RATE_LIMIT_DELAY_MS = 5000;\r\n private static readonly DEFAULT_PROFILE_IMAGE_NAME = 'ProfilePg1.png';\r\n\r\n @Input() config: IProfileConfig = {\r\n person1Interests: [],\r\n person2Interests: [],\r\n person3Interests: [],\r\n user1Image: '',\r\n user2Image: '',\r\n };\r\n @Input() apiNinjasKey: string = '';\r\n @Input() faceplusKey: string = '';\r\n @Input() faceplusSecret: string = '';\r\n @Input() openaiApiKey: string = '';\r\n @Input() fadeAllEdges: boolean = false;\r\n @Output() matrixDataChange = new EventEmitter<IMatrixData>();\r\n\r\n selectedFile: File | null = null;\r\n result: unknown;\r\n firstImageData: FaceDetectionData | null = null;\r\n secondImageData: FaceDetectionData | null = null;\r\n\r\n user1Transform: string = '';\r\n user2Transform: string = '';\r\n alignmentCalculated: boolean = false;\r\n isAligning: boolean = false;\r\n\r\n user1ObjectPosition: string = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n user2ObjectPosition: string = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n\r\n private user1NaturalWidth = 0;\r\n private user1NaturalHeight = 0;\r\n private user2NaturalWidth = 0;\r\n private user2NaturalHeight = 0;\r\n\r\n private user1FaceRaw: IFaceBoxWithLandmarks | null = null;\r\n private user2FaceRaw: IFaceBoxWithLandmarks | null = null;\r\n\r\n private eyeAlignmentBiasPx: number = ProfileComparisonLibComponent.DEFAULT_EYE_ALIGNMENT_BIAS_PX;\r\n\r\n firstPersonInterests: string[] = [];\r\n secondPersonInterests: string[] = [];\r\n thirdPersonInterests: string[] = [];\r\n centerItem: string[] = [];\r\n\r\n person1Interests: string[] = [];\r\n person2Interests: string[] = [];\r\n person3Interests: string[] = [];\r\n user1Image: string = '';\r\n user2Image: string = '';\r\n\r\n private baseConfig: IProfileConfig = {\r\n person1Interests: [],\r\n person2Interests: [],\r\n person3Interests: [],\r\n user1Image: '',\r\n user2Image: '',\r\n };\r\n\r\n displayPerson1Interests: string[] = [];\r\n displayPerson2Interests: string[] = [];\r\n\r\n alignedPerson1Interests: string[] = [];\r\n alignedPerson2Interests: string[] = [];\r\n\r\n leftProfileClicked = false;\r\n rightProfileClicked = false;\r\n\r\n sortedA: { item: string; score: number }[] = [];\r\n sortedB: { item: string; score: number }[] = [];\r\n sortedC: { item: string; score: number }[] = [];\r\n\r\n similarity: number = 0;\r\n similarityMatrixCsv: string = '';\r\n matrixData: IMatrixData | null = null;\r\n\r\n customApiKey: string = '';\r\n showApiKeyModal: boolean = false;\r\n apiKeyInputValue: string = '';\r\n quotaExhausted: boolean = false;\r\n\r\n customFaceppKey: string = '';\r\n customFaceppSecret: string = '';\r\n showFaceppKeyModal: boolean = false;\r\n faceppKeyInputValue: string = '';\r\n faceppSecretInputValue: string = '';\r\n faceppQuotaExhausted: boolean = false;\r\n\r\n customOpenAIKey: string = '';\r\n showOpenAIKeyModal: boolean = false;\r\n openaiKeyInputValue: string = '';\r\n openaiQuotaExhausted: boolean = false;\r\n\r\n compressionConfig: IImageCompressionConfig = {\r\n maxWidth: ProfileComparisonLibComponent.DEFAULT_MAX_WIDTH,\r\n maxHeight: ProfileComparisonLibComponent.DEFAULT_MAX_HEIGHT,\r\n format: ProfileComparisonLibComponent.DEFAULT_IMAGE_FORMAT,\r\n qualityStart: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_START,\r\n qualityMin: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_MIN,\r\n qualityStep: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_STEP,\r\n maxBytes: ProfileComparisonLibComponent.DEFAULT_MAX_BYTES,\r\n downscaleStep: ProfileComparisonLibComponent.DEFAULT_DOWNSCALE_STEP,\r\n minWidth: ProfileComparisonLibComponent.DEFAULT_MIN_WIDTH,\r\n minHeight: ProfileComparisonLibComponent.DEFAULT_MIN_HEIGHT,\r\n };\r\n\r\n private computeSub?: Subscription;\r\n private detectFaceSub1?: Subscription;\r\n private detectFaceSub2?: Subscription;\r\n private activeRequestEpoch = 0;\r\n\r\n form = new FormGroup({\r\n interest1: new FormControl(''),\r\n interest2: new FormControl(''),\r\n });\r\n\r\n @ViewChild('leftContainer') leftContainer!: ElementRef;\r\n @ViewChild('rightContainer') rightContainer!: ElementRef;\r\n\r\n constructor(\r\n private profileService: ProfileService,\r\n private openaiEmbeddingService: OpenAIEmbeddingService,\r\n private renderer: Renderer2,\r\n private fileConversionService: FileConversionService,\r\n private imageCompressionService: ImageCompressionService\r\n ) {}\r\n\r\n anchorSide: 'left' | 'right' = 'left';\r\n\r\n ngOnInit(): void {\r\n this.baseConfig = JSON.parse(JSON.stringify(this.config));\r\n this.loadCustomConfig();\r\n this.updateConfigProperties();\r\n this.loadApiKeyFromStorage();\r\n this.loadFaceppCredsFromStorage();\r\n this.loadOpenAIKeyFromStorage();\r\n\r\n this.compute();\r\n this.compressConfigImagesIfNeeded().subscribe({\r\n next: () => this.initializeFaceDetection(),\r\n error: (e) => {\r\n console.warn('Config image compression failed, continuing:', e);\r\n this.initializeFaceDetection();\r\n }\r\n });\r\n\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.alignmentCalculated = false;\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.waitForImagesAndInitDrag();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateConfigProperties();\r\n }\r\n }\r\n\r\n private updateConfigProperties(): void {\r\n const normalized = this.buildConfigWithDefaults(\r\n this.config,\r\n this.baseConfig\r\n );\r\n this.config = normalized;\r\n\r\n this.person1Interests = [...normalized.person1Interests];\r\n this.person2Interests = [...normalized.person2Interests];\r\n this.user1Image = normalized.user1Image;\r\n this.user2Image = normalized.user2Image;\r\n }\r\n\r\n private buildConfigWithDefaults(\r\n cfg: Partial<IProfileConfig> | undefined,\r\n base: IProfileConfig\r\n ): IProfileConfig {\r\n const list = (val: unknown, fb: string[]): string[] => {\r\n if (Array.isArray(val)) {\r\n const cleaned = val\r\n .filter((s) => typeof s === 'string')\r\n .map((s: string) => s.trim())\r\n .filter((s: string) => s.length > 0 && s !== ProfileComparisonLibComponent.SPACER_SMALL);\r\n if (cleaned.length > 0) return cleaned;\r\n }\r\n return [...fb];\r\n };\r\n\r\n const str = (val: unknown, fb: string): string => {\r\n return typeof val === 'string' && val.trim().length > 0 ? val : fb;\r\n };\r\n\r\n const safe = cfg || ({} as Partial<IProfileConfig>);\r\n return {\r\n person1Interests: list(safe.person1Interests, base.person1Interests),\r\n person2Interests: list(safe.person2Interests, base.person2Interests),\r\n person3Interests: list(safe.person3Interests, base.person3Interests),\r\n user1Image: str(safe.user1Image, base.user1Image),\r\n user2Image: str(safe.user2Image, base.user2Image),\r\n } as IProfileConfig;\r\n }\r\n\r\n onUserImageLoad(which: 1 | 2, event: Event): void {\r\n const img = event?.target as HTMLImageElement | null;\r\n if (!img) return;\r\n if (which === 1) {\r\n this.user1NaturalWidth = img.naturalWidth || 0;\r\n this.user1NaturalHeight = img.naturalHeight || 0;\r\n this.updateObjectPositionForFace(1);\r\n if (this.firstImageData && this.secondImageData) {\r\n this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n }\r\n } else {\r\n this.user2NaturalWidth = img.naturalWidth || 0;\r\n this.user2NaturalHeight = img.naturalHeight || 0;\r\n this.updateObjectPositionForFace(2);\r\n if (this.firstImageData && this.secondImageData) {\r\n this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n }\r\n }\r\n }\r\n\r\n private updateObjectPositionForFace(which: 1 | 2): void {\r\n const face = which === 1 ? this.user1FaceRaw : this.user2FaceRaw;\r\n const natW = which === 1 ? this.user1NaturalWidth : this.user2NaturalWidth;\r\n const natH = which === 1 ? this.user1NaturalHeight : this.user2NaturalHeight;\r\n\r\n if (!face || !natW || !natH) {\r\n if (which === 1) this.user1ObjectPosition = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n else this.user2ObjectPosition = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n return;\r\n }\r\n\r\n const eyes = this.getEyeCoordinatesFromFace(face);\r\n const nose = this.getNoseCoordinateFromFace(face);\r\n const minX = Math.min(eyes.leftEye.x, eyes.rightEye.x, nose.x);\r\n const maxX = Math.max(eyes.leftEye.x, eyes.rightEye.x, nose.x);\r\n const roiCenterX = (minX + maxX) / 2;\r\n\r\n const { width: cw, height: ch } = this.getProfileContainerSize(which);\r\n if (!cw || !ch) {\r\n const clamped = Math.max(0, Math.min(natW, roiCenterX));\r\n let xPercentFallback = Math.round((clamped / natW) * 10000) / 100;\r\n const faceCenterX_fb = face.x + face.width / 2;\r\n const ratio_fb = faceCenterX_fb / natW;\r\n if (ratio_fb > 0.6) {\r\n const over = Math.min(0.4, ratio_fb - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n xPercentFallback = Math.max(0, Math.min(100, xPercentFallback + shiftPct));\r\n }\r\n const posFallback = `${xPercentFallback}% 50%`;\r\n if (which === 1) this.user1ObjectPosition = posFallback;\r\n else this.user2ObjectPosition = posFallback;\r\n return;\r\n }\r\n\r\n const scale = Math.max(cw / natW, ch / natH);\r\n const viewW = cw / scale;\r\n\r\n const paddingCssPx = 12;\r\n const overlapCssPx = this.getOverlapSizeCssPx();\r\n const fadeSafetyCssPx = 8;\r\n const fadeCssPx = overlapCssPx + paddingCssPx + fadeSafetyCssPx;\r\n const fadeInImgPx = fadeCssPx / scale;\r\n const edgeInImgPx = paddingCssPx / scale;\r\n\r\n let anchorX = roiCenterX;\r\n\r\n if (which === 1) {\r\n const minAnchorForRightEye = maxX - viewW / 2 + fadeInImgPx;\r\n const maxAnchorForLeftEye = minX + viewW / 2 - edgeInImgPx;\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n\r\n const faceCenterX = face.x + face.width / 2;\r\n const ratio = faceCenterX / natW;\r\n if (ratio > 0.6) {\r\n const over = Math.min(0.4, ratio - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n const shiftPx = (shiftPct / 100) * natW;\r\n anchorX += shiftPx;\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n }\r\n } else {\r\n const maxAnchorForLeftEye = minX + viewW / 2 - fadeInImgPx;\r\n const minAnchorForRightEye = maxX - viewW / 2 + edgeInImgPx;\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n\r\n const faceCenterX = face.x + face.width / 2;\r\n const ratio = faceCenterX / natW;\r\n if (ratio > 0.6) {\r\n const over = Math.min(0.4, ratio - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n const shiftPx = (shiftPct / 100) * natW;\r\n anchorX += shiftPx;\r\n }\r\n }\r\n\r\n const minAnchor = viewW / 2;\r\n const maxAnchor = natW - viewW / 2;\r\n anchorX = Math.max(minAnchor, Math.min(maxAnchor, anchorX));\r\n\r\n const viewLeft = anchorX - viewW / 2;\r\n const viewRight = anchorX + viewW / 2;\r\n const currentOverlap = this.getOverlapSizeCssPx();\r\n let desiredOverlap = currentOverlap;\r\n if (which === 1) {\r\n const distanceRightImg = Math.max(0, viewRight - maxX);\r\n const allowedCss = Math.max(10, distanceRightImg * scale - paddingCssPx);\r\n if (allowedCss < desiredOverlap) desiredOverlap = allowedCss;\r\n } else {\r\n const distanceLeftImg = Math.max(0, minX - viewLeft);\r\n const allowedCss = Math.max(10, distanceLeftImg * scale - paddingCssPx);\r\n if (allowedCss < desiredOverlap) desiredOverlap = allowedCss;\r\n }\r\n if (desiredOverlap < currentOverlap - 0.5) {\r\n this.setOverlapSizeCssPx(desiredOverlap);\r\n }\r\n\r\n const xPercent = Math.round((anchorX / natW) * 10000) / 100;\r\n const pos = `${xPercent}% 50%`;\r\n if (which === 1) this.user1ObjectPosition = pos;\r\n else this.user2ObjectPosition = pos;\r\n }\r\n\r\n private getProfileContainerSize(which: 1 | 2): { width: number; height: number } {\r\n try {\r\n const selector = which === 1 ? '.profile-img.left' : '.profile-img.right';\r\n const el = document.querySelector(selector) as HTMLElement | null;\r\n if (!el) return { width: 0, height: 0 };\r\n const rect = el.getBoundingClientRect();\r\n return { width: Math.round(rect.width), height: Math.round(rect.height) };\r\n } catch {\r\n return { width: 0, height: 0 };\r\n }\r\n }\r\n\r\n private getOverlapSizeCssPx(): number {\r\n try {\r\n const root = document.querySelector('.profile-flex') as HTMLElement | null;\r\n const fallback = 40;\r\n if (!root) return fallback;\r\n const val = getComputedStyle(root).getPropertyValue('--overlap-size').trim();\r\n const parsed = parseFloat(val);\r\n return isNaN(parsed) ? fallback : parsed;\r\n } catch {\r\n return 40;\r\n }\r\n }\r\n\r\n private setOverlapSizeCssPx(px: number): void {\r\n try {\r\n const root = document.querySelector('.profile-flex') as HTMLElement | null;\r\n if (!root) return;\r\n const clamped = Math.max(8, Math.min(80, Math.round(px)));\r\n root.style.setProperty('--overlap-size', `${clamped}px`);\r\n } catch {}\r\n }\r\n\r\n waitForImagesAndInitDrag() {\r\n const shapeBg1 = document.querySelector('img.shape-bg1') as HTMLImageElement;\r\n const shapeBg2 = document.querySelector('img.shape-bg2') as HTMLImageElement;\r\n\r\n if (!shapeBg1 || !shapeBg2) {\r\n setTimeout(() => this.waitForImagesAndInitDrag(), 100);\r\n return;\r\n }\r\n\r\n const checkImagesLoaded = () => {\r\n const img1Loaded = shapeBg1.complete && shapeBg1.naturalWidth > 0;\r\n const img2Loaded = shapeBg2.complete && shapeBg2.naturalWidth > 0;\r\n\r\n if (img1Loaded && img2Loaded) {\r\n setTimeout(() => this.initDrag(), 50);\r\n } else {\r\n setTimeout(checkImagesLoaded, 100);\r\n }\r\n };\r\n\r\n checkImagesLoaded();\r\n }\r\n\r\n initDrag() {\r\n const shapeBg1 = document.querySelector('img.shape-bg1') as HTMLElement;\r\n const shapeBg2 = document.querySelector('img.shape-bg2') as HTMLElement;\r\n const shapeTextLeft = document.querySelector('.shape-text-left') as HTMLElement;\r\n const shapeTextRight = document.querySelector('.shape-text-right') as HTMLElement;\r\n if (!shapeBg1 || !shapeBg2 || !shapeTextLeft || !shapeTextRight) return;\r\n\r\n shapeBg1.style.height = '350px';\r\n shapeBg1.style.objectFit = 'cover';\r\n shapeBg1.style.objectPosition = 'right';\r\n shapeBg2.style.height = '350px';\r\n shapeBg2.style.objectFit = 'cover';\r\n shapeBg2.style.objectPosition = 'left';\r\n\r\n const originalWidth1 = shapeBg1.offsetWidth;\r\n const originalWidth2 = shapeBg2.offsetWidth;\r\n\r\n const minWidth = 200;\r\n const maxWidth = 400;\r\n\r\n let isDragging = false;\r\n let dragStartX = 0;\r\n let initialWidth1 = 0;\r\n let initialWidth2 = 0;\r\n let activeImg: HTMLElement | null = null;\r\n\r\n const shapeTextCenter = document.querySelector('.shape-text-center') as HTMLElement;\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (!isDragging || !activeImg) return;\r\n\r\n const deltaX = e.clientX - dragStartX;\r\n const containerWidth = document.querySelector('.shape')?.clientWidth || 0;\r\n const centerPosition = containerWidth / 2;\r\n\r\n let newWidth1 = initialWidth1;\r\n let newWidth2 = initialWidth2;\r\n\r\n if (activeImg === shapeBg1) {\r\n newWidth1 = initialWidth1 + deltaX;\r\n newWidth2 = initialWidth2 - deltaX;\r\n } else if (activeImg === shapeBg2) {\r\n newWidth1 = initialWidth1 - deltaX;\r\n newWidth2 = initialWidth2 + deltaX;\r\n }\r\n\r\n newWidth1 = Math.max(minWidth, Math.min(maxWidth, newWidth1));\r\n newWidth2 = Math.max(minWidth, Math.min(maxWidth, newWidth2));\r\n\r\n shapeBg1.style.width = newWidth1 + 'px';\r\n shapeBg1.style.height = '350px';\r\n shapeBg2.style.width = newWidth2 + 'px';\r\n shapeBg2.style.height = '350px';\r\n\r\n const widthChange1 = newWidth1 - originalWidth1;\r\n const widthChange2 = newWidth2 - originalWidth2;\r\n\r\n const dragDirection = deltaX > 0 ? 1 : -1;\r\n const dragDistance = Math.abs(deltaX);\r\n const maxDragDistance = 100;\r\n const centerMoveDistance = Math.min(dragDistance, maxDragDistance) * dragDirection * 0.5;\r\n\r\n shapeTextLeft.style.transform = `translateX(${widthChange1 * 0.3}px)`;\r\n shapeTextRight.style.transform = `translateX(${-widthChange2 * 0.3}px)`;\r\n shapeTextCenter.style.transform = `translateX(${centerMoveDistance * 0.3}px)`;\r\n };\r\n\r\n const resetWidths = () => {\r\n isDragging = false;\r\n activeImg = null;\r\n\r\n shapeBg1.style.transition = 'width 0.3s ease';\r\n shapeBg2.style.transition = 'width 0.3s ease';\r\n shapeTextLeft.style.transition = 'transform 0.3s ease';\r\n shapeTextRight.style.transition = 'transform 0.3s ease';\r\n shapeTextCenter.style.transition = 'transform 0.3s ease';\r\n\r\n shapeBg1.style.width = originalWidth1 + 'px';\r\n shapeBg2.style.width = originalWidth2 + 'px';\r\n\r\n shapeTextLeft.style.transform = 'translateX(0px)';\r\n shapeTextRight.style.transform = 'translateX(0px)';\r\n shapeTextCenter.style.transform = 'translateX(0px)';\r\n\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', resetWidths);\r\n document.removeEventListener('mouseleave', resetWidths);\r\n\r\n setTimeout(() => {\r\n shapeBg1.style.transition = '';\r\n shapeBg2.style.transition = '';\r\n shapeTextLeft.style.transition = '';\r\n shapeTextRight.style.transition = '';\r\n shapeTextCenter.style.transition = '';\r\n }, 300);\r\n };\r\n\r\n [shapeBg1, shapeBg2].forEach((img) => {\r\n img.addEventListener('mousedown', (e: MouseEvent) => {\r\n e.preventDefault();\r\n isDragging = true;\r\n activeImg = img;\r\n dragStartX = e.clientX;\r\n initialWidth1 = shapeBg1.offsetWidth;\r\n initialWidth2 = shapeBg2.offsetWidth;\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', resetWidths);\r\n document.addEventListener('mouseleave', resetWidths);\r\n });\r\n });\r\n }\r\n\r\n compute() {\r\n if (this.computeSub) {\r\n this.computeSub.unsubscribe();\r\n this.computeSub = undefined;\r\n }\r\n\r\n const requestEpoch = this.activeRequestEpoch;\r\n this.centerItem = [];\r\n\r\n this.computeSub = forkJoin({\r\n a: this.sortByMaxSimilarity(this.person1Interests, [this.person2Interests, this.person3Interests]),\r\n b: this.sortByMaxSimilarity(this.person2Interests, [this.person1Interests, this.person3Interests]),\r\n c: this.sortByMaxSimilarity(this.person3Interests, [this.person1Interests, this.person2Interests]),\r\n }).subscribe((result) => {\r\n this.sortedA = result.a;\r\n this.sortedB = result.b;\r\n this.sortedC = result.c;\r\n\r\n this.displayPerson1Interests = result.a.map((item) => item.item);\r\n this.displayPerson2Interests = result.b.map((item) => item.item);\r\n\r\n this.isAligning = true;\r\n this.createEmbeddingBasedAlignment(result.a, result.b)\r\n .then(() => {\r\n this.isAligning = false;\r\n this.generateSimilarityMatrix();\r\n })\r\n .catch((error) => {\r\n console.warn('Embedding alignment failed, falling back to semantic:', error);\r\n this.createSemanticAlignment(result.a, result.b).then(() => {\r\n this.isAligning = false;\r\n this.generateSimilarityMatrix();\r\n });\r\n });\r\n });\r\n }\r\n\r\n async createSemanticAlignment(\r\n person1Results: { item: string; score: number }[],\r\n person2Results: { item: string; score: number }[]\r\n ) {\r\n this.alignedPerson1Interests = person1Results.map((item) => item.item);\r\n this.alignedPerson2Interests = person2Results.map((item) => item.item);\r\n\r\n const maxLength = Math.max(this.alignedPerson1Interests.length, this.alignedPerson2Interests.length);\r\n\r\n while (this.alignedPerson1Interests.length < maxLength) this.alignedPerson1Interests.push(ProfileComparisonLibComponent.SPACER_SMALL);\r\n while (this.alignedPerson2Interests.length < maxLength) this.alignedPerson2Interests.push(ProfileComparisonLibComponent.SPACER_SMALL);\r\n }\r\n\r\n async createEmbeddingBasedAlignment(\r\n person1Results: { item: string; score: number }[],\r\n person2Results: { item: string; score: number }[]\r\n ) {\r\n try {\r\n const baseLeft = this.person1Interests.filter(i => !!i && i.trim() !== ProfileComparisonLibComponent.SPACER_SMALL && i.trim().length > 0 && !this.centerItem.includes(i));\r\n const baseRight = this.person2Interests.filter(i => !!i && i.trim() !== ProfileComparisonLibComponent.SPACER_SMALL && i.trim().length > 0 && !this.centerItem.includes(i));\r\n\r\n this.openaiEmbeddingService\r\n .getAlignedLists(baseLeft, baseRight, this.getActiveOpenAIKey())\r\n .subscribe({\r\n next: (result) => {\r\n if (result) {\r\n let listA = result.listA;\r\n let listB = result.listB;\r\n \r\n const minLength = Math.min(listA.length, listB.length);\r\n for (let i = 0; i < minLength; i++) {\r\n const itemA = listA[i];\r\n const itemB = listB[i];\r\n \r\n if (!itemA || !itemB || itemA === ProfileComparisonLibComponent.SPACER_SMALL || itemA === ProfileComparisonLibComponent.SPACER_LARGE || itemB === ProfileComparisonLibComponent.SPACER_SMALL || itemB === ProfileComparisonLibComponent.SPACER_LARGE) continue;\r\n \r\n const normA = itemA.trim().toLowerCase();\r\n const normB = itemB.trim().toLowerCase();\r\n let isMatch = normA === normB;\r\n \r\n if (!isMatch && (normA.includes(ProfileComparisonLibComponent.CONSOLIDATION_SEPARATOR_X) || normA.includes(ProfileComparisonLibComponent.CONSOLIDATION_SEPARATOR_SLASH)) && (normB.includes(ProfileComparisonLibComponent.CONSOLIDATION_SEPARATOR_X) || normB.includes(ProfileComparisonLibComponent.CONSOLIDATION_SEPARATOR_SLASH))) {\r\n const separatorRegex = new RegExp(`[${ProfileComparisonLibComponent.CONSOLIDATION_SEPARATOR_X}${ProfileComparisonLibComponent.CONSOLIDATION_SEPARATOR_SLASH}]`);\r\n const partsA = normA.split(separatorRegex).map(p => p.trim()).sort();\r\n const partsB = normB.split(separatorRegex).map(p => p.trim()).sort();\r\n if (partsA.length === partsB.length && partsA.every((val, index) => val === partsB[index])) isMatch = true;\r\n }\r\n\r\n if (isMatch) {\r\n const existing = this.centerItem.find(item => item.trim().toLowerCase() === normA);\r\n if (!existing) this.centerItem.push(itemA);\r\n listA[i] = ProfileComparisonLibComponent.SPACER_SMALL;\r\n listB[i] = ProfileComparisonLibComponent.SPACER_SMALL;\r\n }\r\n }\r\n \r\n const cleanListA: string[] = [];\r\n const cleanListB: string[] = [];\r\n \r\n for (let i = 0; i < listA.length; i++) {\r\n const itemA = listA[i];\r\n const itemB = listB[i];\r\n const isSpacerRow = (!itemA || itemA === ProfileComparisonLibComponent.SPACER_SMALL || itemA === ProfileComparisonLibComponent.SPACER_LARGE) && (!itemB || itemB === ProfileComparisonLibComponent.SPACER_SMALL || itemB === ProfileComparisonLibComponent.SPACER_LARGE);\r\n \r\n if (isSpacerRow) {\r\n const lastIndex = cleanListA.length - 1;\r\n if (lastIndex >= 0) {\r\n const lastA = cleanListA[lastIndex];\r\n const lastB = cleanListB[lastIndex];\r\n const lastWasSpacer = (!lastA || lastA === ProfileComparisonLibComponent.SPACER_SMALL || lastA === ProfileComparisonLibComponent.SPACER_LARGE) && (!lastB || lastB === ProfileComparisonLibComponent.SPACER_SMALL || lastB === ProfileComparisonLibComponent.SPACER_LARGE);\r\n if (lastWasSpacer) {\r\n if (itemA === ProfileComparisonLibComponent.SPACER_LARGE || itemB === ProfileComparisonLibComponent.SPACER_LARGE || lastA === ProfileComparisonLibComponent.SPACER_LARGE || lastB === ProfileComparisonLibComponent.SPACER_LARGE) {\r\n cleanListA[lastIndex] = ProfileComparisonLibComponent.SPACER_LARGE;\r\n cleanListB[lastIndex] = ProfileComparisonLibComponent.SPACER_LARGE;\r\n }\r\n continue;\r\n }\r\n }\r\n }\r\n cleanListA.push(itemA);\r\n cleanListB.push(itemB);\r\n }\r\n \r\n if (cleanListA.length > 0) {\r\n const firstA = cleanListA[0];\r\n const firstB = cleanListB[0];\r\n if ((!firstA || firstA === ProfileComparisonLibComponent.SPACER_SMALL || firstA === ProfileComparisonLibComponent.SPACER_LARGE) && (!firstB || firstB === ProfileComparisonLibComponent.SPACER_SMALL || firstB === ProfileComparisonLibComponent.SPACER_LARGE)) {\r\n cleanListA.shift();\r\n cleanListB.shift();\r\n }\r\n }\r\n \r\n if (cleanListA.length > 0) {\r\n const lastIndex = cleanListA.length - 1;\r\n const lastA = cleanListA[lastIndex];\r\n const lastB = cleanListB[lastIndex];\r\n if ((!lastA || lastA === ProfileComparisonLibComponent.SPACER_SMALL || lastA === ProfileComparisonLibComponent.SPACER_LARGE) && (!lastB || lastB === ProfileComparisonLibComponent.SPACER_SMALL || lastB === ProfileComparisonLibComponent.SPACER_LARGE)) {\r\n cleanListA.pop();\r\n cleanListB.pop();\r\n }\r\n }\r\n \r\n this.alignedPerson1Interests = cleanListA;\r\n this.alignedPerson2Interests = cleanListB;\r\n } else {\r\n this.createSemanticAlignment(person1Results, person2Results);\r\n }\r\n },\r\n error: (error) => {\r\n this.createSemanticAlignment(person1Results, person2Results);\r\n }\r\n });\r\n } catch (error) {\r\n // Catch block for baseLeft/baseRight filtering errors\r\n this.createSemanticAlignment(person1Results, person2Results);\r\n }\r\n }\r\n\r\n sortByMaxSimilarity(personList: string[], otherLists: string[][]): Observable<{ item: string; score: number }[]> {\r\n const requestEpoch = this.activeRequestEpoch;\r\n const others = otherLists.flat().filter(o => !!o && o.trim() !== ProfileComparisonLibComponent.SPACER_SMALL && o.trim().length > 0);\r\n const validPersonList = personList.filter(i => !!i && i.trim() !== ProfileComparisonLibComponent.SPACER_SMALL && i.trim().length > 0);\r\n const CONCURRENCY = 4;\r\n\r\n return from(validPersonList).pipe(\r\n concatMap((item) =>\r\n from(others).pipe(\r\n mergeMap((o) =>\r\n this.profileService.compareInterests(item, o, this.getActiveApiKey()).pipe(\r\n map((res: { similarity: number }) => res.similarity),\r\n catchError((error: unknown) => {\r\n if (requestEpoch === this.activeRequestEpoch) this.handleApiQuotaError(error as HttpErrorResponse);\r\n return of(0);\r\n })\r\n ),\r\n CONCURRENCY\r\n ),\r\n toArray(),\r\n map((scores) => {\r\n const maxScore = scores.length ? Math.max(...scores) : 0;\r\n const itemNorm = item.trim().toLowerCase();\r\n const hasExact = others.some(o => o && o.trim().toLowerCase() === itemNorm);\r\n if (hasExact) {\r\n const existing = this.centerItem.find(i => i.trim().toLowerCase() === itemNorm);\r\n if (!existing) this.centerItem.push(item);\r\n }\r\n return { item, score: maxScore };\r\n })\r\n )\r\n ),\r\n toArray(),\r\n map((results) => results.sort((a, b) => b.score - a.score))\r\n );\r\n }\r\n\r\n onViewProfile() {\r\n alert('You have been routed to a profile page ');\r\n }\r\n\r\n getActiveApiKey(): string {\r\n return this.customApiKey || this.apiNinjasKey;\r\n }\r\n\r\n updateApiKey(): void {\r\n if (this.apiKeyInputValue.trim()) {\r\n this.customApiKey = this.apiKeyInputValue.trim();\r\n this.saveApiKeyToStorage(this.customApiKey);\r\n this.showApiKeyModal = false;\r\n this.quotaExhausted = false;\r\n this.activeRequestEpoch++;\r\n this.compute();\r\n this.initializeFaceDetection();\r\n }\r\n }\r\n\r\n closeApiKeyModal(): void {\r\n this.showApiKeyModal = false;\r\n }\r\n\r\n handleApiQuotaError(error: HttpErrorResponse | { status?: number; error?: { message?: string } }): void {\r\n if (error?.status === 400 || error?.status === 429 || error?.status === 403 || error?.error?.message?.toLowerCase().includes('quota')) {\r\n this.quotaExhausted = true;\r\n this.showApiKeyModal = true;\r\n }\r\n }\r\n\r\n private saveApiKeyToStorage(apiKey: string): void {\r\n try { localStorage.setItem('apiNinjasCustomKey', apiKey); } catch {}\r\n }\r\n\r\n private loadApiKeyFromStorage(): void {\r\n try {\r\n const savedKey = localStorage.getItem('apiNinjasCustomKey');\r\n if (savedKey) {\r\n this.customApiKey = savedKey;\r\n this.apiKeyInputValue = savedKey;\r\n }\r\n } catch {}\r\n }\r\n\r\n onFileInputChange(event: FileInputEvent): void {\r\n const files = event.target.files;\r\n this.selectedFile = files && files.length > 0 ? files[0] : null;\r\n }\r\n\r\n private compressConfigImagesIfNeeded(): Observable<void> {\r\n const tasks: Observable<void>[] = [];\r\n if (this.user1Image) {\r\n tasks.push(\r\n this.compressImageStringToDataUrl(this.user1Image, 'ConfigUser1').pipe(\r\n tap((dataUrl: string | null) => { if (dataUrl) this.user1Image = dataUrl; }),\r\n map(() => void 0)\r\n )\r\n );\r\n }\r\n if (this.user2Image) {\r\n tasks.push(\r\n this.compressImageStringToDataUrl(this.user2Image, 'ConfigUser2').pipe(\r\n tap((dataUrl: string | null) => { if (dataUrl) this.user2Image = dataUrl; }),\r\n map(() => void 0)\r\n )\r\n );\r\n }\r\n return tasks.length > 0 ? forkJoin(tasks).pipe(map(() => void 0)) : of(void 0);\r\n }\r\n\r\n private compressImageStringToDataUrl(imageStr: string, baseName: string): Observable<string | null> {\r\n return this.fileConversionService.getFileForImageString(imageStr, `${baseName}.jpg`).pipe(\r\n switchMap(file => this.imageCompressionService.compressImageFile(file, this.compressionConfig)),\r\n map(res => res.dataUrl),\r\n catchError(() => of(null))\r\n );\r\n }\r\n\r\n private loadCustomConfig(): void {\r\n try {\r\n const raw = localStorage.getItem('customProfileConfig');\r\n if (!raw) { this.config = this.baseConfig || this.config; return; }\r\n const parsed = JSON.parse(raw);\r\n this.config = this.buildConfigWithDefaults(parsed as Partial<IProfileConfig>, this.baseConfig);\r\n } catch { this.config = this.baseConfig || this.config; }\r\n }\r\n\r\n getEyeCoordinatesFromBBox(bbox: IBoundingBox): { leftEye: IPoint; rightEye: IPoint } {\r\n const eyeY = bbox.y + bbox.height * 0.38;\r\n const leftEyeX = bbox.x + bbox.width * 0.32;\r\n const rightEyeX = bbox.x + bbox.width * 0.68;\r\n return { leftEye: { x: leftEyeX, y: eyeY }, rightEye: { x: rightEyeX, y: eyeY } };\r\n }\r\n\r\n getEyeCoordinatesFromFace(face: IFaceBoxWithLandmarks): { leftEye: IPoint; rightEye: IPoint } {\r\n const lm: IFaceLandmarks | undefined = (face && face.landmarks) || undefined;\r\n const pick = (candidates: string[]): IPoint | undefined => {\r\n if (!lm) return undefined;\r\n for (const key of candidates) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') return this.clampPointToFaceRect({ x: pt.x, y: pt.y }, face);\r\n }\r\n return undefined;\r\n };\r\n const left = pick(['left_eye_pupil', 'left_eye_center', 'eye_left_pupil', 'left_eye']) || this.getEyeCoordinatesFromBBox(face).leftEye;\r\n const right = pick(['right_eye_pupil', 'right_eye_center', 'eye_right_pupil', 'right_eye']) || this.getEyeCoordinatesFromBBox(face).rightEye;\r\n return { leftEye: left, rightEye: right };\r\n }\r\n\r\n getNoseCoordinateFromFace(face: IFaceBoxWithLandmarks): IPoint {\r\n const lm: IFaceLandmarks | undefined = (face && face.landmarks) || undefined;\r\n const pick = (candidates: string[]): IPoint | undefined => {\r\n if (!lm) return undefined;\r\n for (const key of candidates) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') return this.clampPointToFaceRect({ x: pt.x, y: pt.y }, face);\r\n }\r\n return undefined;\r\n };\r\n const nose = pick(['nose_tip', 'nose', 'nose_middle', 'nose_bridge1']);\r\n if (nose) return nose;\r\n return this.getNoseCoordinateFromBBox(face as unknown as IBoundingBox);\r\n }\r\n\r\n private clampPointToFaceRect(p: IPoint, box: IBoundingBox): IPoint {\r\n const x = Math.max(box.x, Math.min(box.x + box.width, p.x));\r\n const y = Math.max(box.y, Math.min(box.y + box.height, p.y));\r\n return { x, y };\r\n }\r\n\r\n getNoseCoordinateFromBBox(bbox: IBoundingBox): IPoint {\r\n return { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height * 0.58 };\r\n }\r\n\r\n getFaceCoordinatesFromBBox(bbox: IBoundingBox): { faceCenter: IPoint; faceTop: IPoint; faceBottom: IPoint; faceLeft: IPoint; faceRight: IPoint } {\r\n return {\r\n faceCenter: { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 2 },\r\n faceTop: { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 4 },\r\n faceBottom: { x: bbox.x + bbox.width / 2, y: bbox.y + (3 * bbox.height) / 4 },\r\n faceLeft: { x: bbox.x + bbox.width / 4, y: bbox.y + bbox.height / 2 },\r\n faceRight: { x: bbox.x + (3 * bbox.width) / 4, y: bbox.y + bbox.height / 2 },\r\n };\r\n }\r\n\r\n initializeFaceDetection(): void {\r\n if (this.detectFaceSub1) this.detectFaceSub1.unsubscribe();\r\n if (this.detectFaceSub2) this.detectFaceSub2.unsubscribe();\r\n let user1FaceData: FaceDetectionData | null = null;\r\n let user2FaceData: FaceDetectionData | null = null;\r\n const shouldDelayUser2 = !!this.user1Image && !!this.user2Image;\r\n const FACEPP_RATE_LIMIT_DELAY_MS = ProfileComparisonLibComponent.FACEPP_RATE_LIMIT_DELAY_MS;\r\n\r\n if (this.user1Image) {\r\n this.fileConversionService.getFileForImageString(this.user1Image, ProfileComparisonLibComponent.DEFAULT_PROFILE_IMAGE_NAME).subscribe((file) => {\r\n this.detectFaceSub1 = this.profileService.detectFace(file, { apiKey: this.getActiveFaceppKey(), apiSecret: this.getActiveFaceppSecret() }).subscribe({\r\n next: (res) => {\r\n this.firstImageData = res; user1FaceData = res;\r\n try {\r\n const faces = (res as IFaceDetectionResult)?.faces || [];\r\n this.user1FaceRaw = Array.isArray(faces) && faces.length > 0 ? faces[0] : null;\r\n this.updateObjectPositionForFace(1);\r\n } catch {}\r\n if (user1FaceData && user2FaceData) this.calculateFaceAlignment(user1FaceData, user2FaceData);\r\n },\r\n error: (err) => this.handleFaceppError(err),\r\n });\r\n });\r\n }\r\n\r\n if (this.user2Image) {\r\n this.fileConversionService.getFileForImageString(this.user2Image, 'ProfilePg2.png').subscribe((file) => {\r\n const startUser2Detect = () => {\r\n this.detectFaceSub2 = this.profileService.detectFace(file, { apiKey: this.getActiveFaceppKey(), apiSecret: this.getActiveFaceppSecret() }).subscribe({\r\n next: (res) => {\r\n this.secondImageData = res; user2FaceData = res;\r\n try {\r\n const faces = (res as IFaceDetectionResult)?.faces || [];\r\n this.user2FaceRaw = Array.isArray(faces) && faces.length > 0 ? faces[0] : null;\r\n this.updateObjectPositionForFace(2);\r\n } catch {}\r\n if (user1FaceData && user2FaceData) this.calculateFaceAlignment(user1FaceData, user2FaceData);\r\n },\r\n error: (err) => this.handleFaceppError(err),\r\n });\r\n };\r\n if (shouldDelayUser2) setTimeout(startUser2Detect, FACEPP_RATE_LIMIT_DELAY_MS);\r\n else startUser2Detect();\r\n });\r\n }\r\n }\r\n\r\n calculateFaceAlignment(user1Data: FaceDetectionData, user2Data: FaceDetectionData): void {\r\n let faces1: IFaceBoxWithLandmarks[] = [];\r\n let faces2: IFaceBoxWithLandmarks[] = [];\r\n \r\n const getFaces = (data: FaceDetectionData): IFaceBoxWithLandmarks[] => {\r\n if (Array.isArray(data)) return data;\r\n if (data && typeof data === 'object' && 'faces' in data && Array.isArray(data.faces)) return data.faces;\r\n return [];\r\n };\r\n\r\n faces1 = getFaces(user1Data);\r\n faces2 = getFaces(user2Data);\r\n\r\n if (!faces1?.length || !faces2?.length) { this.applyDefaultAlignment(); return; }\r\n const face1 = faces1[0]; const face2 = faces2[0];\r\n if (!this.isValidFaceData(face1) || !this.isValidFaceData(face2)) { this.applyDefaultAlignment(); return; }\r\n\r\n const user1FaceCoords = this.getFaceCoordinatesFromBBox(face1);\r\n const user2FaceCoords = this.getFaceCoordinatesFromBBox(face2);\r\n const user1Eyes = this.getEyeCoordinatesFromFace(face1);\r\n const user2Eyes = this.getEyeCoordinatesFromFace(face2);\r\n\r\n const leftContainerEl = document.querySelector('.profile-img.left') as HTMLElement | null;\r\n const rightContainerEl = document.querySelector('.profile-img.right') as HTMLElement | null;\r\n const containerWidth1 = leftContainerEl?.clientWidth || 160;\r\n const containerHeight1 = leftContainerEl?.clientHeight || 550;\r\n const containerWidth2 = rightContainerEl?.clientWidth || 160;\r\n const containerHeight2 = rightContainerEl?.clientHeight || 550;\r\n\r\n const scale1 = this.user1NaturalWidth ? Math.max(containerWidth1 / this.user1NaturalWidth, containerHeight1 / this.user1NaturalHeight) : 1;\r\n const scale2 = this.user2NaturalWidth ? Math.max(containerWidth2 / this.user2NaturalWidth, containerHeight2 / this.user2NaturalHeight) : 1;\r\n\r\n const displayedFaceHeight1 = face1.height * scale1;\r\n const displayedFaceHeight2 = face2.height * scale2;\r\n const ratio1 = containerHeight1 ? displayedFaceHeight1 / containerHeight1 : 0;\r\n const ratio2 = containerHeight2 ? displayedFaceHeight2 / containerHeight2 : 0;\r\n\r\n let finalScale1 = ratio1 > 0 && ratio1 < 0.22 ? Math.min(3, 0.32 / ratio1) : 1;\r\n let finalScale2 = ratio2 > 0 && ratio2 < 0.22 ? Math.min(3, 0.32 / ratio2) : 1;\r\n\r\n const effRatio1 = ratio1 * finalScale1;\r\n const effRatio2 = ratio2 * finalScale2;\r\n if (effRatio1 > effRatio2 * 1.35) finalScale1 = Math.max(0.95, finalScale1 * (effRatio2 / effRatio1));\r\n else if (effRatio2 > effRatio1 * 1.35) finalScale2 = Math.max(0.95, finalScale2 * (effRatio1 / effRatio2));\r\n\r\n const nose1 = this.getNoseCoordinateFromFace(face1);\r\n const nose2 = this.getNoseCoordinateFromFace(face2);\r\n const anchor1Y = (Math.min(user1Eyes.leftEye.y, user1Eyes.rightEye.y) + nose1.y) / 2;\r\n const anchor2Y = (Math.min(user2Eyes.leftEye.y, user2Eyes.rightEye.y) + nose2.y) / 2;\r\n\r\n const tCenter1 = this.user1NaturalHeight ? -((anchor1Y - this.user1NaturalHeight / 2) * scale1 * finalScale1) : 0;\r\n const tCenter2 = this.user2NaturalHeight ? -((anchor2Y - this.user2NaturalHeight / 2) * scale2 * finalScale2) : 0;\r\n\r\n this.user1Transform = `translateY(${tCenter1 - this.eyeAlignmentBiasPx}px) scale(${finalScale1})`;\r\n this.user2Transform = `translateY(${tCenter2 - this.eyeAlignmentBiasPx}px) scale(${finalScale2})`;\r\n this.alignmentCalculated = true;\r\n }\r\n\r\n applyDefaultAlignment() {\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.alignmentCalculated = true;\r\n }\r\n\r\n isValidFaceData(face: IBoundingBox): boolean {\r\n return !!face && typeof face.x === 'number' && face.width > 0 && face.height > 0;\r\n }\r\n\r\n getActiveFaceppKey(): string { return this.customFaceppKey || this.faceplusKey; }\r\n getActiveFaceppSecret(): string { return this.customFaceppSecret || this.faceplusSecret; }\r\n\r\n updateFaceppCredentials(): void {\r\n const newKey = (this.faceppKeyInputValue || '').trim();\r\n const newSecret = (this.faceppSecretInputValue || '').trim();\r\n if (!newKey || !newSecret) return;\r\n if (this.detectFaceSub1) this.detectFaceSub1.unsubscribe();\r\n if (this.detectFaceSub2) this.detectFaceSub2.unsubscribe();\r\n this.customFaceppKey = newKey; this.customFaceppSecret = newSecret;\r\n this.saveFaceppCredsToStorage(newKey, newSecret);\r\n this.showFaceppKeyModal = false; this.faceppQuotaExhausted = false;\r\n this.activeRequestEpoch++; this.initializeFaceDetection();\r\n }\r\n\r\n closeFaceppKeyModal(): void { this.showFaceppKeyModal = false; }\r\n\r\n handleFaceppError(error: HttpErrorResponse | { status?: number; error?: { message?: string } }): void {\r\n this.faceppQuotaExhausted = true;\r\n this.showFaceppKeyModal = true;\r\n }\r\n\r\n private saveFaceppCredsToStorage(apiKey: string, apiSecret: string): void {\r\n try { localStorage.setItem('faceppApiKey', apiKey); localStorage.setItem('faceppApiSecret', apiSecret); } catch {}\r\n }\r\n\r\n private loadFaceppCredsFromStorage(): void {\r\n try {\r\n const key = localStorage.getItem('faceppApiKey');\r\n const secret = localStorage.getItem('faceppApiSecret');\r\n if (key) { this.customFaceppKey = key; this.faceppKeyInputValue = key; }\r\n if (secret) { this.customFaceppSecret = secret; this.faceppSecretInputValue = secret; }\r\n } catch {}\r\n }\r\n\r\n private getActiveOpenAIKey(): string { return this.customOpenAIKey || this.openaiApiKey; }\r\n\r\n updateOpenAIKey(): void {\r\n if (this.openaiKeyInputValue.trim()) {\r\n this.customOpenAIKey = this.openaiKeyInputValue.trim();\r\n this.saveOpenAIKeyToStorage(this.customOpenAIKey);\r\n this.showOpenAIKeyModal = false;\r\n this.openaiQuotaExhausted = false;\r\n this.openaiEmbeddingService.clearCache();\r\n this.compute();\r\n }\r\n }\r\n\r\n closeOpenAIKeyModal(): void { this.showOpenAIKeyModal = false; }\r\n\r\n private saveOpenAIKeyToStorage(apiKey: string): void {\r\n try { localStorage.setItem('openaiCustomKey', apiKey); } catch {}\r\n }\r\n\r\n private loadOpenAIKeyFromStorage(): void {\r\n try {\r\n const savedKey = localStorage.getItem('openaiCustomKey');\r\n if (savedKey) { this.customOpenAIKey = savedKey; this.openaiKeyInputValue = savedKey; }\r\n } catch {}\r\n }\r\n\r\n private async generateSimilarityMatrix() {\r\n const allInterests = Array.from(new Set([...this.person1Interests, ...this.person2Interests])).filter(i => i && i.trim() && i.trim() !== '-');\r\n if (!allInterests.length) { this.matrixData = null; return; }\r\n try {\r\n const apiKey = this.getActiveOpenAIKey();\r\n if (!apiKey) return;\r\n this.openaiEmbeddingService.getEmbeddings(allInterests, apiKey).subscribe({\r\n next: (embeddings) => {\r\n if (!embeddings?.length) return;\r\n const abbreviations: { [key: string]: string } = {};\r\n allInterests.forEach(interest => {\r\n const words = interest.split(/[\\s/-]+/);\r\n let abbr = words.length === 1 ? words[0].substring(0, 3) : words.map(w => w[0]).join('').substring(0, 3);\r\n let finalAbbr = abbr; let counter = 1;\r\n while (Object.values(abbreviations).includes(finalAbbr)) finalAbbr = abbr + counter++;\r\n abbreviations[interest] = finalAbbr;\r\n });\r\n const legend = Object.entries(abbreviations).map(([full, abbr]) => ({ abbr, full }));\r\n const headers = allInterests.map(i => abbreviations[i]);\r\n const rows = allInterests.map((interest, i) => ({\r\n label: abbreviations[interest],\r\n values: allInterests.map((_, j) => this.cosineSimilarity(embeddings[i], embeddings[j]).toFixed(2))\r\n }));\r\n this.matrixData = { legend, headers, rows };\r\n this.matrixDataChange.emit(this.matrixData);\r\n }\r\n });\r\n } catch {}\r\n }\r\n\r\n private cosineSimilarity(a: number[], b: number[]): number {\r\n let dot = 0, na = 0, nb = 0;\r\n for (let i = 0; i < a.length; i++) { dot += a[i] * b[i]; na += a[i] * a[i]; nb += b[i] * b[i]; }\r\n return (na === 0 || nb === 0) ? 0 : dot / (Math.sqrt(na) * Math.sqrt(nb));\r\n }\r\n}\r\n","<!-- API Quota Exhausted Modal (Independent) -->\r\n<div class=\"api-key-modal-overlay\" *ngIf=\"showApiKeyModal\">\r\n <div class=\"api-key-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"api-key-modal-header\">\r\n <div class=\"warning-icon\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\r\n ></path>\r\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\r\n </svg>\r\n </div>\r\n <h2>API Quota Limit Exceeded</h2>\r\n <button class=\"close-btn\" (click)=\"closeApiKeyModal()\" aria-label=\"Close\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n <!-- Face++ modal moved outside to top-level sibling overlay -->\r\n\r\n <div class=\"api-key-modal-body\">\r\n <p class=\"modal-message\">\r\n The default API Ninjas key has reached its free monthly quota limit of\r\n <strong>3,000 API calls</strong>.\r\n </p>\r\n <p class=\"modal-instruction\">\r\n Please enter your own API Ninjas key below to continue using the profile\r\n comparison features:\r\n </p>\r\n\r\n <div class=\"api-key-input-group\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"apiKeyInputValue\"\r\n placeholder=\"Paste your API Ninjas key here\"\r\n class=\"api-key-input\"\r\n autofocus\r\n />\r\n <button class=\"api-key-load-btn\" (click)=\"updateApiKey()\">\r\n Apply Key\r\n </button>\r\n </div>\r\n\r\n <div class=\"modal-hint\">\r\n <p>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\r\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\r\n </svg>\r\n Don't have an API key? Get your free key at\r\n <a href=\"https://api-ninjas.com/\" target=\"_blank\" rel=\"noopener\"\r\n >api-ninjas.com</a\r\n >\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Face++ API Credentials Modal (Independent) -->\r\n<div class=\"api-key-modal-overlay facepp-overlay\" *ngIf=\"showFaceppKeyModal\">\r\n <div class=\"api-key-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"api-key-modal-header\">\r\n <div class=\"warning-icon\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\r\n ></path>\r\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\r\n </svg>\r\n </div>\r\n <h2>Face++ Credentials Required</h2>\r\n <button\r\n class=\"close-btn\"\r\n (click)=\"closeFaceppKeyModal()\"\r\n aria-label=\"Close\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"api-key-modal-body\">\r\n <p class=\"modal-message\">\r\n The Face++ API returned an authorization or rate-limit error. Please\r\n enter your Face++ API Key and API Secret.\r\n </p>\r\n\r\n <div\r\n class=\"api-key-input-group\"\r\n style=\"flex-direction: column; align-items: stretch; gap: 10px\"\r\n >\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"faceppKeyInputValue\"\r\n placeholder=\"Face++ API Key\"\r\n class=\"api-key-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"faceppSecretInputValue\"\r\n placeholder=\"Face++ API Secret\"\r\n class=\"api-key-input\"\r\n />\r\n <button class=\"api-key-load-btn\" (click)=\"updateFaceppCredentials()\">\r\n Apply Face++ Credentials\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- OpenAI API Key Modal (Independent) -->\r\n<div class=\"api-key-modal-overlay openai-overlay\" *ngIf=\"showOpenAIKeyModal\">\r\n <div class=\"api-key-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"api-key-modal-header\">\r\n <div class=\"warning-icon\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"48\"\r\n height=\"48\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\r\n ></path>\r\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\r\n </svg>\r\n </div>\r\n <h2>OpenAI API Key Required</h2>\r\n <button\r\n class=\"close-btn\"\r\n (click)=\"closeOpenAIKeyModal()\"\r\n aria-label=\"Close\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"api-key-modal-body\">\r\n <p class=\"modal-message\">\r\n The OpenAI API returned an authorization or rate-limit error. Please\r\n enter your OpenAI API key to continue using the text similarity features.\r\n </p>\r\n <p class=\"modal-instruction\">\r\n Text matching now uses OpenAI embeddings (text-embedding-3-small) for improved semantic similarity.\r\n </p>\r\n\r\n <div class=\"api-key-input-group\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"openaiKeyInputValue\"\r\n placeholder=\"Paste your OpenAI API key here\"\r\n class=\"api-key-input\"\r\n autofocus\r\n />\r\n <button class=\"api-key-load-btn\" (click)=\"updateOpenAIKey()\">\r\n Apply OpenAI Key\r\n </button>\r\n </div>\r\n\r\n <div class=\"modal-hint\">\r\n <p>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\r\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\r\n </svg>\r\n Don't have an API key? Get your free key at\r\n <a href=\"https://platform.openai.com/api-keys\" target=\"_blank\" rel=\"noopener\"\r\n >platform.openai.com/api-keys</a\r\n >\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"blank-box\"></div>\r\n\r\n<div class=\"profile-screen\">\r\n <div class=\"profile-flex\">\r\n <div class=\"profile-img left\" [class.fade-all]=\"fadeAllEdges\">\r\n <img\r\n [src]=\"user1Image\"\r\n alt=\"User 1\"\r\n [style.transform]=\"user1Transform\"\r\n [style.object-position]=\"user1ObjectPosition\"\r\n (load)=\"onUserImageLoad(1, $event)\"\r\n />\r\n </div>\r\n <div class=\"profile-img right\" [class.fade-all]=\"fadeAllEdges\">\r\n <img\r\n [src]=\"user2Image\"\r\n alt=\"User 2\"\r\n [style.transform]=\"user2Transform\"\r\n [style.object-position]=\"user2ObjectPosition\"\r\n (load)=\"onUserImageLoad(2, $event)\"\r\n />\r\n <!-- [style.object-fit]=\"'cover'\" -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"shape\">\r\n <div class=\"shape-bg\">\r\n <img src=\"./assets/s1.svg\" alt=\"Shape\" height=\"350\" class=\"shape-bg1\" />\r\n <img src=\"./assets/s2.svg\" alt=\"Shape\" height=\"350\" class=\"shape-bg2\" />\r\n </div>\r\n\r\n <div class=\"shape-text\">\r\n <div class=\"shape-text-left\">\r\n <div class=\"scroll-container\" #leftContainer>\r\n <ng-container\r\n *ngFor=\"\r\n let interest of alignedPerson1Interests.length > 0\r\n ? alignedPerson1Interests\r\n : displayPerson1Interests.length > 0\r\n ? displayPerson1Interests\r\n : person1Interests;\r\n let i = index\r\n \"\r\n >\r\n <p\r\n class=\"shape-p\"\r\n *ngIf=\"!centerItem.includes(interest)\"\r\n [ngClass]=\"{'dash-item': interest === '-', 'spacer-item': interest === '----', 'aligned-item': interest !== '-' && interest !== '----'}\"\r\n >\r\n {{ interest === \"-\" ? \"—\" : interest }}\r\n </p>\r\n </ng-container>\r\n </div>\r\n <h2 class=\"shape-h2\" (click)=\"onViewProfile()\">View Profile</h2>\r\n </div>\r\n\r\n <div class=\"shape-text-center\">\r\n <ng-container *ngFor=\"let item of centerItem\">\r\n <p class=\"shape-p-center\">{{ item }}</p>\r\n </ng-container>\r\n </div>\r\n <div class=\"shape-text-right\">\r\n <div class=\"scroll-container\" #rightContainer>\r\n <ng-container\r\n *ngFor=\"\r\n let interest of alignedPerson2Interests.length > 0\r\n ? alignedPerson2Interests\r\n : displayPerson2Interests.length > 0\r\n ? displayPerson2Interests\r\n : person2Interests;\r\n let i = index\r\n \"\r\n >\r\n <p\r\n class=\"shape-p-right\"\r\n *ngIf=\"!centerItem.includes(interest)\"\r\n [ngClass]=\"{'dash-item': interest === '-', 'spacer-item': interest === '----', 'aligned-item': interest !== '-' && interest !== '----'}\"\r\n >\r\n {{ interest === \"-\" ? \"—\" : interest }}\r\n </p>\r\n </ng-container>\r\n </div>\r\n <h2 class=\"shape-h2-right\" (click)=\"onViewProfile()\">View Profile</h2>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading indicator for alignment process -->\r\n <div *ngIf=\"isAligning\" class=\"loading-indicator\">\r\n <div class=\"loading-spinner\"></div>\r\n </div>\r\n</div>\r\n\r\n\r\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { IProfileConfig } from '../interfaces';\r\nimport { Observable, from, of, throwError, firstValueFrom } from 'rxjs';\r\nimport { map, switchMap, catchError, tap } from 'rxjs/operators';\r\n\r\n// Local interface to configure compression behavior\r\ninterface IImageCompressionConfig {\r\n maxWidth: number;\r\n maxHeight: number;\r\n format: 'image/jpeg' | 'image/png' | 'image/webp';\r\n qualityStart: number;\r\n qualityMin: number;\r\n qualityStep: number;\r\n maxBytes: number;\r\n downscaleStep: number;\r\n minWidth: number;\r\n minHeight: number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-custom-input',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './custom-input.component.html',\r\n styleUrls: ['./custom-input.component.scss'],\r\n})\r\nexport class CustomInputComponent {\r\n person1Text = '';\r\n person2Text = '';\r\n person3Text = '';\r\n user1File: File | null = null;\r\n user2File: File | null = null;\r\n user1Preview: string | null = null;\r\n user2Preview: string | null = null;\r\n\r\n saving = false;\r\n error: string | null = null;\r\n\r\n private static readonly MAX_WIDTH = 1600;\r\n private static readonly MAX_HEIGHT = 1600;\r\n private static readonly COMPRESSION_FORMAT: 'image/jpeg' | 'image/png' | 'image/webp' = 'image/jpeg';\r\n private static readonly QUALITY_START = 0.85;\r\n private static readonly QUALITY_MIN = 0.5;\r\n private static readonly QUALITY_STEP = 0.05;\r\n private static readonly MAX_BYTES = 2 * 1024 * 1024;\r\n private static readonly DOWNSCALE_STEP = 0.9;\r\n private static readonly MIN_WIDTH = 400;\r\n private static readonly MIN_HEIGHT = 400;\r\n\r\n // Image compression settings (configurable)\r\n // Note: Images are later stored as Data URLs in localStorage (base64 ~33% larger).\r\n // If you plan to store multiple images, consider lowering maxBytes to ~1.6–1.8 MB.\r\n compressionConfig: IImageCompressionConfig = {\r\n maxWidth: CustomInputComponent.MAX_WIDTH,\r\n maxHeight: CustomInputComponent.MAX_HEIGHT,\r\n format: CustomInputComponent.COMPRESSION_FORMAT,\r\n qualityStart: CustomInputComponent.QUALITY_START,\r\n qualityMin: CustomInputComponent.QUALITY_MIN,\r\n qualityStep: CustomInputComponent.QUALITY_STEP,\r\n maxBytes: CustomInputComponent.MAX_BYTES,\r\n downscaleStep: CustomInputComponent.DOWNSCALE_STEP,\r\n minWidth: CustomInputComponent.MIN_WIDTH,\r\n minHeight: CustomInputComponent.MIN_HEIGHT,\r\n };\r\n\r\n constructor(private router: Router) {}\r\n\r\n async onUser1FileChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files && input.files.length ? input.files[0] : null;\r\n if (!file) {\r\n this.user1File = null;\r\n this.user1Preview = null;\r\n return;\r\n }\r\n try {\r\n const { file: compressed, dataUrl } = await firstValueFrom(this.compressImageFile(file));\r\n this.user1File = compressed;\r\n this.user1Preview = dataUrl;\r\n } catch (e) {\r\n console.error('User1 image compression failed:', e);\r\n // Fallback to original if compression fails\r\n this.user1File = file;\r\n this.previewFile(file, (dataUrl) => (this.user1Preview = dataUrl));\r\n }\r\n }\r\n\r\n async onUser2FileChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files && input.files.length ? input.files[0] : null;\r\n if (!file) {\r\n this.user2File = null;\r\n this.user2Preview = null;\r\n return;\r\n }\r\n try {\r\n const { file: compressed, dataUrl } = await firstValueFrom(this.compressImageFile(file));\r\n this.user2File = compressed;\r\n this.user2Preview = dataUrl;\r\n } catch (e) {\r\n console.error('User2 image compression failed:', e);\r\n // Fallback to original if compression fails\r\n this.user2File = file;\r\n this.previewFile(file, (dataUrl) => (this.user2Preview = dataUrl));\r\n }\r\n }\r\n\r\n async saveAndView() {\r\n this.error = null;\r\n this.saving = true;\r\n\r\n try {\r\n const img1 = this.user1File\r\n ? await firstValueFrom(this.fileToDataURL(this.user1File))\r\n : this.user1Preview || '';\r\n const img2 = this.user2File\r\n ? await firstValueFrom(this.fileToDataURL(this.user2File))\r\n : this.user2Preview || '';\r\n\r\n const cfg: IProfileConfig = {\r\n person1Interests: this.toList(this.person1Text),\r\n person2Interests: this.toList(this.person2Text),\r\n person3Interests: this.toList(this.person3Text),\r\n user1Image: img1,\r\n user2Image: img2,\r\n } as IProfileConfig;\r\n\r\n localStorage.setItem('customProfileConfig', JSON.stringify(cfg));\r\n // Navigate to home to render with the new config\r\n await this.router.navigateByUrl('/');\r\n window.location.reload();\r\n } catch (e:unknown) {\r\n this.error = (e as Error)?.message || 'Failed to save configuration';\r\n } finally {\r\n this.saving = false;\r\n }\r\n }\r\n\r\n clearAll() {\r\n this.person1Text = '';\r\n this.person2Text = '';\r\n this.person3Text = '';\r\n this.user1File = null;\r\n this.user2File = null;\r\n this.user1Preview = null;\r\n this.user2Preview = null;\r\n try {\r\n localStorage.removeItem('customProfileConfig');\r\n window.location.reload();\r\n } catch {}\r\n }\r\n\r\n // Close the overlay and return to the main view\r\n close() {\r\n this.router.navigateByUrl('/');\r\n }\r\n\r\n private toList(block: string): string[] {\r\n return (block || '')\r\n .split(/[\\n,]+/)\r\n .map((s) => s.trim())\r\n .filter((s) => !!s);\r\n }\r\n\r\n private fileToDataURL(file: File): Observable<string> {\r\n return new Observable(observer => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = (err) => observer.error(err);\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n private previewFile(file: File | null, cb: (dataUrl: string | null) => void) {\r\n if (!file) {\r\n cb(null);\r\n return;\r\n }\r\n const reader = new FileReader();\r\n reader.onload = () => cb(String(reader.result));\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n // Compress an image file according to compressionConfig (or overrides)\r\n private compressImageFile(\r\n file: File,\r\n overrides: Partial<IImageCompressionConfig> = {}\r\n ): Observable<{ file: File; dataUrl: string }> {\r\n const cfg = { ...this.compressionConfig, ...overrides };\r\n\r\n return this.loadImageFromFile(file).pipe(\r\n switchMap((img) => {\r\n let width = img.naturalWidth || img.width;\r\n let height = img.naturalHeight || img.height;\r\n\r\n // Initial fit within max dimensions\r\n const scale = Math.min(cfg.maxWidth / width, cfg.maxHeight / height, 1);\r\n width = Math.max(1, Math.round(width * scale));\r\n height = Math.max(1, Math.round(height * scale));\r\n\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d')!;\r\n\r\n const render = (w: number, h: number) => {\r\n canvas.width = w;\r\n canvas.height = h;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.drawImage(img, 0, 0, w, h);\r\n };\r\n\r\n const process = (w: number, h: number, q: number, attempts: number): Observable<Blob> => {\r\n render(w, h);\r\n return this.canvasToBlob(canvas, cfg.format, q).pipe(\r\n switchMap((blob) => {\r\n if (blob.size > cfg.maxBytes && attempts < 25) {\r\n if (q > cfg.qualityMin + 0.005) {\r\n return process(w, h, Math.max(cfg.qualityMin, q - cfg.qualityStep), attempts + 1);\r\n } else {\r\n const nextW = Math.max(Math.round(w * cfg.downscaleStep), cfg.minWidth);\r\n const nextH = Math.max(Math.round(h * cfg.downscaleStep), cfg.minHeight);\r\n if (nextW === w && nextH === h) {\r\n return of(blob);\r\n }\r\n return process(nextW, nextH, cfg.qualityStart, attempts + 1);\r\n }\r\n }\r\n return of(blob);\r\n })\r\n );\r\n };\r\n\r\n return process(width, height, cfg.qualityStart, 0).pipe(\r\n switchMap((finalBlob: Blob) => {\r\n const newName = this.renameFileForFormat(file.name, cfg.format);\r\n const compressedFile = new File([finalBlob], newName, {\r\n type: cfg.format,\r\n lastModified: Date.now(),\r\n });\r\n return this.blobToDataURL(finalBlob).pipe(\r\n map((dataUrl) => ({ file: compressedFile, dataUrl }))\r\n );\r\n })\r\n );\r\n })\r\n );\r\n }\r\n\r\n private loadImageFromFile(file: File): Observable<HTMLImageElement> {\r\n return new Observable(observer => {\r\n const url = URL.createObjectURL(file);\r\n const img = new Image();\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n observer.next(img);\r\n observer.complete();\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n observer.error(new Error('Failed to load image for compression'));\r\n };\r\n img.src = url;\r\n });\r\n }\r\n\r\n private canvasToBlob(\r\n canvas: HTMLCanvasElement,\r\n type: string,\r\n quality: number\r\n ): Observable<Blob> {\r\n return new Observable(observer => {\r\n if (canvas.toBlob) {\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n observer.next(blob);\r\n observer.complete();\r\n } else {\r\n observer.error(new Error('Canvas.toBlob returned null'));\r\n }\r\n }, type, quality);\r\n } else {\r\n // Fallback via DataURL\r\n try {\r\n const dataUrl = canvas.toDataURL(type, quality);\r\n const base64 = dataUrl.split(',')[1] || '';\r\n const binary = atob(base64);\r\n const len = binary.length;\r\n const u8 = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) u8[i] = binary.charCodeAt(i);\r\n observer.next(new Blob([u8], { type }));\r\n observer.complete();\r\n } catch (e) {\r\n observer.error(e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private blobToDataURL(blob: Blob): Observable<string> {\r\n return new Observable(observer => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = (err) => observer.error(err);\r\n reader.readAsDataURL(blob);\r\n });\r\n }\r\n\r\n private renameFileForFormat(name: string, mime: string): string {\r\n const ext = mime === 'image/webp' ? '.webp' : mime === 'image/png' ? '.png' : '.jpg';\r\n return name.replace(/\\.[^/.]+$/, '') + ext;\r\n }\r\n}\r\n","<div class=\"try-overlay\">\r\n <div class=\"try-container\" (click)=\"$event.stopPropagation()\">\r\n <header class=\"try-header\">\r\n <h1>Try Your Own Data</h1>\r\n <a class=\"close-btn\" (click)=\"close()\" aria-label=\"Close\">×</a>\r\n </header>\r\n <p class=\"lead\">\r\n Paste interests (one per line) and upload two images. Click \"Save & View\"\r\n to preview in the main comparison view.\r\n </p>\r\n\r\n <section class=\"try-grid\">\r\n <div class=\"card\">\r\n <h2>Person 1</h2>\r\n <div class=\"field\">\r\n <label>Image</label>\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n (change)=\"onUser1FileChange($event)\"\r\n />\r\n <div class=\"preview\" *ngIf=\"user1Preview\">\r\n <img [src]=\"user1Preview\" alt=\"User 1 preview\" />\r\n </div>\r\n </div>\r\n <div class=\"field\">\r\n <label>Interests (one per line)</label>\r\n <textarea\r\n [(ngModel)]=\"person1Text\"\r\n rows=\"10\"\r\n placeholder=\"e.g.Photography,Travel,Hiking\"\r\n ></textarea>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <h2>Person 2</h2>\r\n <div class=\"field\">\r\n <label>Image</label>\r\n <input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n (change)=\"onUser2FileChange($event)\"\r\n />\r\n <div class=\"preview\" *ngIf=\"user2Preview\">\r\n <img [src]=\"user2Preview\" alt=\"User 2 preview\" />\r\n </div>\r\n </div>\r\n <div class=\"field\">\r\n <label>Interests (one per line)</label>\r\n <textarea\r\n [(ngModel)]=\"person2Text\"\r\n rows=\"10\"\r\n placeholder=\"e.g.Music,Movies,Soccer\"\r\n ></textarea>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"card\">\r\n <h2>Person 3 (Optional)</h2>\r\n <div class=\"field\">\r\n <label>Interests (one per line)</label>\r\n <textarea [(ngModel)]=\"person3Text\" rows=\"10\" placeholder=\"Optional third list\"></textarea>\r\n </div>\r\n <div class=\"hint\">\r\n <p>Tip: Leave this empty if you only want to compare two lists.</p>\r\n </div>\r\n </div> -->\r\n </section>\r\n\r\n <footer class=\"try-actions\">\r\n <button class=\"btn primary\" (click)=\"saveAndView()\" [disabled]=\"saving\">\r\n {{ saving ? \"Saving...\" : \"Save & View\" }}\r\n </button>\r\n <button class=\"btn\" (click)=\"clearAll()\" [disabled]=\"saving\">\r\n Clear\r\n </button>\r\n <a class=\"btn link\" (click)=\"close()\">Back to Home</a>\r\n </footer>\r\n\r\n <p class=\"error\" *ngIf=\"error\">{{ error }}</p>\r\n </div>\r\n</div>\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { ProfileService, OpenAIEmbeddingService } from '../services';\r\nimport { IWordPair } from '../interfaces';\r\n\r\n@Component({\r\n selector: 'lib-documentation',\r\n templateUrl: './documentation.component.html',\r\n styleUrls: ['./documentation.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule]\r\n})\r\nexport class DocumentationComponent implements OnInit {\r\n // API key state\r\n apiKeyInput = '';\r\n\r\n // Embedding similarity demo\r\n textA = 'football';\r\n textB = 'soccer';\r\n embeddingScore: number | null = null;\r\n embeddingLoading = false;\r\n embeddingError: string | null = null;\r\n\r\n // Best matching pairs demo\r\n listAInput = 'music\\nphotography\\ntravel\\nrock climbing';\r\n listBInput = 'hiking\\nsoccer\\nphotograph\\nmovies';\r\n matchingPairs: Array<{ wordA: string; wordB: string; score: number }> = [];\r\n pairsLoading = false;\r\n pairsError: string | null = null;\r\n\r\n // Face detect demo\r\n faceFile: File | null = null;\r\n faceResult: unknown = null;\r\n faceLoading = false;\r\n faceError: string | null = null;\r\n\r\n // Text similarity via API Ninjas\r\n compareA = 'football';\r\n compareB = 'soccer';\r\n apiSimilarity: number | null = null;\r\n apiLoading = false;\r\n apiError: string | null = null;\r\n\r\n // OpenAI key state\r\n openaiKeyInput = '';\r\n\r\n @Input() defaultApiNinjasKey = '';\r\n @Input() defaultOpenaiApiKey = '';\r\n\r\n constructor(\r\n private openaiEmbeddingService: OpenAIEmbeddingService,\r\n private profileService: ProfileService,\r\n private router: Router\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n // Prefill API key from env or localStorage\r\n const saved = this.getStoredKey();\r\n if (saved) {\r\n this.apiKeyInput = saved;\r\n } else {\r\n this.apiKeyInput = this.defaultApiNinjasKey || '';\r\n }\r\n }\r\n\r\n // --- API Key helpers ---\r\n getActiveApiKey(): string {\r\n return this.apiKeyInput?.trim() || this.defaultApiNinjasKey;\r\n }\r\n\r\n saveKey() {\r\n try {\r\n localStorage.setItem('apiNinjasCustomKey', this.apiKeyInput.trim());\r\n } catch (e) {\r\n console.warn('Could not persist API key', e);\r\n }\r\n }\r\n\r\n getStoredKey(): string | null {\r\n try {\r\n return localStorage.getItem('apiNinjasCustomKey');\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // --- OpenAI Key helpers ---\r\n getActiveOpenAIKey(): string {\r\n return this.openaiKeyInput?.trim() || this.defaultOpenaiApiKey;\r\n }\r\n\r\n saveOpenAIKey() {\r\n try {\r\n localStorage.setItem('openaiCustomKey', this.openaiKeyInput.trim());\r\n } catch (e) {\r\n console.warn('Could not persist OpenAI key', e);\r\n }\r\n }\r\n\r\n // --- Embedding similarity demo (now uses OpenAI) ---\r\n runEmbeddingSimilarity() {\r\n this.embeddingLoading = true;\r\n this.embeddingError = null;\r\n this.embeddingScore = null;\r\n this.openaiEmbeddingService\r\n .calculateSimilarity(this.textA, this.textB, this.getActiveOpenAIKey())\r\n .subscribe({\r\n next: (score: number) => {\r\n this.embeddingScore = score;\r\n this.embeddingLoading = false;\r\n },\r\n error: (err: Error | HttpErrorResponse) => {\r\n this.embeddingError = (err as Error)?.message || 'Failed to compute similarity';\r\n this.embeddingLoading = false;\r\n },\r\n });\r\n }\r\n\r\n // --- Best matching pairs demo ---\r\n runBestPairs() {\r\n const listA = this.listAInput\r\n .split('\\n')\r\n .map((s) => s.trim())\r\n .filter(Boolean);\r\n const listB = this.listBInput\r\n .split('\\n')\r\n .map((s) => s.trim())\r\n .filter(Boolean);\r\n\r\n if (listA.length === 0 || listB.length === 0) {\r\n this.pairsError = 'Both lists must contain at least one item.';\r\n return;\r\n }\r\n\r\n this.pairsLoading = true;\r\n this.pairsError = null;\r\n this.matchingPairs = [];\r\n\r\n // Note: Best matching pairs demo is currently disabled as it's not needed for showcase functionality\r\n // The OpenAI service focuses on core text similarity for the main alignment algorithm\r\n this.pairsError = 'This demo is currently disabled. The showcase uses OpenAI embeddings for core text similarity.';\r\n this. pairsLoading = false;\r\n \r\n /* Original TensorFlow implementation:\r\n this.embeddingService\r\n .findBestMatchingPairs(listA, listB, 0.15)\r\n .subscribe({\r\n next: (pairs: IWordPair[]) => {\r\n this.matchingPairs = pairs;\r\n this.pairsLoading = false;\r\n },\r\n error: (err: Error | HttpErrorResponse) => {\r\n this.pairsError = (err as Error)?.message || 'Failed to compute pairs';\r\n this.pairsLoading = false;\r\n },\r\n });\r\n */\r\n }\r\n\r\n // --- Face detection demo ---\r\n onFaceFileChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files && input.files.length ? input.files[0] : null;\r\n this.faceFile = file;\r\n }\r\n\r\n runFaceDetect() {\r\n this.faceResult = null;\r\n this.faceError = null;\r\n if (!this.faceFile) {\r\n this.faceError = 'Please choose an image file.';\r\n return;\r\n }\r\n\r\n this.faceLoading = true;\r\n this.profileService.detectFace(this.faceFile).subscribe({\r\n next: (res) => {\r\n this.faceResult = res;\r\n this.faceLoading = false;\r\n },\r\n error: (err) => {\r\n this.faceError = err?.error?.message || err?.message || 'Face detection failed';\r\n this.faceLoading = false;\r\n }\r\n });\r\n }\r\n\r\n // --- API Ninjas text similarity demo ---\r\n runApiSimilarity() {\r\n this.apiSimilarity = null;\r\n this.apiError = null;\r\n this.apiLoading = true;\r\n this.profileService\r\n .compareInterests(this.compareA, this.compareB, this.getActiveApiKey())\r\n .subscribe({\r\n next: (res: { similarity: number }) => {\r\n this.apiSimilarity = res.similarity;\r\n this.apiLoading = false;\r\n },\r\n error: (err) => {\r\n this.apiError = err?.error?.message || err?.message || 'API call failed';\r\n this.apiLoading = false;\r\n },\r\n });\r\n }\r\n\r\n // --- Helper label/format methods to simplify template expressions ---\r\n similarityLabel(): string {\r\n if (this.embeddingScore === null) return '';\r\n return `Similarity: ${this.formatNumber(this.embeddingScore, 2, 4)}`;\r\n }\r\n\r\n apiSimilarityLabel(): string {\r\n if (this.apiSimilarity === null) return '';\r\n return `Similarity: ${this.formatNumber(this.apiSimilarity, 2, 4)}`;\r\n }\r\n\r\n pairLabel(p: { wordA: string; wordB: string; score: number }): string {\r\n return `${p.wordA} ⇄ ${p.wordB} — ${this.formatNumber(p.score * 100, 1, 1)}%`;\r\n }\r\n\r\n faceResultJson(): string {\r\n try { return JSON.stringify(this.faceResult, null, 2); } catch { return String(this.faceResult); }\r\n }\r\n\r\n private formatNumber(value: number, min = 2, max = 2): string {\r\n try { return new Intl.NumberFormat('en-US', { minimumFractionDigits: min, maximumFractionDigits: max }).format(value); }\r\n catch { return value.toFixed(max); }\r\n }\r\n\r\n // --- Navigation ---\r\n goHome(event: Event) {\r\n event.preventDefault();\r\n this.router.navigateByUrl('/');\r\n }\r\n}\r\n","<div class=\"docs-overlay\">\r\n <div class=\"docs-container\">\r\n <div class=\"docs-header\">\r\n <h1>Profile Comparison Library — Developer Docs</h1>\r\n <a class=\"close-btn\" href=\"/\" (click)=\"goHome($event)\" aria-label=\"Close\">×</a>\r\n </div>\r\n\r\n <p class=\"lead\">\r\n This page documents how to use the library services and lets you test them live inside the showcase.\r\n Existing showcase UI remains unchanged — this is a standalone docs screen reachable from the \"Docs\" link.\r\n </p>\r\n\r\n <section class=\"section\">\r\n <h2>Quickstart</h2>\r\n <ol>\r\n <li><strong>Build the library</strong>: run <code>ng build profile-comparison-lib</code>.</li>\r\n <li><strong>Import</strong>: <code>import { ProfileComparisonLibModule, EmbeddingService, ProfileService } from 'profile-comparison-lib';</code></li>\r\n <li><strong>Provide HttpClient</strong>: ensure <code>HttpClientModule</code> is imported in your app module.</li>\r\n <li><strong>API Key</strong>: for text similarity/face detect APIs, pass an API Ninjas key.</li>\r\n <li><strong>Run Showcase</strong>: <code>ng serve showcase</code> (or <code>npm run serve:showcase</code>), then open <code>/docs</code>.</li>\r\n </ol>\r\n <p>\r\n Full README is in <code>README.md</code> at the repository root.\r\n </p>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Set API Key</h2>\r\n <div class=\"row\">\r\n <input type=\"text\" [(ngModel)]=\"apiKeyInput\" placeholder=\"API Ninjas Key\" />\r\n <button (click)=\"saveKey()\">Save</button>\r\n </div>\r\n <p class=\"hint\">Your key is stored in localStorage. Provide a valid key; rate limits apply.</p>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Embedding Similarity (TensorFlow.js)</h2>\r\n <div class=\"row\">\r\n <input type=\"text\" [(ngModel)]=\"textA\" placeholder=\"Text A\" />\r\n <input type=\"text\" [(ngModel)]=\"textB\" placeholder=\"Text B\" />\r\n <button (click)=\"runEmbeddingSimilarity()\" [disabled]=\"embeddingLoading\">Run</button>\r\n </div>\r\n <div class=\"result\" *ngIf=\"embeddingLoading\">Computing…</div>\r\n <div class=\"result\" *ngIf=\"embeddingError\" [textContent]=\"'Error: ' + embeddingError\"></div>\r\n <div class=\"result\" *ngIf=\"embeddingScore !== null\" [textContent]=\"similarityLabel()\"></div>\r\n <details>\r\n <summary>Usage</summary>\r\n <pre ngNonBindable><code>constructor(private embedding: EmbeddingService) {}\r\nthis.embedding.calculateSimilarity('football','soccer')\r\n .subscribe(score => console.log(score));</code></pre>\r\n </details>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Best Matching Pairs</h2>\r\n <div class=\"cols\">\r\n <textarea [(ngModel)]=\"listAInput\" rows=\"6\" spellcheck=\"false\"></textarea>\r\n <textarea [(ngModel)]=\"listBInput\" rows=\"6\" spellcheck=\"false\"></textarea>\r\n </div>\r\n <button class=\"spaced-btn\" (click)=\"runBestPairs()\" [disabled]=\"pairsLoading\">Find Pairs</button>\r\n <div class=\"result\" *ngIf=\"pairsLoading\">Processing…</div>\r\n <div class=\"result\" *ngIf=\"pairsError\" [textContent]=\"'Error: ' + pairsError\"></div>\r\n <ul class=\"pairs\" *ngIf=\"!pairsLoading && matchingPairs.length\">\r\n <li *ngFor=\"let p of matchingPairs\" [textContent]=\"pairLabel(p)\"></li>\r\n </ul>\r\n <details>\r\n <summary>Usage</summary>\r\n <pre ngNonBindable><code>this.embedding.findBestMatchingPairs(listA, listB, 0.15)\r\n .subscribe(pairs => console.log(pairs));</code></pre>\r\n </details>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>API Ninjas: Text Similarity</h2>\r\n <div class=\"row\">\r\n <input type=\"text\" [(ngModel)]=\"compareA\" placeholder=\"Text A\" />\r\n <input type=\"text\" [(ngModel)]=\"compareB\" placeholder=\"Text B\" />\r\n <button (click)=\"runApiSimilarity()\" [disabled]=\"apiLoading\">Compare</button>\r\n </div>\r\n <div class=\"result\" *ngIf=\"apiLoading\">Calling API…</div>\r\n <div class=\"result\" *ngIf=\"apiError\" [textContent]=\"'Error: ' + apiError\"></div>\r\n <div class=\"result\" *ngIf=\"apiSimilarity !== null\" [textContent]=\"apiSimilarityLabel()\"></div>\r\n <details>\r\n <summary>Usage</summary>\r\n <pre><code>this.profileService.compareInterests(a, b, apiKey)\r\n .subscribe((res: { similarity: number }) => console.log(res.similarity));</code></pre>\r\n </details>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Face Detection</h2>\r\n <div class=\"row\">\r\n <input type=\"file\" (change)=\"onFaceFileChange($event)\" accept=\"image/*\" />\r\n <button (click)=\"runFaceDetect()\" [disabled]=\"faceLoading\">Detect Face</button>\r\n </div>\r\n <div class=\"result\" *ngIf=\"faceLoading\">Calling API…</div>\r\n <div class=\"result\" *ngIf=\"faceError\" [textContent]=\"'Error: ' + faceError\"></div>\r\n <pre class=\"result\" *ngIf=\"!faceLoading && faceResult\" [textContent]=\"faceResultJson()\"></pre>\r\n <details>\r\n <summary>Usage</summary>\r\n <pre ngNonBindable><code>this.profileService.detectFace(file, apiKey)\r\n .subscribe(res => console.log(res));</code></pre>\r\n </details>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Module Import</h2>\r\n <pre ngNonBindable><code>import { HttpClientModule } from '@angular/common/http';\r\nimport { ProfileComparisonLibModule } from 'profile-comparison-lib';\r\n\r\n@NgModule({\r\n imports: [HttpClientModule, ProfileComparisonLibModule]\r\n})\r\nexport class AppModule {}</code></pre>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Services Overview</h2>\r\n <ul>\r\n <li><strong>EmbeddingService</strong>: <code>calculateSimilarity(textA, textB)</code>, <code>findBestMatchingPairs(listA, listB, threshold?)</code></li>\r\n <li><strong>ProfileService</strong>: <code>compareInterests(a, b, apiKey)</code>, <code>detectFace(file, apiKey)</code></li>\r\n </ul>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Exports</h2>\r\n <ul>\r\n <li><code>ProfileComparisonLibModule</code></li>\r\n <li><code>EmbeddingService</code></li>\r\n <li><code>ProfileService</code></li>\r\n <li><code>WordPair</code> (interface)</li>\r\n <li><code>WordAlignment</code> (interface)</li>\r\n </ul>\r\n </section>\r\n\r\n <section class=\"section\">\r\n <h2>Troubleshooting</h2>\r\n <ul>\r\n <li><strong>API key/Quota</strong>: If calls fail, verify the API key and check rate limits.</li>\r\n <li><strong>Network</strong>: Ensure CORS and network connectivity are OK.</li>\r\n <li><strong>Build</strong>: Run <code>ng build profile-comparison-lib</code> after library changes.</li>\r\n </ul>\r\n </section>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ProfileComparisonLibComponent } from './profile-comparison-lib.component';\r\nimport { ProfileService, EmbeddingService, OpenAIEmbeddingService } from './services';\r\nimport { CustomInputComponent } from './custom-input/custom-input.component';\r\nimport { DocumentationComponent } from './documentation/documentation.component';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n@NgModule({\r\n declarations: [\r\n ProfileComparisonLibComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CustomInputComponent,\r\n DocumentationComponent,\r\n RouterModule\r\n ],\r\n exports: [\r\n ProfileComparisonLibComponent,\r\n CustomInputComponent,\r\n DocumentationComponent\r\n ],\r\n providers: [\r\n ProfileService,\r\n EmbeddingService,\r\n OpenAIEmbeddingService\r\n ]\r\n})\r\nexport class ProfileComparisonLibModule { }\r\n","/*\r\n * Public API Surface of profile-comparison-lib\r\n */\r\n\r\nexport * from './lib/profile-comparison-lib.component';\r\nexport * from './lib/profile-comparison-lib.module';\r\nexport * from './lib/services';\r\nexport * from './lib/interfaces';\r\nexport * from './lib/custom-input/custom-input.component';\r\nexport * from './lib/documentation/documentation.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["switchMap","map","catchError","i1.ProfileService","i1.OpenAIEmbeddingService","i1.FileConversionService","i1.ImageCompressionService","i1","i2","i4"],"mappings":"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"}
|