





from __future__ import annotations

import numpy as np
from numpy import floataa
from numpy.typing import NDArray

def   snake_case (UpperCAmelCase__     ,   UpperCAmelCase__     ,   UpperCAmelCase__     ,   UpperCAmelCase__     ,   )	->    list[float]:
  UpperCamelCase_: Optional[int]   				=    coefficient_matrix.shape
  UpperCamelCase_: List[Any]   				=    constant_matrix.shape

  if rowsa != colsa:
    UpperCamelCase_: Any   				=    F'''Coefficient matrix dimensions must be nxn but received {rowsa}x{colsa}'''
    raise ValueError(UpperCAmelCase__  )

  if colsa != 1:
    UpperCamelCase_: Any   				=    F'''Constant matrix must be nx1 but received {rowsa}x{colsa}'''
    raise ValueError(UpperCAmelCase__  )

  if rowsa != rowsa:
    UpperCamelCase_: Tuple   				=    (
        """Coefficient and constant matrices dimensions must be nxn and nx1 but """
        F'''received {rowsa}x{colsa} and {rowsa}x{colsa}'''
    )
    raise ValueError(UpperCAmelCase__  )

  if len(UpperCAmelCase__  ) != rowsa:
    UpperCamelCase_: Optional[Any]   				=    (
        """Number of initial values must be equal to number of rows in coefficient """
        F'''matrix but received {len(UpperCAmelCase__  )} and {rowsa}'''
    )
    raise ValueError(UpperCAmelCase__  )

  if iterations <= 0:
    raise ValueError('Iterations must be at least 1'  )

  UpperCamelCase_: NDArray[floataa]   				=    np.concatenate(
      (coefficient_matrix, constant_matrix)     ,   axis=1  )

  UpperCamelCase_: Union[str, Any]   				=    table.shape

  strictly_diagonally_dominant(UpperCAmelCase__  )

  # Iterates the whole matrix for given number of times
  for _ in range(UpperCAmelCase__  ):
    UpperCamelCase_: Optional[Any]   				=    []
    for row in range(UpperCAmelCase__  ):
      UpperCamelCase_: str   				=    0
      for col in range(UpperCAmelCase__  ):
        if col == row:
          UpperCamelCase_: List[Any]   				=    table[row][col]
        elif col == cols - 1:
          UpperCamelCase_: Optional[int]   				=    table[row][col]
        else:
          temp += (-1) * table[row][col] * init_val[col]
      UpperCamelCase_: Optional[int]   				=    (temp + val) / denom
      new_val.append(UpperCAmelCase__  )
    UpperCamelCase_: str   				=    new_val

  return [float(UpperCAmelCase__  ) for i in new_val]

def   snake_case (UpperCAmelCase__  )	->    bool:
  UpperCamelCase_: Optional[Any]   				=    table.shape

  UpperCamelCase_: Union[str, Any]   				=    True

  for i in range(0     ,   UpperCAmelCase__  ):
    UpperCamelCase_: Any   				=    0
    for j in range(0     ,   cols - 1  ):
      if i == j:
        continue
      else:
        total += table[i][j]

    if table[i][i] <= total:
      raise ValueError('Coefficient matrix is not strictly diagonally dominant'  )

  return is_diagonally_dominant


# Test Cases
if __name__ == "__main__":
   import doctest

   doctest.testmod()







import time
from dataclasses import dataclass
from multiprocessing import Pool
from unittest import TestCase
from unittest.mock import patch

import multiprocess
import numpy as np
import pytest

from datasets.utils.py_utils import (
    NestedDataStructure,
    asdict,
    iflatmap_unordered,
    map_nested,
    temp_seed,
    temporary_assignment,
    zip_dict,
)

from .utils import require_tf, require_torch

def   snake_case (UpperCAmelCase__  )	->    Optional[int]:  # picklable for multiprocessing
  return x.sum()

def   snake_case (UpperCAmelCase__  )	->    Any:  # picklable for multiprocessing
  return i + 1




@dataclass
class     _lowerCAmelCase:





       """simple docstring"""







       a    :		int
       a    :		str







