


import unittest

import torch

from diffusers import VQModel
from diffusers.utils import floats_tensor, torch_device
from diffusers.utils.testing_utils import enable_full_determinism

from .test_modeling_common import ModelTesterMixin, UNetTesterMixin


enable_full_determinism()


class     __UpperCAmelCase							(       __A ,					__A ,					unittest.TestCase							):


     """simple docstring"""
     _lowerCamelCase   =      VQModel
     _lowerCamelCase   =      """sample"""


     @property
     def 	snake_case_  (	self  ,       __A=(32, 32)    ):
        __a					=  4
        __a					=  3

        __a					=  floats_tensor((batch_size, num_channels) + sizes    ).to(__A    )

        return {"sample": image}


     @property
     def 	snake_case_  (	self    ):
        return (3, 32, 32)


     @property
     def 	snake_case_  (	self    ):
        return (3, 32, 32)


     def 	snake_case_  (	self    ):
        __a					=  {
            """block_out_channels""": [32, 64],
            """in_channels""": 3,
            """out_channels""": 3,
            """down_block_types""": ["""DownEncoderBlock2D""", """DownEncoderBlock2D"""],
            """up_block_types""": ["""UpDecoderBlock2D""", """UpDecoderBlock2D"""],
            """latent_channels""": 3,
        }
        __a					=  self.dummy_input
        return init_dict, inputs_dict


     def 	snake_case_  (	self    ):
        pass


     def 	snake_case_  (	self    ):
        pass


     def 	snake_case_  (	self    ):
        __a	,    __a					=  VQModel.from_pretrained("""fusing/vqgan-dummy"""  ,       output_loading_info=__A    )
        self.assertIsNotNone(__A    )
        self.assertEqual(len(loading_info["""missing_keys"""]    )  ,       0    )

        model.to(__A    )
        __a					=  model(**self.dummy_input    )

        assert image is not None, "Make sure output is not None"


     def 	snake_case_  (	self    ):
        __a					=  VQModel.from_pretrained("""fusing/vqgan-dummy"""    )
        model.to(__A    ).eval()

        torch.manual_seed(0    )
        if torch.cuda.is_available():
           torch.cuda.manual_seed_all(0    )

        __a					=  torch.randn(1  ,       model.config.in_channels  ,       model.config.sample_size  ,       model.config.sample_size    )
        __a					=  image.to(__A    )
        with torch.no_grad():
           __a					=  model(__A    ).sample

        __a					=  output[0, -1, -3:, -3:].flatten().cpu()
        # fmt: off
        __a					=  torch.tensor([-0.0153, -0.4044, -0.1880, -0.5161, -0.2418, -0.4072, -0.1612, -0.0633, -0.0143]    )
        # fmt: on
        self.assertTrue(torch.allclose(__A  ,       __A  ,       atol=1E-3    )    )




"""simple docstring"""


from __future__ import annotations

import math





def      lowerCamelCase_					(   __lowerCAmelCase  ,       __lowerCAmelCase							)				->   list:




						'''simple docstring'''



						if len(__lowerCAmelCase							) != 2 or len(a[0]							) != 2 or len(__lowerCAmelCase							) != 2 or len(b[0]							) != 2:
												raise Exception("Matrices are not 2x2"							)
						lowerCamelCase__   =[
						    [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]],
						    [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]],
						]
						return new_matrix





def      lowerCamelCase_					(   __lowerCAmelCase  ,       __lowerCAmelCase							)				->   Dict:




						'''simple docstring'''



						return [
						    [matrix_a[row][col] + matrix_b[row][col] for col in range(len(matrix_a[row]							)							)]
						    for row in range(len(__lowerCAmelCase							)							)
						]





def      lowerCamelCase_					(   __lowerCAmelCase  ,       __lowerCAmelCase							)				->   List[Any]:




						'''simple docstring'''



						return [
						    [matrix_a[row][col] - matrix_b[row][col] for col in range(len(matrix_a[row]							)							)]
						    for row in range(len(__lowerCAmelCase							)							)
						]





def      lowerCamelCase_					(   __lowerCAmelCase							)				->   tuple[list, list, list, list]:




						'''simple docstring'''



						if len(__lowerCAmelCase							) % 2 != 0 or len(a[0]							) % 2 != 0:
												raise Exception("Odd matrices are not supported!"							)

						lowerCamelCase__   =len(__lowerCAmelCase							)
						lowerCamelCase__   =matrix_length // 2

						lowerCamelCase__   =[[a[i][j] for j in range(__lowerCAmelCase  ,       __lowerCAmelCase							)] for i in range(__lowerCAmelCase							)]
						lowerCamelCase__   =[
						    [a[i][j] for j in range(__lowerCAmelCase  ,       __lowerCAmelCase							)] for i in range(__lowerCAmelCase  ,       __lowerCAmelCase							)
						]

						lowerCamelCase__   =[[a[i][j] for j in range(__lowerCAmelCase							)] for i in range(__lowerCAmelCase							)]
						lowerCamelCase__   =[[a[i][j] for j in range(__lowerCAmelCase							)] for i in range(__lowerCAmelCase  ,       __lowerCAmelCase							)]

						return top_left, top_right, bot_left, bot_right





def      lowerCamelCase_					(   __lowerCAmelCase							)				->   tuple[int, int]:




						'''simple docstring'''



						return len(__lowerCAmelCase							), len(matrix[0]							)





