AdamWeightDecay
=================
对权重张量执行 Adam Weight Decay 优化更新。

	.. math::

		\begin{aligned}
		m_t &= \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \\
		v_t &= \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 \\
		\hat{m}_t &= \frac{m_t}{\sqrt{v_t} + \epsilon} \\
		var_t &= var_{t-1} - lr \cdot (\hat{m}_t + decay \cdot var_{t-1})
		\end{aligned}


	输入：
		- **var** - 待更新权重张量首地址。
		- **m** - 一阶动量张量首地址。
		- **v** - 二阶动量张量首地址。
		- **gradient** - 梯度张量首地址。
		- **lr** - 学习率。
		- **beta1** - 一阶动量衰减系数。
		- **beta2** - 二阶动量衰减系数。
		- **epsilon** - 数值稳定项。
		- **decay** - 权重衰减系数。
		- **start** - 参与计算的起始索引（闭区间）。
		- **end** - 参与计算的结束索引（开区间）。
		- **core_mask(int, 可选)** - 核掩码（仅适用于共享存储版本）。

	输出：
		- **var** - 原地写回更新后的权重张量。
		- **m** - 原地写回更新后的一阶动量张量。
		- **v** - 原地写回更新后的二阶动量张量。

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

	.. note::
		- FT78NE 支持 fp32 数据类型。
		- MT7004 支持 fp16、fp32 数据类型。

**共享存储版本:**

.. c:function:: void hp_adamweightdecay_s(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)
.. c:function:: void fp_adamweightdecay_s(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)

	**C调用示例：**

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

		// FT78NE 多核示例
		#include <stdio.h>

		int main(void) {
			float *var = (float *)0xA0000000;        // DDR 存储
			float *m = (float *)0xB0000000;
			float *v = (float *)0xC0000000;
			float *gradient = (float *)0xD0000000;
			int start = 0;
			int end = 4096;
			int core_mask = 0xff;
			float lr = 1e-3f;
			float beta1 = 0.9f;
			float beta2 = 0.999f;
			float epsilon = 1e-8f;
			float decay = 1e-2f;
			fp_adamweightdecay_s(var, m, v, gradient, lr,
								 beta1, beta2, epsilon, decay,
								 start, end, core_mask);
			return 0;
		}


**私有存储版本:**

.. c:function:: void hp_adamweightdecay_p(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)
.. c:function:: void fp_adamweightdecay_p(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)

	

	**C调用示例：**

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

		// MT7004 单核示例
		#include <stdio.h>

		int main(void) {
			half *var = (half *)0x10000000;        // L2 存储
			half *m = (half *)0x10002000;
			half *v = (half *)0x10004000;
			half *gradient = (half *)0x10006000;
			int length = 2048;
			float lr = 5e-4f;
			float beta1 = 0.9f;
			float beta2 = 0.999f;
			float epsilon = 1e-6f;
			float decay = 5e-3f;
			hp_adamweightdecay_p(var, m, v, gradient, lr,
								 beta1, beta2, epsilon, decay,
								 length);
			return 0;
		}

