/* Copyright 2020 The TensorFlow Authors. 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 <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
/**
 * Struct to represent the logit and offset of the answer related to context.
 */
struct TFLPos {
  int start;
  int end;
  float logit;
};

/**
 * Class for the Answer to BertQuestionAnswerer.
 */
@interface TFLQAAnswer : NSObject
@property(nonatomic) struct TFLPos pos;
@property(nonatomic) NSString* text;
@end

/**
 * BertQA task API, performs tokenization for models (BERT, Albert, etc.) in
 * preprocess and returns most possible answers.
 *
 * In particular, the branch of BERT models use WordPiece tokenizer, and the
 * branch of Albert models use SentencePiece tokenizer, respectively.
 */
@interface TFLBertQuestionAnswerer : NSObject

/**
 * Creates a BertQuestionAnswerer instance with an albert model or mobilebert
 * model. The API expects a Bert based TFLite model with metadata containing
 * the following information:
 *  input_process_units: for Wordpiece/Sentencepiece Tokenizer
 *  3 input tensors with names "ids", "mask" and "segment_ids"
 *  2 output tensors with names "end_logits" and "start_logits"
 * Sample models:
 *   https://tfhub.dev/tensorflow/lite-model/albert_lite_base/squadv1/1
 *   https://tfhub.dev/tensorflow/lite-model/mobilebert/1/default/1
 * @param modelPath The file path to the tflite model.
 * @return A BertQuestionAnswerer instance.
 */
+ (instancetype)questionAnswererWithModelPath:(NSString*)modelPath
    NS_SWIFT_NAME(questionAnswerer(modelPath:));

/**
 * Answers question based on the context. Could be empty if no answer was found
 * from the given context.
 *
 * @param context Context the question bases on.
 * @param question Question to ask.
 *
 * @return A list of answers to the question, reversely sorted by the
 * probability of each answer.
 */
- (NSArray<TFLQAAnswer*>*)answerWithContext:(NSString*)context
                                   question:(NSString*)question
    NS_SWIFT_NAME(answer(context:question:));
@end
NS_ASSUME_NONNULL_END