def      lowerCamelCase_					(   __lowerCAmelCase							)				->   None:




						'''simple docstring'''



						print("\n".join(str(__lowerCAmelCase							) for line in matrix							)							)





def      lowerCamelCase_					(   __lowerCAmelCase  ,       __lowerCAmelCase							)				->   list:




						'''simple docstring'''



						if matrix_dimensions(__lowerCAmelCase							) == (2, 2):
												return default_matrix_multiplication(__lowerCAmelCase  ,       __lowerCAmelCase							)

						lowerCamelCase__   , lowerCamelCase__   , lowerCamelCase__   , lowerCamelCase__   =split_matrix(__lowerCAmelCase							)
						lowerCamelCase__   , lowerCamelCase__   , lowerCamelCase__   , lowerCamelCase__   =split_matrix(__lowerCAmelCase							)

						lowerCamelCase__   =actual_strassen(__lowerCAmelCase  ,       matrix_subtraction(__lowerCAmelCase  ,       __lowerCAmelCase							)							)
						lowerCamelCase__   =actual_strassen(matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       __lowerCAmelCase							)
						lowerCamelCase__   =actual_strassen(matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       __lowerCAmelCase							)
						lowerCamelCase__   =actual_strassen(__lowerCAmelCase  ,       matrix_subtraction(__lowerCAmelCase  ,       __lowerCAmelCase							)							)
						lowerCamelCase__   =actual_strassen(matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)							)
						lowerCamelCase__   =actual_strassen(matrix_subtraction(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)							)
						lowerCamelCase__   =actual_strassen(matrix_subtraction(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)							)

						lowerCamelCase__   =matrix_addition(matrix_subtraction(matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       __lowerCAmelCase							)  ,       __lowerCAmelCase							)
						lowerCamelCase__   =matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)
						lowerCamelCase__   =matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)
						lowerCamelCase__   =matrix_subtraction(matrix_subtraction(matrix_addition(__lowerCAmelCase  ,       __lowerCAmelCase							)  ,       __lowerCAmelCase							)  ,       __lowerCAmelCase							)

						# construct the new matrix from our 4 quadrants
						lowerCamelCase__   =[]
						for i in range(len(__lowerCAmelCase							)							):
												new_matrix.append(top_left[i] + top_right[i]							)
						for i in range(len(__lowerCAmelCase							)							):
												new_matrix.append(bot_left[i] + bot_right[i]							)
						return new_matrix





def      lowerCamelCase_					(   __lowerCAmelCase  ,       __lowerCAmelCase							)				->   list:




						'''simple docstring'''



						if matrix_dimensions(__lowerCAmelCase							)[1] != matrix_dimensions(__lowerCAmelCase							)[0]:
												lowerCamelCase__   =(
												    "Unable to multiply these matrices, please check the dimensions.\n"
												    F'''Matrix A: {matrixa}\n'''
												    F'''Matrix B: {matrixa}'''
												)
												raise Exception(__lowerCAmelCase							)
						lowerCamelCase__   =matrix_dimensions(__lowerCAmelCase							)
						lowerCamelCase__   =matrix_dimensions(__lowerCAmelCase							)

						if dimensiona[0] == dimensiona[1] and dimensiona[0] == dimensiona[1]:
												return [matrixa, matrixa]

						lowerCamelCase__   =max(*__lowerCAmelCase  ,       *__lowerCAmelCase							)
						lowerCamelCase__   =int(math.pow(2  ,       math.ceil(math.loga(__lowerCAmelCase							)							)							)							)
						lowerCamelCase__   =matrixa
						lowerCamelCase__   =matrixa

						# Adding zeros to the matrices so that the arrays dimensions are the same and also
						# power of 2
						for i in range(0  ,       __lowerCAmelCase							):
												if i < dimensiona[0]:
																		for _ in range(dimensiona[1]  ,       __lowerCAmelCase							):
																								new_matrixa[i].append(0							)
												else:
																		new_matrixa.append([0] * maxim							)
												if i < dimensiona[0]:
																		for _ in range(dimensiona[1]  ,       __lowerCAmelCase							):
																								new_matrixa[i].append(0							)
												else:
																		new_matrixa.append([0] * maxim							)

						lowerCamelCase__   =actual_strassen(__lowerCAmelCase  ,       __lowerCAmelCase							)

						# Removing the additional zeros
						for i in range(0  ,       __lowerCAmelCase							):
												if i < dimensiona[0]:
																		for _ in range(dimensiona[1]  ,       __lowerCAmelCase							):
																								final_matrix[i].pop()
												else:
																		final_matrix.pop()
						return final_matrix


if __name__ == "__main__":
	a				=[
	    [2, 3, 4, 5],
	    [6, 4, 3, 1],
	    [2, 3, 6, 7],
	    [3, 1, 2, 4],
	    [2, 3, 4, 5],
	    [6, 4, 3, 1],
	    [2, 3, 6, 7],
	    [3, 1, 2, 4],
	    [2, 3, 4, 5],
	    [6, 2, 3, 1],
	]
	a				=[[0, 2, 1, 1], [16, 2, 3, 3], [2, 2, 7, 7], [13, 11, 22, 4]]
	print(strassen(matrixa, matrixa))


