






import tempfile

import numpy as np
import torch
from transformers import AutoTokenizer, TaEncoderModel

from diffusers import DDPMScheduler, UNetaDConditionModel
from diffusers.models.attention_processor import AttnAddedKVProcessor
from diffusers.pipelines.deepfloyd_if import IFWatermarker
from diffusers.utils.testing_utils import torch_device

from ..test_pipelines_common import to_np





class 			__a  :







 def 					__lowercase					(		self					:   str						):


      '''simple docstring'''






      torch.manual_seed(0						)
      UpperCamelCase__			:   int       				=  TaEncoderModel.from_pretrained("hf-internal-testing/tiny-random-t5"						)

      torch.manual_seed(0						)
      UpperCamelCase__			:   int       				=  AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-t5"						)

      torch.manual_seed(0						)
      UpperCamelCase__			:   int       				=  UNetaDConditionModel(
          sample_size=32							,   layers_per_block=1							,   block_out_channels=[32, 64]							,   down_block_types=[
              "ResnetDownsampleBlock2D",
              "SimpleCrossAttnDownBlock2D",
          ]							,   mid_block_type="UNetMidBlock2DSimpleCrossAttn"							,   up_block_types=["SimpleCrossAttnUpBlock2D", "ResnetUpsampleBlock2D"]							,   in_channels=3							,   out_channels=6							,   cross_attention_dim=32							,   encoder_hid_dim=32							,   attention_head_dim=8							,   addition_embed_type="text"							,   addition_embed_type_num_heads=2							,   cross_attention_norm="group_norm"							,   resnet_time_scale_shift="scale_shift"							,   act_fn="gelu"							,   )
      unet.set_attn_processor(AttnAddedKVProcessor()						)  # For reproducibility tests

      torch.manual_seed(0						)
      UpperCamelCase__			:   int       				=  DDPMScheduler(
          num_train_timesteps=10_00							,   beta_schedule="squaredcos_cap_v2"							,   beta_start=0.0_0_0_1							,   beta_end=0.0_2							,   thresholding=UpperCamelCase_							,   dynamic_thresholding_ratio=0.9_5							,   sample_max_value=1.0							,   prediction_type="epsilon"							,   variance_type="learned_range"							,   )

      torch.manual_seed(0						)
      UpperCamelCase__			:   Optional[Any]       				=  IFWatermarker()

      return {
          "text_encoder": text_encoder,
          "tokenizer": tokenizer,
          "unet": unet,
          "scheduler": scheduler,
          "watermarker": watermarker,
          "safety_checker": None,
          "feature_extractor": None,
      }







 def 					__lowercase					(		self					:   int						):


      '''simple docstring'''






      torch.manual_seed(0						)
      UpperCamelCase__			:   int       				=  TaEncoderModel.from_pretrained("hf-internal-testing/tiny-random-t5"						)

      torch.manual_seed(0						)
      UpperCamelCase__			:   List[str]       				=  AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-t5"						)

      torch.manual_seed(0						)
      UpperCamelCase__			:   List[str]       				=  UNetaDConditionModel(
          sample_size=32							,   layers_per_block=[1, 2]							,   block_out_channels=[32, 64]							,   down_block_types=[
              "ResnetDownsampleBlock2D",
              "SimpleCrossAttnDownBlock2D",
          ]							,   mid_block_type="UNetMidBlock2DSimpleCrossAttn"							,   up_block_types=["SimpleCrossAttnUpBlock2D", "ResnetUpsampleBlock2D"]							,   in_channels=6							,   out_channels=6							,   cross_attention_dim=32							,   encoder_hid_dim=32							,   attention_head_dim=8							,   addition_embed_type="text"							,   addition_embed_type_num_heads=2							,   cross_attention_norm="group_norm"							,   resnet_time_scale_shift="scale_shift"							,   act_fn="gelu"							,   class_embed_type="timestep"							,   mid_block_scale_factor=1.4_1_4							,   time_embedding_act_fn="gelu"							,   time_embedding_dim=32							,   )
      unet.set_attn_processor(AttnAddedKVProcessor()						)  # For reproducibility tests

      torch.manual_seed(0						)
      UpperCamelCase__			:   Optional[int]       				=  DDPMScheduler(
          num_train_timesteps=10_00							,   beta_schedule="squaredcos_cap_v2"							,   beta_start=0.0_0_0_1							,   beta_end=0.0_2							,   thresholding=UpperCamelCase_							,   dynamic_thresholding_ratio=0.9_5							,   sample_max_value=1.0							,   prediction_type="epsilon"							,   variance_type="learned_range"							,   )

      torch.manual_seed(0						)
      UpperCamelCase__			:   Tuple       				=  DDPMScheduler(
          num_train_timesteps=10_00							,   beta_schedule="squaredcos_cap_v2"							,   beta_start=0.0_0_0_1							,   beta_end=0.0_2							,   )

      torch.manual_seed(0						)
      UpperCamelCase__			:   str       				=  IFWatermarker()

      return {
          "text_encoder": text_encoder,
          "tokenizer": tokenizer,
          "unet": unet,
          "scheduler": scheduler,
          "image_noising_scheduler": image_noising_scheduler,
          "watermarker": watermarker,
          "safety_checker": None,
          "feature_extractor": None,
      }







 def 					__lowercase					(		self					:   List[Any]						):


      '''simple docstring'''






      UpperCamelCase__			:   List[Any]       				=  self.get_dummy_components()
      UpperCamelCase__			:   List[Any]       				=  self.pipeline_class(**UpperCamelCase_						)
      pipe.to(UpperCamelCase_						)
      pipe.set_progress_bar_config(disable=UpperCamelCase_						)

      UpperCamelCase__			:   int       				=  self.get_dummy_inputs(UpperCamelCase_						)

      UpperCamelCase__			:   List[str]       				=  inputs['''prompt''']
      UpperCamelCase__			:   Tuple       				=  inputs['''generator''']
      UpperCamelCase__			:   Optional[Any]       				=  inputs['''num_inference_steps''']
      UpperCamelCase__			:   List[str]       				=  inputs['''output_type''']

      if "image" in inputs:
           UpperCamelCase__			:   Optional[int]       				=  inputs['''image''']
      else:
           UpperCamelCase__			:   Optional[Any]       				=  None

      if "mask_image" in inputs:
           UpperCamelCase__			:   List[Any]       				=  inputs['''mask_image''']
      else:
           UpperCamelCase__			:   Union[str, Any]       				=  None

      if "original_image" in inputs:
           UpperCamelCase__			:   Optional[Any]       				=  inputs['''original_image''']
      else:
           UpperCamelCase__			:   Optional[Any]       				=  None

      UpperCamelCase__			:   Tuple       				=  pipe.encode_prompt(UpperCamelCase_						)

      # inputs with prompt converted to embeddings
      UpperCamelCase__			:   List[str]       				=  {
          '''prompt_embeds''': prompt_embeds,
          '''negative_prompt_embeds''': negative_prompt_embeds,
          '''generator''': generator,
          '''num_inference_steps''': num_inference_steps,
          '''output_type''': output_type,
      }

      if image is not None:
           UpperCamelCase__			:   List[str]       				=  image

      if mask_image is not None:
           UpperCamelCase__			:   List[Any]       				=  mask_image

      if original_image is not None:
           UpperCamelCase__			:   Optional[Any]       				=  original_image

      # set all optional components to None
      for optional_component in pipe._optional_components:
           setattr(UpperCamelCase_							,   UpperCamelCase_							,   UpperCamelCase_						)

      UpperCamelCase__			:   List[Any]       				=  pipe(**UpperCamelCase_						)[0]

      with tempfile.TemporaryDirectory() as tmpdir:
           pipe.save_pretrained(UpperCamelCase_						)
           UpperCamelCase__			:   Dict       				=  self.pipeline_class.from_pretrained(UpperCamelCase_						)
           pipe_loaded.to(UpperCamelCase_						)
           pipe_loaded.set_progress_bar_config(disable=UpperCamelCase_						)

      pipe_loaded.unet.set_attn_processor(AttnAddedKVProcessor()						)  # For reproducibility tests

      for optional_component in pipe._optional_components:
           self.assertTrue(
               getattr(UpperCamelCase_							,   UpperCamelCase_						) is None							,   F'`{optional_component}` did not stay set to None after loading.'							,   )

      UpperCamelCase__			:   List[Any]       				=  self.get_dummy_inputs(UpperCamelCase_						)

      UpperCamelCase__			:   str       				=  inputs['''generator''']
      UpperCamelCase__			:   Optional[int]       				=  inputs['''num_inference_steps''']
      UpperCamelCase__			:   Any       				=  inputs['''output_type''']

      # inputs with prompt converted to embeddings
      UpperCamelCase__			:   List[str]       				=  {
          '''prompt_embeds''': prompt_embeds,
          '''negative_prompt_embeds''': negative_prompt_embeds,
          '''generator''': generator,
          '''num_inference_steps''': num_inference_steps,
          '''output_type''': output_type,
      }

      if image is not None:
           UpperCamelCase__			:   Dict       				=  image

      if mask_image is not None:
           UpperCamelCase__			:   int       				=  mask_image

      if original_image is not None:
           UpperCamelCase__			:   Optional[int]       				=  original_image

      UpperCamelCase__			:   str       				=  pipe_loaded(**UpperCamelCase_						)[0]

      UpperCamelCase__			:   Optional[Any]       				=  np.abs(to_np(UpperCamelCase_						) - to_np(UpperCamelCase_						)						).max()
      self.assertLess(UpperCamelCase_							,   1e-4						)







 def 					__lowercase					(		self					:   int						):


      '''simple docstring'''






      UpperCamelCase__			:   Union[str, Any]       				=  self.get_dummy_components()
      UpperCamelCase__			:   List[str]       				=  self.pipeline_class(**UpperCamelCase_						)
      pipe.to(UpperCamelCase_						)
      pipe.set_progress_bar_config(disable=UpperCamelCase_						)

      UpperCamelCase__			:   Optional[Any]       				=  self.get_dummy_inputs(UpperCamelCase_						)
      UpperCamelCase__			:   Optional[int]       				=  pipe(**UpperCamelCase_						)[0]

      with tempfile.TemporaryDirectory() as tmpdir:
           pipe.save_pretrained(UpperCamelCase_						)
           UpperCamelCase__			:   Tuple       				=  self.pipeline_class.from_pretrained(UpperCamelCase_						)
           pipe_loaded.to(UpperCamelCase_						)
           pipe_loaded.set_progress_bar_config(disable=UpperCamelCase_						)

      pipe_loaded.unet.set_attn_processor(AttnAddedKVProcessor()						)  # For reproducibility tests

      UpperCamelCase__			:   Tuple       				=  self.get_dummy_inputs(UpperCamelCase_						)
      UpperCamelCase__			:   int       				=  pipe_loaded(**UpperCamelCase_						)[0]

      UpperCamelCase__			:   Tuple       				=  np.abs(to_np(UpperCamelCase_						) - to_np(UpperCamelCase_						)						).max()
      self.assertLess(UpperCamelCase_							,   1e-4						)