class     _lowerCAmelCase(	UpperCAmelCase_ ):





       """simple docstring"""







       def       _a   ( self							):
         UpperCamelCase_: Optional[Any]   				=    {}
         UpperCamelCase_: List[str]   				=    []
         UpperCamelCase_: Any   				=    1
         UpperCamelCase_: Optional[int]   				=    [1, 2]
         UpperCamelCase_: List[str]   				=    {'a': 1, 'b': 2}
         UpperCamelCase_: Tuple   				=    {'a': [1, 2], 'b': [3, 4]}
         UpperCamelCase_: Optional[int]   				=    {'a': {'1': 1}, 'b': 2}
         UpperCamelCase_: Optional[Any]   				=    {'a': 1, 'b': 2, 'c': 3, 'd': 4}
         UpperCamelCase_: Tuple   				=    {}
         UpperCamelCase_: str   				=    []
         UpperCamelCase_: List[Any]   				=    2
         UpperCamelCase_: List[Any]   				=    [2, 3]
         UpperCamelCase_: Optional[Any]   				=    {'a': 2, 'b': 3}
         UpperCamelCase_: List[str]   				=    {'a': [2, 3], 'b': [4, 5]}
         UpperCamelCase_: Any   				=    {'a': {'1': 2}, 'b': 3}
         UpperCamelCase_: List[str]   				=    {'a': 2, 'b': 3, 'c': 4, 'd': 5}
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase							)  ,      _lowerCamelCase							)

         UpperCamelCase_: Optional[int]   				=    2
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)

         UpperCamelCase_: Tuple   				=    {'a': np.eye(2							), 'b': np.zeros(3							), 'c': np.ones(2							)}
         UpperCamelCase_: Tuple   				=    {'a': 2, 'b': 0, 'c': 2}
         UpperCamelCase_: str   				=    {
             'a': np.eye(2							).astype(_lowerCamelCase							),
             'b': np.zeros(3							).astype(_lowerCamelCase							),
             'c': np.ones(2							).astype(_lowerCamelCase							),
         }
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      map_numpy=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(
             {k: v.tolist() for k, v in map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      map_numpy=_lowerCamelCase							).items()}  ,      {k: v.tolist() for k, v in expected_map_nested_sna_int.items()}  ,      )
         self.assertEqual(map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      map_numpy=_lowerCamelCase  ,      num_proc=_lowerCamelCase							)  ,      _lowerCamelCase							)
         self.assertEqual(
             {k: v.tolist() for k, v in map_nested(_lowerCamelCase  ,      _lowerCamelCase  ,      map_numpy=_lowerCamelCase  ,      num_proc=_lowerCamelCase							).items()}  ,      {k: v.tolist() for k, v in expected_map_nested_sna_int.items()}  ,      )
         with self.assertRaises(_lowerCamelCase							):  # can't pickle a local lambda
           map_nested(lambda _lowerCamelCase							: x + 1  ,      _lowerCamelCase  ,      num_proc=_lowerCamelCase							)





       def       _a   ( self							):
         UpperCamelCase_: Optional[Any]   				=    {'a': 1, 'b': 2}
         UpperCamelCase_: Dict   				=    {'a': 3, 'b': 4}
         UpperCamelCase_: Optional[int]   				=    {'a': 5, 'b': 6}
         UpperCamelCase_: int   				=    sorted([('a', (1, 3, 5)), ('b', (2, 4, 6))]							)
         self.assertEqual(sorted(zip_dict(_lowerCamelCase  ,      _lowerCamelCase  ,      _lowerCamelCase							)							)  ,      _lowerCamelCase							)





       def       _a   ( self							):




         class     _lowerCAmelCase:





                """simple docstring"""







                a    :		str									='''bar'''







         UpperCamelCase_: int   				=    Foo()
         self.assertEqual(foo.my_attr  ,      'bar'							)
         with temporary_assignment(_lowerCamelCase  ,      'my_attr'  ,      'BAR'							):
           self.assertEqual(foo.my_attr  ,      'BAR'							)
         self.assertEqual(foo.my_attr  ,      'bar'							)







