






import copy
import os
import tempfile
from unittest import TestCase
from unittest.mock import patch

import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
import pytest

from datasets.arrow_writer import ArrowWriter, OptimizedTypedSequence, ParquetWriter, TypedSequence
from datasets.features import ArrayaD, ClassLabel, Features, Image, Value
from datasets.features.features import ArrayaDExtensionType, cast_to_python_objects
from datasets.keyhash import DuplicatedKeysError, InvalidKeyError

from .utils import require_pil
class  lowerCAmelCase_       (				snake_case__					):




							def 						__snake_case					(   self     :   str	):
										lowerCAmelCase__      			=						pa.array(TypedSequence([1, 2, 3]	)	)
										self.assertEqual(arr.type ,							pa.intaa()	)




							def 						__snake_case					(   self     :   Optional[int]	):
										with self.assertRaises(SCREAMING_SNAKE_CASE_	):
													lowerCAmelCase__      			=						pa.array(TypedSequence([1, 2, 3]	) ,							type=pa.intaa()	)




							def 						__snake_case					(   self     :   str	):
										with self.assertRaises(SCREAMING_SNAKE_CASE_	):
													lowerCAmelCase__      			=						pa.array(TypedSequence([1, 2, 3] ,							try_type=Value('''bool'''	) ,							type=Value('''int64'''	)	)	)




							def 						__snake_case					(   self     :   List[str]	):
										lowerCAmelCase__      			=						pa.array(TypedSequence([1, 2, 3] ,							type=Value('''int32'''	)	)	)
										self.assertEqual(arr.type ,							pa.intaa()	)




							def 						__snake_case					(   self     :   Dict	):
										with self.assertRaises((TypeError, pa.lib.ArrowInvalid)	):
													lowerCAmelCase__      			=						pa.array(TypedSequence(['''foo''', '''bar'''] ,							type=Value('''int64'''	)	)	)




							def 						__snake_case					(   self     :   List[Any]	):
										lowerCAmelCase__      			=						pa.array(TypedSequence([1, 2, 3] ,							try_type=Value('''int32'''	)	)	)
										self.assertEqual(arr.type ,							pa.intaa()	)




							def 						__snake_case					(   self     :   str	):
										lowerCAmelCase__      			=						pa.array(TypedSequence(['''foo''', '''bar'''] ,							try_type=Value('''int64'''	)	)	)
										self.assertEqual(arr.type ,							pa.string()	)




							def 						__snake_case					(   self     :   Dict	):
										lowerCAmelCase__      			=						pa.array(TypedSequence([[[1, 2, 3]]] ,							type=ArrayaD((1, 3) ,							'''int64'''	)	)	)
										self.assertEqual(arr.type ,							ArrayaDExtensionType((1, 3) ,							'''int64'''	)	)




							def 						__snake_case					(   self     :   Tuple	):
										with self.assertRaises((TypeError, pa.lib.ArrowInvalid)	):
													lowerCAmelCase__      			=						pa.array(TypedSequence(['''foo''', '''bar'''] ,							type=ArrayaD((1, 3) ,							'''int64'''	)	)	)




							def 						__snake_case					(   self     :   Union[str, Any]	):
										lowerCAmelCase__      			=						pa.array(TypedSequence([[[1, 2, 3]]] ,							try_type=ArrayaD((1, 3) ,							'''int64'''	)	)	)
										self.assertEqual(arr.type ,							ArrayaDExtensionType((1, 3) ,							'''int64'''	)	)




							def 						__snake_case					(   self     :   Optional[int]	):
										lowerCAmelCase__      			=						pa.array(TypedSequence(['''foo''', '''bar'''] ,							try_type=ArrayaD((1, 3) ,							'''int64'''	)	)	)
										self.assertEqual(arr.type ,							pa.string()	)




							@require_pil
							def 						__snake_case					(   self     :   Optional[int]	):
										import PIL.Image

										lowerCAmelCase__      			=						PIL.Image.fromarray(np.arange(10 ,							dtype=np.uinta	).reshape(2 ,							5	)	)
										with patch(
										    '''datasets.arrow_writer.cast_to_python_objects''' ,							side_effect=SCREAMING_SNAKE_CASE_	) as mock_cast_to_python_objects:
													lowerCAmelCase__      			=						pa.array(TypedSequence([{'''path''': None, '''bytes''': b'''image_bytes'''}, pil_image] ,							type=Image()	)	)
													lowerCAmelCase__			,		lowerCAmelCase__      			=						mock_cast_to_python_objects.call_args_list[-1]
													self.assertIn('''optimize_list_casting''' ,							SCREAMING_SNAKE_CASE_	)
													self.assertFalse(kwargs['''optimize_list_casting''']	)





