dot divide
[scilab.git] / scilab / modules / ast / includes / operations / types_dotdivide.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
4  *  Copyright (C) 2014 - Scilab Enterprises - Sylvain GENIN
5 *
6 *  This file must be used under the terms of the CeCILL.
7 *  This source file is licensed as described in the file COPYING, which
8 *  you should have received as part of this distribution.  The terms
9 *  are also available at
10 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 *
12 */
13 #ifndef __TYPES_DOTDIVIDE_HXX__
14 #define __TYPES_DOTDIVIDE_HXX__
15
16 #include "generic_operations.hxx"
17 #include "double.hxx"
18 #include "polynom.hxx"
19 #include "sparse.hxx"
20
21 void fillDotDivFunction();
22
23 //define arrays on operation functions
24 typedef types::InternalType*(*dotdiv_function)(types::InternalType*, types::InternalType*);
25
26 #define DECLARE_DOTDIV_PROTO(x) template<class T, class U, class O> types::InternalType* x(T *_pL, U *_pR)
27
28 DECLARE_DOTDIV_PROTO(dotdiv_M_M);
29 DECLARE_DOTDIV_PROTO(dotdiv_M_MC);
30 DECLARE_DOTDIV_PROTO(dotdiv_M_S);
31 DECLARE_DOTDIV_PROTO(dotdiv_M_SC);
32 DECLARE_DOTDIV_PROTO(dotdiv_M_E);
33 DECLARE_DOTDIV_PROTO(dotdiv_M_I);
34 DECLARE_DOTDIV_PROTO(dotdiv_M_IC);
35
36 DECLARE_DOTDIV_PROTO(dotdiv_MC_M);
37 DECLARE_DOTDIV_PROTO(dotdiv_MC_MC);
38 DECLARE_DOTDIV_PROTO(dotdiv_MC_S);
39 DECLARE_DOTDIV_PROTO(dotdiv_MC_SC);
40 DECLARE_DOTDIV_PROTO(dotdiv_MC_I);
41 DECLARE_DOTDIV_PROTO(dotdiv_MC_IC);
42
43 DECLARE_DOTDIV_PROTO(dotdiv_S_M);
44 DECLARE_DOTDIV_PROTO(dotdiv_S_MC);
45 DECLARE_DOTDIV_PROTO(dotdiv_S_S);
46 DECLARE_DOTDIV_PROTO(dotdiv_S_SC);
47 DECLARE_DOTDIV_PROTO(dotdiv_S_I);
48 DECLARE_DOTDIV_PROTO(dotdiv_S_IC);
49
50 DECLARE_DOTDIV_PROTO(dotdiv_SC_M);
51 DECLARE_DOTDIV_PROTO(dotdiv_SC_MC);
52 DECLARE_DOTDIV_PROTO(dotdiv_SC_S);
53 DECLARE_DOTDIV_PROTO(dotdiv_SC_SC);
54 DECLARE_DOTDIV_PROTO(dotdiv_SC_I);
55 DECLARE_DOTDIV_PROTO(dotdiv_SC_IC);
56
57 //[]
58 DECLARE_DOTDIV_PROTO(dotdiv_E_M);
59
60 //eye
61 DECLARE_DOTDIV_PROTO(dotdiv_I_M);
62 DECLARE_DOTDIV_PROTO(dotdiv_I_MC);
63 DECLARE_DOTDIV_PROTO(dotdiv_I_S);
64 DECLARE_DOTDIV_PROTO(dotdiv_I_SC);
65 DECLARE_DOTDIV_PROTO(dotdiv_I_I);
66 DECLARE_DOTDIV_PROTO(dotdiv_I_IC);
67
68 DECLARE_DOTDIV_PROTO(dotdiv_IC_M);
69 DECLARE_DOTDIV_PROTO(dotdiv_IC_MC);
70 DECLARE_DOTDIV_PROTO(dotdiv_IC_S);
71 DECLARE_DOTDIV_PROTO(dotdiv_IC_SC);
72 DECLARE_DOTDIV_PROTO(dotdiv_IC_I);
73 DECLARE_DOTDIV_PROTO(dotdiv_IC_IC);
74
75 #undef DECLARE_DOTDIV_PROTO
76
77 template<> types::InternalType* dotdiv_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
78 template<> types::InternalType* dotdiv_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
79 template<> types::InternalType* dotdiv_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
80 template<> types::InternalType* dotdiv_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
81 template<> types::InternalType* dotdiv_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
82
83 template<> types::InternalType* dotdiv_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
84 template<> types::InternalType* dotdiv_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
85 template<> types::InternalType* dotdiv_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
86
87 //x ./ x
88 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U* r, O* o)
89 {
90     for (size_t i = 0; i < size ; ++i)
91     {
92         o[i] = (O)l[i] / (O)r[i];
93     }
94 }
95
96 //xC ./ x
97 template<typename T, typename U, typename O> inline static void dotdiv(T* l, T* lc, size_t size, U* r, O* o, O* oc)
98 {
99     for (size_t i = 0; i < size ; ++i)
100     {
101         o[i] = (O)l[i] / (O)r[i];
102         oc[i] = (O)lc[i] / (O)r[i];
103     }
104 }
105
106 //x ./ xC
107 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U* r, U* rc, O* o, O* oc)
108 {
109     for (size_t i = 0; i < size ; ++i)
110     {
111         o[i] = ((O)l[i] * (O)r[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
112         oc[i] = ((O)l[i] * -(O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
113     }
114 }
115
116 //xC ./ xC
117 template<typename T, typename U, typename O> inline static void dotdiv(T* l, T* lc, size_t size, U* r, U* rc, O* o, O* oc)
118 {
119     for (size_t i = 0; i < size ; ++i)
120     {
121         o[i] =  ((O)l[i] * (O)r[i] + (O)lc[i] * (O)rc[i] ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
122         oc[i] = ((O)r[i] * (O)lc[i] - (O)rc[i] * (O)l[i] ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
123     }
124 }
125
126 //x1 ./ x1
127 template<typename T, typename U, typename O> inline static void dotdiv(T l, U r, O* o)
128 {
129     *o = (O)l / (O)r;
130 }
131
132 //x1 ./ x1c
133 template<typename T, typename U, typename O> inline static void dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
134 {
135     *o  = ((O)l * (O)r) / ((O)rc * (O)rc + (O)r * (O)r) ;
136     *oc = ((O)l * -(O)rc) / ((O)rc * (O)rc + (O)r * (O)r) ;
137 }
138
139 //x1c ./ x1
140 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
141 {
142     *o = (O)l / (O)r;
143     *oc = (O)lc / (O)r;
144 }
145
146 //x1c ./ x1c
147 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U r, U rc, O* o, O* oc)
148 {
149     *o  = ((O)l * (O)r + (O)lc * (O)rc ) / ((O)rc * (O)rc + (O)r * (O)r);
150     *oc = ((O)r * (O)lc - (O)rc * (O)l ) / ((O)rc * (O)rc + (O)r * (O)r) ;
151 }
152
153 //x ./ x1
154 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U r, O* o)
155 {
156     for (size_t i = 0; i < size ; ++i)
157     {
158         o[i] = (O)l[i] / (O)r;
159     }
160 }
161
162 //x1 ./ x
163 template<typename T, typename U, typename O> inline static void dotdiv(T l, size_t size, U* r, O* o)
164 {
165     for (size_t i = 0; i < size ; ++i)
166     {
167         o[i] = (O)l / (O)r[i];
168     }
169 }
170
171
172 //x ./ x1c
173 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U r, U rc, O* o, O* oc)
174 {
175     O denum = ((O)rc * (O)rc + (O)r * (O)r);
176     for (size_t i = 0; i < size ; ++i)
177     {
178         o[i] = ((O)l[i] * (O)r) / denum ;
179         oc[i] = ((O)l[i] * -(O)rc) / denum;
180     }
181 }
182
183 //x1 ./ xc
184 template<typename T, typename U, typename O> inline static void dotdiv(T l, size_t size, U* r, U* rc, O* o, O* oc)
185 {
186     for (size_t i = 0; i < size ; ++i)
187     {
188         o[i] = ((O)l * (O)r[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
189         oc[i] = ((O)l * -(O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
190     }
191 }
192
193 //xC ./ x1
194 template<typename T, typename U, typename O> inline static void dotdiv(T* l, T* lc, size_t size, U r, O* o, O* oc)
195 {
196     for (size_t i = 0; i < size ; ++i)
197     {
198         o[i] = (O)l[i] / (O)r;
199         oc[i] = (O)lc[i] / (O)r;
200     }
201 }
202
203 //x1C ./ x
204 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U* r, O* o, O* oc)
205 {
206     for (size_t i = 0; i < size ; ++i)
207     {
208         o[i] = (O)l / (O)r[i];
209         oc[i] = (O)lc / (O)r[i];
210     }
211 }
212
213
214 //xC ./ x1c
215 template<typename T, typename U, typename O> inline static void dotdiv(T* l, T* lc, size_t size, U r, U rc, O* o, O* oc)
216 {
217     O denum = ((O)rc * (O)rc + (O)r * (O)r);
218     for (size_t i = 0; i < size ; ++i)
219     {
220         o[i] =  ((O)l[i] * (O)r + (O)lc[i] * (O)rc ) / denum ;
221         oc[i] = ((O)r * (O)lc[i] - (O)rc * (O)l[i] ) / denum ;
222     }
223 }
224
225 //x1C ./ xc
226 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U* r, U* rc, O* o, O* oc)
227 {
228     for (size_t i = 0; i < size ; ++i)
229     {
230         o[i] =  ((O)l * (O)r[i] + (O)lc * (O)rc[i] ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
231         oc[i] = ((O)r[i] * (O)lc - (O)rc[i] * (O)l ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
232     }
233 }
234
235
236 #endif /* !__TYPES_DOTDIVIDE_HXX__ */