





'''simple docstring'''
from ...configuration_utils import PretrainedConfig
from ...utils import logging


a__							:							List[str] =logging.get_logger(__name__)

a__							:							Optional[int] ={
    '''funnel-transformer/small''': '''https://huggingface.co/funnel-transformer/small/resolve/main/config.json''',
    '''funnel-transformer/small-base''': '''https://huggingface.co/funnel-transformer/small-base/resolve/main/config.json''',
    '''funnel-transformer/medium''': '''https://huggingface.co/funnel-transformer/medium/resolve/main/config.json''',
    '''funnel-transformer/medium-base''': '''https://huggingface.co/funnel-transformer/medium-base/resolve/main/config.json''',
    '''funnel-transformer/intermediate''': (
        '''https://huggingface.co/funnel-transformer/intermediate/resolve/main/config.json'''
    ),
    '''funnel-transformer/intermediate-base''': (
        '''https://huggingface.co/funnel-transformer/intermediate-base/resolve/main/config.json'''
    ),
    '''funnel-transformer/large''': '''https://huggingface.co/funnel-transformer/large/resolve/main/config.json''',
    '''funnel-transformer/large-base''': '''https://huggingface.co/funnel-transformer/large-base/resolve/main/config.json''',
    '''funnel-transformer/xlarge''': '''https://huggingface.co/funnel-transformer/xlarge/resolve/main/config.json''',
    '''funnel-transformer/xlarge-base''': '''https://huggingface.co/funnel-transformer/xlarge-base/resolve/main/config.json''',
}

class      snake_case     (    __lowerCamelCase       ):




 """simple docstring"""



 SCREAMING_SNAKE_CASE_	:					str					="funnel"
 SCREAMING_SNAKE_CASE_	:					Dict					={
     "hidden_size": "d_model",
     "num_attention_heads": "n_head",
 }






 def __init__(       self       :							int							,	__A       :							Any=3_0_5_2_2							,	__A       :							List[Any]=[4, 4, 4]							,	__A       :							str=None							,	__A       :							Optional[int]=2							,	__A       :							Tuple=7_6_8							,	__A       :							Dict=1_2							,	__A       :							Optional[int]=6_4							,	__A       :							Dict=3_0_7_2							,	__A       :							Optional[int]="gelu_new"							,	__A       :							Any=0.1							,	__A       :							int=0.1							,	__A       :							Union[str, Any]=0.0							,	__A       :							Optional[Any]=0.1							,	__A       :							Tuple=None							,	__A       :							Optional[int]=1e-9							,	__A       :							Any="mean"							,	__A       :							List[str]="relative_shift"							,	__A       :							List[Any]=True							,	__A       :							List[str]=True							,	__A       :							List[str]=True							,	**__A       :							Optional[int]							,	):
        __UpperCamelCase       =  vocab_size
        __UpperCamelCase       =  block_sizes
        __UpperCamelCase       =  [1] * len(__A	) if block_repeats is None else block_repeats
        assert len(__A	) == len(
            self.block_repeats	), "`block_sizes` and `block_repeats` should have the same length."
        __UpperCamelCase       =  num_decoder_layers
        __UpperCamelCase       =  d_model
        __UpperCamelCase       =  n_head
        __UpperCamelCase       =  d_head
        __UpperCamelCase       =  d_inner
        __UpperCamelCase       =  hidden_act
        __UpperCamelCase       =  hidden_dropout
        __UpperCamelCase       =  attention_dropout
        __UpperCamelCase       =  activation_dropout
        __UpperCamelCase       =  initializer_range
        __UpperCamelCase       =  initializer_std
        __UpperCamelCase       =  layer_norm_eps
        assert pooling_type in [
            "mean",
            "max",
        ], f'''Got {pooling_type} for `pooling_type` but only \'mean\' and \'max\' are supported.'''
        __UpperCamelCase       =  pooling_type
        assert attention_type in [
            "relative_shift",
            "factorized",
        ], f'''Got {attention_type} for `attention_type` but only \'relative_shift\' and \'factorized\' are supported.'''
        __UpperCamelCase       =  attention_type
        __UpperCamelCase       =  separate_cls
        __UpperCamelCase       =  truncate_seq
        __UpperCamelCase       =  pool_q_only

        super().__init__(**__A	)






 @property
 def        _lowerCamelCase					(       self       :							int	):
        return sum(self.block_sizes	)






 @num_hidden_layers.setter
 def        _lowerCamelCase					(       self       :							List[Any]							,	__A       :							List[Any]	):
        raise NotImplementedError(
            'This model does not support the setting of `num_hidden_layers`. Please set `block_sizes`.'	)






 @property
 def        _lowerCamelCase					(       self       :							Optional[Any]	):
        return len(self.block_sizes	)






 @num_blocks.setter
 def        _lowerCamelCase					(       self       :							Any							,	__A       :							int	):
        raise NotImplementedError('This model does not support the setting of `num_blocks`. Please set `block_sizes`.'	)