def 	lowerCAmelCase_		(lowercase__						:       int     ,					lowercase__						:       int       )		->    List[Any]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferReader(lowercase__       ) if isinstance(lowercase__     ,					pa.Buffer       ) else pa.memory_map(lowercase__       )
			lowerCAmelCase__      			=						pa.ipc.open_stream(lowercase__       )
			lowerCAmelCase__      			=						f.read_all()
			assert len(pa_table.to_batches()       ) == expected_num_chunks
			assert pa_table.to_pydict() == {"col_1": ["foo", "bar"], "col_2": [1, 2]}
			del pa_table





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 1, 10]       )
@pytest.mark.parametrize(
    '''fields'''     ,					[None, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}]       )
def 	lowerCAmelCase_		(lowercase__						:       Tuple     ,					lowercase__						:       Optional[Any]       )		->    str:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			lowerCAmelCase__      			=						pa.schema(lowercase__       ) if fields else None
			with ArrowWriter(stream=lowercase__     ,					schema=lowercase__     ,					writer_batch_size=lowercase__       ) as writer:
						writer.write({'''col_1''': '''foo''', '''col_2''': 1}       )
						writer.write({'''col_1''': '''bar''', '''col_2''': 2}       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			if not fields:
						lowerCAmelCase__      			=						{'''col_1''': pa.string(), '''col_2''': pa.intaa()}
			assert writer._schema == pa.schema(lowercase__     ,					metadata=writer._schema.metadata       )
			_check_output(output.getvalue()     ,					expected_num_chunks=num_examples if writer_batch_size == 1 else 1       )





def 	lowerCAmelCase_		()		->    Optional[int]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			lowerCAmelCase__      			=						Features({'''labels''': ClassLabel(names=['''neg''', '''pos''']       )}       )
			with ArrowWriter(stream=lowercase__     ,					features=lowercase__       ) as writer:
						writer.write({'''labels''': 0}       )
						writer.write({'''labels''': 1}       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			assert writer._schema == features.arrow_schema
			assert writer._schema.metadata == features.arrow_schema.metadata
			lowerCAmelCase__      			=						pa.BufferReader(output.getvalue()       )
			lowerCAmelCase__      			=						pa.ipc.open_stream(lowercase__       )
			lowerCAmelCase__      			=						f.read_all()
			lowerCAmelCase__      			=						pa_table.schema
			assert pa_table.num_rows == 2
			assert schema == features.arrow_schema
			assert schema.metadata == features.arrow_schema.metadata
			assert features == Features.from_arrow_schema(lowercase__       )





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 1, 10]       )
def 	lowerCAmelCase_		(lowercase__						:       Tuple       )		->    List[Any]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			with ArrowWriter(
			    stream=lowercase__     ,					writer_batch_size=lowercase__     ,					hash_salt='''split_name'''     ,					check_duplicates=lowercase__     ,					) as writer:
						with pytest.raises(lowercase__       ):
									writer.write({'''col_1''': '''foo''', '''col_2''': 1}     ,					key=[1, 2]       )
									lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 2, 10]       )
def 	lowerCAmelCase_		(lowercase__						:       List[Any]       )		->    str:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			with ArrowWriter(
			    stream=lowercase__     ,					writer_batch_size=lowercase__     ,					hash_salt='''split_name'''     ,					check_duplicates=lowercase__     ,					) as writer:
						with pytest.raises(lowercase__       ):
									writer.write({'''col_1''': '''foo''', '''col_2''': 1}     ,					key=10       )
									writer.write({'''col_1''': '''bar''', '''col_2''': 2}     ,					key=10       )
									lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 2, 10]       )
def 	lowerCAmelCase_		(lowercase__						:       Tuple       )		->    Union[str, Any]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			with ArrowWriter(
			    stream=lowercase__     ,					writer_batch_size=lowercase__     ,					hash_salt='''split_name'''     ,					check_duplicates=lowercase__     ,					) as writer:
						writer.write({'''col_1''': '''foo''', '''col_2''': 1}     ,					key=1       )
						writer.write({'''col_1''': '''bar''', '''col_2''': 2}     ,					key=2       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			_check_output(output.getvalue()     ,					expected_num_chunks=num_examples if writer_batch_size == 1 else 1       )





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 1, 10]       )
@pytest.mark.parametrize(
    '''fields'''     ,					[None, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}]       )
