



from __future__ import annotations

from decimal import Decimal

from numpy import array





def   __snake_case			(    _UpperCAmelCase       ):
    __a		 =       Decimal

    # Check if the provided matrix has 2 rows and 2 columns
    # since this implementation only works for 2x2 matrices
    if len(_UpperCAmelCase       ) == 2 and len(matrix[0]       ) == 2 and len(matrix[1]       ) == 2:
        # Calculate the determinant of the matrix
        __a		 =       float(
            d(matrix[0][0]       ) * d(matrix[1][1]       ) - d(matrix[1][0]       ) * d(matrix[0][1]       )       )
        if determinant == 0:
            raise ValueError('''This matrix has no inverse.'''       )

        # Creates a copy of the matrix with swapped positions of the elements
        __a		 =       [[0.0, 0.0], [0.0, 0.0]]
        __a ,     __a		 =       matrix[1][1], matrix[0][0]
        __a ,     __a		 =       -matrix[1][0], -matrix[0][1]

        # Calculate the inverse of the matrix
        return [
            [(float(d(_UpperCAmelCase       )       ) / determinant) or 0.0 for n in row] for row in swapped_matrix
        ]
    elif (
        len(_UpperCAmelCase       ) == 3
        and len(matrix[0]       ) == 3
        and len(matrix[1]       ) == 3
        and len(matrix[2]       ) == 3
    ):
        # Calculate the determinant of the matrix using Sarrus rule
        __a		 =       float(
            (
                (d(matrix[0][0]       ) * d(matrix[1][1]       ) * d(matrix[2][2]       ))
                + (d(matrix[0][1]       ) * d(matrix[1][2]       ) * d(matrix[2][0]       ))
                + (d(matrix[0][2]       ) * d(matrix[1][0]       ) * d(matrix[2][1]       ))
            )
            - (
                (d(matrix[0][2]       ) * d(matrix[1][1]       ) * d(matrix[2][0]       ))
                + (d(matrix[0][1]       ) * d(matrix[1][0]       ) * d(matrix[2][2]       ))
                + (d(matrix[0][0]       ) * d(matrix[1][2]       ) * d(matrix[2][1]       ))
            )       )
        if determinant == 0:
            raise ValueError('''This matrix has no inverse.'''       )

        # Creating cofactor matrix
        __a		 =       [
            [d(0.0       ), d(0.0       ), d(0.0       )],
            [d(0.0       ), d(0.0       ), d(0.0       )],
            [d(0.0       ), d(0.0       ), d(0.0       )],
        ]
        __a		 =       (d(matrix[1][1]       ) * d(matrix[2][2]       )) - (
            d(matrix[1][2]       ) * d(matrix[2][1]       )
        )
        __a		 =       -(
            (d(matrix[1][0]       ) * d(matrix[2][2]       )) - (d(matrix[1][2]       ) * d(matrix[2][0]       ))
        )
        __a		 =       (d(matrix[1][0]       ) * d(matrix[2][1]       )) - (
            d(matrix[1][1]       ) * d(matrix[2][0]       )
        )
        __a		 =       -(
            (d(matrix[0][1]       ) * d(matrix[2][2]       )) - (d(matrix[0][2]       ) * d(matrix[2][1]       ))
        )
        __a		 =       (d(matrix[0][0]       ) * d(matrix[2][2]       )) - (
            d(matrix[0][2]       ) * d(matrix[2][0]       )
        )
        __a		 =       -(
            (d(matrix[0][0]       ) * d(matrix[2][1]       )) - (d(matrix[0][1]       ) * d(matrix[2][0]       ))
        )
        __a		 =       (d(matrix[0][1]       ) * d(matrix[1][2]       )) - (
            d(matrix[0][2]       ) * d(matrix[1][1]       )
        )
        __a		 =       -(
            (d(matrix[0][0]       ) * d(matrix[1][2]       )) - (d(matrix[0][2]       ) * d(matrix[1][0]       ))
        )
        __a		 =       (d(matrix[0][0]       ) * d(matrix[1][1]       )) - (
            d(matrix[0][1]       ) * d(matrix[1][0]       )
        )

        # Transpose the cofactor matrix (Adjoint matrix)
        __a		 =       array(_UpperCAmelCase       )
        for i in range(3       ):
            for j in range(3       ):
                __a		 =       cofactor_matrix[j][i]

        # Inverse of the matrix using the formula (1/determinant) * adjoint matrix
        __a		 =       array(_UpperCAmelCase       )
        for i in range(3       ):
            for j in range(3       ):
                inverse_matrix[i][j] /= d(_UpperCAmelCase       )

        # Calculate the inverse of the matrix
        return [[float(d(_UpperCAmelCase       )       ) or 0.0 for n in row] for row in inverse_matrix]
    raise ValueError('''Please provide a matrix of size 2x2 or 3x3.'''       )










