Priorbox
=================

根据输入的特征图尺寸、步长和预设的候选框配置，逐元素计算先验框（Prior Boxes），通常用于目标检测模型。

该算子遍历特征图的每一个网格中心点，并围绕该中心点生成一系列具有不同尺寸和宽高比的候选框。生成的坐标 ``[xmin, ymin, xmax, ymax]`` 经过归一化处理。

输入：
    - **fmap_h** - 当前特征图的高度。
    - **fmap_w** - 当前特征图的宽度。
    - **step_h** - 计算先验框在原图上坐标时的垂直缩放比例。
    - **step_w** - 计算先验框在原图上坐标时的水平缩放比例。
    - **offset** - 中心点偏移量，通常为0.5，表示取网格的正中心。
    - **min_sizes** - 定义基础先验框尺寸的浮点数数组。
    - **min_sizes_size** - ``min_sizes`` 数组的长度。
    - **max_sizes** - 可选的浮点数数组，用于生成额外的正方形先验框。
    - **max_sizes_size** - ``max_sizes`` 数组的长度。
    - **different_aspect_ratios** - 定义不同宽高比的浮点数数组。
    - **different_aspect_ratios_size** - ``different_aspect_ratios`` 数组的长度。
    - **core_mask** - 核掩码 (仅共享存储版本需要)。

输出：
   - **output** - 用于存储最终生成的先验框坐标的数组。
   - **output_size** - 指向一个整数的指针，函数执行后，该整数将记录写入 ``output`` 数组的浮点数总数。

支持平台：
   ``6678``
   ``7004``

.. note::
     - 6678支持fp32类型。
     - 7004支持fp16和fp32类型。
      
**共享存储版本:**

.. c:function:: int fp_priorbox_s(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size, int core_mask)
.. c:function:: int hp_priorbox_s(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size, int core_mask)

**C调用示例：**

.. code-block:: c
   :linenos:
   :emphasize-lines: 22

   #include "priorbox.h"

   int main() {
       // DDR memory pointers
       float *min_sizes = (float *)0xA0000000;
       float *max_sizes = (float *)0xA0001000;
       float *ratios = (float *)0xA0002000;
       float *output = (float *)0xB0000000;
       int output_size = 0;

       // Parameters
       int fmap_h = 19, fmap_w = 19;
       float step_h = 16.0f, step_w = 16.0f;
       float offset = 0.5f;
       int min_sizes_size = 1;
       int max_sizes_size = 1;
       int ratios_size = 2;
       int core_mask = 0xff;
       
       // (假设 min_sizes, max_sizes, ratios 已在DDR中填充数据)

       fp_priorbox_s(fmap_h, fmap_w, step_h, step_w, offset, min_sizes, min_sizes_size, max_sizes, max_sizes_size, ratios, ratios_size, output, &output_size, core_mask);
       
       return 0;
   }

**私有存储版本:**

.. c:function:: int fp_priorbox_p(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size)
.. c:function:: int hp_priorbox_p(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size)
    
**C调用示例：**

.. code-block:: c
   :linenos:
   :emphasize-lines: 16

   #include "priorbox.h"

   int main() {
       // L2 memory arrays
       float min_sizes_data[] = {30.0f};
       float max_sizes_data[] = {60.0f};
       float ratios_data[] = {2.0f, 0.5f};
       float output_data[4 * 19 * 19 * (1 + 1 + 2)]; // 足够大的空间
       int output_size = 0;

       // Parameters
       int fmap_h = 19, fmap_w = 19;
       float step_h = 16.0f, step_w = 16.0f;
       float offset = 0.5f;
       
       fp_priorbox_p(fmap_h, fmap_w, step_h, step_w, offset, min_sizes_data, 1, max_sizes_data, 1, ratios_data, 2, output_data, &output_size);

       return 0;
   }