def 	lowerCAmelCase_		(lowercase__						:       Tuple     ,					lowercase__						:       int       )		->    Optional[int]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			lowerCAmelCase__      			=						pa.schema(lowercase__       ) if fields else None
			with ArrowWriter(stream=lowercase__     ,					schema=lowercase__     ,					writer_batch_size=lowercase__       ) as writer:
						writer.write_batch({'''col_1''': ['''foo''', '''bar'''], '''col_2''': [1, 2]}       )
						writer.write_batch({'''col_1''': [], '''col_2''': []}       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			if not fields:
						lowerCAmelCase__      			=						{'''col_1''': pa.string(), '''col_2''': pa.intaa()}
			assert writer._schema == pa.schema(lowercase__     ,					metadata=writer._schema.metadata       )
			_check_output(output.getvalue()     ,					expected_num_chunks=num_examples if writer_batch_size == 1 else 1       )





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 1, 10]       )
@pytest.mark.parametrize(
    '''fields'''     ,					[None, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}]       )
def 	lowerCAmelCase_		(lowercase__						:       Optional[Any]     ,					lowercase__						:       int       )		->    List[Any]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			lowerCAmelCase__      			=						pa.schema(lowercase__       ) if fields else None
			with ArrowWriter(stream=lowercase__     ,					schema=lowercase__     ,					writer_batch_size=lowercase__       ) as writer:
						writer.write_table(pa.Table.from_pydict({'''col_1''': ['''foo''', '''bar'''], '''col_2''': [1, 2]}       )       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			if not fields:
						lowerCAmelCase__      			=						{'''col_1''': pa.string(), '''col_2''': pa.intaa()}
			assert writer._schema == pa.schema(lowercase__     ,					metadata=writer._schema.metadata       )
			_check_output(output.getvalue()     ,					expected_num_chunks=num_examples if writer_batch_size == 1 else 1       )





@pytest.mark.parametrize('''writer_batch_size'''     ,					[None, 1, 10]       )
@pytest.mark.parametrize(
    '''fields'''     ,					[None, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}, {'''col_1''': pa.string(), '''col_2''': pa.intaa()}]       )
