#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ๐ŸŽฏ ํ†ตํ•ฉ ์„ฑ๊ฒฉ ์ƒํ˜ธ์ž‘์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ์ž ์กฐ์ •๊ฐ’์ด ์ „์ฒด ์‹œ์Šคํ…œ์— ์˜๋ฏธ์žˆ๊ฒŒ ๋ฐ˜์˜๋˜๋„๋ก ํ•˜๋Š” ํ•ต์‹ฌ ์—”์ง„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ: 1. ๐ŸŽ›๏ธ ์‚ฌ์šฉ์ž ์กฐ์ •๊ฐ’ โ†’ 127๊ฐœ ๋ณ€์ˆ˜ ์ž๋™ ๋ณ€ํ™˜ 2. ๐Ÿ”„ ๋ณ€์ˆ˜๊ฐ„ ์ƒํ˜ธ์˜ํ–ฅ ๊ณ„์‚ฐ (์ƒ๊ด€๊ด€๊ณ„, ์—ญ์ƒ๊ด€๊ด€๊ณ„) 3. ๐ŸŽญ ์„ฑ๊ฒฉ ์ผ๊ด€์„ฑ ์œ ์ง€ (๋ชจ์ˆœ ๋ฐฉ์ง€) 4. ๐Ÿ’ฌ ๋Œ€ํ™” ์Šคํƒ€์ผ ๋™์  ์ƒ์„ฑ 5. ๐ŸŒŸ ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ž๋™ ๋„์ถœ """ import math import random import numpy as np from typing import Dict, List, Tuple, Optional, Any import json class PersonalityInteractionEngine: """ ์„ฑ๊ฒฉ ๋ณ€์ˆ˜๋“ค ๊ฐ„์˜ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ์—”์ง„ """ # ๐Ÿง  ์„ฑ๊ฒฉ ๋ณ€์ˆ˜ ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„ ๋งคํŠธ๋ฆญ์Šค CORRELATION_MATRIX = { # ์˜จ๊ธฐ(Warmth) ๊ธฐ๋ฐ˜ ์ƒ๊ด€๊ด€๊ณ„ "์˜จ๊ธฐ": { "positive": ["W01_์นœ์ ˆํ•จ", "W02_์นœ๊ทผํ•จ", "W06_๊ณต๊ฐ๋Šฅ๋ ฅ", "W07_ํฌ์šฉ๋ ฅ", "A03_์ดํƒ€์‹ฌ", "A04_์ˆœ์‘์„ฑ", "R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„", "D01_์ดˆ๊ธฐ์ ‘๊ทผ์„ฑ"], "negative": ["N04_์ž์˜์‹", "F02_์†Œ์‹ฌํ•จ", "S01_๊ฒฉ์‹์„ฑ์ˆ˜์ค€"], "neutral": ["C01_ํšจ์œจ์„ฑ", "C02_์ง€๋Šฅ"] }, # ๋Šฅ๋ ฅ(Competence) ๊ธฐ๋ฐ˜ ์ƒ๊ด€๊ด€๊ณ„ "๋Šฅ๋ ฅ": { "positive": ["C01_ํšจ์œจ์„ฑ", "C02_์ง€๋Šฅ", "C03_์ „๋ฌธ์„ฑ", "C05_์ •ํ™•์„ฑ", "C06_๋ถ„์„๋ ฅ", "C07_ํ•™์Šต๋Šฅ๋ ฅ", "C08_ํ†ต์ฐฐ๋ ฅ", "C09_์‹คํ–‰๋ ฅ", "C11_์œ ๋Šฅ๊ฐ", "C12_์งˆ์„œ์„ฑ", "C14_์„ฑ์ทจ์š•๊ตฌ"], "negative": ["F03_๊ธฐ์ˆ ์น˜์Œ", "F09_๊ฒฐ์ •ํšŒํ”ผ", "N01_๋ถˆ์•ˆ์„ฑ"], "neutral": ["E01_์‚ฌ๊ต์„ฑ", "H01_์œ ๋จธ๊ฐ๊ฐ"] }, # ์™ธํ–ฅ์„ฑ(Extraversion) ๊ธฐ๋ฐ˜ ์ƒ๊ด€๊ด€๊ณ„ "์™ธํ–ฅ์„ฑ": { "positive": ["E01_์‚ฌ๊ต์„ฑ", "E02_ํ™œ๋™์„ฑ", "E03_์ž๊ธฐ์ฃผ์žฅ", "E04_๊ธ์ •์ •์„œ", "E05_์ž๊ทน์ถ”๊ตฌ", "E06_์—ด์ •์„ฑ", "D01_์ดˆ๊ธฐ์ ‘๊ทผ์„ฑ", "H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ"], "negative": ["F02_์†Œ์‹ฌํ•จ", "N04_์ž์˜์‹", "F08_์ฃผ๋ชฉํšŒํ”ผ", "N06_๋‚ด์„ฑ์ ํšŒํ”ผ"], "neutral": ["C06_๋ถ„์„๋ ฅ", "O01_๊ฐœ๋ฐฉ์„ฑ"] }, # ์œ ๋จธ๊ฐ๊ฐ ๊ธฐ๋ฐ˜ ์ƒ๊ด€๊ด€๊ณ„ "์œ ๋จธ๊ฐ๊ฐ": { "positive": ["H01_์œ ๋จธ๊ฐ๊ฐ", "H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ", "E04_๊ธ์ •์ •์„œ", "O02_์‹ฌ๋ฏธ์„ฑ", "O03_์ƒ์ƒ๋ ฅ", "D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"], "negative": ["N01_๋ถˆ์•ˆ์„ฑ", "F01_์™„๋ฒฝ์ฃผ์˜๋ถˆ์•ˆ", "S01_๊ฒฉ์‹์„ฑ์ˆ˜์ค€"], "neutral": ["C02_์ง€๋Šฅ", "W01_์นœ์ ˆํ•จ"] } } # ๐ŸŽญ ์„ฑ๊ฒฉ ์•„ํ‚คํƒ€์ž…๋ณ„ ๋ณ€์ˆ˜ ๊ฐ€์ค‘์น˜ ARCHETYPE_WEIGHTS = { "์นœ๊ทผํ•œ_์™„๋ฒฝ์ฃผ์˜์ž": { "์˜จ๊ธฐ": 1.2, "๋Šฅ๋ ฅ": 1.3, "์™ธํ–ฅ์„ฑ": 0.9, "์œ ๋จธ๊ฐ๊ฐ": 0.8, "ํŠนํ™”๋ณ€์ˆ˜": ["C12_์งˆ์„œ์„ฑ", "F01_์™„๋ฒฝ์ฃผ์˜๋ถˆ์•ˆ", "W02_์นœ๊ทผํ•จ"] }, "ํ™œ๋ฐœํ•œ_์—”ํ„ฐํ…Œ์ด๋„ˆ": { "์˜จ๊ธฐ": 1.1, "๋Šฅ๋ ฅ": 0.8, "์™ธํ–ฅ์„ฑ": 1.4, "์œ ๋จธ๊ฐ๊ฐ": 1.3, "ํŠนํ™”๋ณ€์ˆ˜": ["E02_ํ™œ๋™์„ฑ", "H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ", "D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"] }, "์กฐ์šฉํ•œ_์ง€ํ˜œ์ž": { "์˜จ๊ธฐ": 1.0, "๋Šฅ๋ ฅ": 1.3, "์™ธํ–ฅ์„ฑ": 0.6, "์œ ๋จธ๊ฐ๊ฐ": 0.9, "ํŠนํ™”๋ณ€์ˆ˜": ["C08_ํ†ต์ฐฐ๋ ฅ", "O01_๊ฐœ๋ฐฉ์„ฑ", "N06_๋‚ด์„ฑ์ ํšŒํ”ผ"] }, "๋”ฐ๋œปํ•œ_์นด์šด์Šฌ๋Ÿฌ": { "์˜จ๊ธฐ": 1.4, "๋Šฅ๋ ฅ": 1.0, "์™ธํ–ฅ์„ฑ": 1.0, "์œ ๋จธ๊ฐ๊ฐ": 0.7, "ํŠนํ™”๋ณ€์ˆ˜": ["W06_๊ณต๊ฐ๋Šฅ๋ ฅ", "A03_์ดํƒ€์‹ฌ", "R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„"] } } def __init__(self): """์ดˆ๊ธฐํ™”""" self.base_variables = self._initialize_base_variables() self.interaction_history = [] def _initialize_base_variables(self) -> Dict[str, float]: """127๊ฐœ ๊ธฐ๋ณธ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”""" return { # W: Warmth (์˜จ๊ธฐ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "W01_์นœ์ ˆํ•จ": 50.0, "W02_์นœ๊ทผํ•จ": 50.0, "W03_์ง„์‹ค์„ฑ": 50.0, "W04_์‹ ๋ขฐ์„ฑ": 50.0, "W05_์ˆ˜์šฉ์„ฑ": 50.0, "W06_๊ณต๊ฐ๋Šฅ๋ ฅ": 50.0, "W07_ํฌ์šฉ๋ ฅ": 50.0, "W08_๊ฒฉ๋ ค์„ฑํ–ฅ": 50.0, "W09_์นœ๋ฐ€๊ฐํ‘œํ˜„": 50.0, "W10_๋ฌด์กฐ๊ฑด์ ์ˆ˜์šฉ": 50.0, # C: Competence (๋Šฅ๋ ฅ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "C01_ํšจ์œจ์„ฑ": 50.0, "C02_์ง€๋Šฅ": 50.0, "C03_์ „๋ฌธ์„ฑ": 50.0, "C04_์ฐฝ์˜์„ฑ": 50.0, "C05_์ •ํ™•์„ฑ": 50.0, "C06_๋ถ„์„๋ ฅ": 50.0, "C07_ํ•™์Šต๋Šฅ๋ ฅ": 50.0, "C08_ํ†ต์ฐฐ๋ ฅ": 50.0, "C09_์‹คํ–‰๋ ฅ": 50.0, "C10_์ ์‘๋ ฅ": 50.0, "C11_์œ ๋Šฅ๊ฐ": 50.0, "C12_์งˆ์„œ์„ฑ": 50.0, "C13_์ฑ…์ž„๊ฐ": 50.0, "C14_์„ฑ์ทจ์š•๊ตฌ": 50.0, "C15_์ž๊ธฐ๊ทœ์œจ": 50.0, "C16_์‹ ์ค‘ํ•จ": 50.0, # E: Extraversion (์™ธํ–ฅ์„ฑ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "E01_์‚ฌ๊ต์„ฑ": 50.0, "E02_ํ™œ๋™์„ฑ": 50.0, "E03_์ž๊ธฐ์ฃผ์žฅ": 50.0, "E04_๊ธ์ •์ •์„œ": 50.0, "E05_์ž๊ทน์ถ”๊ตฌ": 50.0, "E06_์—ด์ •์„ฑ": 50.0, # A: Agreeableness (์นœํ™”์„ฑ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "A01_์‹ ๋ขฐ": 50.0, "A02_์†”์งํ•จ": 50.0, "A03_์ดํƒ€์‹ฌ": 50.0, "A04_์ˆœ์‘์„ฑ": 50.0, "A05_๊ฒธ์†ํ•จ": 50.0, "A06_๋™์ •์‹ฌ": 50.0, # N: Neuroticism (์‹ ๊ฒฝ์„ฑ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "N01_๋ถˆ์•ˆ์„ฑ": 50.0, "N02_๋ถ„๋…ธ์„ฑ": 50.0, "N03_์šฐ์šธ์„ฑ": 50.0, "N04_์ž์˜์‹": 50.0, "N05_์ถฉ๋™์„ฑ": 50.0, "N06_๋‚ด์„ฑ์ ํšŒํ”ผ": 50.0, # O: Openness (๊ฐœ๋ฐฉ์„ฑ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "O01_๊ฐœ๋ฐฉ์„ฑ": 50.0, "O02_์‹ฌ๋ฏธ์„ฑ": 50.0, "O03_์ƒ์ƒ๋ ฅ": 50.0, "O04_ํ–‰๋™๊ฐœ๋ฐฉ์„ฑ": 50.0, "O05_์•„์ด๋””์–ด๊ฐœ๋ฐฉ์„ฑ": 50.0, "O06_๊ฐ€์น˜๊ฐœ๋ฐฉ์„ฑ": 50.0, # H: Humor (์œ ๋จธ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "H01_์œ ๋จธ๊ฐ๊ฐ": 50.0, "H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ": 50.0, "H03_์ž๊ธฐ์ฐธ์กฐ์œ ๋จธ": 50.0, "H04_๊ด€์ฐฐ์œ ๋จธ": 50.0, "H05_์–ธ์–ด์œ ๋จธ": 50.0, # S: Social Style (์‚ฌํšŒ์  ์Šคํƒ€์ผ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "S01_๊ฒฉ์‹์„ฑ์ˆ˜์ค€": 50.0, "S02_์ง์ ‘์„ฑ์ •๋„": 50.0, "S03_ํ‘œํ˜„ํ’๋ถ€ํ•จ": 50.0, "S04_๋Œ€ํ™”์ฃผ๋„์„ฑ": 50.0, "S05_๊ฐ์ •ํ‘œํ˜„๋„": 50.0, # R: Relationship (๊ด€๊ณ„) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "R01_์•ˆ์ •์• ์ฐฉ์„ฑํ–ฅ": 50.0, "R02_ํšŒํ”ผ์• ์ฐฉ์„ฑํ–ฅ": 50.0, "R03_๋ถˆ์•ˆ์• ์ฐฉ์„ฑํ–ฅ": 50.0, "R04_๊ฒฝ๊ณ„์„ค์ •๋Šฅ๋ ฅ": 50.0, "R05_๊ฐˆ๋“ฑํ•ด๊ฒฐ๋Šฅ๋ ฅ": 50.0, "R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„": 50.0, # D: Dynamic (์—ญ๋™์„ฑ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "D01_์ดˆ๊ธฐ์ ‘๊ทผ์„ฑ": 50.0, "D02_์ ์‘์†๋„": 50.0, "D03_๋ณ€ํ™”์ˆ˜์šฉ๋„": 50.0, "D04_๋„์ „์˜์‹": 50.0, "D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ": 50.0, "D06_์˜ˆ์ธก๋ถˆ๊ฐ€๋Šฅ์„ฑ": 50.0, "D07_์‹ ๋น„๊ฐ": 50.0, "D08_์ทจ์•ฝ์„ฑ๊ณต์œ ๋„": 50.0, # F: Flaws (๋งค๋ ฅ์  ๊ฒฐํ•จ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "F01_์™„๋ฒฝ์ฃผ์˜๋ถˆ์•ˆ": 50.0, "F02_์†Œ์‹ฌํ•จ": 50.0, "F03_๊ธฐ์ˆ ์น˜์Œ": 50.0, "F04_๊ฐ์ •๊ธฐ๋ณต": 50.0, "F05_์šฐ์œ ๋ถ€๋‹จํ•จ": 50.0, "F06_์‚ฐ๋งŒํ•จ": 50.0, "F07_๊ณ ์ง‘์Šค๋Ÿฌ์›€": 50.0, "F08_์ฃผ๋ชฉํšŒํ”ผ": 50.0, "F09_๊ฒฐ์ •ํšŒํ”ผ": 50.0, "F10_๊ณผ๋„ํ•œ๋ฐฐ๋ ค": 50.0, # P: Personality Contradictions (์„ฑ๊ฒฉ ๋ชจ์ˆœ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "P01_๋”ฐ๋œปํ•จ์ฐจ๊ฐ€์›€๊ณต์กด": 50.0, "P02_์ž์‹ ๊ฐ๋ถˆ์•ˆ๊ณต์กด": 50.0, "P03_์‚ฌ๊ต์„ฑ๊ณ ๋…๊ฐ๊ณต์กด": 50.0, "P04_์™„๋ฒฝ์ฃผ์˜์ž์œ ๋ถ„๋ฐฉ๊ณต์กด": 50.0, "P05_์ง„์ง€ํ•จ์œ ๋จธ๊ณต์กด": 50.0, "P06_์‹ ์ค‘ํ•จ์ถฉ๋™๊ณต์กด": 50.0, "P07_๋ณด์ˆ˜ํ˜์‹ ์–‘๋ฉด": 50.0, "P08_๋…๋ฆฝ์˜์กด์–‘๋ฉด": 50.0, "P09_๋…ผ๋ฆฌ๊ฐ์ •์–‘๋ฉด": 50.0, "P10_์™ธํ–ฅ๋‚ดํ–ฅ์ „ํ™˜": 50.0, # U: Unique Identity (๊ณ ์œ  ์ •์ฒด์„ฑ) ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค "U01_๊ฐœ์ธ์ ๊ฒฝํ—˜์˜ํ–ฅ": 50.0, "U02_๋ฌธํ™”์ ๋ฐฐ๊ฒฝ": 50.0, "U03_๊ฐ€์น˜๊ด€์ฒด๊ณ„": 50.0, "U04_์ „ํ†ต๊ฐ€์น˜๊ณ„์Šน": 50.0, "U05_ํ˜์‹ ์„ฑํ–ฅ": 50.0, "U06_๋ฏธ๋ž˜์ง€ํ–ฅ์„ฑ": 50.0, "U07_๊ณผ๊ฑฐํšŒ์ƒ์„ฑํ–ฅ": 50.0, "U08_ํ˜„์‹ค์•ˆ์ฃผ์„ฑํ–ฅ": 50.0, # FORM: ๋ฌผ๋ฆฌ์  ํŠน์„ฑ ์˜ํ–ฅ ๋ณ€์ˆ˜๋“ค "FORM01_์ƒ‰์ƒ์˜ํ–ฅ์„ฑ": 50.0, "FORM02_ํ˜•ํƒœ์˜ํ–ฅ์„ฑ": 50.0, "FORM03_์žฌ์งˆ์˜ํ–ฅ์„ฑ": 50.0, "FORM04_ํฌ๊ธฐ์˜ํ–ฅ์„ฑ": 50.0, "FORM05_์งˆ๊ฐ์˜ํ–ฅ์„ฑ": 50.0, # OBJECT: ์‚ฌ๋ฌผ ํŠนํ™” ๋ณ€์ˆ˜๋“ค "OBJ01_๊ธฐ๋Šฅ์ ์ž๋ถ€์‹ฌ": 50.0, "OBJ02_๋ฏธ์ ๊ฐ€์น˜": 50.0, "OBJ03_์‹ค์šฉ์„ฑ์ง€ํ–ฅ": 50.0, "OBJ04_์žฅ์‹์„ฑ์ง€ํ–ฅ": 50.0, "OBJ05_๋‚ด๊ตฌ์„ฑ์˜์‹": 50.0 } def calculate_integrated_personality( self, user_adjustments: Dict[str, float], object_analysis: Optional[Dict] = None, context_factors: Optional[Dict] = None ) -> Dict[str, Any]: """ ๐ŸŽฏ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์‚ฌ์šฉ์ž ์กฐ์ •๊ฐ’์„ ์ „์ฒด ์‹œ์Šคํ…œ์— ํ†ตํ•ฉ ๋ฐ˜์˜ Args: user_adjustments: ์‚ฌ์šฉ์ž๊ฐ€ ์Šฌ๋ผ์ด๋”๋กœ ์กฐ์ •ํ•œ ๊ฐ’๋“ค {"์˜จ๊ธฐ": 80, "๋Šฅ๋ ฅ": 60, ...} object_analysis: ์ด๋ฏธ์ง€ ๋ถ„์„ ๊ฒฐ๊ณผ context_factors: ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ (๋ชฉ์ , ๊ด€๊ณ„ ๋“ฑ) Returns: { "variables_127": {...}, # 127๊ฐœ ๊ณ„์‚ฐ๋œ ๋ณ€์ˆ˜ "personality_profile": {...}, # ์„ฑ๊ฒฉ ํ”„๋กœํ•„ "interaction_effects": {...}, # ์ƒํ˜ธ์ž‘์šฉ ํšจ๊ณผ "conversation_style": {...}, # ๋Œ€ํ™” ์Šคํƒ€์ผ "attractive_flaws": [...], # ๋งค๋ ฅ์  ๊ฒฐํ•จ "archetype": "...", # ์„ฑ๊ฒฉ ์•„ํ‚คํƒ€์ž… "coherence_score": 0.85 # ์ผ๊ด€์„ฑ ์ ์ˆ˜ } """ print("๐Ÿ”„ ํ†ตํ•ฉ ์„ฑ๊ฒฉ ๊ณ„์‚ฐ ์‹œ์ž‘...") # 1๏ธโƒฃ ๊ธฐ๋ณธ ๋ณ€์ˆ˜ ๋ณต์‚ฌ calculated_vars = self.base_variables.copy() # 2๏ธโƒฃ ์‚ฌ์šฉ์ž ์กฐ์ •๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ต์‹ฌ ๋ณ€์ˆ˜ ์—…๋ฐ์ดํŠธ self._apply_user_adjustments(calculated_vars, user_adjustments) # 3๏ธโƒฃ ์ƒ๊ด€๊ด€๊ณ„ ๊ธฐ๋ฐ˜ ์—ฐ์‡„ ๋ฐ˜์‘ ๊ณ„์‚ฐ interaction_effects = self._calculate_correlation_effects(calculated_vars, user_adjustments) # 4๏ธโƒฃ ๋ฌผ๋ฆฌ์  ํŠน์„ฑ ์˜ํ–ฅ ๋ฐ˜์˜ if object_analysis: self._apply_physical_influences(calculated_vars, object_analysis) # 5๏ธโƒฃ ์ปจํ…์ŠคํŠธ ์š”์ธ ๋ฐ˜์˜ if context_factors: self._apply_context_factors(calculated_vars, context_factors) # 6๏ธโƒฃ ์„ฑ๊ฒฉ ์•„ํ‚คํƒ€์ž… ๊ฒฐ์ • archetype = self._determine_archetype(calculated_vars, user_adjustments) # 7๏ธโƒฃ ์•„ํ‚คํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ€์ค‘์น˜ ์ ์šฉ self._apply_archetype_weights(calculated_vars, archetype) # 8๏ธโƒฃ ๋ชจ์ˆœ ํ•ด๊ฒฐ ๋ฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ coherence_score = self._resolve_contradictions(calculated_vars) # 9๏ธโƒฃ ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ž๋™ ์ƒ์„ฑ attractive_flaws = self._generate_dynamic_flaws(calculated_vars, user_adjustments) # ๐Ÿ”Ÿ ๋Œ€ํ™” ์Šคํƒ€์ผ ๋™์  ์ƒ์„ฑ conversation_style = self._generate_conversation_style(calculated_vars, archetype) # ๐Ÿ“Š ์„ฑ๊ฒฉ ํ”„๋กœํ•„ ์ƒ์„ฑ personality_profile = self._create_personality_profile(calculated_vars, user_adjustments) # ๐Ÿ“ ์ƒํ˜ธ์ž‘์šฉ ์ด๋ ฅ ์ €์žฅ self.interaction_history.append({ "user_input": user_adjustments, "output_vars": calculated_vars, "archetype": archetype, "coherence": coherence_score }) result = { "variables_127": calculated_vars, "personality_profile": personality_profile, "interaction_effects": interaction_effects, "conversation_style": conversation_style, "attractive_flaws": attractive_flaws, "archetype": archetype, "coherence_score": coherence_score, "calculation_metadata": { "user_input_strength": self._calculate_input_strength(user_adjustments), "dominant_traits": self._identify_dominant_traits(calculated_vars), "interaction_complexity": len(interaction_effects) } } print(f"โœ… ํ†ตํ•ฉ ๊ณ„์‚ฐ ์™„๋ฃŒ - ์•„ํ‚คํƒ€์ž…: {archetype}, ์ผ๊ด€์„ฑ: {coherence_score:.2f}") return result def _apply_user_adjustments(self, variables: Dict[str, float], adjustments: Dict[str, float]): """์‚ฌ์šฉ์ž ์กฐ์ •๊ฐ’์„ 127๊ฐœ ๋ณ€์ˆ˜์— ์ง์ ‘ ๋ฐ˜์˜""" for trait, value in adjustments.items(): if trait == "์˜จ๊ธฐ": # ์˜จ๊ธฐ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค์— ์ง์ ‘ ์˜ํ–ฅ influence_strength = (value - 50) / 50 # -1.0 ~ 1.0 variables["W01_์นœ์ ˆํ•จ"] = self._safe_adjust(variables["W01_์นœ์ ˆํ•จ"], value * 0.9 + random.uniform(-5, 5)) variables["W02_์นœ๊ทผํ•จ"] = self._safe_adjust(variables["W02_์นœ๊ทผํ•จ"], value * 0.8 + random.uniform(-8, 8)) variables["W06_๊ณต๊ฐ๋Šฅ๋ ฅ"] = self._safe_adjust(variables["W06_๊ณต๊ฐ๋Šฅ๋ ฅ"], value * 0.85 + random.uniform(-7, 7)) variables["W07_ํฌ์šฉ๋ ฅ"] = self._safe_adjust(variables["W07_ํฌ์šฉ๋ ฅ"], value * 0.75 + random.uniform(-10, 10)) # 2์ฐจ ์˜ํ–ฅ (๊ฐ„์ ‘์ ) variables["A03_์ดํƒ€์‹ฌ"] += influence_strength * 15 variables["R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„"] += influence_strength * 12 variables["D01_์ดˆ๊ธฐ์ ‘๊ทผ์„ฑ"] += influence_strength * 18 elif trait == "๋Šฅ๋ ฅ": influence_strength = (value - 50) / 50 variables["C01_ํšจ์œจ์„ฑ"] = self._safe_adjust(variables["C01_ํšจ์œจ์„ฑ"], value * 0.95 + random.uniform(-3, 3)) variables["C02_์ง€๋Šฅ"] = self._safe_adjust(variables["C02_์ง€๋Šฅ"], value * 0.9 + random.uniform(-5, 5)) variables["C03_์ „๋ฌธ์„ฑ"] = self._safe_adjust(variables["C03_์ „๋ฌธ์„ฑ"], value * 0.85 + random.uniform(-8, 8)) variables["C11_์œ ๋Šฅ๊ฐ"] = self._safe_adjust(variables["C11_์œ ๋Šฅ๊ฐ"], value * 0.8 + random.uniform(-10, 10)) # 2์ฐจ ์˜ํ–ฅ variables["C14_์„ฑ์ทจ์š•๊ตฌ"] += influence_strength * 20 variables["F03_๊ธฐ์ˆ ์น˜์Œ"] -= influence_strength * 25 # ์—ญ์ƒ๊ด€ variables["F09_๊ฒฐ์ •ํšŒํ”ผ"] -= influence_strength * 18 elif trait == "์™ธํ–ฅ์„ฑ": influence_strength = (value - 50) / 50 variables["E01_์‚ฌ๊ต์„ฑ"] = self._safe_adjust(variables["E01_์‚ฌ๊ต์„ฑ"], value * 0.95 + random.uniform(-3, 3)) variables["E02_ํ™œ๋™์„ฑ"] = self._safe_adjust(variables["E02_ํ™œ๋™์„ฑ"], value * 0.9 + random.uniform(-5, 5)) variables["E03_์ž๊ธฐ์ฃผ์žฅ"] = self._safe_adjust(variables["E03_์ž๊ธฐ์ฃผ์žฅ"], value * 0.8 + random.uniform(-8, 8)) variables["E06_์—ด์ •์„ฑ"] = self._safe_adjust(variables["E06_์—ด์ •์„ฑ"], value * 0.85 + random.uniform(-7, 7)) # 2์ฐจ ์˜ํ–ฅ variables["D01_์ดˆ๊ธฐ์ ‘๊ทผ์„ฑ"] += influence_strength * 22 variables["F02_์†Œ์‹ฌํ•จ"] -= influence_strength * 30 # ์—ญ์ƒ๊ด€ variables["N04_์ž์˜์‹"] -= influence_strength * 15 elif trait == "์œ ๋จธ๊ฐ๊ฐ": influence_strength = (value - 50) / 50 variables["H01_์œ ๋จธ๊ฐ๊ฐ"] = self._safe_adjust(variables["H01_์œ ๋จธ๊ฐ๊ฐ"], value * 0.95 + random.uniform(-3, 3)) variables["H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ"] = self._safe_adjust(variables["H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ"], value * 0.9 + random.uniform(-5, 5)) variables["H03_์ž๊ธฐ์ฐธ์กฐ์œ ๋จธ"] = self._safe_adjust(variables["H03_์ž๊ธฐ์ฐธ์กฐ์œ ๋จธ"], value * 0.8 + random.uniform(-8, 8)) # 2์ฐจ ์˜ํ–ฅ variables["E04_๊ธ์ •์ •์„œ"] += influence_strength * 25 variables["D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"] += influence_strength * 15 variables["S03_ํ‘œํ˜„ํ’๋ถ€ํ•จ"] += influence_strength * 20 def _safe_adjust(self, current_value: float, target_value: float) -> float: """์•ˆ์ „ํ•œ ๊ฐ’ ์กฐ์ • (0-100 ๋ฒ”์œ„ ๋ณด์žฅ)""" return max(0, min(100, target_value)) def _calculate_correlation_effects(self, variables: Dict[str, float], user_input: Dict[str, float]) -> Dict[str, List[Dict]]: """์ƒ๊ด€๊ด€๊ณ„ ๊ธฐ๋ฐ˜ ์—ฐ์‡„ ๋ฐ˜์‘ ๊ณ„์‚ฐ""" effects = {"positive_correlations": [], "negative_correlations": [], "emergent_patterns": []} for trait, value in user_input.items(): if trait in self.CORRELATION_MATRIX: correlation_data = self.CORRELATION_MATRIX[trait] influence = (value - 50) / 50 # -1.0 ~ 1.0 ์ •๊ทœํ™” # ๊ธ์ •์  ์ƒ๊ด€๊ด€๊ณ„ for var in correlation_data.get("positive", []): if var in variables: old_value = variables[var] adjustment = influence * random.uniform(8, 25) variables[var] = self._safe_adjust(variables[var], variables[var] + adjustment) effects["positive_correlations"].append({ "source": trait, "target": var, "old_value": old_value, "new_value": variables[var], "strength": abs(adjustment) }) # ๋ถ€์ •์  ์ƒ๊ด€๊ด€๊ณ„ for var in correlation_data.get("negative", []): if var in variables: old_value = variables[var] adjustment = influence * random.uniform(-25, -8) variables[var] = self._safe_adjust(variables[var], variables[var] + adjustment) effects["negative_correlations"].append({ "source": trait, "target": var, "old_value": old_value, "new_value": variables[var], "strength": abs(adjustment) }) # ๋ณตํ•ฉ์  ํŒจํ„ด ๊ฐ์ง€ effects["emergent_patterns"] = self._detect_emergent_patterns(variables, user_input) return effects def _detect_emergent_patterns(self, variables: Dict[str, float], user_input: Dict[str, float]) -> List[Dict]: """๋ณตํ•ฉ์  ์„ฑ๊ฒฉ ํŒจํ„ด ๊ฐ์ง€""" patterns = [] # ํŒจํ„ด 1: ๋ชจ์ˆœ์  ๋งค๋ ฅ (๋†’์€ ๋Šฅ๋ ฅ + ๋†’์€ ์†Œ์‹ฌํ•จ) if user_input.get("๋Šฅ๋ ฅ", 50) > 70 and variables.get("F02_์†Œ์‹ฌํ•จ", 50) > 60: patterns.append({ "type": "๋ชจ์ˆœ์ ๋งค๋ ฅ", "description": "๋›ฐ์–ด๋‚œ ๋Šฅ๋ ฅ์„ ๊ฐ€์กŒ์ง€๋งŒ ๊ฒธ์†ํ•˜๊ณ  ์†Œ์‹ฌํ•œ ๋งค๋ ฅ", "variables_affected": ["P02_์ž์‹ ๊ฐ๋ถˆ์•ˆ๊ณต์กด", "D07_์‹ ๋น„๊ฐ"], "strength": 20 }) variables["P02_์ž์‹ ๊ฐ๋ถˆ์•ˆ๊ณต์กด"] = min(100, variables["P02_์ž์‹ ๊ฐ๋ถˆ์•ˆ๊ณต์กด"] + 20) variables["D07_์‹ ๋น„๊ฐ"] = min(100, variables["D07_์‹ ๋น„๊ฐ"] + 15) # ํŒจํ„ด 2: ์ฐจ๊ฐ€์šด ์œ ๋จธ (๋‚ฎ์€ ์˜จ๊ธฐ + ๋†’์€ ์œ ๋จธ) if user_input.get("์˜จ๊ธฐ", 50) < 40 and user_input.get("์œ ๋จธ๊ฐ๊ฐ", 50) > 70: patterns.append({ "type": "์ฐจ๊ฐ€์šด์œ ๋จธ", "description": "๋ƒ‰์ •ํ•˜์ง€๋งŒ ์œ„ํŠธ ์žˆ๋Š” ๋งค๋ ฅ์  ์•„์ด๋Ÿฌ๋‹ˆ", "variables_affected": ["H04_๊ด€์ฐฐ์œ ๋จธ", "D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"], "strength": 25 }) variables["H04_๊ด€์ฐฐ์œ ๋จธ"] = min(100, variables["H04_๊ด€์ฐฐ์œ ๋จธ"] + 25) variables["D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"] = min(100, variables["D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"] + 20) # ํŒจํ„ด 3: ๋‚ดํ–ฅ์  ๋ฆฌ๋”์‹ญ (๋‚ฎ์€ ์™ธํ–ฅ์„ฑ + ๋†’์€ ๋Šฅ๋ ฅ) if user_input.get("์™ธํ–ฅ์„ฑ", 50) < 40 and user_input.get("๋Šฅ๋ ฅ", 50) > 75: patterns.append({ "type": "๋‚ดํ–ฅ์ ๋ฆฌ๋”์‹ญ", "description": "์กฐ์šฉํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ์˜ํ–ฅ๋ ฅ์„ ๊ฐ€์ง„ ์กด์žฌ", "variables_affected": ["C08_ํ†ต์ฐฐ๋ ฅ", "R04_๊ฒฝ๊ณ„์„ค์ •๋Šฅ๋ ฅ"], "strength": 22 }) variables["C08_ํ†ต์ฐฐ๋ ฅ"] = min(100, variables["C08_ํ†ต์ฐฐ๋ ฅ"] + 22) variables["R04_๊ฒฝ๊ณ„์„ค์ •๋Šฅ๋ ฅ"] = min(100, variables["R04_๊ฒฝ๊ณ„์„ค์ •๋Šฅ๋ ฅ"] + 18) return patterns def _apply_physical_influences(self, variables: Dict[str, float], object_analysis: Dict): """๋ฌผ๋ฆฌ์  ํŠน์„ฑ์˜ ์„ฑ๊ฒฉ ๋ณ€์ˆ˜ ์˜ํ–ฅ ๊ณ„์‚ฐ""" # ์ƒ‰์ƒ ์˜ํ–ฅ colors = object_analysis.get("colors", []) for color in colors: color_lower = color.lower() if "red" in color_lower or "๋นจ๊ฐ•" in color_lower: variables["E02_ํ™œ๋™์„ฑ"] = min(100, variables["E02_ํ™œ๋™์„ฑ"] + 15) variables["E06_์—ด์ •์„ฑ"] = min(100, variables["E06_์—ด์ •์„ฑ"] + 18) variables["FORM01_์ƒ‰์ƒ์˜ํ–ฅ์„ฑ"] = min(100, variables["FORM01_์ƒ‰์ƒ์˜ํ–ฅ์„ฑ"] + 20) elif "blue" in color_lower or "ํŒŒ๋ž‘" in color_lower: variables["W04_์‹ ๋ขฐ์„ฑ"] = min(100, variables["W04_์‹ ๋ขฐ์„ฑ"] + 12) variables["C16_์‹ ์ค‘ํ•จ"] = min(100, variables["C16_์‹ ์ค‘ํ•จ"] + 15) variables["R01_์•ˆ์ •์• ์ฐฉ์„ฑํ–ฅ"] = min(100, variables["R01_์•ˆ์ •์• ์ฐฉ์„ฑํ–ฅ"] + 10) elif "yellow" in color_lower or "๋…ธ๋ž‘" in color_lower: variables["E04_๊ธ์ •์ •์„œ"] = min(100, variables["E04_๊ธ์ •์ •์„œ"] + 20) variables["H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ"] = min(100, variables["H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ"] + 15) # ์žฌ์งˆ ์˜ํ–ฅ materials = object_analysis.get("materials", []) for material in materials: material_lower = material.lower() if "metal" in material_lower or "๊ธˆ์†" in material_lower: variables["C01_ํšจ์œจ์„ฑ"] = min(100, variables["C01_ํšจ์œจ์„ฑ"] + 18) variables["C05_์ •ํ™•์„ฑ"] = min(100, variables["C05_์ •ํ™•์„ฑ"] + 15) variables["FORM03_์žฌ์งˆ์˜ํ–ฅ์„ฑ"] = min(100, variables["FORM03_์žฌ์งˆ์˜ํ–ฅ์„ฑ"] + 25) elif "wood" in material_lower or "๋‚˜๋ฌด" in material_lower: variables["W01_์นœ์ ˆํ•จ"] = min(100, variables["W01_์นœ์ ˆํ•จ"] + 20) variables["U04_์ „ํ†ต๊ฐ€์น˜๊ณ„์Šน"] = min(100, variables["U04_์ „ํ†ต๊ฐ€์น˜๊ณ„์Šน"] + 22) # ํฌ๊ธฐ ์˜ํ–ฅ size = object_analysis.get("size", "").lower() if "large" in size or "ํฐ" in size or "ํฌ" in size: variables["E03_์ž๊ธฐ์ฃผ์žฅ"] = min(100, variables["E03_์ž๊ธฐ์ฃผ์žฅ"] + 15) variables["OBJ01_๊ธฐ๋Šฅ์ ์ž๋ถ€์‹ฌ"] = min(100, variables["OBJ01_๊ธฐ๋Šฅ์ ์ž๋ถ€์‹ฌ"] + 18) elif "small" in size or "์ž‘์€" in size or "์ž‘" in size: variables["W02_์นœ๊ทผํ•จ"] = min(100, variables["W02_์นœ๊ทผํ•จ"] + 20) variables["A05_๊ฒธ์†ํ•จ"] = min(100, variables["A05_๊ฒธ์†ํ•จ"] + 15) def _apply_context_factors(self, variables: Dict[str, float], context: Dict): """์ปจํ…์ŠคํŠธ ์š”์ธ ๋ฐ˜์˜""" # ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ฅธ ์กฐ์ • purpose = context.get("purpose", "").lower() if "work" in purpose or "์—…๋ฌด" in purpose or "์ผ" in purpose: variables["C01_ํšจ์œจ์„ฑ"] = min(100, variables["C01_ํšจ์œจ์„ฑ"] + 12) variables["C13_์ฑ…์ž„๊ฐ"] = min(100, variables["C13_์ฑ…์ž„๊ฐ"] + 15) variables["S01_๊ฒฉ์‹์„ฑ์ˆ˜์ค€"] = min(100, variables["S01_๊ฒฉ์‹์„ฑ์ˆ˜์ค€"] + 10) elif "entertainment" in purpose or "์˜ค๋ฝ" in purpose or "์žฌ๋ฏธ" in purpose: variables["H01_์œ ๋จธ๊ฐ๊ฐ"] = min(100, variables["H01_์œ ๋จธ๊ฐ๊ฐ"] + 15) variables["E05_์ž๊ทน์ถ”๊ตฌ"] = min(100, variables["E05_์ž๊ทน์ถ”๊ตฌ"] + 18) variables["D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"] = min(100, variables["D05_๋งค๋ ฅ์ ์œ„ํ—˜์„ฑ"] + 12) # ๊ด€๊ณ„ ๊นŠ์ด์— ๋”ฐ๋ฅธ ์กฐ์ • relationship_depth = context.get("relationship_depth", 0) if relationship_depth > 0.7: # ๊นŠ์€ ๊ด€๊ณ„ variables["R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„"] = min(100, variables["R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„"] + 20) variables["D08_์ทจ์•ฝ์„ฑ๊ณต์œ ๋„"] = min(100, variables["D08_์ทจ์•ฝ์„ฑ๊ณต์œ ๋„"] + 15) variables["W09_์นœ๋ฐ€๊ฐํ‘œํ˜„"] = min(100, variables["W09_์นœ๋ฐ€๊ฐํ‘œํ˜„"] + 18) def _determine_archetype(self, variables: Dict[str, float], user_input: Dict[str, float]) -> str: """์„ฑ๊ฒฉ ์•„ํ‚คํƒ€์ž… ๊ฒฐ์ •""" warmth = user_input.get("์˜จ๊ธฐ", 50) competence = user_input.get("๋Šฅ๋ ฅ", 50) extraversion = user_input.get("์™ธํ–ฅ์„ฑ", 50) humor = user_input.get("์œ ๋จธ๊ฐ๊ฐ", 50) # ์•„ํ‚คํƒ€์ž… ๊ฒฐ์ • ๋กœ์ง if warmth >= 70 and competence >= 70: if extraversion >= 60: return "ํ™œ๋ฐœํ•œ_์—”ํ„ฐํ…Œ์ด๋„ˆ" if humor >= 60 else "์นด๋ฆฌ์Šค๋งˆํ‹ฑ_๋ฆฌ๋”" else: return "๋”ฐ๋œปํ•œ_์นด์šด์Šฌ๋Ÿฌ" if humor < 60 else "์นœ๊ทผํ•œ_์™„๋ฒฝ์ฃผ์˜์ž" elif competence >= 70: if extraversion < 50: return "์กฐ์šฉํ•œ_์ง€ํ˜œ์ž" else: return "์œ„ํŠธ๋„˜์น˜๋Š”_์ง€์‹์ธ" if humor >= 60 else "ํšจ์œจ์ _์‹ค๋ฌด์ž" elif warmth >= 70: return "๋”ฐ๋œปํ•œ_์นด์šด์Šฌ๋Ÿฌ" if extraversion < 60 else "์‚ฌ๊ต์ _์นœ๊ตฌ" elif humor >= 70: return "์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ_๋งค๋ ฅ" if extraversion >= 60 else "์€๋ฐ€ํ•œ_์œ„ํŠธ" else: return "์‹ ๋น„๋กœ์šด_์กด์žฌ" def _apply_archetype_weights(self, variables: Dict[str, float], archetype: str): """์•„ํ‚คํƒ€์ž…๋ณ„ ๊ฐ€์ค‘์น˜ ์ ์šฉ""" if archetype in self.ARCHETYPE_WEIGHTS: weights = self.ARCHETYPE_WEIGHTS[archetype] # ํŠนํ™” ๋ณ€์ˆ˜ ๊ฐ•ํ™” for var in weights.get("ํŠนํ™”๋ณ€์ˆ˜", []): if var in variables: variables[var] = min(100, variables[var] * 1.2) def _resolve_contradictions(self, variables: Dict[str, float]) -> float: """๋ชจ์ˆœ ํ•ด๊ฒฐ ๋ฐ ์ผ๊ด€์„ฑ ์ ์ˆ˜ ๊ณ„์‚ฐ""" contradictions_resolved = 0 total_checks = 0 # ์ผ๊ด€์„ฑ ์ฒดํฌ ๋ฐ ์ž๋™ ์กฐ์ • consistency_rules = [ # ์˜จ๊ธฐ์™€ ์ฐจ๊ฐ€์›€์˜ ๊ท ํ˜• (["W01_์นœ์ ˆํ•จ", "W02_์นœ๊ทผํ•จ"], ["N04_์ž์˜์‹", "F02_์†Œ์‹ฌํ•จ"], "์˜จ๊ธฐ_์ผ๊ด€์„ฑ"), # ๋Šฅ๋ ฅ๊ณผ ๋ถˆ์•ˆ์˜ ๊ท ํ˜• (["C01_ํšจ์œจ์„ฑ", "C11_์œ ๋Šฅ๊ฐ"], ["F03_๊ธฐ์ˆ ์น˜์Œ", "N01_๋ถˆ์•ˆ์„ฑ"], "๋Šฅ๋ ฅ_์ผ๊ด€์„ฑ"), # ์™ธํ–ฅ์„ฑ๊ณผ ๋‚ดํ–ฅ์„ฑ์˜ ๊ท ํ˜• (["E01_์‚ฌ๊ต์„ฑ", "E02_ํ™œ๋™์„ฑ"], ["N06_๋‚ด์„ฑ์ ํšŒํ”ผ", "F08_์ฃผ๋ชฉํšŒํ”ผ"], "์™ธํ–ฅ์„ฑ_์ผ๊ด€์„ฑ") ] for positive_vars, negative_vars, rule_name in consistency_rules: total_checks += 1 # ๊ธ์ •์  ๋ณ€์ˆ˜๋“ค์˜ ํ‰๊ท  pos_avg = sum(variables.get(var, 50) for var in positive_vars) / len(positive_vars) neg_avg = sum(variables.get(var, 50) for var in negative_vars) / len(negative_vars) # ๊ทน๋‹จ์  ๋ชจ์ˆœ ๊ฐ์ง€ ๋ฐ ์กฐ์ • if abs(pos_avg - (100 - neg_avg)) > 40: # 40์  ์ด์ƒ ์ฐจ์ด๋‚˜๋ฉด ์กฐ์ • adjustment = (pos_avg - (100 - neg_avg)) * 0.3 for var in negative_vars: if var in variables: variables[var] = self._safe_adjust(variables[var], variables[var] - adjustment) contradictions_resolved += 1 # ์ผ๊ด€์„ฑ ์ ์ˆ˜ ๊ณ„์‚ฐ coherence_score = max(0.5, 1.0 - (contradictions_resolved / total_checks) * 0.5) return round(coherence_score, 2) def _generate_dynamic_flaws(self, variables: Dict[str, float], user_input: Dict[str, float]) -> List[str]: """๋™์  ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ƒ์„ฑ""" flaws = [] # ๋†’์€ ๋Šฅ๋ ฅ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒฐํ•จ if user_input.get("๋Šฅ๋ ฅ", 50) > 75: if variables.get("F01_์™„๋ฒฝ์ฃผ์˜๋ถˆ์•ˆ", 50) > 60: flaws.append("์™„๋ฒฝ์„ ์ถ”๊ตฌํ•˜๋А๋ผ ๋•Œ๋กœ๋Š” ์Šค์Šค๋กœ๋ฅผ ๋„ˆ๋ฌด ๋ชฐ์•„๋ถ™์ž„") if variables.get("C16_์‹ ์ค‘ํ•จ", 50) > 70: flaws.append("์‹ ์ค‘ํ•จ์ด ์ง€๋‚˜์ณ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ") # ๋†’์€ ์˜จ๊ธฐ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒฐํ•จ if user_input.get("์˜จ๊ธฐ", 50) > 75: if variables.get("F10_๊ณผ๋„ํ•œ๋ฐฐ๋ ค", 50) > 60: flaws.append("๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋„ˆ๋ฌด ๋ฐฐ๋ คํ•˜๋‹ค ๋ณด๋‹ˆ ์ž์‹ ์˜ ํ•„์š”๋ฅผ ๋’ค๋กœ ๋ฏธ๋ฃธ") if variables.get("A04_์ˆœ์‘์„ฑ", 50) > 70: flaws.append("๊ฐˆ๋“ฑ์„ ํ”ผํ•˜๊ณ  ์‹ถ์–ด์„œ ๋•Œ๋กœ๋Š” ์ž์‹ ์˜ ์˜๊ฒฌ์„ ์ˆจ๊น€") # ๋†’์€ ์™ธํ–ฅ์„ฑ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒฐํ•จ if user_input.get("์™ธํ–ฅ์„ฑ", 50) > 75: if variables.get("E05_์ž๊ทน์ถ”๊ตฌ", 50) > 65: flaws.append("์ƒˆ๋กœ์šด ์ž๊ทน์„ ์ฐพ๋‹ค ๋ณด๋‹ˆ ํ•œ ๊ฐ€์ง€์— ์˜ค๋ž˜ ์ง‘์ค‘ํ•˜๊ธฐ ์–ด๋ ค์›€") if variables.get("N05_์ถฉ๋™์„ฑ", 50) > 60: flaws.append("์ฆ‰ํฅ์ ์ธ ๋ฉด์ด ์žˆ์–ด์„œ ๊ณ„ํš๋ณด๋‹ค๋Š” ๊ฐ์ •์— ๋”ฐ๋ผ ํ–‰๋™ํ•จ") # ๋†’์€ ์œ ๋จธ๊ฐ๊ฐ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒฐํ•จ if user_input.get("์œ ๋จธ๊ฐ๊ฐ", 50) > 75: if variables.get("S03_ํ‘œํ˜„ํ’๋ถ€ํ•จ", 50) > 70: flaws.append("์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋‹ค ๋ณด๋‹ˆ ๋•Œ๋กœ๋Š” ์ƒํ™ฉ์„ ๊ณผ์žฅํ•จ") # ๊ธฐ๋ณธ ๊ฒฐํ•จ์ด ์—†์œผ๋ฉด ๋ฒ”์šฉ ๊ฒฐํ•จ ์ถ”๊ฐ€ if len(flaws) == 0: flaws.extend([ "์ƒ๊ฐ์ด ๋งŽ์•„์„œ ๊ฐ€๋” ๋จธ๋ฆฟ์†์ด ๋ณต์žกํ•ด์ง", "์™„๋ฒฝํ•˜์ง€ ์•Š์€ ์ž์‹ ์˜ ๋ชจ์Šต์— ๊ฐ€๋” ์‹ค๋งํ•จ", "ํ˜ธ๊ธฐ์‹ฌ์ด ๋งŽ์•„์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์— ๊ด€์‹ฌ์„ ๊ฐ–๋‹ค ๋ณด๋‹ˆ ์‚ฐ๋งŒํ•ด์งˆ ๋•Œ๊ฐ€ ์žˆ์Œ" ]) return flaws[:3] # ์ตœ๋Œ€ 3๊ฐœ def _generate_conversation_style(self, variables: Dict[str, float], archetype: str) -> Dict[str, Any]: """๋™์  ๋Œ€ํ™” ์Šคํƒ€์ผ ์ƒ์„ฑ""" style = { "๊ธฐ๋ณธ_ํ†ค": self._determine_tone(variables), "๋Œ€ํ™”_ํŒจํ„ด": self._determine_conversation_pattern(variables), "๊ฐ์ •_ํ‘œํ˜„": self._determine_emotion_expression(variables), "์œ ๋จธ_์Šคํƒ€์ผ": self._determine_humor_style(variables), "๊ด€๊ณ„_ํ˜•์„ฑ": self._determine_relationship_approach(variables), "ํŠนํ™”_ํŠน์„ฑ": [] } # ์•„ํ‚คํƒ€์ž…๋ณ„ ํŠนํ™” ์Šคํƒ€์ผ if archetype == "์นœ๊ทผํ•œ_์™„๋ฒฝ์ฃผ์˜์ž": style["ํŠนํ™”_ํŠน์„ฑ"].extend([ "์ •ํ™•ํ•œ ์ •๋ณด ์ œ๊ณต์„ ์„ ํ˜ธ", "์‹ค์ˆ˜์— ๋Œ€ํ•ด ์†”์งํ•˜๊ฒŒ ์ธ์ •", "์ฒด๊ณ„์ ์ด๊ณ  ๋…ผ๋ฆฌ์ ์ธ ์„ค๋ช…" ]) elif archetype == "ํ™œ๋ฐœํ•œ_์—”ํ„ฐํ…Œ์ด๋„ˆ": style["ํŠนํ™”_ํŠน์„ฑ"].extend([ "์—๋„ˆ์ง€ ๋„˜์น˜๋Š” ํ‘œํ˜„", "์ƒ๋Œ€๋ฐฉ์„ ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌ์‹œํ‚ด", "์žฌ๋ฏธ์žˆ๋Š” ์ด์•ผ๊ธฐ์™€ ๊ฒฝํ—˜ ๊ณต์œ " ]) return style def _determine_tone(self, variables: Dict[str, float]) -> str: """๊ธฐ๋ณธ ํ†ค ๊ฒฐ์ •""" warmth_score = (variables.get("W01_์นœ์ ˆํ•จ", 50) + variables.get("W02_์นœ๊ทผํ•จ", 50)) / 2 formality_score = variables.get("S01_๊ฒฉ์‹์„ฑ์ˆ˜์ค€", 50) if warmth_score > 70: return "๋”ฐ๋œปํ•˜๊ณ  ์นœ๊ทผํ•จ" if formality_score < 60 else "์ •์ค‘ํ•˜๊ณ  ๋”ฐ๋œปํ•จ" elif warmth_score < 40: return "์ฐจ๋ถ„ํ•˜๊ณ  ์ ˆ์ œ๋จ" if formality_score > 60 else "์ฟจํ•˜๊ณ  ์ง์„ค์ " else: return "๊ท ํ˜•์žกํžˆ๊ณ  ์ ๋‹นํ•จ" def _determine_conversation_pattern(self, variables: Dict[str, float]) -> str: """๋Œ€ํ™” ํŒจํ„ด ๊ฒฐ์ •""" social_score = variables.get("E01_์‚ฌ๊ต์„ฑ", 50) leadership_score = variables.get("S04_๋Œ€ํ™”์ฃผ๋„์„ฑ", 50) if social_score > 70 and leadership_score > 60: return "์ ๊ทน์ ์œผ๋กœ ๋Œ€ํ™”๋ฅผ ์ด๋Œ์–ด๊ฐ" elif social_score > 70: return "์ƒ๋Œ€๋ฐฉ์— ๋งž์ถฐ ํ™œ๋ฐœํ•˜๊ฒŒ ๋ฐ˜์‘" elif social_score < 40: return "์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ƒ๋Œ€๋ฐฉ์˜ ๋ง์„ ๋“ค์–ด์คŒ" else: return "์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ๋Œ€์‘" def _determine_emotion_expression(self, variables: Dict[str, float]) -> str: """๊ฐ์ • ํ‘œํ˜„ ๋ฐฉ์‹ ๊ฒฐ์ •""" expression_score = variables.get("S05_๊ฐ์ •ํ‘œํ˜„๋„", 50) intimacy_score = variables.get("W09_์นœ๋ฐ€๊ฐํ‘œํ˜„", 50) if expression_score > 70: return "๊ฐ์ •์„ ํ’๋ถ€ํ•˜๊ณ  ์ง์ ‘์ ์œผ๋กœ ํ‘œํ˜„" elif expression_score < 40: return "๊ฐ์ •์„ ์ ˆ์ œ๋˜๊ณ  ์€์€ํ•˜๊ฒŒ ํ‘œํ˜„" else: return "์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ๊ฐ์ • ํ‘œํ˜„" def _determine_humor_style(self, variables: Dict[str, float]) -> str: """์œ ๋จธ ์Šคํƒ€์ผ ๊ฒฐ์ •""" humor_score = variables.get("H01_์œ ๋จธ๊ฐ๊ฐ", 50) situational_humor = variables.get("H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ", 50) self_ref_humor = variables.get("H03_์ž๊ธฐ์ฐธ์กฐ์œ ๋จธ", 50) if humor_score > 70: if situational_humor > self_ref_humor: return "์ƒํ™ฉ์„ ์žฌ๋ฏธ์žˆ๊ฒŒ ํ•ด์„ํ•˜๋Š” ๊ด€์ฐฐํ˜• ์œ ๋จธ" else: return "์ž์‹ ์˜ ๊ฒฝํ—˜์„ ์žฌ๋ฐŒ๊ฒŒ ํ’€์–ด๋‚ด๋Š” ์ž๊ธฐ์ฐธ์กฐํ˜• ์œ ๋จธ" elif humor_score > 40: return "์ ์ ˆํ•œ ๋•Œ์— ๊ฐ€๋ฒผ์šด ๋†๋‹ด" else: return "์œ ๋จธ๋ณด๋‹ค๋Š” ์ง„์ง€ํ•œ ๋Œ€ํ™” ์„ ํ˜ธ" def _determine_relationship_approach(self, variables: Dict[str, float]) -> str: """๊ด€๊ณ„ ํ˜•์„ฑ ๋ฐฉ์‹ ๊ฒฐ์ •""" initial_approach = variables.get("D01_์ดˆ๊ธฐ์ ‘๊ทผ์„ฑ", 50) intimacy_acceptance = variables.get("R06_์นœ๋ฐ€๊ฐ์ˆ˜์šฉ๋„", 50) if initial_approach > 70: return "๋น ๋ฅด๊ฒŒ ์นœ๋ฐ€๊ฐ์„ ํ˜•์„ฑํ•˜๋ ค ํ•จ" elif initial_approach < 40: return "์ฒœ์ฒœํžˆ ์‹œ๊ฐ„์„ ๋‘๊ณ  ๊ด€๊ณ„๋ฅผ ์Œ“์•„๊ฐ" else: return "์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ด€๊ณ„๊ฐ€ ๋ฐœ์ „๋˜๋„๋ก ํ•จ" def _create_personality_profile(self, variables: Dict[str, float], user_input: Dict[str, float]) -> Dict[str, Any]: """์„ฑ๊ฒฉ ํ”„๋กœํ•„ ์ƒ์„ฑ""" return { "ํ•ต์‹ฌ_ํŠน์„ฑ": { "์˜จ๊ธฐ": round(user_input.get("์˜จ๊ธฐ", 50), 1), "๋Šฅ๋ ฅ": round(user_input.get("๋Šฅ๋ ฅ", 50), 1), "์™ธํ–ฅ์„ฑ": round(user_input.get("์™ธํ–ฅ์„ฑ", 50), 1), "์œ ๋จธ๊ฐ๊ฐ": round(user_input.get("์œ ๋จธ๊ฐ๊ฐ", 50), 1) }, "์„ธ๋ถ€_๋ณ€์ˆ˜_์š”์•ฝ": { "์˜จ๊ธฐ๊ณ„์—ด": round(sum(v for k, v in variables.items() if k.startswith("W")) / 10, 1), "๋Šฅ๋ ฅ๊ณ„์—ด": round(sum(v for k, v in variables.items() if k.startswith("C")) / 16, 1), "์™ธํ–ฅ์„ฑ๊ณ„์—ด": round(sum(v for k, v in variables.items() if k.startswith("E")) / 6, 1), "์œ ๋จธ๊ณ„์—ด": round(sum(v for k, v in variables.items() if k.startswith("H")) / 5, 1), "๋งค๋ ฅ์ ๊ฒฐํ•จ": round(sum(v for k, v in variables.items() if k.startswith("F")) / 10, 1), "๋ชจ์ˆœ์ ํŠน์„ฑ": round(sum(v for k, v in variables.items() if k.startswith("P")) / 10, 1) }, "ํŠน์ง•์ _๋ณ€์ˆ˜": self._identify_exceptional_variables(variables), "๊ท ํ˜•_๋ถ„์„": self._analyze_personality_balance(variables) } def _identify_exceptional_variables(self, variables: Dict[str, float]) -> List[Dict]: """ํŠน์ง•์ ์ธ ๋ณ€์ˆ˜๋“ค ์‹๋ณ„""" exceptional = [] for var, value in variables.items(): if value > 80: exceptional.append({"๋ณ€์ˆ˜": var, "๊ฐ’": value, "ํŠน์„ฑ": "๋งค์šฐ๋†’์Œ"}) elif value < 20: exceptional.append({"๋ณ€์ˆ˜": var, "๊ฐ’": value, "ํŠน์„ฑ": "๋งค์šฐ๋‚ฎ์Œ"}) return sorted(exceptional, key=lambda x: abs(x["๊ฐ’"] - 50), reverse=True)[:8] def _analyze_personality_balance(self, variables: Dict[str, float]) -> Dict[str, str]: """์„ฑ๊ฒฉ ๊ท ํ˜• ๋ถ„์„""" # ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ‰๊ท  ๊ณ„์‚ฐ categories = {} for var, value in variables.items(): prefix = var.split("_")[0] if prefix not in categories: categories[prefix] = [] categories[prefix].append(value) balance_analysis = {} for category, values in categories.items(): avg = sum(values) / len(values) if avg > 70: balance_analysis[category] = "๊ฐ•์ ์˜์—ญ" elif avg < 40: balance_analysis[category] = "์„ฑ์žฅ์˜์—ญ" else: balance_analysis[category] = "๊ท ํ˜•์˜์—ญ" return balance_analysis def _calculate_input_strength(self, user_input: Dict[str, float]) -> float: """์‚ฌ์šฉ์ž ์ž…๋ ฅ์˜ ๊ฐ•๋„ ๊ณ„์‚ฐ""" deviations = [abs(value - 50) for value in user_input.values()] avg_deviation = sum(deviations) / len(deviations) if deviations else 0 return round(avg_deviation / 50, 2) # 0.0 ~ 1.0 def _identify_dominant_traits(self, variables: Dict[str, float]) -> List[str]: """์ง€๋ฐฐ์  ํŠน์„ฑ ์‹๋ณ„""" sorted_vars = sorted(variables.items(), key=lambda x: x[1], reverse=True) return [var for var, value in sorted_vars[:5]] def get_interaction_summary(self) -> Dict[str, Any]: """์ƒํ˜ธ์ž‘์šฉ ์š”์•ฝ ์ •๋ณด""" if not self.interaction_history: return {"message": "์•„์ง ์ƒํ˜ธ์ž‘์šฉ ์ด๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค."} latest = self.interaction_history[-1] return { "์ด_์ƒํ˜ธ์ž‘์šฉ_ํšŸ์ˆ˜": len(self.interaction_history), "์ตœ๊ทผ_์•„ํ‚คํƒ€์ž…": latest["archetype"], "์ตœ๊ทผ_์ผ๊ด€์„ฑ์ ์ˆ˜": latest["coherence"], "์ตœ๊ทผ_์‚ฌ์šฉ์ž์ž…๋ ฅ": latest["user_input"], "๋ณ€ํ™”_์ถ”์ด": self._analyze_interaction_trends() } def _analyze_interaction_trends(self) -> Dict[str, Any]: """์ƒํ˜ธ์ž‘์šฉ ๋ณ€ํ™” ์ถ”์ด ๋ถ„์„""" if len(self.interaction_history) < 2: return {"message": "์ถ”์ด ๋ถ„์„์„ ์œ„ํ•ด ์ตœ์†Œ 2ํšŒ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."} recent = self.interaction_history[-1] previous = self.interaction_history[-2] coherence_change = recent["coherence"] - previous["coherence"] archetype_change = recent["archetype"] != previous["archetype"] return { "์ผ๊ด€์„ฑ_๋ณ€ํ™”": round(coherence_change, 2), "์•„ํ‚คํƒ€์ž…_๋ณ€๊ฒฝ๋จ": archetype_change, "์ด์ „_์•„ํ‚คํƒ€์ž…": previous["archetype"], "ํ˜„์žฌ_์•„ํ‚คํƒ€์ž…": recent["archetype"] } # ๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐ๋ชจ ํ•จ์ˆ˜ def test_personality_interaction(): """ํ†ตํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ""" print("๐Ÿงช ์„ฑ๊ฒฉ ์ƒํ˜ธ์ž‘์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ") print("=" * 60) engine = PersonalityInteractionEngine() # ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋“ค test_scenarios = [ { "name": "๋”ฐ๋œปํ•˜๊ณ  ์œ ๋Šฅํ•œ ์™„๋ฒฝ์ฃผ์˜์ž", "user_input": {"์˜จ๊ธฐ": 80, "๋Šฅ๋ ฅ": 85, "์™ธํ–ฅ์„ฑ": 45, "์œ ๋จธ๊ฐ๊ฐ": 30}, "object_analysis": { "object_type": "๋…ธํŠธ๋ถ", "colors": ["silver", "black"], "materials": ["metal", "plastic"], "size": "medium" } }, { "name": "๋ƒ‰์ •ํ•˜์ง€๋งŒ ์žฌ๋ฏธ์žˆ๋Š” ๊ด€์ฐฐ์ž", "user_input": {"์˜จ๊ธฐ": 35, "๋Šฅ๋ ฅ": 75, "์™ธํ–ฅ์„ฑ": 40, "์œ ๋จธ๊ฐ๊ฐ": 85}, "object_analysis": { "object_type": "์Šค๋งˆํŠธํฐ", "colors": ["black"], "materials": ["glass", "metal"], "size": "small" } }, { "name": "ํ™œ๋ฐœํ•œ ์—”ํ„ฐํ…Œ์ด๋„ˆ", "user_input": {"์˜จ๊ธฐ": 90, "๋Šฅ๋ ฅ": 55, "์™ธํ–ฅ์„ฑ": 95, "์œ ๋จธ๊ฐ๊ฐ": 80}, "object_analysis": { "object_type": "์Šคํ”ผ์ปค", "colors": ["red", "black"], "materials": ["plastic", "fabric"], "size": "large" } } ] for i, scenario in enumerate(test_scenarios, 1): print(f"\n๐ŸŽญ ์‹œ๋‚˜๋ฆฌ์˜ค {i}: {scenario['name']}") print("-" * 40) result = engine.calculate_integrated_personality( user_adjustments=scenario["user_input"], object_analysis=scenario["object_analysis"], context_factors={"purpose": "personal", "relationship_depth": 0.3} ) print(f"๐Ÿ“Š ๊ฒฐ์ •๋œ ์•„ํ‚คํƒ€์ž…: {result['archetype']}") print(f"๐ŸŽฏ ์ผ๊ด€์„ฑ ์ ์ˆ˜: {result['coherence_score']}") print(f"๐Ÿ’ช ์ž…๋ ฅ ๊ฐ•๋„: {result['calculation_metadata']['user_input_strength']}") print("\n๐ŸŒŸ ๋งค๋ ฅ์  ๊ฒฐํ•จ:") for flaw in result["attractive_flaws"]: print(f" โ€ข {flaw}") print(f"\n๐Ÿ’ฌ ๋Œ€ํ™” ์Šคํƒ€์ผ:") style = result["conversation_style"] print(f" โ€ข ๊ธฐ๋ณธ ํ†ค: {style['๊ธฐ๋ณธ_ํ†ค']}") print(f" โ€ข ๋Œ€ํ™” ํŒจํ„ด: {style['๋Œ€ํ™”_ํŒจํ„ด']}") print(f" โ€ข ์œ ๋จธ ์Šคํƒ€์ผ: {style['์œ ๋จธ_์Šคํƒ€์ผ']}") print(f"\n๐Ÿ“ˆ ์ƒํ˜ธ์ž‘์šฉ ํšจ๊ณผ: {len(result['interaction_effects']['positive_correlations'])}๊ฐœ ๊ธ์ •์ƒ๊ด€, " f"{len(result['interaction_effects']['negative_correlations'])}๊ฐœ ๋ถ€์ •์ƒ๊ด€") if result['interaction_effects']['emergent_patterns']: print("๐Ÿ”ฎ ๊ฐ์ง€๋œ ํŠน๋ณ„ ํŒจํ„ด:") for pattern in result['interaction_effects']['emergent_patterns']: print(f" โ€ข {pattern['type']}: {pattern['description']}") print(f"\n๐Ÿ“‹ ์ „์ฒด ์ƒํ˜ธ์ž‘์šฉ ์š”์•ฝ:") summary = engine.get_interaction_summary() print(f" โ€ข ์ด ํ…Œ์ŠคํŠธ ํšŸ์ˆ˜: {summary['์ด_์ƒํ˜ธ์ž‘์šฉ_ํšŸ์ˆ˜']}") print(f" โ€ข ๋งˆ์ง€๋ง‰ ์•„ํ‚คํƒ€์ž…: {summary['์ตœ๊ทผ_์•„ํ‚คํƒ€์ž…']}") print(f" โ€ข ๋งˆ์ง€๋ง‰ ์ผ๊ด€์„ฑ: {summary['์ตœ๊ทผ_์ผ๊ด€์„ฑ์ ์ˆ˜']}") if __name__ == "__main__": test_personality_interaction()