
    ci                          d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
mZ ddlmZ  ej                  e      Z G d de      Zy)	uE  Shot 연관 분석 — 코드 기반 엔티티 오버랩 스코어링.

각 selected shot에 대해 같은 배경(location)의 이전 shot 중
교집합(공통 엔티티) 최대 + 여집합(현재에 없는 엔티티) 최소인 것을 선택.
LLM 호출 없이 shot_director VE + scene_director location 데이터로 계산.
    N)Path)AnyDictList)build_name_indexlookup_name)
StepRunnerc                   4    e Zd ZdZdefdZddeeef   fdZy)ShotDependencyStepuH   Shot 연관 분석 — 배경 기준 + 엔티티 오버랩 스코어링.step_idc                     ddl m} t        |j                        | j                  z  dz  dz  | j
                  z  |z  dz  }|j                         r%t        j                  |j                  d            S y )Nr   )settingscheckpointsepisodeszmanifest.jsonzutf-8)encoding)
app.core.configr   r   projects_dir
project_id
episode_idexistsjsonloads	read_text)selfr   r   cps       Y/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/steps/shot_dependency_step.py_load_prev_checkpointz(ShotDependencyStep._load_prev_checkpoint   su    ,&&'$//9()+/??;'( 	
 99;::bllGl<==    returnc           
      
   | j                  d      }|r!|j                  di       j                  d      sddlm}  |ddd	      dd
lm}  ||| j                  d       | j                  d      }i }|rO|j                  di       j                  d      r.|d   d   D ]#  }t        |j                  dg             ||d   <   % | j                  d      }i }	|rF|j                  di       j                  d      r%|d   d   D ]  }
|
j                  dd      |	|
d   <    | j                  d      }i }|ro|j                  di       j                  d      rN|d   d   D ]C  }|d   }|j                  dg       D ]'  }||d   f}t        |j                  dg             ||<   ) E i }|rO|j                  di       j                  d      r.|d   d   D ]#  }
t        |
j                  dg             ||
d   <   % g }| j                  d      }|rg|j                  d      rVdD ]Q  }|d   j                  |g       D ]7  }|j                  d      s|j                  d      s'|j                  |       9 S t        |d d       }i }|d   d   D ]  }|d   }|j                  dg       D ]n  }||j                  dd      f}t               }|j                  dg       D ]4  }t        ||      }|s|j                  d       s$|j                  |       6 |||<   p  g }|d   d   D ]  }|d   }|j                  |      }|j                  dg       D ]  }|j                  dd      }|||v s||f}|j                  ||j                  |t                           }|j                  |t                     }|r&|D ch c]  }|j                  d       r| } }|| z  }|	j                  |d      }!|j                  |||!|d!         |s	dddd"g id#S g }"t        |      D ]  \  }#}$|$d   |$d   f}%|$d$   }&|$d%   }'d }(d&})|&rt        |#      D ]u  }*||*   }+|+d$   |&k7  r|+d%   },|'|,z  }-|,|'z
  }.|.D ch c]  }|j                  d       s| }/}|.|/z
  }0t        |-      t        |/      d'z  z
  t        |0      z
  }1|1|)k\  sr|1})|+}(w |$d   |$d   g g d(}2|(r6|(d   |(d   |)t!        |$d%   |(d%   z        t!        |(d%   |$d%   z
        d)g|2d*<   |"j                  |2        t#        d+ |"D              }3t$        j'                  d,|3t        |             t        |"      t        |      dd"|"id#S c c}w c c}w )-Nshot_validatordatascenesr   )AppErrorzstep.no_shotsu   shot_extract 결과 없음i  )codemessagestatus_code)assert_no_failed_scenesshot_dependency)consumer_stepshot_selectionselected_shot_indicesscene_indexscene_directorprimary_location shot_directorshots
shot_indexvisible_entity_idspresent_entity_ids
entity_t2i)
characters	locationspropsnameshort_idc                 &    | j                  dd      S )Nr:   r0   )getes    r   <lambda>z-ShotDependencyStep._execute.<locals>.<lambda>R   s    vr):r   c                     | d   S )Nr;    r>   s    r   r@   z-ShotDependencyStep._execute.<locals>.<lambda>R   s	    qQ[}r   )key_fnvalue_fnr7   C)r-   r3   locationentitiesdependencies)completed_countapplicable_countfailed_countr"   rF   rG   i   )r-   r3   location_refscharacter_refs)r-   r3   scoreshared_entitiesextra_entitiesrM   c              3   ,   K   | ]  }|d    s	d  yw)rM      NrB   ).0ds     r   	<genexpr>z.ShotDependencyStep._execute.<locals>.<genexpr>   s     C1/0BQs   
z8shot_dependency: %d/%d shots linked (code-based scoring))r   r=   app.core.errorsr$   "app.core.steps.shot_validator_stepr(   project_configsetappendr   r   
startswithadd	enumeraterangelensortedsumloggerinfo)4r   modeshot_cpr$   r(   sel_cpselected_mapsdirector_cpscene_locationdsshot_director_cpshot_vescsishkeyscene_ve
_ent_itemst2i_cpetyper?   name_to_sidshot_characters	char_sidsr:   sidall_selectedsel_indicesshot_idxve
shot_chars	non_charslocrH   icurrentcur_keycur_loccur_entitiesbest_ref
best_scorejprevprev_entitiesintersection
complementchar_complementnon_char_complementrO   deplinkeds4                                                       r   _executezShotDependencyStep._execute    s   ,,-=>gkk&"599(C09UcfggN)<)<L]^++,<=')fjj,00:F^H-14QUU;RTV5W1XQ}-. . 001AB)+;??626::8D!&)(346FF;Mr4Rr-01 4  55oF$& 0 4 4VR @ D DX N&v.x8&&&"-Br,/0C#&rvv.BB'G#HGCL . 9 $&;??626::8D!&)(3.1"&&9Mr2R.SM*+ 4 ,.
++L9fjj(=++E26AuuV}z):"))!, 7 > '7:E\'

 -/&/(+BM"BffWb)266,23E	FF<4D%k48Cs~~c2!c* 5 (1$ * , $&&/(+BM"B&**2.KffWb)66,2&(k*Ax.C S(,,r35*ABB!0!4!4S#%!@J!02$L1!,,s:KQ	$L')3(,,R4C ''')&.$'$&	)  * ,. '(aQR+R02 2 #L1JAw}-w|/DEGj)G":.LHJqA'?DJ'72 $($4M#/-#?L!.!=J2<&R*QS@Qq*O&R*4*F'-O0Dq0HH3ObKccE
*%*
#' "   '}5%l3!#"$	C #+M#:"*<"8''-gj.AHZDX.X'Y&,Xj-AGJDW-W&X) (O$ $Q 2T CCCNS.	0  #<0 #L 1#\2	
 	
} %MD 'Ss   9U'U'.U,U,N)resume)	__name__
__module____qualname____doc__strr   r   r   r   rB   r   r   r   r      s'    R	S 	T
c3h T
r   r   )r   r   loggingpathlibr   typingr   r   r   app.core.name_matcherr   r   app.core.step_runnerr	   	getLoggerr   rc   r   rB   r   r   <module>r      sA       " " ? +			8	$b
 b
r   