




'''simple docstring'''


from pickle import UnpicklingError

import jax
import jax.numpy as jnp
import numpy as np
from flax.serialization import from_bytes
from flax.traverse_util import flatten_dict

from ..utils import logging


_snake_case : str  				=						logging.get_logger(__name__)
def 						snake_case_       (UpperCamelCase			:    Union[str, Any]					,		UpperCamelCase			:    Optional[Any] ):





							'''simple docstring'''


							try:
														with open(UpperCamelCase					,		'''rb''' ) as flax_state_f:
																					_a      	=							from_bytes(UpperCamelCase					,		flax_state_f.read() )
							except UnpicklingError as e:
														try:
																					with open(UpperCamelCase ) as f:
																												if f.read().startswith('''version''' ):
																																			raise OSError(
																																			    '''You seem to have cloned a repository without having git-lfs installed. Please'''
																																			    ''' install git-lfs and run `git lfs install` followed by `git lfs pull` in the'''
																																			    ''' folder you cloned.''' )
																												else:
																																			raise ValueError from e
														except (UnicodeDecodeError, ValueError):
																					raise EnvironmentError(f'Unable to convert {model_file} to Flax deserializable object. ' )

							return load_flax_weights_in_pytorch_model(UpperCamelCase					,		UpperCamelCase )

def 						snake_case_       (UpperCamelCase			:    Any					,		UpperCamelCase			:    int ):





							'''simple docstring'''


							try:
														import torch  # noqa: F401
							except ImportError:
														logger.error(
														    '''Loading Flax weights in PyTorch requires both PyTorch and Flax to be installed. Please see'''
														    ''' https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation'''
														    ''' instructions.''' )
														raise

							# check if we have bf16 weights
							_a      	=							flatten_dict(jax.tree_util.tree_map(lambda UpperCamelCase : x.dtype == jnp.bfloataa					,		UpperCamelCase ) ).values()
							if any(UpperCamelCase ):
														# convert all weights to fp32 if they are bf16 since torch.from_numpy can-not handle bf16

														# and bf16 is not fully supported in PT yet.
														logger.warning(
														    '''Found ``bfloat16`` weights in Flax model. Casting all ``bfloat16`` weights to ``float32`` '''
														    '''before loading those in PyTorch model.''' )
														_a      	=							jax.tree_util.tree_map(
														    lambda UpperCamelCase : params.astype(np.floataa ) if params.dtype == jnp.bfloataa else params					,		UpperCamelCase )

							_a      	=							''''''

							_a      	=							flatten_dict(UpperCamelCase					,		sep='''.''' )
							_a      	=							pt_model.state_dict()

							# keep track of unexpected & missing keys
							_a      	=							[]
							_a      	=							set(pt_model_dict.keys() )

							for flax_key_tuple, flax_tensor in flax_state_dict.items():
														_a      	=							flax_key_tuple.split('''.''' )

														if flax_key_tuple_array[-1] == "kernel" and flax_tensor.ndim == 4:
																					_a      	=							flax_key_tuple_array[:-1] + ['''weight''']
																					_a      	=							jnp.transpose(UpperCamelCase					,		(3, 2, 0, 1) )
														elif flax_key_tuple_array[-1] == "kernel":
																					_a      	=							flax_key_tuple_array[:-1] + ['''weight''']
																					_a      	=							flax_tensor.T
														elif flax_key_tuple_array[-1] == "scale":
																					_a      	=							flax_key_tuple_array[:-1] + ['''weight''']

														if "time_embedding" not in flax_key_tuple_array:
																					for i, flax_key_tuple_string in enumerate(UpperCamelCase ):
																												_a      	=							(
																												    flax_key_tuple_string.replace('''_0'''					,		'''.0''' )
																												    .replace('''_1'''					,		'''.1''' )
																												    .replace('''_2'''					,		'''.2''' )
																												    .replace('''_3'''					,		'''.3''' )
																												    .replace('''_4'''					,		'''.4''' )
																												    .replace('''_5'''					,		'''.5''' )
																												    .replace('''_6'''					,		'''.6''' )
																												    .replace('''_7'''					,		'''.7''' )
																												    .replace('''_8'''					,		'''.8''' )
																												    .replace('''_9'''					,		'''.9''' )
																												)

														_a      	=							'''.'''.join(UpperCamelCase )

														if flax_key in pt_model_dict:
																					if flax_tensor.shape != pt_model_dict[flax_key].shape:
																												raise ValueError(
																												    f'Flax checkpoint seems to be incorrect. Weight {flax_key_tuple} was expected '
																												    f'to be of shape {pt_model_dict[flax_key].shape}, but is {flax_tensor.shape}.' )
																					else:
																												# add weight to pytorch dict
																												_a      	=							np.asarray(UpperCamelCase ) if not isinstance(UpperCamelCase					,		np.ndarray ) else flax_tensor
																												_a      	=							torch.from_numpy(UpperCamelCase )
																												# remove from missing keys
																												missing_keys.remove(UpperCamelCase )
														else:
																					# weight is not expected by PyTorch model
																					unexpected_keys.append(UpperCamelCase )

							pt_model.load_state_dict(UpperCamelCase )

							# re-transform missing_keys to list
							_a      	=							list(UpperCamelCase )

							if len(UpperCamelCase ) > 0:
														logger.warning(
														    '''Some weights of the Flax model were not used when initializing the PyTorch model'''
														    f' {pt_model.__class__.__name__}: {unexpected_keys}\n- This IS expected if you are initializing'
														    f' {pt_model.__class__.__name__} from a Flax model trained on another task or with another architecture'
														    ''' (e.g. initializing a BertForSequenceClassification model from a FlaxBertForPreTraining model).\n- This'''
														    f' IS NOT expected if you are initializing {pt_model.__class__.__name__} from a Flax model that you expect'
														    ''' to be exactly identical (e.g. initializing a BertForSequenceClassification model from a'''
														    ''' FlaxBertForSequenceClassification model).''' )
							if len(UpperCamelCase ) > 0:
														logger.warning(
														    f'Some weights of {pt_model.__class__.__name__} were not initialized from the Flax model and are newly'
														    f' initialized: {missing_keys}\nYou should probably TRAIN this model on a down-stream task to be able to'
														    ''' use it for predictions and inference.''' )

							return pt_model







'''simple docstring'''


import qiskit
def 						snake_case_       (UpperCamelCase			:    int					,		UpperCamelCase			:    int ):





							'''simple docstring'''


							_a      	=							qiskit.Aer.get_backend('''aer_simulator''' )

							_a      	=							qiskit.QuantumCircuit(4					,		2 )
							# encode inputs in qubits 0 and 1
							if bita == 1:
														qc_ha.x(0 )
							if bita == 1:
														qc_ha.x(1 )
							qc_ha.barrier()

							# use cnots to write XOR of the inputs on qubit2
							qc_ha.cx(0					,		2 )
							qc_ha.cx(1					,		2 )

							# use ccx / toffoli gate to write AND of the inputs on qubit3
							qc_ha.ccx(0					,		1					,		3 )
							qc_ha.barrier()

							# extract outputs
							qc_ha.measure(2					,		0 )  # extract XOR value
							qc_ha.measure(3					,		1 )  # extract AND value

							# Execute the circuit on the qasm simulator
							_a      	=							qiskit.execute(UpperCamelCase					,		UpperCamelCase					,		shots=1000 )

							# Return the histogram data of the results of the experiment
							return job.result().get_counts(UpperCamelCase )


if __name__ == "__main__":
				_snake_case : Tuple  				=						half_adder(1, 1)
				print(F'''Half Adder Output Qubit Counts: {counts}''')

