/*
 * Copyright (c) 2024 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.
 */

#include "atb/utils/param_to_json.h"
#include "atb/infer_op_params.h"
#include "atb/train_op_params.h"
#include "atb/common_op_params.h"
#include "atb/utils/common_utils.h"

namespace atb {
template <> nlohmann::json OpParamToJson(const infer::ActivationParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["activationType"] = opParam.activationType;
    paramsJson["scale"] = opParam.scale;
    paramsJson["dim"] = opParam.dim;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AllGatherParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AllGatherVParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AllReduceParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["backend"] = opParam.backend;
    paramsJson["allReduceType"] = opParam.allReduceType;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;
    paramsJson["quantType"] = opParam.quantType;
    paramsJson["outDataType"] = opParam.outDataType;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AsStridedParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["size"] = SVectorToVector(opParam.size);
    paramsJson["stride"] = SVectorToVector(opParam.stride);
    paramsJson["offset"] = SVectorToVector(opParam.offset);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::BroadcastParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["backend"] = opParam.backend;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ReduceScatterParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["reduceType"] = opParam.reduceType;
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["backend"] = opParam.backend;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ReduceScatterVParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["sendCounts"] = opParam.sendCounts;
    paramsJson["sdispls"] = opParam.sdispls;
    paramsJson["recvCount"] = opParam.recvCount;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["reduceType"] = opParam.reduceType;
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["backend"] = opParam.backend;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ConcatParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["concatDim"] = opParam.concatDim;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::CumsumParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["axes"] = SVectorToVector(opParam.axes);
    paramsJson["exclusive"] = opParam.exclusive;
    paramsJson["reverse"] = opParam.reverse;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::DynamicNTKParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["outputType"] = opParam.outDataType;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ElewiseParam &opParam)
{
    nlohmann::json quantParamsJson;
    quantParamsJson["inputOffset"] = opParam.quantParam.inputOffset;
    quantParamsJson["inputScale"] = opParam.quantParam.inputScale;
    quantParamsJson["asymmetric"] = opParam.quantParam.asymmetric;

    nlohmann::json mulsParamJson;
    mulsParamJson["varAttr"] = opParam.mulsParam.varAttr;

    nlohmann::json paramsJson;
    paramsJson["elewiseType"] = opParam.elewiseType;
    paramsJson["quantParam"] = quantParamsJson;
    paramsJson["mulsParam"] = mulsParamJson;
    paramsJson["outTensorType"] = opParam.outTensorType;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const train::FastSoftMaxParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["qSeqLen"] = opParam.qSeqLen;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const train::FastSoftMaxGradParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["qSeqLen"] = opParam.qSeqLen;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::FillParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["outDim"] = SVectorToVector(opParam.outDim);
    paramsJson["value"] = SVectorToVector(opParam.value);
    paramsJson["withMask"] = opParam.withMask;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GatherParam &opParam)
{
    nlohmann::json gatherParamsJson;
    gatherParamsJson["axis"] = opParam.axis;
    gatherParamsJson["batchDims"] = opParam.batchDims;

    return gatherParamsJson;
}

template <> nlohmann::json OpParamToJson(const train::GenAttentionMaskParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["seqLen"] = SVectorToVector(opParam.seqLen);
    paramsJson["headNum"] = opParam.headNum;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GroupedMatmulInplaceAddParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["transposeA"] = opParam.transposeA;
    paramsJson["transposeB"] = opParam.transposeB;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::LayerNormParam &opParam)
{
    nlohmann::json normParam;
    normParam["quantType"] = opParam.normParam.quantType;
    normParam["epsilon"] = opParam.normParam.epsilon;
    normParam["beginNormAxis"] = opParam.normParam.beginNormAxis;
    normParam["beginParamsAxis"] = opParam.normParam.beginParamsAxis;

    nlohmann::json preNormParam;
    preNormParam["quantType"] = opParam.preNormParam.quantType;
    preNormParam["epsilon"] = opParam.preNormParam.epsilon;
    preNormParam["opMode"] = opParam.preNormParam.opMode;
    preNormParam["zoomScaleValue"] = opParam.preNormParam.zoomScaleValue;

    nlohmann::json postNormParam;
    postNormParam["quantType"] = opParam.postNormParam.quantType;
    postNormParam["epsilon"] = opParam.postNormParam.epsilon;
    postNormParam["opMode"] = opParam.postNormParam.opMode;
    postNormParam["zoomScaleValue"] = opParam.postNormParam.zoomScaleValue;

    nlohmann::json paramJson;
    paramJson["layerType"] = opParam.layerType;
    paramJson["normParam"] = normParam;
    paramJson["preNormParam"] = preNormParam;
    paramJson["postNormParam"] = postNormParam;

    return paramJson;
}

template <> nlohmann::json OpParamToJson(const infer::LayerNormWithStrideParam &opParam)
{
    nlohmann::json normParam;
    normParam["quantType"] = opParam.normParam.quantType;
    normParam["epsilon"] = opParam.normParam.epsilon;
    normParam["beginNormAxis"] = opParam.normParam.beginNormAxis;
    normParam["beginParamsAxis"] = opParam.normParam.beginParamsAxis;

    nlohmann::json preNormParam;
    preNormParam["quantType"] = opParam.preNormParam.quantType;
    preNormParam["epsilon"] = opParam.preNormParam.epsilon;
    preNormParam["opMode"] = opParam.preNormParam.opMode;
    preNormParam["zoomScaleValue"] = opParam.preNormParam.zoomScaleValue;

    nlohmann::json postNormParam;
    postNormParam["quantType"] = opParam.postNormParam.quantType;
    postNormParam["epsilon"] = opParam.postNormParam.epsilon;
    postNormParam["opMode"] = opParam.postNormParam.opMode;
    postNormParam["zoomScaleValue"] = opParam.postNormParam.zoomScaleValue;

    nlohmann::json layerNormWithStrideParamJson;
    layerNormWithStrideParamJson["layerType"] = opParam.layerType;
    layerNormWithStrideParamJson["normParam"] = normParam;
    layerNormWithStrideParamJson["preNormParam"] = preNormParam;
    layerNormWithStrideParamJson["postNormParam"] = postNormParam;

    return layerNormWithStrideParamJson;
}

template <> nlohmann::json OpParamToJson(const infer::LinearParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["transposeA"] = opParam.transposeA;
    paramsJson["transposeB"] = opParam.transposeB;
    paramsJson["hasBias"] = opParam.hasBias;
    paramsJson["outDataType"] = opParam.outDataType;
    paramsJson["enAccum"] = opParam.enAccum;
    paramsJson["matmulType"] = opParam.matmulType;
    paramsJson["quantMode"] = opParam.quantMode;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::LinearParallelParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["transWeight"] = opParam.transWeight;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["hasResidual"] = opParam.hasResidual;
    paramsJson["backend"] = opParam.backend;
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["type"] = opParam.type;
    paramsJson["keepIntermediate"] = opParam.keepIntermediate;
    paramsJson["quantType"] = opParam.quantType;
    paramsJson["quantGroupSize"] = opParam.quantGroupSize;
    paramsJson["outDataType"] = opParam.outDataType;
    paramsJson["commDomain"] = opParam.commDomain;
    paramsJson["local_expert_nums"] = opParam.moeInfo.localExpertNums;
    paramsJson["epSize"] = opParam.moeInfo.epSize;
    paramsJson["tpSize"] = opParam.moeInfo.tpSize;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::LinearSparseParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["transposeA"] = opParam.transposeA;
    paramsJson["transposeB"] = opParam.transposeB;
    paramsJson["tilingK"] = opParam.tilingK;
    paramsJson["tilingN"] = opParam.tilingN;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SwigluQuantParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["quantType"] = opParam.quantType;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::MultinomialParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["numSamples"] = opParam.numSamples;
    paramsJson["randSeed"] = opParam.randSeed;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::OnehotParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["axis"] = opParam.axis;
    paramsJson["depth"] = opParam.depth;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::IndexAddParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["indexType"] = opParam.indexType;
    paramsJson["axis"] = opParam.axis;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::PagedAttentionParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["qkScale"] = opParam.qkScale;
    paramsJson["kvHeadNum"] = opParam.kvHeadNum;
    paramsJson["maskType"] = opParam.maskType;
    paramsJson["batchRunStatusEnable"] = opParam.batchRunStatusEnable;
    paramsJson["quantType"] = opParam.quantType;
    paramsJson["hasQuantOffset"] = opParam.hasQuantOffset;
    paramsJson["compressType"] = opParam.compressType;
    paramsJson["calcType"] = opParam.calcType;

    paramsJson["mlaVHeadSize"] = opParam.mlaVHeadSize;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ReduceParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["axis"] = SVectorToVector(opParam.axis);
    paramsJson["reduceType"] = opParam.reduceType;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RelayAttentionParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["qkScale"] = opParam.qkScale;
    paramsJson["kvHeadNum"] = opParam.kvHeadNum;
    paramsJson["maskType"] = opParam.maskType;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RepeatParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["multiples"] = SVectorToVector(opParam.multiples);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RmsNormParam &opParam)
{
    nlohmann::json normParamJson;
    normParamJson["quantType"] = opParam.normParam.quantType;
    normParamJson["epsilon"] = opParam.normParam.epsilon;
    normParamJson["layerNormEps"] = opParam.normParam.layerNormEps;
    normParamJson["rstd"] = opParam.normParam.rstd;
    normParamJson["precisionMode"] = opParam.normParam.precisionMode;
    normParamJson["modelType"] = opParam.normParam.modelType;
    normParamJson["dynamicQuantType"] = opParam.normParam.dynamicQuantType;

    nlohmann::json preNormParamJson;
    preNormParamJson["quantType"] = opParam.preNormParam.quantType;
    preNormParamJson["epsilon"] = opParam.preNormParam.epsilon;
    preNormParamJson["hasBias"] = opParam.preNormParam.hasBias;

    nlohmann::json postNormParamJson;
    postNormParamJson["quantType"] = opParam.postNormParam.quantType;
    postNormParamJson["epsilon"] = opParam.postNormParam.epsilon;
    postNormParamJson["hasBias"] = opParam.postNormParam.hasBias;

    nlohmann::json rmsNormParamsJson;
    rmsNormParamsJson["layerType"] = opParam.layerType;
    rmsNormParamsJson["normParam"] = normParamJson;
    rmsNormParamsJson["preNormParam"] = preNormParamJson;
    rmsNormParamsJson["postNormParam"] = postNormParamJson;
    return rmsNormParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RmsNormWithStrideParam &opParam)
{
    nlohmann::json normParamJson;
    normParamJson["quantType"] = opParam.normParam.quantType;
    normParamJson["epsilon"] = opParam.normParam.epsilon;
    normParamJson["layerNormEps"] = opParam.normParam.layerNormEps;
    normParamJson["rstd"] = opParam.normParam.rstd;
    normParamJson["precisionMode"] = opParam.normParam.precisionMode;
    normParamJson["modelType"] = opParam.normParam.modelType;

    nlohmann::json preNormParamJson;
    preNormParamJson["quantType"] = opParam.preNormParam.quantType;
    preNormParamJson["epsilon"] = opParam.preNormParam.epsilon;
    preNormParamJson["hasBias"] = opParam.preNormParam.hasBias;

    nlohmann::json postNormParamJson;
    postNormParamJson["quantType"] = opParam.postNormParam.quantType;
    postNormParamJson["epsilon"] = opParam.postNormParam.epsilon;
    postNormParamJson["hasBias"] = opParam.postNormParam.hasBias;

    nlohmann::json rmsNormWithStrideParamsJson;
    rmsNormWithStrideParamsJson["layerType"] = opParam.layerType;
    rmsNormWithStrideParamsJson["normParam"] = normParamJson;
    rmsNormWithStrideParamsJson["preNormParam"] = preNormParamJson;
    rmsNormWithStrideParamsJson["postNormParam"] = postNormParamJson;
    return rmsNormWithStrideParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RopeParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rotaryCoeff"] = opParam.rotaryCoeff;
    paramsJson["cosFormat"] = opParam.cosFormat;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const train::RopeGradParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["c_qSeqLen"] = opParam.qSeqLen;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SelfAttentionParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["isTriuMask"] = opParam.isTriuMask;
    paramsJson["qScale"] = opParam.qScale;
    paramsJson["qkScale"] = opParam.qkScale;
    paramsJson["batchRunStatusEnable"] = opParam.batchRunStatusEnable;
    paramsJson["kvHeadNum"] = opParam.kvHeadNum;
    paramsJson["calcType"] = opParam.calcType;
    paramsJson["maskType"] = opParam.maskType;
    paramsJson["kernelType"] = opParam.kernelType;
    paramsJson["clampType"] = opParam.clampType;
    paramsJson["clampMin"] = opParam.clampMin;
    paramsJson["clampMax"] = opParam.clampMax;
    paramsJson["kvcacheCfg"] = opParam.kvcacheCfg;
    paramsJson["inputLayout"] = opParam.inputLayout;
    paramsJson["scaleType"] = opParam.scaleType;
    paramsJson["quantType"] = opParam.quantType;
    paramsJson["outDataType"] = opParam.outDataType;
    paramsJson["mlaVHeadSize"] = opParam.mlaVHeadSize;
    paramsJson["windowSize"] = opParam.windowSize;
    paramsJson["cacheType"] = opParam.cacheType;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SetValueParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["starts"] = SVectorToVector(opParam.starts);
    paramsJson["ends"] = SVectorToVector(opParam.ends);
    paramsJson["strides"] = SVectorToVector(opParam.strides);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SliceParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["offsets"] = SVectorToVector(opParam.offsets);
    paramsJson["size"] = SVectorToVector(opParam.size);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SoftmaxParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["axes"] = SVectorToVector(opParam.axes);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SortParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["num"] = SVectorToVector(opParam.num);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SplitParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["splitNum"] = opParam.splitNum;
    paramsJson["splitDim"] = opParam.splitDim;
    paramsJson["splitSizes"] = SVectorToVector(opParam.splitSizes);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const train::StridedBatchMatmulParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["transposeA"] = opParam.transposeA;
    paramsJson["transposeB"] = opParam.transposeB;
    paramsJson["batch"] = opParam.batch;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["m"] = opParam.m;
    paramsJson["n"] = opParam.n;
    paramsJson["k"] = opParam.k;
    paramsJson["lda"] = opParam.lda;
    paramsJson["ldb"] = opParam.ldb;
    paramsJson["ldc"] = opParam.ldc;
    paramsJson["strideA"] = opParam.strideA;
    paramsJson["strideB"] = opParam.strideB;
    paramsJson["strideC"] = opParam.strideC;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::TopkToppSamplingParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["topkToppSamplingType"] = opParam.topkToppSamplingType;
    paramsJson["randSeeds"] = opParam.randSeeds;
    paramsJson["randSeed"] = opParam.randSeed;
    paramsJson["topk"] = opParam.topk;
    paramsJson["logProbsSize"] = opParam.logProbsSize;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::TransdataParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["transdataType"] = opParam.transdataType;
    paramsJson["outCrops"] = SVectorToVector(opParam.outCrops);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::TransposeParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["perm"] = SVectorToVector(opParam.perm);

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ReshapeAndCacheParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["compressType"] = opParam.compressType;
    paramsJson["kvCacheCfg"] = opParam.kvCacheCfg;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GatingParam &opParam)
{
    nlohmann::json gatingParamsJson;
    gatingParamsJson["topkExpertNum"] = opParam.topkExpertNum;
    gatingParamsJson["cumSumNum"] = opParam.cumSumNum;
    gatingParamsJson["deviceExpert"] = opParam.deviceExpert;

    return gatingParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::SendParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["destRank"] = opParam.destRank;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RecvParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["srcRank"] = opParam.srcRank;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AllToAllParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AllToAllVParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["sendCounts"] = opParam.sendCounts;
    paramsJson["sdispls"] = opParam.sdispls;
    paramsJson["recvCounts"] = opParam.recvCounts;
    paramsJson["rdispls"] = opParam.rdispls;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::AllToAllVV2Param &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["rank"] = opParam.rank;
    paramsJson["rankSize"] = opParam.rankSize;
    paramsJson["rankRoot"] = opParam.rankRoot;
    paramsJson["backend"] = opParam.backend;
    paramsJson["hcclComm"] = reinterpret_cast<uint64_t>(opParam.hcclComm);
    paramsJson["commMode"] = opParam.commMode;
    paramsJson["rankTableFile"] = opParam.rankTableFile;
    paramsJson["commDomain"] = opParam.commDomain;

    return paramsJson;
}


template <> nlohmann::json OpParamToJson(const train::LaserAttentionParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["inputLayout"] = opParam.inputLayout;
    paramsJson["scaleValue"] = opParam.scaleValue;
    paramsJson["keepProb"] = opParam.keepProb;
    paramsJson["preTokens"] = opParam.preTokens;
    paramsJson["nextTokens"] = opParam.nextTokens;
    paramsJson["sparseMode"] = opParam.sparseMode;
    paramsJson["innerPrecise"] = opParam.innerPrecise;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const train::LaserAttentionGradParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["inputLayout"] = opParam.inputLayout;
    paramsJson["scaleValue"] = opParam.scaleValue;
    paramsJson["keepProb"] = opParam.keepProb;
    paramsJson["preTokens"] = opParam.preTokens;
    paramsJson["nextTokens"] = opParam.nextTokens;
    paramsJson["sparseMode"] = opParam.sparseMode;
    paramsJson["innerPrecise"] = opParam.innerPrecise;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GroupTopkParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["groupNum"] = opParam.groupNum;
    paramsJson["k"] = opParam.k;
    paramsJson["groupMultiFlag"] = opParam.groupMultiFlag;
    paramsJson["n"] = opParam.n;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GroupedMatmulWithRoutingParam &opParam)
{
    nlohmann::json moeGroupMatmulParamsJson;
    moeGroupMatmulParamsJson["transposeB"] = opParam.transposeB;
    moeGroupMatmulParamsJson["topK"] = opParam.topK;
    moeGroupMatmulParamsJson["moeType"] = opParam.groupedMatmulType;
    moeGroupMatmulParamsJson["outDataType"] = opParam.outDataType;
    return moeGroupMatmulParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::CohereLayerNormParam &opParam)
{
    nlohmann::json cohereLayerNormParamsJson;
    cohereLayerNormParamsJson["epsilon"] = opParam.epsilon;
    return cohereLayerNormParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GatherPreRmsNormParam &opParam)
{
    nlohmann::json gatherPreRmsNormParamJson;
    gatherPreRmsNormParamJson["epsilon"] = opParam.epsilon;

    return gatherPreRmsNormParamJson;
}

template <> nlohmann::json OpParamToJson(const infer::MlaPreprocessParam &opParam)
{
    nlohmann::json mlaPreprocessParamJson;
    mlaPreprocessParamJson["wdqDim"] = opParam.wdqDim;
    mlaPreprocessParamJson["qRopeDim"] = opParam.qRopeDim;
    mlaPreprocessParamJson["kRopeDim"] = opParam.kRopeDim;
    mlaPreprocessParamJson["epsilon"] = opParam.epsilon;
    mlaPreprocessParamJson["qRotaryCoeff"] = opParam.qRotaryCoeff;
    mlaPreprocessParamJson["kRotaryCoeff"] = opParam.kRotaryCoeff;
    mlaPreprocessParamJson["transposeWdq"] = opParam.transposeWdq;
    mlaPreprocessParamJson["transposeWuq"] = opParam.transposeWuq;
    mlaPreprocessParamJson["transposeWuk"] = opParam.transposeWuk;
    mlaPreprocessParamJson["cacheMode"] = opParam.cacheMode;
    mlaPreprocessParamJson["quantMode"] = opParam.quantMode;
    return mlaPreprocessParamJson;
}

template <> nlohmann::json OpParamToJson(const infer::MultiLatentAttentionParam &opParam)
{
    nlohmann::json multiLatentAttentionParamJson;
    multiLatentAttentionParamJson["headNum"] = opParam.headNum;
    multiLatentAttentionParamJson["qkScale"] = opParam.qkScale;
    multiLatentAttentionParamJson["kvHeadNum"] = opParam.kvHeadNum;
    multiLatentAttentionParamJson["maskType"] = opParam.maskType;
    multiLatentAttentionParamJson["calcType"] = opParam.calcType;
    multiLatentAttentionParamJson["cacheMode"] = opParam.cacheMode;
    multiLatentAttentionParamJson["windowSize"] = opParam.windowSize;
    multiLatentAttentionParamJson["maskUseStatusType"] = opParam.maskUseStatusType;
    return multiLatentAttentionParamJson;
}

template <> nlohmann::json OpParamToJson(const common::EventParam &opParam)
{
    nlohmann::json eventParamsJson;
    eventParamsJson["operatorType"] = opParam.operatorType;
    eventParamsJson["event"] = reinterpret_cast<uint64_t>(opParam.event);
    return eventParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::NormRopeReshapeParam &opParam)
{
    nlohmann::json normRopeReshapeParamParamsJson;
    normRopeReshapeParamParamsJson["precisionMode"] = opParam.precisionMode;
    normRopeReshapeParamParamsJson["epsilon"] = opParam.epsilon;
    normRopeReshapeParamParamsJson["rotaryCoeff"] = opParam.rotaryCoeff;
    return normRopeReshapeParamParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RopeQConcatParam &opParam)
{
    (void)opParam;
    nlohmann::json ropeQConcataramsJson;
    return ropeQConcataramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::FusedAddTopkDivParam &opParam)
{
    nlohmann::json fusedAddTopkDivParamsJson;
    fusedAddTopkDivParamsJson["groupNum"] = opParam.groupNum;
    fusedAddTopkDivParamsJson["groupTopk"] = opParam.groupTopk;
    fusedAddTopkDivParamsJson["n"] = opParam.n;
    fusedAddTopkDivParamsJson["k"] = opParam.k;
    fusedAddTopkDivParamsJson["activationType"] = opParam.activationType;
    fusedAddTopkDivParamsJson["isNorm"] = opParam.isNorm;
    fusedAddTopkDivParamsJson["scale"] = opParam.scale;
    fusedAddTopkDivParamsJson["enableExpertMapping"] = opParam.enableExpertMapping;
    return fusedAddTopkDivParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ReshapeAndCacheWithStrideParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["compressType"] = opParam.compressType;
    paramsJson["kvCacheCfg"] = opParam.kvCacheCfg;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RazorFusionAttentionParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["kvHeadNum"] = opParam.kvHeadNum;
    paramsJson["qkScale"] = opParam.qkScale;
    paramsJson["razorLen"] = opParam.razorLen;
    paramsJson["preTokens"] = opParam.preTokens;
    paramsJson["nextTokens"] = opParam.nextTokens;
    paramsJson["tileQ"] = opParam.tileQ;
    paramsJson["tileKv"] = opParam.tileKv;
    paramsJson["textQLen"] = opParam.textQLen;
    paramsJson["textKvLen"] = opParam.textKvLen;

    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::FaUpdateParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["faUpdateType"] = opParam.faUpdateType;
    paramsJson["sp"] = opParam.sp;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::ScatterElementsV2Param &opParam)
{
    nlohmann::json scatterElementsV2ParamsJson;
    scatterElementsV2ParamsJson["axis"] = opParam.axis;
    scatterElementsV2ParamsJson["reduction"] = opParam.reduction;

    return scatterElementsV2ParamsJson;
}

template <> nlohmann::json OpParamToJson(const infer::GmmDeqSwigluQuantGmmDeqParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["outputType"] = opParam.outputType;
    paramsJson["groupListType"] = opParam.groupListType;
    paramsJson["weightUpPermuteType"] = opParam.weightUpPermuteType;
    paramsJson["transposeWeightUp"] = opParam.transposeWeightUp;
    paramsJson["transposeWeightDown"] = opParam.transposeWeightDown;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::MmDeqSwigluQuantMmDeqParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["outputType"] = opParam.outputType;
    paramsJson["weightUpPermuteType"] = opParam.weightUpPermuteType;
    paramsJson["transposeWeightUp"] = opParam.transposeWeightUp;
    paramsJson["transposeWeightDown"] = opParam.transposeWeightDown;
    return paramsJson;
}

template <> nlohmann::json OpParamToJson(const infer::RingMLAParam &opParam)
{
    nlohmann::json paramsJson;
    paramsJson["calcType"] = opParam.calcType;
    paramsJson["headNum"] = opParam.headNum;
    paramsJson["kvHeadNum"] = opParam.kvHeadNum;
    paramsJson["qkScale"] = opParam.qkScale;
    paramsJson["kernelType"] = opParam.kernelType;
    paramsJson["maskType"] = opParam.maskType;
    paramsJson["inputLayout"] = opParam.inputLayout;
    return paramsJson;
}

} // namespace atb