From 97aa014e767345aac4758d730007bacd4a98aa79 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 30 Aug 2023 17:55:48 +0900 Subject: [PATCH 1/4] wip: xy_capsule support --- efficiency_nodes.py | 56 ++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/efficiency_nodes.py b/efficiency_nodes.py index 11166b6..86dd950 100644 --- a/efficiency_nodes.py +++ b/efficiency_nodes.py @@ -828,6 +828,9 @@ class TSC_KSampler: cnet_stack = var text = f'ControlNetStr: {round(cnet_stack[0][2], 3)}' + elif var_type == "XY_Capsule": + text = var.getLabel() + else: # No matching type found text="" @@ -917,28 +920,36 @@ class TSC_KSampler: # The below function is used to generate the results based on all the processed variables def process_values(model, add_noise, seed, steps, start_at_step, end_at_step, return_with_leftover_noise, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise, vae, vae_decode, - ksampler_adv_flag, latent_list=[], image_tensor_list=[], image_pil_list=[]): + ksampler_adv_flag, latent_list=[], image_tensor_list=[], image_pil_list=[], xy_capsule=None): - if preview_method != "none": - send_command_to_frontend(startListening=True, maxCount=steps - 1, sendBlob=False) + capsule_result = None + if xy_capsule is not None: + capsule_result = xy_capsule.get_result(model, clip, vae) + if capsule_result is not None: + image, latent = capsule_result + latent_list.append(latent) - # Sample using the Comfy KSampler nodes - if ksampler_adv_flag == False: - samples = KSampler().sample(model, seed, steps, cfg, sampler_name, scheduler, - positive, negative, latent_image, denoise=denoise) - else: - samples = KSamplerAdvanced().sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler, - positive, negative, latent_image, start_at_step, end_at_step, - return_with_leftover_noise, denoise=1.0) + if capsule_result is None: + if preview_method != "none": + send_command_to_frontend(startListening=True, maxCount=steps - 1, sendBlob=False) - # Decode images and store - latent = samples[0]["samples"] + # Sample using the Comfy KSampler nodes + if ksampler_adv_flag == False: + samples = KSampler().sample(model, seed, steps, cfg, sampler_name, scheduler, + positive, negative, latent_image, denoise=denoise) + else: + samples = KSamplerAdvanced().sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler, + positive, negative, latent_image, start_at_step, end_at_step, + return_with_leftover_noise, denoise=1.0) - # Add the latent tensor to the tensors list - latent_list.append(latent) + # Decode images and store + latent = samples[0]["samples"] - # Decode the latent tensor - image = vae_decode_latent(latent, vae_decode) + # Add the latent tensor to the tensors list + latent_list.append(latent) + + # Decode the latent tensor + image = vae_decode_latent(latent, vae_decode) # Add the resulting image tensor to image_tensor_list image_tensor_list.append(image) @@ -1006,6 +1017,8 @@ class TSC_KSampler: elif X_type != "Nothing" and Y_type != "Nothing": # Seed control based on loop index during Batch for Y_index, Y in enumerate(Y_value): + if Y_type == "XY_Capsule" and X_type == "XY_Capsule": + Y.set_another_capsule(X) if Y_type == "Seeds++ Batch": # Update seed based on the inner loop index @@ -1019,16 +1032,23 @@ class TSC_KSampler: return_with_leftover_noise, cfg, sampler_name, scheduler, denoise, vae_name, ckpt_name, clip_skip, positive_prompt, negative_prompt, lora_stack, cnet_stack, Y_label, len(Y_value)) + if Y_type == "XY_Capsule": + model, clip, vae = Y.pre_define_model(model, clip, vae) + # Models & Conditionings model, positive, negative, vae = \ define_model(model, clip, positive, negative, positive_prompt, negative_prompt, clip_skip[0], vae, vae_name, ckpt_name, lora_stack, cnet_stack, Y_index, types, script_node_id, cache) # Generate Results + xy_capsule = None + if Y_type == "XY_Capsule": + xy_capsule = Y + latent_list, image_tensor_list, image_pil_list = \ process_values(model, add_noise, seed_updated, steps, start_at_step, end_at_step, return_with_leftover_noise, cfg, sampler_name, scheduler[0], - positive, negative, latent_image, denoise, vae, vae_decode, ksampler_adv_flag) + positive, negative, latent_image, denoise, vae, vae_decode, ksampler_adv_flag, xy_capsule) # Clean up cache if cache_models == "False": From 3b93d96319f0c551df38055ec4d13eff5e5b0245 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 30 Aug 2023 23:34:15 +0900 Subject: [PATCH 2/4] feat:XY_Capsule --- efficiency_nodes.py | 30 +++++++++++++++++++++++++----- tsc_utils.py | 19 ++++++++++++++++++- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/efficiency_nodes.py b/efficiency_nodes.py index 86dd950..2a9cabf 100644 --- a/efficiency_nodes.py +++ b/efficiency_nodes.py @@ -927,7 +927,7 @@ class TSC_KSampler: capsule_result = xy_capsule.get_result(model, clip, vae) if capsule_result is not None: image, latent = capsule_result - latent_list.append(latent) + latent_list.append(latent['samples']) if capsule_result is None: if preview_method != "none": @@ -951,6 +951,9 @@ class TSC_KSampler: # Decode the latent tensor image = vae_decode_latent(latent, vae_decode) + if xy_capsule is not None: + xy_capsule.set_result(image, latent) + # Add the resulting image tensor to image_tensor_list image_tensor_list.append(image) @@ -985,8 +988,13 @@ class TSC_KSampler: # Change the global preview method temporarily during this node's execution set_preview_method(preview_method) + original_model = model.clone() + original_clip = clip.clone() + # Fill Plot Rows (X) for X_index, X in enumerate(X_value): + model = original_model.clone() + clip = original_clip.clone() # Seed control based on loop index during Batch if X_type == "Seeds++ Batch": @@ -1001,24 +1009,34 @@ class TSC_KSampler: return_with_leftover_noise, cfg, sampler_name, scheduler, denoise, vae_name, ckpt_name, clip_skip, positive_prompt, negative_prompt, lora_stack, cnet_stack, X_label, len(X_value)) + if X_type != "Nothing" and Y_type == "Nothing": + if X_type == "XY_Capsule": + model, clip, vae = X.pre_define_model(model, clip, vae) # Models & Conditionings model, positive, negative , vae = \ define_model(model, clip, positive, negative, positive_prompt, negative_prompt, clip_skip[0], vae, vae_name, ckpt_name, lora_stack, cnet_stack, 0, types, script_node_id, cache) + xy_capsule = None + if X_type == "XY_Capsule": + xy_capsule = X + # Generate Results latent_list, image_tensor_list, image_pil_list = \ process_values(model, add_noise, seed_updated, steps, start_at_step, end_at_step, return_with_leftover_noise, cfg, sampler_name, scheduler[0], - positive, negative, latent_image, denoise, vae, vae_decode, ksampler_adv_flag) + positive, negative, latent_image, denoise, vae, vae_decode, ksampler_adv_flag, xy_capsule=xy_capsule) elif X_type != "Nothing" and Y_type != "Nothing": # Seed control based on loop index during Batch for Y_index, Y in enumerate(Y_value): + model = original_model.clone() + clip = original_clip.clone() + if Y_type == "XY_Capsule" and X_type == "XY_Capsule": - Y.set_another_capsule(X) + Y.set_x_capsule(X) if Y_type == "Seeds++ Batch": # Update seed based on the inner loop index @@ -1034,6 +1052,8 @@ class TSC_KSampler: if Y_type == "XY_Capsule": model, clip, vae = Y.pre_define_model(model, clip, vae) + elif X_type == "XY_Capsule": + model, clip, vae = X.pre_define_model(model, clip, vae) # Models & Conditionings model, positive, negative, vae = \ @@ -1048,7 +1068,7 @@ class TSC_KSampler: latent_list, image_tensor_list, image_pil_list = \ process_values(model, add_noise, seed_updated, steps, start_at_step, end_at_step, return_with_leftover_noise, cfg, sampler_name, scheduler[0], - positive, negative, latent_image, denoise, vae, vae_decode, ksampler_adv_flag, xy_capsule) + positive, negative, latent_image, denoise, vae, vae_decode, ksampler_adv_flag, xy_capsule=xy_capsule) # Clean up cache if cache_models == "False": @@ -1547,7 +1567,7 @@ class TSC_XYplot: Y_value = [""] # If types are the same exit. If one isn't "Nothing", print error - if (X_type == Y_type): + if X_type != "XY_Capsule" and (X_type == Y_type): if X_type != "Nothing": print(f"\033[31mXY Plot Error:\033[0m X and Y input types must be different.") return (None,) diff --git a/tsc_utils.py b/tsc_utils.py index cffc222..727dd11 100644 --- a/tsc_utils.py +++ b/tsc_utils.py @@ -600,4 +600,21 @@ def send_command_to_frontend(startListening=False, maxCount=0, sendBlob=False): if websocket_status == True: server_thread = threading.Thread(target=run_server) server_thread.daemon = True - server_thread.start() \ No newline at end of file + server_thread.start() + + +class XY_Capsule: + def pre_define_model(self, model, clip, vae): + return model, clip, vae + + def set_result(self, image, latent): + pass + + def get_result(self, model, clip, vae): + return None + + def set_x_capsule(self, capsule): + return None + + def getLabel(self): + return "Unknown" From 583da4999ef268dca41e7a189fc18c0096473990 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Thu, 31 Aug 2023 13:20:04 +0900 Subject: [PATCH 3/4] indent fix --- efficiency_nodes.py | 74 ++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/efficiency_nodes.py b/efficiency_nodes.py index 118d770..f4f7040 100644 --- a/efficiency_nodes.py +++ b/efficiency_nodes.py @@ -1406,32 +1406,30 @@ class TSC_KSampler: sampler_type, latent_list=[], image_tensor_list=[], image_pil_list=[], xy_capsule=None): capsule_result = None - if xy_capsule is not None: - capsule_result = xy_capsule.get_result(model, clip, vae) - if capsule_result is not None: - image, latent = capsule_result - latent_list.append(latent['samples']) + if xy_capsule is not None: + capsule_result = xy_capsule.get_result(model, clip, vae) + if capsule_result is not None: + image, latent = capsule_result + latent_list.append(latent['samples']) - if capsule_result is None: - if preview_method != "none": - send_command_to_frontend(startListening=True, maxCount=steps - 1, sendBlob=False) + if capsule_result is None: + if preview_method != "none": + send_command_to_frontend(startListening=True, maxCount=steps - 1, sendBlob=False) + samples = sample_latent_image(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, + latent_image, denoise, sampler_type, add_noise, start_at_step, + end_at_step, + return_with_leftover_noise, refiner_model, refiner_positive, + refiner_negative) - samples = sample_latent_image(model, seed, steps, cfg, sampler_name, scheduler, - positive, negative, latent_image, denoise, sampler_type, add_noise, start_at_step, end_at_step, - return_with_leftover_noise, refiner_model, refiner_positive, refiner_negative) + # Add the latent tensor to the tensors list + latent_list.append(samples) - # Add the latent tensor to the tensors list - latent_list.append(samples) + # Decode the latent tensor + image = vae_decode_latent(vae, samples, vae_decode) - # Decode the latent tensor - image = vae_decode_latent(vae, samples, vae_decode) - - if xy_capsule is not None: - xy_capsule.set_result(image, latent) - - # Add the resulting image tensor to image_tensor_list - image_tensor_list.append(image) + # Add the resulting image tensor to image_tensor_list + image_tensor_list.append(image) # Convert the image from tensor to PIL Image and add it to the image_pil_list image_pil_list.append(tensor2pil(image)) @@ -1463,12 +1461,12 @@ class TSC_KSampler: set_preview_method(preview_method) original_model = model.clone() - original_clip = clip.clone() + original_clip = clip.clone() - # Fill Plot Rows (X) - for X_index, X in enumerate(X_value): - model = original_model.clone() - clip = original_clip.clone() + # Fill Plot Rows (X) + for X_index, X in enumerate(X_value): + model = original_model.clone() + clip = original_clip.clone() # Define X parameters and generate labels add_noise, seed, steps, start_at_step, end_at_step, return_with_leftover_noise, cfg,\ @@ -1481,9 +1479,9 @@ class TSC_KSampler: negative_prompt, ascore, lora_stack, cnet_stack, X_label, len(X_value)) - if X_type != "Nothing" and Y_type == "Nothing": - if X_type == "XY_Capsule": - model, clip, vae = X.pre_define_model(model, clip, vae) + if X_type != "Nothing" and Y_type == "Nothing": + if X_type == "XY_Capsule": + model, clip, vae = X.pre_define_model(model, clip, vae) # Models & Conditionings model, positive, negative, refiner_model, refiner_positive, refiner_negative, vae = \ @@ -1505,11 +1503,11 @@ class TSC_KSampler: elif X_type != "Nothing" and Y_type != "Nothing": # Seed control based on loop index during Batch for Y_index, Y in enumerate(Y_value): - model = original_model.clone() - clip = original_clip.clone() + model = original_model.clone() + clip = original_clip.clone() - if Y_type == "XY_Capsule" and X_type == "XY_Capsule": - Y.set_x_capsule(X) + if Y_type == "XY_Capsule" and X_type == "XY_Capsule": + Y.set_x_capsule(X) # Define Y parameters and generate labels add_noise, seed, steps, start_at_step, end_at_step, return_with_leftover_noise, cfg,\ @@ -1522,12 +1520,12 @@ class TSC_KSampler: negative_prompt, ascore, lora_stack, cnet_stack, Y_label, len(Y_value)) if Y_type == "XY_Capsule": - model, clip, vae = Y.pre_define_model(model, clip, vae) - elif X_type == "XY_Capsule": - model, clip, vae = X.pre_define_model(model, clip, vae) + model, clip, vae = Y.pre_define_model(model, clip, vae) + elif X_type == "XY_Capsule": + model, clip, vae = X.pre_define_model(model, clip, vae) - # Models & Conditionings - model, positive, negative, refiner_model, refiner_positive, refiner_negative, vae = \ + # Models & Conditionings + model, positive, negative, refiner_model, refiner_positive, refiner_negative, vae = \ define_model(model, clip, clip_skip[0], refiner_model, refiner_clip, refiner_clip_skip[0], ckpt_name, refiner_name, positive, negative, refiner_positive, refiner_negative, positive_prompt[0], negative_prompt[0], ascore, vae, vae_name, lora_stack, cnet_stack[0], From 6389391aa53e8bf747709dc83891a5d95d0bd5cf Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Thu, 31 Aug 2023 14:01:17 +0900 Subject: [PATCH 4/4] fix --- efficiency_nodes.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/efficiency_nodes.py b/efficiency_nodes.py index f4f7040..b7806da 100644 --- a/efficiency_nodes.py +++ b/efficiency_nodes.py @@ -1410,7 +1410,7 @@ class TSC_KSampler: capsule_result = xy_capsule.get_result(model, clip, vae) if capsule_result is not None: image, latent = capsule_result - latent_list.append(latent['samples']) + latent_list.append(latent) if capsule_result is None: if preview_method != "none": @@ -1428,6 +1428,9 @@ class TSC_KSampler: # Decode the latent tensor image = vae_decode_latent(vae, samples, vae_decode) + if xy_capsule is not None: + xy_capsule.set_result(image, samples) + # Add the resulting image tensor to image_tensor_list image_tensor_list.append(image)