@pytest.mark.parametrize(
    'iterable_length, num_proc, expected_num_proc'     ,   [
        (1, None, 1),
        (1, 1, 1),
        (2, None, 1),
        (2, 1, 1),
        (2, 2, 1),
        (2, 3, 1),
        (3, 2, 1),
        (1_6, 1_6, 1_6),
        (1_6, 1_7, 1_6),
        (1_7, 1_6, 1_6),
    ]     ,   )
def   snake_case (UpperCAmelCase__     ,   UpperCAmelCase__     ,   UpperCAmelCase__  )	->    Dict:
  with patch('datasets.utils.py_utils._single_map_nested'  ) as mock_single_map_nested, patch(
      'datasets.parallel.parallel.Pool'  ) as mock_multiprocessing_pool:
    UpperCamelCase_: Any   				=    {F'''{i}''': i for i in range(UpperCAmelCase__  )}
    UpperCamelCase_: int   				=    map_nested(lambda UpperCAmelCase__  : x + 1_0     ,   UpperCAmelCase__     ,   num_proc=UpperCAmelCase__     ,   parallel_min_length=1_6  )
    if expected_num_proc == 1:
      assert mock_single_map_nested.called
      assert not mock_multiprocessing_pool.called
    else:
      assert not mock_single_map_nested.called
      assert mock_multiprocessing_pool.called
      assert mock_multiprocessing_pool.call_args[0][0] == expected_num_proc




class     _lowerCAmelCase(	UpperCAmelCase_ ):





       """simple docstring"""







       @require_tf
       def       _a   ( self							):
         import tensorflow as tf
         from tensorflow.keras import layers

         UpperCamelCase_: Dict   				=    layers.Dense(2							)

         def gen_random_output():
           UpperCamelCase_: Optional[Any]   				=    tf.random.uniform((1, 3)							)
           return model(_lowerCamelCase							).numpy()

         with temp_seed(4_2  ,      set_tensorflow=_lowerCamelCase							):
           UpperCamelCase_: int   				=    gen_random_output()
         with temp_seed(4_2  ,      set_tensorflow=_lowerCamelCase							):
           UpperCamelCase_: List[str]   				=    gen_random_output()
         UpperCamelCase_: str   				=    gen_random_output()

         np.testing.assert_equal(_lowerCamelCase  ,      _lowerCamelCase							)
         self.assertGreater(np.abs(outa - outa							).sum()  ,      0							)





       @require_torch
       def       _a   ( self							):
         import torch

         def gen_random_output():
           UpperCamelCase_: Any   				=    torch.nn.Linear(3  ,      2							)
           UpperCamelCase_: Optional[Any]   				=    torch.rand(1  ,      3							)
           return model(_lowerCamelCase							).detach().numpy()

         with temp_seed(4_2  ,      set_pytorch=_lowerCamelCase							):
           UpperCamelCase_: Dict   				=    gen_random_output()
         with temp_seed(4_2  ,      set_pytorch=_lowerCamelCase							):
           UpperCamelCase_: str   				=    gen_random_output()
         UpperCamelCase_: str   				=    gen_random_output()

         np.testing.assert_equal(_lowerCamelCase  ,      _lowerCamelCase							)
         self.assertGreater(np.abs(outa - outa							).sum()  ,      0							)





       def       _a   ( self							):
         def gen_random_output():
           return np.random.rand(1  ,      3							)

         with temp_seed(4_2							):
           UpperCamelCase_: Optional[Any]   				=    gen_random_output()
         with temp_seed(4_2							):
           UpperCamelCase_: Tuple   				=    gen_random_output()
         UpperCamelCase_: Optional[int]   				=    gen_random_output()

         np.testing.assert_equal(_lowerCamelCase  ,      _lowerCamelCase							)
         self.assertGreater(np.abs(outa - outa							).sum()  ,      0							)







@pytest.mark.parametrize('input_data'     ,   [{}]  )
def   snake_case (UpperCAmelCase__  )	->    Dict:
  UpperCamelCase_: str   				=    NestedDataStructure(UpperCAmelCase__  ).data
  assert output_data == input_data

