License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / operations / types_dotmultiplication.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2014 - Scilab enterprises - Antoine ELIAS
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15 #ifndef __TYPES_DOTMULTIPLICATION_HXX__
16 #define __TYPES_DOTMULTIPLICATION_HXX__
17
18 #include "generic_operations.hxx"
19 #include "double.hxx"
20 #include "polynom.hxx"
21 #include "sparse.hxx"
22
23 void fillDotMulFunction();
24
25 //define arrays on operation functions
26 typedef types::InternalType*(*dotmul_function)(types::InternalType*, types::InternalType*);
27
28 #define DECLARE_DOTMUL_PROTO(x) template<class T, class U, class O> types::InternalType* x(T *_pL, U *_pR)
29 DECLARE_DOTMUL_PROTO(dotmul_M_M);
30 DECLARE_DOTMUL_PROTO(dotmul_M_MC);
31 DECLARE_DOTMUL_PROTO(dotmul_M_S);
32 DECLARE_DOTMUL_PROTO(dotmul_M_SC);
33 DECLARE_DOTMUL_PROTO(dotmul_M_E);
34 DECLARE_DOTMUL_PROTO(dotmul_M_I);
35 DECLARE_DOTMUL_PROTO(dotmul_M_IC);
36
37 DECLARE_DOTMUL_PROTO(dotmul_MC_M);
38 DECLARE_DOTMUL_PROTO(dotmul_MC_MC);
39 DECLARE_DOTMUL_PROTO(dotmul_MC_S);
40 DECLARE_DOTMUL_PROTO(dotmul_MC_SC);
41 DECLARE_DOTMUL_PROTO(dotmul_MC_I);
42 DECLARE_DOTMUL_PROTO(dotmul_MC_IC);
43
44 DECLARE_DOTMUL_PROTO(dotmul_S_M);
45 DECLARE_DOTMUL_PROTO(dotmul_S_MC);
46 DECLARE_DOTMUL_PROTO(dotmul_S_S);
47 DECLARE_DOTMUL_PROTO(dotmul_S_SC);
48 DECLARE_DOTMUL_PROTO(dotmul_S_I);
49 DECLARE_DOTMUL_PROTO(dotmul_S_IC);
50
51 DECLARE_DOTMUL_PROTO(dotmul_SC_M);
52 DECLARE_DOTMUL_PROTO(dotmul_SC_MC);
53 DECLARE_DOTMUL_PROTO(dotmul_SC_S);
54 DECLARE_DOTMUL_PROTO(dotmul_SC_SC);
55 DECLARE_DOTMUL_PROTO(dotmul_SC_I);
56 DECLARE_DOTMUL_PROTO(dotmul_SC_IC);
57
58 //[]
59 DECLARE_DOTMUL_PROTO(dotmul_E_M);
60
61 //eye
62 DECLARE_DOTMUL_PROTO(dotmul_I_M);
63 DECLARE_DOTMUL_PROTO(dotmul_I_MC);
64 DECLARE_DOTMUL_PROTO(dotmul_I_S);
65 DECLARE_DOTMUL_PROTO(dotmul_I_SC);
66 DECLARE_DOTMUL_PROTO(dotmul_I_I);
67 DECLARE_DOTMUL_PROTO(dotmul_I_IC);
68
69 DECLARE_DOTMUL_PROTO(dotmul_IC_M);
70 DECLARE_DOTMUL_PROTO(dotmul_IC_MC);
71 DECLARE_DOTMUL_PROTO(dotmul_IC_S);
72 DECLARE_DOTMUL_PROTO(dotmul_IC_SC);
73 DECLARE_DOTMUL_PROTO(dotmul_IC_I);
74 DECLARE_DOTMUL_PROTO(dotmul_IC_IC);
75
76 #undef DECLARE_DOTMUL_PROTO
77
78 template<> types::InternalType* dotmul_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
79 template<> types::InternalType* dotmul_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
80 template<> types::InternalType* dotmul_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
81 template<> types::InternalType* dotmul_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
82 template<> types::InternalType* dotmul_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
83
84 template<> types::InternalType* dotmul_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
85 template<> types::InternalType* dotmul_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
86 template<> types::InternalType* dotmul_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
87
88
89
90 //x .* x
91 template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U* r, O* o)
92 {
93     for (size_t i = 0; i < size ; ++i)
94     {
95         o[i] = (O)l[i] * (O)r[i];
96     }
97 }
98
99 //xC .* x
100 template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U* r, O* o, O* oc)
101 {
102     for (size_t i = 0; i < size ; ++i)
103     {
104         o[i] = (O)l[i] * (O)r[i];
105         oc[i] = (O)lc[i] * (O)r[i];
106     }
107 }
108
109 //x .* xC
110 template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U* r, U* rc, O* o, O* oc)
111 {
112     for (size_t i = 0; i < size ; ++i)
113     {
114         o[i] = (O)l[i] * (O)r[i];
115         oc[i] = (O)l[i] * (O)rc[i];
116     }
117 }
118
119 //xC .* xC
120 template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U* r, U* rc, O* o, O* oc)
121 {
122     for (size_t i = 0; i < size ; ++i)
123     {
124         o[i] = (O)l[i] * (O)r[i] - (O)lc[i] * (O)rc[i];
125         oc[i] = (O)l[i] * (O)rc[i] + (O)lc[i] * (O)r[i];
126     }
127 }
128
129 //x1 .* x1
130 template<typename T, typename U, typename O> inline static void dotmul(T l, U r, O* o)
131 {
132     *o = (O)l * (O)r;
133 }
134
135 //x1 .* x1c
136 template<typename T, typename U, typename O> inline static void dotmul(T l, size_t /*size*/, U r, U rc, O* o, O* oc)
137 {
138     *o = (O)l * (O)r;
139     *oc = (O)l * (O)rc;
140 }
141
142 //x1c .* x1
143 template<typename T, typename U, typename O> inline static void dotmul(T l, T lc, size_t /*size*/, U r, O* o, O* oc)
144 {
145     *o = (O)l * (O)r;
146     *oc = (O)lc * (O)r;
147 }
148
149 //x1c .* x1c
150 template<typename T, typename U, typename O> inline static void dotmul(T l, T lc, size_t /*size*/, U r, U rc, O* o, O* oc)
151 {
152     *o = (O)l * (O)r - (O)lc * (O)rc;
153     *oc = (O)lc * (O)r + (O)l * (O)rc;
154 }
155
156 //x .* x1
157 template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U r, O* o)
158 {
159     for (size_t i = 0; i < size ; ++i)
160     {
161         o[i] = (O)l[i] * (O)r;
162     }
163 }
164
165 //x .* x1c
166 template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U r, U rc, O* o, O* oc)
167 {
168     for (size_t i = 0; i < size ; ++i)
169     {
170         o[i] = (O)l[i] * (O)r;
171         oc[i] = (O)l[i] * (O)rc;
172     }
173 }
174
175 //xC .* x1
176 template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U r, O* o, O* oc)
177 {
178     for (size_t i = 0; i < size ; ++i)
179     {
180         o[i] = (O)l[i] * (O)r;
181         oc[i] = (O)lc[i] * (O)r;
182     }
183 }
184
185 //xC .* x1c
186 template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U r, U rc, O* o, O* oc)
187 {
188     for (size_t i = 0; i < size ; ++i)
189     {
190         o[i] = (O)l[i] * (O)r - (O)lc[i] * (O)rc;
191         oc[i] = (O)lc[i] * (O)r + (O)l[i] * (O)rc;
192     }
193 }
194
195 #endif /* !__TYPES_DOTMULTIPLICATION_HXX__ */