# Lint as: python3
import dataclasses
import re
from dataclasses import dataclass
from functools import total_ordering
from typing import Optional, Union


__snake_case		:List[str]   	=  re.compile(r'''^(?P<major>\d+)''' r'''\.(?P<minor>\d+)''' r'''\.(?P<patch>\d+)$''')

@total_ordering
@dataclass
class 					_A :
       UpperCamelCase__						:					str
       UpperCamelCase__						:					Optional[str]		      =		None
       UpperCamelCase__						:					Optional[Union[str, int]]		      =		None
       UpperCamelCase__						:					Optional[Union[str, int]]		      =		None
       UpperCamelCase__						:					Optional[Union[str, int]]		      =		None



       def 	_lowerCamelCase    (	self							:  Union[str, Any]):


           '''simple docstring'''

           __a ,     __a ,     __a		 =       _str_to_version_tuple(self.version_str)



       def __repr__(	self							:  Tuple):


           '''simple docstring'''

           return F'{self.tuple[0]}.{self.tuple[1]}.{self.tuple[2]}'



       @property
       def 	_lowerCamelCase    (	self							:  Optional[int]):


           '''simple docstring'''

           return self.major, self.minor, self.patch



       def 	_lowerCamelCase    (	self							:  Any  ,	__SCREAMING_SNAKE_CASE							:  Optional[int]):


           '''simple docstring'''

           if isinstance(__SCREAMING_SNAKE_CASE  ,	__SCREAMING_SNAKE_CASE):
               return Version(__SCREAMING_SNAKE_CASE)
           elif isinstance(__SCREAMING_SNAKE_CASE  ,	__SCREAMING_SNAKE_CASE):
               return other
           raise TypeError(F'{other} (type {type(__SCREAMING_SNAKE_CASE)}) cannot be compared to version.')



       def __eq__(	self							:  int  ,	__SCREAMING_SNAKE_CASE							:  Any):


           '''simple docstring'''

           try:
               __a		 =       self._validate_operand(__SCREAMING_SNAKE_CASE)
           except (TypeError, ValueError):
               return False
           else:
               return self.tuple == other.tuple



       def __lt__(	self							:  str  ,	__SCREAMING_SNAKE_CASE							:  Tuple):


           '''simple docstring'''

           __a		 =       self._validate_operand(__SCREAMING_SNAKE_CASE)
           return self.tuple < other.tuple



       def __hash__(	self							:  Optional[Any]):


           '''simple docstring'''

           return hash(_version_tuple_to_str(self.tuple))



       @classmethod
       def 	_lowerCamelCase    (	cls							:  List[str]  ,	__SCREAMING_SNAKE_CASE							:  Optional[Any]):


           '''simple docstring'''

           __a		 =       {f.name for f in dataclasses.fields(cls)}
           return cls(**{k: v for k, v in dic.items() if k in field_names})





       def 	_lowerCamelCase    (	self							:  int):


           '''simple docstring'''

           return self.version_str





def   __snake_case			(    _UpperCAmelCase       ):
    __a		 =       _VERSION_REG.match(_UpperCAmelCase       )
    if not res:
        raise ValueError(f'Invalid version \'{version_str}\'. Format should be x.y.z with {{x,y,z}} being digits.'       )
    return tuple(int(_UpperCAmelCase       ) for v in [res.group('''major'''       ), res.group('''minor'''       ), res.group('''patch'''       )]       )





def   __snake_case			(    _UpperCAmelCase       ):
    return ".".join(str(_UpperCAmelCase       ) for v in version_tuple       )





