LpNormalization
=================



对输入张量按 **实例（Instance）+ 通道（Channel）** 维度执行 Lp 归一化操作。
该算子在每个样本的每个通道内，基于 ``inner_size`` 维度计算 Lp 范数，
并结合可学习参数 ``gamma`` 与 ``beta`` 完成缩放与偏移。

.. math::

    \text{norm}_{b,c} = \left( \sum_{i=1}^{N} |x_{b,c,i}|^p + \epsilon \right)^{\frac{1}{p}}

    y_{b,c,i} = \frac{x_{b,c,i}}{\text{norm}_{b,c}} \cdot \gamma_c + \beta_c

其中：

- :math:`b` 表示 batch 维度
- :math:`c` 表示通道维度
- :math:`i` 表示 ``inner_size`` 维度
- :math:`p` 为范数阶数
- :math:`\gamma_c`、:math:`\beta_c` 为通道级缩放与偏移参数

输入：
    - **input** - 输入数据地址，形状为 ``[batch, channel, inner_size]``。
    - **gamma** - 缩放参数地址，长度为 ``channel``。
    - **beta** - 偏移参数地址，长度为 ``channel``。
    - **p** - Lp 范数阶数。
    - **batch** - batch 数。
    - **channel** - 通道数。
    - **inner_size** - 每个通道内的归一化长度。
    - **epsilon** - 数值稳定因子。
    - **core_mask** - 核掩码（仅适用于共享存储版本）。

输出：
    - **output** - LpNormalization 计算结果地址。

支持平台：
    ``FT78NE``
    ``MT7004``

.. note::
    - FT78NE 支持 ``fp32`` 类型
    - MT7004 支持 ``fp16``、``fp32`` 类型
    - 归一化统计量仅在单个样本、单个通道内计算
    - ``p`` 为浮点数，可用于 L1、L2 等不同范数形式

**共享存储版本:**

.. c:function:: void fp_lpnorm_s(float* input, float* gamma, float* beta, float* output, float p, int batch, int channel, int inner_size, float epsilon, int core_mask)
.. c:function:: void hp_lpnorm_s(half* input, half* gamma, half* beta, half* output, float p, int batch, int channel, int inner_size, float epsilon, int core_mask)

**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 18-19

    // FT78NE 示例
    #include <stdio.h>
    #include <lpnorm.h>

    int main(int argc, char* argv[]) {
        float *input  = (float *)0xA0000000;   // input 在 DDR 空间
        float *output = (float *)0xC0000000;
        float *gamma  = (float *)0xA1000000;
        float *beta   = (float *)0xA2000000;

        int batch = 4;
        int channel = 64;
        int inner_size = 256;
        float p = 2.0f;
        float epsilon = 1e-6f;
        int core_mask = 0xff;

        fp_lpnorm_s(input, gamma, beta, output,
                    p, batch, channel, inner_size, epsilon, core_mask);
        return 0;
    }


**私有存储版本:**

.. c:function:: void fp_lpnorm_p(float* input, float* gamma, float* beta, float* output, float p, int batch, int channel, int inner_size, float epsilon)
.. c:function:: void hp_lpnorm_p(half* input, half* gamma, half* beta, half* output, float p, int batch, int channel, int inner_size, float epsilon)


**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 17-18

    // FT78NE 示例
    #include <stdio.h>
    #include <lpnorm.h>

    int main(int argc, char* argv[]) {
        float *input  = (float *)0x10810000;   // input 在 L2 空间
        float *output = (float *)0x10820000;
        float *gamma  = (float *)0x10830000;
        float *beta   = (float *)0x10840000;

        int batch = 4;
        int channel = 64;
        int inner_size = 256;
        float p = 2.0f;
        float epsilon = 1e-6f;

        fp_lpnorm_p(input, gamma, beta, output,
                    p, batch, channel, inner_size, epsilon);
        return 0;
    }