def 	lowerCAmelCase_		(lowercase__						:       Union[str, Any]     ,					lowercase__						:       int       )		->    int:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			lowerCAmelCase__      			=						pa.schema(lowercase__       ) if fields else None
			with ArrowWriter(stream=lowercase__     ,					schema=lowercase__     ,					writer_batch_size=lowercase__       ) as writer:
						writer.write_row(pa.Table.from_pydict({'''col_1''': ['''foo'''], '''col_2''': [1]}       )       )
						writer.write_row(pa.Table.from_pydict({'''col_1''': ['''bar'''], '''col_2''': [2]}       )       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			if not fields:
						lowerCAmelCase__      			=						{'''col_1''': pa.string(), '''col_2''': pa.intaa()}
			assert writer._schema == pa.schema(lowercase__     ,					metadata=writer._schema.metadata       )
			_check_output(output.getvalue()     ,					expected_num_chunks=num_examples if writer_batch_size == 1 else 1       )





def 	lowerCAmelCase_		()		->    Dict:


			'''simple docstring'''




			with tempfile.TemporaryDirectory() as tmp_dir:
						lowerCAmelCase__      			=						{'''col_1''': pa.string(), '''col_2''': pa.intaa()}
						lowerCAmelCase__      			=						os.path.join(lowercase__     ,					'''test.arrow'''       )
						with ArrowWriter(path=lowercase__     ,					schema=pa.schema(lowercase__       )       ) as writer:
									writer.write_batch({'''col_1''': ['''foo''', '''bar'''], '''col_2''': [1, 2]}       )
									lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
						assert num_examples == 2
						assert num_bytes > 0
						assert writer._schema == pa.schema(lowercase__     ,					metadata=writer._schema.metadata       )
						_check_output(lowercase__     ,					1       )





def 	lowerCAmelCase_		(lowercase__						:       Dict       )		->    Tuple:


			'''simple docstring'''




			if pa.types.is_list(lowercase__       ):
						return get_base_dtype(arr_type.value_type       )
			else:
						return arr_type





def 	lowerCAmelCase_		(lowercase__						:       int     ,					lowercase__						:       Dict       )		->    Tuple:


			'''simple docstring'''




			if isinstance(lst[0]     ,					lowercase__       ):
						change_first_primitive_element_in_list(lst[0]     ,					lowercase__       )
			else:
						lowerCAmelCase__      			=						value





@pytest.mark.parametrize('''optimized_int_type, expected_dtype'''     ,					[(None, pa.intaa()), (Value('''int32'''       ), pa.intaa())]       )
@pytest.mark.parametrize('''sequence'''     ,					[[1, 2, 3], [[1, 2, 3]], [[[1, 2, 3]]]]       )
def 	lowerCAmelCase_		(lowercase__						:       Union[str, Any]     ,					lowercase__						:       str     ,					lowercase__						:       Tuple       )		->    Tuple:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.array(TypedSequence(lowercase__     ,					optimized_int_type=lowercase__       )       )
			assert get_base_dtype(arr.type       ) == expected_dtype





@pytest.mark.parametrize(
    '''col, expected_dtype'''     ,					[
        ('''attention_mask''', pa.inta()),
        ('''special_tokens_mask''', pa.inta()),
        ('''token_type_ids''', pa.inta()),
        ('''input_ids''', pa.intaa()),
        ('''other''', pa.intaa()),
    ]     ,					)
@pytest.mark.parametrize('''sequence'''     ,					[[1, 2, 3], [[1, 2, 3]], [[[1, 2, 3]]]]       )
def 	lowerCAmelCase_		(lowercase__						:       Tuple     ,					lowercase__						:       str     ,					lowercase__						:       List[Any]       )		->    Optional[Any]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.array(OptimizedTypedSequence(lowercase__     ,					col=lowercase__       )       )
			assert get_base_dtype(arr.type       ) == expected_dtype

			# not in range
			if col != "other":
						# avoids errors due to in-place modifications
						lowerCAmelCase__      			=						copy.deepcopy(lowercase__       )
						lowerCAmelCase__      			=						np.iinfo(expected_dtype.to_pandas_dtype()       ).max + 1
						change_first_primitive_element_in_list(lowercase__     ,					lowercase__       )
						lowerCAmelCase__      			=						pa.array(OptimizedTypedSequence(lowercase__     ,					col=lowercase__       )       )
						assert get_base_dtype(arr.type       ) == pa.intaa()





@pytest.mark.parametrize('''raise_exception'''     ,					[False, True]       )
def 	lowerCAmelCase_		(lowercase__						:       Tuple     ,					lowercase__						:       Optional[int]       )		->    Optional[int]:


			'''simple docstring'''




			lowerCAmelCase__      			=						str(tmp_path / '''dataset-train.arrow'''       )
			try:
						with ArrowWriter(path=lowercase__       ) as writer:
									if raise_exception:
												raise pa.lib.ArrowInvalid()
									else:
												writer.stream.close()
			except pa.lib.ArrowInvalid:
						pass
			finally:
						assert writer.stream.closed





def 	lowerCAmelCase_		(lowercase__						:       str       )		->    Dict:


			'''simple docstring'''




			lowerCAmelCase__      			=						'''mock://dataset-train.arrow'''
			with ArrowWriter(path=lowercase__     ,					storage_options=mockfs.storage_options       ) as writer:
						assert isinstance(writer._fs     ,					type(lowercase__       )       )
						assert writer._fs.storage_options == mockfs.storage_options
						writer.write({'''col_1''': '''foo''', '''col_2''': 1}       )
						writer.write({'''col_1''': '''bar''', '''col_2''': 2}       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			assert mockfs.exists(lowercase__       )





def 	lowerCAmelCase_		()		->    Optional[int]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.BufferOutputStream()
			with ParquetWriter(stream=lowercase__       ) as writer:
						writer.write({'''col_1''': '''foo''', '''col_2''': 1}       )
						writer.write({'''col_1''': '''bar''', '''col_2''': 2}       )
						lowerCAmelCase__			,		lowerCAmelCase__      			=						writer.finalize()
			assert num_examples == 2
			assert num_bytes > 0
			lowerCAmelCase__      			=						pa.BufferReader(output.getvalue()       )
			lowerCAmelCase__      			=						pq.read_table(lowercase__       )
			assert pa_table.to_pydict() == {"col_1": ["foo", "bar"], "col_2": [1, 2]}





@require_pil
@pytest.mark.parametrize('''embed_local_files'''     ,					[False, True]       )
def 	lowerCAmelCase_		(lowercase__						:       List[str]     ,					lowercase__						:       List[Any]       )		->    Optional[Any]:


			'''simple docstring'''




			import PIL.Image

			lowerCAmelCase__      			=						str(tmp_path / '''test_image_rgb.jpg'''       )
			PIL.Image.fromarray(np.zeros((5, 5)     ,					dtype=np.uinta       )       ).save(lowercase__     ,					format='''png'''       )
			lowerCAmelCase__      			=						pa.BufferOutputStream()
			with ParquetWriter(
			    stream=lowercase__     ,					features=Features({'''image''': Image()}       )     ,					embed_local_files=lowercase__       ) as writer:
						writer.write({'''image''': image_path}       )
						writer.finalize()
			lowerCAmelCase__      			=						pa.BufferReader(output.getvalue()       )
			lowerCAmelCase__      			=						pq.read_table(lowercase__       )
			lowerCAmelCase__      			=						pa_table.to_pydict()
			if embed_local_files:
						assert isinstance(out['''image'''][0]['''path''']     ,					lowercase__       )
						with open(lowercase__     ,					'''rb'''       ) as f:
									assert out["image"][0]["bytes"] == f.read()
			else:
						assert out["image"][0]["path"] == image_path
						assert out["image"][0]["bytes"] is None





def 	lowerCAmelCase_		()		->    Optional[int]:


			'''simple docstring'''




			lowerCAmelCase__      			=						pa.schema([pa.field('''col_1'''     ,					pa.string()     ,					nullable=lowercase__       )]       )
			lowerCAmelCase__      			=						pa.BufferOutputStream()
			with ArrowWriter(stream=lowercase__       ) as writer:
						writer._build_writer(inferred_schema=lowercase__       )
						assert writer._schema == pa.schema([pa.field('''col_1'''     ,					pa.string()       )]       )













# Imports
import numpy as np
class  lowerCAmelCase_       :




							def __init__(   self     :   Any ,							SCREAMING_SNAKE_CASE_     :   Dict=None ,							SCREAMING_SNAKE_CASE_     :   Optional[Any]=None ,							SCREAMING_SNAKE_CASE_     :   List[str]=None ,							SCREAMING_SNAKE_CASE_     :   Dict=None ,							SCREAMING_SNAKE_CASE_     :   int=None	):
											self.set_matricies(red=SCREAMING_SNAKE_CASE_ ,							green=SCREAMING_SNAKE_CASE_ ,							blue=SCREAMING_SNAKE_CASE_ ,							red_edge=SCREAMING_SNAKE_CASE_ ,							nir=SCREAMING_SNAKE_CASE_	)




							def 						__snake_case					(   self     :   str ,							SCREAMING_SNAKE_CASE_     :   Union[str, Any]=None ,							SCREAMING_SNAKE_CASE_     :   Optional[int]=None ,							SCREAMING_SNAKE_CASE_     :   Optional[Any]=None ,							SCREAMING_SNAKE_CASE_     :   Optional[Any]=None ,							SCREAMING_SNAKE_CASE_     :   Dict=None	):
											if red is not None:
															lowerCAmelCase__      			=						red
											if green is not None:
															lowerCAmelCase__      			=						green
											if blue is not None:
															lowerCAmelCase__      			=						blue
											if red_edge is not None:
															lowerCAmelCase__      			=						red_edge
											if nir is not None:
															lowerCAmelCase__      			=						nir
											return True




							def 						__snake_case					(   self     :   Union[str, Any] ,							SCREAMING_SNAKE_CASE_     :   Any="" ,							SCREAMING_SNAKE_CASE_     :   str=None ,							SCREAMING_SNAKE_CASE_     :   Optional[Any]=None ,							SCREAMING_SNAKE_CASE_     :   List[str]=None ,							SCREAMING_SNAKE_CASE_     :   Optional[Any]=None ,							SCREAMING_SNAKE_CASE_     :   Optional[Any]=None	):
											self.set_matricies(red=SCREAMING_SNAKE_CASE_ ,							green=SCREAMING_SNAKE_CASE_ ,							blue=SCREAMING_SNAKE_CASE_ ,							red_edge=SCREAMING_SNAKE_CASE_ ,							nir=SCREAMING_SNAKE_CASE_	)
											lowerCAmelCase__      			=						{
											    '''ARVI2''': self.arvaa,
											    '''CCCI''': self.ccci,
											    '''CVI''': self.cvi,
											    '''GLI''': self.gli,
											    '''NDVI''': self.ndvi,
											    '''BNDVI''': self.bndvi,
											    '''redEdgeNDVI''': self.red_edge_ndvi,
											    '''GNDVI''': self.gndvi,
											    '''GBNDVI''': self.gbndvi,
											    '''GRNDVI''': self.grndvi,
											    '''RBNDVI''': self.rbndvi,
											    '''PNDVI''': self.pndvi,
											    '''ATSAVI''': self.atsavi,
											    '''BWDRVI''': self.bwdrvi,
											    '''CIgreen''': self.ci_green,
											    '''CIrededge''': self.ci_rededge,
											    '''CI''': self.ci,
											    '''CTVI''': self.ctvi,
											    '''GDVI''': self.gdvi,
											    '''EVI''': self.evi,
											    '''GEMI''': self.gemi,
											    '''GOSAVI''': self.gosavi,
											    '''GSAVI''': self.gsavi,
											    '''Hue''': self.hue,
											    '''IVI''': self.ivi,
											    '''IPVI''': self.ipvi,
											    '''I''': self.i,
											    '''RVI''': self.rvi,
											    '''MRVI''': self.mrvi,
											    '''MSAVI''': self.m_savi,
											    '''NormG''': self.norm_g,
											    '''NormNIR''': self.norm_nir,
											    '''NormR''': self.norm_r,
											    '''NGRDI''': self.ngrdi,
											    '''RI''': self.ri,
											    '''S''': self.s,
											    '''IF''': self._if,
											    '''DVI''': self.dvi,
											    '''TVI''': self.tvi,
											    '''NDRE''': self.ndre,
											}

											try:
															return funcs[index]()
											except KeyError:
															print('''Index not in the list!'''	)
															return False




							def 						__snake_case					(   self     :   List[str]	):
											return -0.18 + (1.17 * ((self.nir - self.red) / (self.nir + self.red)))




							def 						__snake_case					(   self     :   Optional[int]	):
											return ((self.nir - self.redEdge) / (self.nir + self.redEdge)) / (
											    (self.nir - self.red) / (self.nir + self.red)
											)




							def 						__snake_case					(   self     :   str	):
											return self.nir * (self.red / (self.green**2))




							def 						__snake_case					(   self     :   List[str]	):
											return (2 * self.green - self.red - self.blue) / (
											    2 * self.green + self.red + self.blue
											)




							def 						__snake_case					(   self     :   List[str]	):
											return (self.nir - self.red) / (self.nir + self.red)




							def 						__snake_case					(   self     :   Optional[Any]	):
											return (self.nir - self.blue) / (self.nir + self.blue)




							def 						__snake_case					(   self     :   Optional[Any]	):
											return (self.redEdge - self.red) / (self.redEdge + self.red)




							def 						__snake_case					(   self     :   Tuple	):
											return (self.nir - self.green) / (self.nir + self.green)




							def 						__snake_case					(   self     :   List[Any]	):
											return (self.nir - (self.green + self.blue)) / (
											    self.nir + (self.green + self.blue)
											)




							def 						__snake_case					(   self     :   Optional[int]	):
											return (self.nir - (self.green + self.red)) / (
											    self.nir + (self.green + self.red)
											)




							def 						__snake_case					(   self     :   Optional[Any]	):
											return (self.nir - (self.blue + self.red)) / (self.nir + (self.blue + self.red))




							def 						__snake_case					(   self     :   Optional[int]	):
											return (self.nir - (self.green + self.red + self.blue)) / (
											    self.nir + (self.green + self.red + self.blue)
											)




							def 						__snake_case					(   self     :   Union[str, Any] ,							SCREAMING_SNAKE_CASE_     :   List[Any]=0.08 ,							SCREAMING_SNAKE_CASE_     :   List[str]=1.22 ,							SCREAMING_SNAKE_CASE_     :   Union[str, Any]=0.03	):
											return a * (
											    (self.nir - a * self.red - b)
											    / (a * self.nir + self.red - a * b + x * (1 + a**2))
											)




							def 						__snake_case					(   self     :   Tuple	):
											return (0.1 * self.nir - self.blue) / (0.1 * self.nir + self.blue)




							def 						__snake_case					(   self     :   Dict	):
											return (self.nir / self.green) - 1




							def 						__snake_case					(   self     :   str	):
											return (self.nir / self.redEdge) - 1




							def 						__snake_case					(   self     :   Tuple	):
											return (self.red - self.blue) / self.red




							def 						__snake_case					(   self     :   Any	):
											lowerCAmelCase__      			=						self.ndvi()
											return ((ndvi + 0.5) / (abs(ndvi + 0.5	))) * (abs(ndvi + 0.5	) ** (1 / 2))




							def 						__snake_case					(   self     :   Dict	):
											return self.nir - self.green




							def 						__snake_case					(   self     :   List[Any]	):
											return 2.5 * (
											    (self.nir - self.red) / (self.nir + 6 * self.red - 7.5 * self.blue + 1)
											)




							def 						__snake_case					(   self     :   Tuple	):
											lowerCAmelCase__      			=						(2 * (self.nir**2 - self.red**2) + 1.5 * self.nir + 0.5 * self.red) / (
											    self.nir + self.red + 0.5
											)
											return n * (1 - 0.25 * n) - (self.red - 0.125) / (1 - self.red)




							def 						__snake_case					(   self     :   Optional[Any] ,							SCREAMING_SNAKE_CASE_     :   Dict=0.16	):
											return (self.nir - self.green) / (self.nir + self.green + y)




							def 						__snake_case					(   self     :   Optional[int] ,							SCREAMING_SNAKE_CASE_     :   Any=0.5	):
											return ((self.nir - self.green) / (self.nir + self.green + n)) * (1 + n)




							def 						__snake_case					(   self     :   Any	):
											return np.arctan(
											    ((2 * self.red - self.green - self.blue) / 30.5) * (self.green - self.blue)	)




							def 						__snake_case					(   self     :   List[str] ,							SCREAMING_SNAKE_CASE_     :   List[str]=None ,							SCREAMING_SNAKE_CASE_     :   Union[str, Any]=None	):
											return (self.nir - b) / (a * self.red)




							def 						__snake_case					(   self     :   Union[str, Any]	):
											return (self.nir / ((self.nir + self.red) / 2)) * (self.ndvi() + 1)




							def 						__snake_case					(   self     :   List[str]	):
											return (self.red + self.green + self.blue) / 30.5




							def 						__snake_case					(   self     :   Optional[int]	):
											return self.nir / self.red




							def 						__snake_case					(   self     :   Dict	):
											return (self.rvi() - 1) / (self.rvi() + 1)




							def 						__snake_case					(   self     :   Union[str, Any]	):
											return (
											    (2 * self.nir + 1)
											    - ((2 * self.nir + 1) ** 2 - 8 * (self.nir - self.red)) ** (1 / 2)
											) / 2




							def 						__snake_case					(   self     :   List[Any]	):
											return self.green / (self.nir + self.red + self.green)




							def 						__snake_case					(   self     :   List[str]	):
											return self.nir / (self.nir + self.red + self.green)




							def 						__snake_case					(   self     :   Any	):
											return self.red / (self.nir + self.red + self.green)




							def 						__snake_case					(   self     :   Union[str, Any]	):
											return (self.green - self.red) / (self.green + self.red)




							def 						__snake_case					(   self     :   Dict	):
											return (self.red - self.green) / (self.red + self.green)




							def 						__snake_case					(   self     :   Optional[int]	):
											lowerCAmelCase__      			=						np.max([np.max(self.red	), np.max(self.green	), np.max(self.blue	)]	)
											lowerCAmelCase__      			=						np.min([np.min(self.red	), np.min(self.green	), np.min(self.blue	)]	)
											return (max_value - min_value) / max_value




							def 						__snake_case					(   self     :   str	):
											return (2 * self.red - self.green - self.blue) / (self.green - self.blue)




							def 						__snake_case					(   self     :   Optional[Any]	):
											return self.nir / self.red




							def 						__snake_case					(   self     :   Union[str, Any]	):
											return (self.ndvi() + 0.5) ** (1 / 2)




							def 						__snake_case					(   self     :   List[Any]	):
											return (self.nir - self.redEdge) / (self.nir + self.redEdge)





