1 /*
2  * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 /* ----------------------------------------------------------------------
20  * Project:      CMSIS NN Library
21  * Title:        arm_softmax_with_batch_q7.c
22  * Description:  Q7 softmax function
23  *
24  * $Date:        09. October 2020
25  * $Revision:    V.1.0.1
26  *
27  * Target Processor:  Cortex-M and Cortex-A cores
28  *
29  * -------------------------------------------------------------------- */
30 
31 #include "arm_nnfunctions.h"
32 
33 /**
34  *  @ingroup groupNN
35  */
36 
37 /**
38  * @addtogroup Softmax
39  * @{
40  */
41 
42 /**
43  * @brief Q7 softmax function with batch parameter
44  * @param[in]       vec_in      pointer to input vector
45  * @param[in]       nb_batches  number of batches
46  * @param[in]       dim_vec     input vector dimention
47  * @param[out]      p_out       pointer to output vector
48  *
49  * @details
50  *
51  *  Here, instead of typical natural logarithm e based softmax, we use
52  *  2-based softmax here, i.e.,:
53  *
54  *  y_i = 2^(x_i) / sum(2^x_j)
55  *
56  *  The relative output will be different here.
57  *  But mathematically, the gradient will be the same
58  *  with a log(2) scaling factor.
59  *
60  */
61 
arm_softmax_with_batch_q7(const q7_t * vec_in,const uint16_t nb_batches,const uint16_t dim_vec,q7_t * p_out)62 void arm_softmax_with_batch_q7(const q7_t *vec_in, const uint16_t nb_batches, const uint16_t dim_vec, q7_t *p_out)
63 {
64     for (int i = 0; i < nb_batches; i++)
65     {
66         arm_softmax_q7(vec_in, dim_vec, p_out);
67         vec_in += dim_vec;
68         p_out += dim_vec;
69     }
70 }
71 
72 /**
73  * @} end of Softmax group
74  */
75