@pytest.mark.parametrize(
    'data, expected_output'     ,   [
        ({}, []),
        ([], []),
        ('foo', ['foo']),
        (['foo', 'bar'], ['foo', 'bar']),
        ([['foo', 'bar']], ['foo', 'bar']),
        ([[['foo'], ['bar']]], ['foo', 'bar']),
        ([[['foo'], 'bar']], ['foo', 'bar']),
        ({'a': 1, 'b': 2}, [1, 2]),
        ({'a': [1, 2], 'b': [3, 4]}, [1, 2, 3, 4]),
        ({'a': [[1, 2]], 'b': [[3, 4]]}, [1, 2, 3, 4]),
        ({'a': [[1, 2]], 'b': [3, 4]}, [1, 2, 3, 4]),
        ({'a': [[[1], [2]]], 'b': [[[3], [4]]]}, [1, 2, 3, 4]),
        ({'a': [[[1], [2]]], 'b': [[3, 4]]}, [1, 2, 3, 4]),
        ({'a': [[[1], [2]]], 'b': [3, 4]}, [1, 2, 3, 4]),
        ({'a': [[[1], [2]]], 'b': [3, [4]]}, [1, 2, 3, 4]),
        ({'a': {'1': 1}, 'b': 2}, [1, 2]),
        ({'a': {'1': [1]}, 'b': 2}, [1, 2]),
        ({'a': {'1': [1]}, 'b': [2]}, [1, 2]),
    ]     ,   )
def   snake_case (UpperCAmelCase__     ,   UpperCAmelCase__  )	->    Dict:
  UpperCamelCase_: Optional[Any]   				=    NestedDataStructure(UpperCAmelCase__  ).flatten()
  assert output == expected_output

def   snake_case ()	->    Optional[int]:
  UpperCamelCase_: List[Any]   				=    A(x=1     ,   y='foobar'  )
  UpperCamelCase_: Optional[int]   				=    {'x': 1, 'y': 'foobar'}
  assert asdict(UpperCAmelCase__  ) == expected_output

  UpperCamelCase_: List[str]   				=    {'a': {'b': A(x=1_0     ,   y='foo'  )}, 'c': [A(x=2_0     ,   y='bar'  )]}
  UpperCamelCase_: Tuple   				=    {'a': {'b': {'x': 1_0, 'y': 'foo'}}, 'c': [{'x': 2_0, 'y': 'bar'}]}
  assert asdict(UpperCAmelCase__  ) == expected_output

  with pytest.raises(UpperCAmelCase__  ):
    asdict([1, A(x=1_0     ,   y='foo'  )]  )

def   snake_case (UpperCAmelCase__  )	->    Optional[Any]:
  return text.split()

def   snake_case (UpperCAmelCase__  )	->    str:
  yield (time.time(), content)
  time.sleep(2  )
  yield (time.time(), content)

def   snake_case ()	->    Union[str, Any]:
  with Pool(2  ) as pool:
    UpperCamelCase_: Optional[Any]   				=    list(iflatmap_unordered(UpperCAmelCase__     ,   _split_text     ,   kwargs_iterable=[{'text': 'hello there'}] * 1_0  )  )
    assert out.count('hello'  ) == 1_0
    assert out.count('there'  ) == 1_0
    assert len(UpperCAmelCase__  ) == 2_0

  # check multiprocess from pathos (uses dill for pickling)
  with multiprocess.Pool(2  ) as pool:
    UpperCamelCase_: Optional[int]   				=    list(iflatmap_unordered(UpperCAmelCase__     ,   _split_text     ,   kwargs_iterable=[{'text': 'hello there'}] * 1_0  )  )
    assert out.count('hello'  ) == 1_0
    assert out.count('there'  ) == 1_0
    assert len(UpperCAmelCase__  ) == 2_0

  # check that we get items as fast as possible
  with Pool(2  ) as pool:
    UpperCamelCase_: Any   				=    []
    for yield_time, content in iflatmap_unordered(
        UpperCAmelCase__     ,   _aseconds_generator_of_aitems_with_timing     ,   kwargs_iterable=[{'content': 'a'}, {'content': 'b'}]  ):
      assert yield_time < time.time() + 0.1, "we should each item directly after it was yielded"
      out.append(UpperCAmelCase__  )
    assert out.count('a'  ) == 2
    assert out.count('b'  ) == 2
    assert len(UpperCAmelCase__  ) == 4