'''simple docstring'''
# Copyright 2023 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import re

from ..models.auto import AutoProcessor
from ..models.vision_encoder_decoder import VisionEncoderDecoderModel
from ..utils import is_vision_available
from .base import PipelineTool


if is_vision_available():
    from PIL import Image

class      snake_case     (    __lowerCamelCase       ):




 """simple docstring"""



 SCREAMING_SNAKE_CASE_	:					Tuple					="naver-clova-ix/donut-base-finetuned-docvqa"
 SCREAMING_SNAKE_CASE_	:					Dict					=(
     "This is a tool that answers a question about an document (pdf). It takes an input named `document` which "
     "should be the document containing the information, as well as a `question` that is the question about the "
     "document. It returns a text that contains the answer to the question."
 )
 SCREAMING_SNAKE_CASE_	:					List[str]					="document_qa"
 SCREAMING_SNAKE_CASE_	:					Union[str, Any]					=AutoProcessor
 SCREAMING_SNAKE_CASE_	:					Union[str, Any]					=VisionEncoderDecoderModel

 SCREAMING_SNAKE_CASE_	:					List[Any]					=["image", "text"]
 SCREAMING_SNAKE_CASE_	:					Any					=["text"]






 def __init__(       self       :							Optional[int]							,	*__A       :							List[str]							,	**__A       :							List[Any]	):
        if not is_vision_available():
               raise ValueError('Pillow must be installed to use the DocumentQuestionAnsweringTool.'	)

        super().__init__(*__A							,	**__A	)






 def        _lowerCamelCase					(       self       :							Any							,	__A       :							"Image"							,	__A       :							str	):
        __UpperCamelCase       =  '<s_docvqa><s_question>{user_input}</s_question><s_answer>'
        __UpperCamelCase       =  task_prompt.replace('{user_input}'							,	__A	)
        __UpperCamelCase       =  self.pre_processor.tokenizer(
            __A							,	add_special_tokens=__A							,	return_tensors='pt'	).input_ids
        __UpperCamelCase       =  self.pre_processor(__A							,	return_tensors='pt'	).pixel_values

        return {"decoder_input_ids": decoder_input_ids, "pixel_values": pixel_values}






 def        _lowerCamelCase					(       self       :							Union[str, Any]							,	__A       :							Optional[Any]	):
        return self.model.generate(
            inputs['pixel_values'].to(self.device	)							,	decoder_input_ids=inputs['decoder_input_ids'].to(self.device	)							,	max_length=self.model.decoder.config.max_position_embeddings							,	early_stopping=__A							,	pad_token_id=self.pre_processor.tokenizer.pad_token_id							,	eos_token_id=self.pre_processor.tokenizer.eos_token_id							,	use_cache=__A							,	num_beams=1							,	bad_words_ids=[[self.pre_processor.tokenizer.unk_token_id]]							,	return_dict_in_generate=__A							,	).sequences






 def        _lowerCamelCase					(       self       :							Tuple							,	__A       :							List[Any]	):
        __UpperCamelCase       =  self.pre_processor.batch_decode(__A	)[0]
        __UpperCamelCase       =  sequence.replace(self.pre_processor.tokenizer.eos_token							,	''	)
        __UpperCamelCase       =  sequence.replace(self.pre_processor.tokenizer.pad_token							,	''	)
        __UpperCamelCase       =  re.sub(R'<.*?>'							,	''							,	__A							,	count=1	).strip()  # remove first task start token
        __UpperCamelCase       =  self.pre_processor.tokenajson(__A	)

        return sequence["answer"]