'''simple docstring'''
from collections import defaultdict
class    lowercase	:

		"""simple docstring"""

		def __init__(		self    ,   UpperCamelCase_    ,   UpperCamelCase_							):

							'''simple docstring'''


							UpperCamelCase__   :List[Any]												= total  # total no of tasks (N)

							# DP table will have a dimension of (2^M)*N
							# initially all values are set to -1
							UpperCamelCase__   :Union[str, Any]												= [
							    [-1 for i in range(total + 1							)] for j in range(2 ** len(UpperCamelCase_							)							)
							]

							UpperCamelCase__   :str												= defaultdict(UpperCamelCase_							)  # stores the list of persons for each task

							# final_mask is used to check if all persons are included by setting all bits
							# to 1
							UpperCamelCase__   :Optional[int]												= (1 << len(UpperCamelCase_							)) - 1




		def     lowerCAmelCase__				(		self    ,   UpperCamelCase_    ,   UpperCamelCase_							):

							'''simple docstring'''


							if mask == self.final_mask:
												return 1

							# if not everyone gets the task and no more tasks are available, return 0
							if task_no > self.total_tasks:
												return 0

							# if case already considered
							if self.dp[mask][task_no] != -1:
												return self.dp[mask][task_no]

							# Number of ways when we don't this task in the arrangement
							UpperCamelCase__   :str												= self.count_ways_until(UpperCamelCase_    ,   task_no + 1							)

							# now assign the tasks one by one to all possible persons and recursively
							# assign for the remaining tasks.
							if task_no in self.task:
												for p in self.task[task_no]:
																	# if p is already given a task
																	if mask & (1 << p):
																						continue

																	# assign this task to p and change the mask value. And recursively
																	# assign tasks with the new mask value.
																	total_ways_util += self.count_ways_until(mask | (1 << p)    ,   task_no + 1							)

        # save the value.
							UpperCamelCase__   :Optional[int]												= total_ways_util

							return self.dp[mask][task_no]




		def     lowerCAmelCase__				(		self    ,   UpperCamelCase_							):

							'''simple docstring'''


							for i in range(len(UpperCamelCase_							)							):
												for j in task_performed[i]:
																	self.task[j].append(UpperCamelCase_							)

        # call the function to fill the DP table, final answer is stored in dp[0][1]
							return self.count_ways_until(0    ,   1							)


if __name__ == "__main__":
		__snake_case							      =     5  # total no of tasks (the value of N)

		# the list of tasks that can be done by M persons.
		__snake_case							      =     [[1, 3, 4], [1, 2, 5], [3, 4]]
		print(
		    AssignmentUsingBitmask(task_performed, total_tasks).count_no_of_ways(
		        task_performed
		    )
		)