33 lines
1.4 KiB
Python
33 lines
1.4 KiB
Python
import copy
|
|
|
|
|
|
def clone_control_chain(control, clone_hint=True):
|
|
"""Shallow copy the ControlNet chain, optionally cloning hints but sharing models."""
|
|
if control is None:
|
|
return None
|
|
new_control = copy.copy(control)
|
|
if clone_hint and hasattr(control, 'cond_hint_original'):
|
|
hint = getattr(control, 'cond_hint_original', None)
|
|
new_control.cond_hint_original = hint.clone() if hint is not None else None
|
|
if hasattr(control, 'previous_controlnet'):
|
|
new_control.previous_controlnet = clone_control_chain(control.previous_controlnet, clone_hint)
|
|
return new_control
|
|
|
|
|
|
def clone_conditioning(cond_list, clone_hints=True):
|
|
"""Clone conditioning without duplicating ControlNet models."""
|
|
new_cond = []
|
|
for emb, cond_dict in cond_list:
|
|
new_emb = emb.clone() if emb is not None else None
|
|
new_dict = cond_dict.copy()
|
|
if 'control' in new_dict:
|
|
new_dict['control'] = clone_control_chain(new_dict['control'], clone_hints)
|
|
if 'mask' in new_dict and new_dict['mask'] is not None:
|
|
new_dict['mask'] = new_dict['mask'].clone()
|
|
if 'pooled_output' in new_dict and new_dict['pooled_output'] is not None:
|
|
new_dict['pooled_output'] = new_dict['pooled_output'].clone()
|
|
if 'area' in new_dict:
|
|
new_dict['area'] = new_dict['area'][:]
|
|
new_cond.append([new_emb, new_dict])
|
|
return new_cond
|