/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of 
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, 
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */

#ifndef ACL_MODEL_SRC_MODEL_ACL_MODEL_IMPL_OM2_H_
#define ACL_MODEL_SRC_MODEL_ACL_MODEL_IMPL_OM2_H_

#include <stddef.h>
#include <stdint.h>

#include "acl_base_rt.h"
#include "acl_rt.h"
#include "acl_mdl.h"

#ifdef __cplusplus
extern "C" {
#endif

ACL_FUNC_VISIBILITY aclmdlDesc *aclmdlCreateDescImplOm2();

ACL_FUNC_VISIBILITY aclError aclmdlDestroyDescImplOm2(aclmdlDesc *modelDesc);

ACL_FUNC_VISIBILITY aclError aclmdlGetDescImplOm2(aclmdlDesc *modelDesc, uint32_t modelId);

ACL_FUNC_VISIBILITY aclError aclmdlGetDescFromFileImplOm2(aclmdlDesc *modelDesc, const char *modelPath);

ACL_FUNC_VISIBILITY aclError aclmdlGetDescFromMemImplOm2(aclmdlDesc *modelDesc, const void *model, size_t modelSize);

ACL_FUNC_VISIBILITY size_t aclmdlGetNumInputsImplOm2(aclmdlDesc *modelDesc);

ACL_FUNC_VISIBILITY size_t aclmdlGetNumOutputsImplOm2(aclmdlDesc *modelDesc);

ACL_FUNC_VISIBILITY size_t aclmdlGetInputSizeByIndexImplOm2(aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY size_t aclmdlGetOutputSizeByIndexImplOm2(aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY aclmdlExecConfigHandle *aclmdlCreateExecConfigHandleImplOm2();

ACL_FUNC_VISIBILITY aclError aclmdlDestroyExecConfigHandleImplOm2(const aclmdlExecConfigHandle *handle);

ACL_FUNC_VISIBILITY aclmdlDataset *aclmdlCreateDatasetImplOm2();

ACL_FUNC_VISIBILITY aclError aclmdlDestroyDatasetImplOm2(const aclmdlDataset *dataset);

ACL_FUNC_VISIBILITY aclError aclmdlAddDatasetBufferImplOm2(aclmdlDataset *dataset, aclDataBuffer *dataBuffer);

ACL_FUNC_VISIBILITY aclError aclmdlSetDatasetTensorDescImplOm2(aclmdlDataset *dataset,
                                                               aclTensorDesc *tensorDesc,
                                                               size_t index);

ACL_FUNC_VISIBILITY aclTensorDesc *aclmdlGetDatasetTensorDescImplOm2(const aclmdlDataset *dataset, size_t index);

ACL_FUNC_VISIBILITY size_t aclmdlGetDatasetNumBuffersImplOm2(const aclmdlDataset *dataset);

ACL_FUNC_VISIBILITY aclDataBuffer *aclmdlGetDatasetBufferImplOm2(const aclmdlDataset *dataset, size_t index);

ACL_FUNC_VISIBILITY aclError aclmdlLoadFromFileImplOm2(const char *modelPath, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleLoadFromFileImplOm2(const char *modelPath, uint32_t *bundleId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleLoadFromMemImplOm2(const void *model,  size_t modelSize, uint32_t *bundleId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleUnloadImplOm2(uint32_t bundleId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleGetModelNumImplOm2(uint32_t bundleId, size_t *modelNum);

ACL_FUNC_VISIBILITY aclError aclmdlBundleGetModelIdImplOm2(uint32_t bundleId, size_t index, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclmdlBundleQueryInfo *aclmdlBundleCreateQueryInfoImplOm2();

ACL_FUNC_VISIBILITY aclError aclmdlBundleDestroyQueryInfoImplOm2(aclmdlBundleQueryInfo *queryInfo);

ACL_FUNC_VISIBILITY aclError aclmdlBundleQueryInfoFromFileImplOm2(const char *fileName, aclmdlBundleQueryInfo *queryInfo);

ACL_FUNC_VISIBILITY aclError aclmdlBundleQueryInfoFromMemImplOm2(const void *model, size_t modelSize,
                                                                 aclmdlBundleQueryInfo *queryInfo);

ACL_FUNC_VISIBILITY aclError aclmdlBundleGetQueryModelNumImplOm2(const aclmdlBundleQueryInfo *queryInfo, size_t *modelNum);


ACL_FUNC_VISIBILITY aclError aclmdlBundleGetVarWeightSizeImplOm2(const aclmdlBundleQueryInfo *queryInfo,
                                                                 size_t *variableWeightSize);


ACL_FUNC_VISIBILITY aclError aclmdlBundleGetSizeImplOm2(const aclmdlBundleQueryInfo *queryInfo, size_t index,
                                                        size_t *workSize, size_t *constWeightSize);

ACL_FUNC_VISIBILITY aclError aclmdlBundleInitFromFileImplOm2(const char *modelPath, void *varWeightPtr,
                                                             size_t varWeightSize, uint32_t *bundleId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleInitFromMemImplOm2(const void *model, size_t modelSize, void *varWeightPtr,
                                                            size_t varWeightSize, uint32_t *bundleId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleLoadModelImplOm2(uint32_t bundleId, size_t index, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleLoadModelWithMemImplOm2(uint32_t bundleId, size_t index, void *workPtr,
                                                                 size_t workSize, void *weightPtr,
                                                                 size_t weightSize, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleLoadModelWithConfigImplOm2(uint32_t bundleId, size_t index,
                                                                    aclmdlConfigHandle *handle, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclError aclmdlBundleUnloadModelImplOm2(uint32_t bundleId, uint32_t modelId);

ACL_FUNC_VISIBILITY aclError aclmdlLoadFromMemImplOm2(const void *model, size_t modelSize, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclError aclmdlLoadFromFileWithMemImplOm2(const char *modelPath,
                                                              uint32_t *modelId, void *workPtr, size_t workSize,
                                                              void *weightPtr, size_t weightSize);

ACL_FUNC_VISIBILITY aclError aclmdlLoadFromMemWithMemImplOm2(const void *model, size_t modelSize,
                                                             uint32_t *modelId, void *workPtr, size_t workSize,
                                                             void *weightPtr, size_t weightSize);

ACL_FUNC_VISIBILITY aclError aclmdlLoadFromFileWithQImplOm2(const char *modelPath, uint32_t *modelId, const uint32_t *inputQ,
                                                            size_t inputQNum, const uint32_t *outputQ, size_t outputQNum);

ACL_FUNC_VISIBILITY aclError aclmdlLoadFromMemWithQImplOm2(const void *model, size_t modelSize, uint32_t *modelId,
                                                           const uint32_t *inputQ, size_t inputQNum,
                                                           const uint32_t *outputQ, size_t outputQNum);

ACL_FUNC_VISIBILITY aclError aclmdlExecuteImplOm2(uint32_t modelId, const aclmdlDataset *input, aclmdlDataset *output);

ACL_FUNC_VISIBILITY aclError aclmdlExecuteV2ImplOm2(uint32_t modelId, const aclmdlDataset *input, aclmdlDataset *output,
                                                    aclrtStream stream, const aclmdlExecConfigHandle *handle);

ACL_FUNC_VISIBILITY aclError aclmdlExecuteAsyncImplOm2(uint32_t modelId, const aclmdlDataset *input,
                                                       aclmdlDataset *output, aclrtStream stream);

ACL_FUNC_VISIBILITY aclError aclmdlUnloadImplOm2(uint32_t modelId);

ACL_FUNC_VISIBILITY aclError aclmdlQuerySizeImplOm2(const char *fileName, size_t *workSize, size_t *weightSize);

ACL_FUNC_VISIBILITY aclError aclmdlQuerySizeFromMemImplOm2(const void *model, size_t modelSize, size_t *workSize,
                                                           size_t *weightSize);

ACL_FUNC_VISIBILITY aclError aclmdlSetDynamicBatchSizeImplOm2(uint32_t modelId, aclmdlDataset *dataset, size_t index,
                                                              uint64_t batchSize);

ACL_FUNC_VISIBILITY aclError aclmdlSetDynamicHWSizeImplOm2(uint32_t modelId, aclmdlDataset *dataset, size_t index,
                                                           uint64_t height, uint64_t width);

ACL_FUNC_VISIBILITY aclError aclmdlSetInputDynamicDimsImplOm2(uint32_t modelId, aclmdlDataset *dataset, size_t index,
                                                              const aclmdlIODims *dims);

ACL_FUNC_VISIBILITY aclError aclmdlGetInputDimsImplOm2(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims);

ACL_FUNC_VISIBILITY aclError aclmdlGetInputDimsV2ImplOm2(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims);

ACL_FUNC_VISIBILITY aclError aclmdlGetInputDimsRangeImplOm2(const aclmdlDesc *modelDesc, size_t index,
                                                            aclmdlIODimsRange *dimsRange);

ACL_FUNC_VISIBILITY aclError aclmdlGetOutputDimsImplOm2(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims);

ACL_FUNC_VISIBILITY aclError aclmdlGetCurOutputDimsImplOm2(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims);

ACL_FUNC_VISIBILITY const char *aclmdlGetOpAttrImplOm2(aclmdlDesc *modelDesc, const char *opName, const char *attr);

ACL_FUNC_VISIBILITY const char *aclmdlGetInputNameByIndexImplOm2(const aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY const char *aclmdlGetOutputNameByIndexImplOm2(const aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY aclFormat aclmdlGetInputFormatImplOm2(const aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY aclFormat aclmdlGetOutputFormatImplOm2(const aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY aclDataType aclmdlGetInputDataTypeImplOm2(const aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY aclDataType aclmdlGetOutputDataTypeImplOm2(const aclmdlDesc *modelDesc, size_t index);

ACL_FUNC_VISIBILITY aclError aclmdlGetInputIndexByNameImplOm2(const aclmdlDesc *modelDesc, const char *name, size_t *index);

ACL_FUNC_VISIBILITY aclError aclmdlGetOutputIndexByNameImplOm2(const aclmdlDesc *modelDesc, const char *name, size_t *index);

ACL_FUNC_VISIBILITY aclError aclmdlGetDynamicBatchImplOm2(const aclmdlDesc *modelDesc, aclmdlBatch *batch);

ACL_FUNC_VISIBILITY aclError aclmdlGetDynamicHWImplOm2(const aclmdlDesc *modelDesc, size_t index, aclmdlHW *hw);

ACL_FUNC_VISIBILITY aclError aclmdlGetInputDynamicGearCountImplOm2(const aclmdlDesc *modelDesc, size_t index,
                                                                   size_t *gearCount);

ACL_FUNC_VISIBILITY aclError aclmdlGetInputDynamicDimsImplOm2(const aclmdlDesc *modelDesc, size_t index, aclmdlIODims *dims,
                                                              size_t gearCount);

ACL_FUNC_VISIBILITY aclmdlAIPP *aclmdlCreateAIPPImplOm2(uint64_t batchSize);

ACL_FUNC_VISIBILITY aclError aclmdlDestroyAIPPImplOm2(const aclmdlAIPP *aippParmsSet);

ACL_FUNC_VISIBILITY aclError aclmdlGetAippDataSizeImplOm2(uint64_t batchSize, size_t *size);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPInputFormatImplOm2(aclmdlAIPP *aippParmsSet, aclAippInputFormat inputFormat);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPCscParamsImplOm2(aclmdlAIPP *aippParmsSet, int8_t cscSwitch,
                                                           int16_t cscMatrixR0C0, int16_t cscMatrixR0C1, int16_t cscMatrixR0C2,
                                                           int16_t cscMatrixR1C0, int16_t cscMatrixR1C1, int16_t cscMatrixR1C2,
                                                           int16_t cscMatrixR2C0, int16_t cscMatrixR2C1, int16_t cscMatrixR2C2,
                                                           uint8_t cscOutputBiasR0, uint8_t cscOutputBiasR1,
                                                           uint8_t cscOutputBiasR2, uint8_t cscInputBiasR0,
                                                           uint8_t cscInputBiasR1, uint8_t cscInputBiasR2);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPRbuvSwapSwitchImplOm2(aclmdlAIPP *aippParmsSet, int8_t rbuvSwapSwitch);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPAxSwapSwitchImplOm2(aclmdlAIPP *aippParmsSet, int8_t axSwapSwitch);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPSrcImageSizeImplOm2(aclmdlAIPP *aippParmsSet, int32_t srcImageSizeW,
                                                              int32_t srcImageSizeH);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPScfParamsImplOm2(aclmdlAIPP *aippParmsSet,
                                                           int8_t scfSwitch,
                                                           int32_t scfInputSizeW,
                                                           int32_t scfInputSizeH,
                                                           int32_t scfOutputSizeW,
                                                           int32_t scfOutputSizeH,
                                                           uint64_t batchIndex);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPCropParamsImplOm2(aclmdlAIPP *aippParmsSet,
                                                            int8_t cropSwitch,
                                                            int32_t cropStartPosW,
                                                            int32_t cropStartPosH,
                                                            int32_t cropSizeW,
                                                            int32_t cropSizeH,
                                                            uint64_t batchIndex);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPPaddingParamsImplOm2(aclmdlAIPP *aippParmsSet, int8_t paddingSwitch,
                                                               int32_t paddingSizeTop, int32_t paddingSizeBottom,
                                                               int32_t paddingSizeLeft, int32_t paddingSizeRight,
                                                               uint64_t batchIndex);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPDtcPixelMeanImplOm2(aclmdlAIPP *aippParmsSet,
                                                              int16_t dtcPixelMeanChn0,
                                                              int16_t dtcPixelMeanChn1,
                                                              int16_t dtcPixelMeanChn2,
                                                              int16_t dtcPixelMeanChn3,
                                                              uint64_t batchIndex);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPDtcPixelMinImplOm2(aclmdlAIPP *aippParmsSet,
                                                             float dtcPixelMinChn0,
                                                             float dtcPixelMinChn1,
                                                             float dtcPixelMinChn2,
                                                             float dtcPixelMinChn3,
                                                             uint64_t batchIndex);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPPixelVarReciImplOm2(aclmdlAIPP *aippParmsSet,
                                                              float dtcPixelVarReciChn0,
                                                              float dtcPixelVarReciChn1,
                                                              float dtcPixelVarReciChn2,
                                                              float dtcPixelVarReciChn3,
                                                              uint64_t batchIndex);

ACL_FUNC_VISIBILITY aclError aclmdlSetInputAIPPImplOm2(uint32_t modelId,
                                                       aclmdlDataset *dataset,
                                                       size_t index,
                                                       const aclmdlAIPP *aippParmsSet);

ACL_FUNC_VISIBILITY aclError aclmdlSetAIPPByInputIndexImplOm2(uint32_t modelId,
                                                              aclmdlDataset *dataset,
                                                              size_t index,
                                                              const aclmdlAIPP *aippParmsSet);

ACL_FUNC_VISIBILITY aclError aclmdlGetAippTypeImplOm2(uint32_t modelId,
                                                      size_t index,
                                                      aclmdlInputAippType *type,
                                                      size_t *dynamicAttachedDataIndex);

ACL_FUNC_VISIBILITY aclError aclmdlGetFirstAippInfoImplOm2(uint32_t modelId, size_t index, aclAippInfo *aippInfo);

ACL_FUNC_VISIBILITY aclError aclmdlCreateAndGetOpDescImplOm2(uint32_t deviceId, uint32_t streamId,
    uint32_t taskId, char *opName, size_t opNameLen, aclTensorDesc **inputDesc, size_t *numInputs,
    aclTensorDesc **outputDesc, size_t *numOutputs);

ACL_FUNC_VISIBILITY aclError aclmdlLoadWithConfigImplOm2(const aclmdlConfigHandle *handle, uint32_t *modelId);

ACL_FUNC_VISIBILITY aclError aclmdlSetExternalWeightAddressImplOm2(aclmdlConfigHandle *handle, const char *weightFileName, void *devPtr, size_t size);

ACL_FUNC_VISIBILITY aclmdlConfigHandle *aclmdlCreateConfigHandleImplOm2();

ACL_FUNC_VISIBILITY aclError aclmdlDestroyConfigHandleImplOm2(aclmdlConfigHandle *handle);

ACL_FUNC_VISIBILITY aclError aclmdlSetConfigOptImplOm2(aclmdlConfigHandle *handle, aclmdlConfigAttr attr,
    const void *attrValue, size_t valueSize);

ACL_FUNC_VISIBILITY aclError aclmdlSetExecConfigOptImplOm2(aclmdlExecConfigHandle *handle, aclmdlExecConfigAttr attr,
                                                           const void *attrValue, size_t valueSize);

ACL_FUNC_VISIBILITY const char *aclmdlGetTensorRealNameImplOm2(const aclmdlDesc *modelDesc, const char *name);

ACL_FUNC_VISIBILITY aclError aclRecoverAllHcclTasksImplOm2(int32_t deviceId);

ACL_FUNC_VISIBILITY aclTensorDesc *aclCreateTensorDescImplOm2(aclDataType dataType,
                                                              int numDims,
                                                              const int64_t *dims,
                                                              aclFormat format);

ACL_FUNC_VISIBILITY void aclDestroyTensorDescImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY aclError aclSetTensorShapeRangeImplOm2(aclTensorDesc *desc,
                                                           size_t dimsCount,
                                                           int64_t dimsRange[][ACL_TENSOR_SHAPE_RANGE_NUM]);

ACL_FUNC_VISIBILITY aclError aclSetTensorValueRangeImplOm2(aclTensorDesc *desc,
                                                           size_t valueCount,
                                                           int64_t valueRange[][ACL_TENSOR_VALUE_RANGE_NUM]);

ACL_FUNC_VISIBILITY aclDataType aclGetTensorDescTypeImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY aclFormat aclGetTensorDescFormatImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY size_t aclGetTensorDescSizeImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY size_t aclGetTensorDescElementCountImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY size_t aclGetTensorDescNumDimsImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY int64_t aclGetTensorDescDimImplOm2(const aclTensorDesc *desc, size_t index);

ACL_FUNC_VISIBILITY aclError aclGetTensorDescDimV2ImplOm2(const aclTensorDesc *desc, size_t index, int64_t *dimSize);

ACL_FUNC_VISIBILITY aclError aclGetTensorDescDimRangeImplOm2(const aclTensorDesc *desc,
                                                             size_t index,
                                                             size_t dimRangeNum,
                                                             int64_t *dimRange);

ACL_FUNC_VISIBILITY void aclSetTensorDescNameImplOm2(aclTensorDesc *desc, const char *name);

ACL_FUNC_VISIBILITY const char *aclGetTensorDescNameImplOm2(aclTensorDesc *desc);

ACL_FUNC_VISIBILITY aclError aclTransTensorDescFormatImplOm2(const aclTensorDesc *srcDesc, aclFormat dstFormat,
                                                             aclTensorDesc **dstDesc);

ACL_FUNC_VISIBILITY aclError aclSetTensorStorageFormatImplOm2(aclTensorDesc *desc, aclFormat format);

ACL_FUNC_VISIBILITY aclError aclSetTensorStorageShapeImplOm2(aclTensorDesc *desc, int numDims, const int64_t *dims);

ACL_FUNC_VISIBILITY aclError aclSetTensorFormatImplOm2(aclTensorDesc *desc, aclFormat format);

ACL_FUNC_VISIBILITY aclError aclSetTensorShapeImplOm2(aclTensorDesc *desc, int numDims, const int64_t *dims);

ACL_FUNC_VISIBILITY aclError aclSetTensorOriginFormatImplOm2(aclTensorDesc *desc, aclFormat format);

ACL_FUNC_VISIBILITY aclError aclSetTensorOriginShapeImplOm2(aclTensorDesc *desc, int numDims, const int64_t *dims);

ACL_FUNC_VISIBILITY aclTensorDesc *aclGetTensorDescByIndexImplOm2(aclTensorDesc *desc, size_t index);

ACL_FUNC_VISIBILITY void *aclGetTensorDescAddressImplOm2(const aclTensorDesc *desc);

ACL_FUNC_VISIBILITY aclError aclSetTensorDynamicInputImplOm2(aclTensorDesc *desc, const char *dynamicInputName);

ACL_FUNC_VISIBILITY aclError aclSetTensorConstImplOm2(aclTensorDesc *desc, void *dataBuffer, size_t length);

ACL_FUNC_VISIBILITY aclError aclSetTensorPlaceMentImplOm2(aclTensorDesc *desc, aclMemType memType);

ACL_FUNC_VISIBILITY aclError aclmdlSetAttributeImplOm2(uint32_t modelId, aclmdlAttr attr, aclmdlAttrValue_t *attrValue);

ACL_FUNC_VISIBILITY aclError aclmdlGetAttributeImplOm2(uint32_t modelId, aclmdlAttr attr, aclmdlAttrValue_t *attrValue);

#ifdef __cplusplus
}
#endif

#endif // ACL_MODEL_SRC_MODEL_ACL_MODEL_IMPL_OM2_H_