d8d0f2eef7566db1bee7bc2c5bd254759ecd30fe
[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 "configvariable.hxx"
18 #include "double.hxx"
19 #include "polynom.hxx"
20 #include "sparse.hxx"
21
22 void fillDotDivFunction();
23
24 //define arrays on operation functions
25 typedef types::InternalType*(*dotdiv_function)(types::InternalType*, types::InternalType*);
26
27 #define DECLARE_DOTDIV_PROTO(x) template<class T, class U, class O> types::InternalType* x(T *_pL, U *_pR)
28
29 DECLARE_DOTDIV_PROTO(dotdiv_M_M);
30 DECLARE_DOTDIV_PROTO(dotdiv_M_MC);
31 DECLARE_DOTDIV_PROTO(dotdiv_M_S);
32 DECLARE_DOTDIV_PROTO(dotdiv_M_SC);
33 DECLARE_DOTDIV_PROTO(dotdiv_M_E);
34 DECLARE_DOTDIV_PROTO(dotdiv_M_I);
35 DECLARE_DOTDIV_PROTO(dotdiv_M_IC);
36
37 DECLARE_DOTDIV_PROTO(dotdiv_MC_M);
38 DECLARE_DOTDIV_PROTO(dotdiv_MC_MC);
39 DECLARE_DOTDIV_PROTO(dotdiv_MC_S);
40 DECLARE_DOTDIV_PROTO(dotdiv_MC_SC);
41 DECLARE_DOTDIV_PROTO(dotdiv_MC_I);
42 DECLARE_DOTDIV_PROTO(dotdiv_MC_IC);
43
44 DECLARE_DOTDIV_PROTO(dotdiv_S_M);
45 DECLARE_DOTDIV_PROTO(dotdiv_S_MC);
46 DECLARE_DOTDIV_PROTO(dotdiv_S_S);
47 DECLARE_DOTDIV_PROTO(dotdiv_S_SC);
48 DECLARE_DOTDIV_PROTO(dotdiv_S_I);
49 DECLARE_DOTDIV_PROTO(dotdiv_S_IC);
50
51 DECLARE_DOTDIV_PROTO(dotdiv_SC_M);
52 DECLARE_DOTDIV_PROTO(dotdiv_SC_MC);
53 DECLARE_DOTDIV_PROTO(dotdiv_SC_S);
54 DECLARE_DOTDIV_PROTO(dotdiv_SC_SC);
55 DECLARE_DOTDIV_PROTO(dotdiv_SC_I);
56 DECLARE_DOTDIV_PROTO(dotdiv_SC_IC);
57
58 //[]
59 DECLARE_DOTDIV_PROTO(dotdiv_E_M);
60
61 //eye
62 DECLARE_DOTDIV_PROTO(dotdiv_I_M);
63 DECLARE_DOTDIV_PROTO(dotdiv_I_MC);
64 DECLARE_DOTDIV_PROTO(dotdiv_I_S);
65 DECLARE_DOTDIV_PROTO(dotdiv_I_SC);
66 DECLARE_DOTDIV_PROTO(dotdiv_I_I);
67 DECLARE_DOTDIV_PROTO(dotdiv_I_IC);
68
69 DECLARE_DOTDIV_PROTO(dotdiv_IC_M);
70 DECLARE_DOTDIV_PROTO(dotdiv_IC_MC);
71 DECLARE_DOTDIV_PROTO(dotdiv_IC_S);
72 DECLARE_DOTDIV_PROTO(dotdiv_IC_SC);
73 DECLARE_DOTDIV_PROTO(dotdiv_IC_I);
74 DECLARE_DOTDIV_PROTO(dotdiv_IC_IC);
75
76 #undef DECLARE_DOTDIV_PROTO
77
78 template<> types::InternalType* dotdiv_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
79 template<> types::InternalType* dotdiv_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
80 template<> types::InternalType* dotdiv_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
81 template<> types::InternalType* dotdiv_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
82 template<> types::InternalType* dotdiv_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
83
84 template<> types::InternalType* dotdiv_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
85 template<> types::InternalType* dotdiv_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
86 template<> types::InternalType* dotdiv_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
87
88 //x1 ./ x1
89 template<typename T, typename U, typename O> inline static void dotdiv(T l, U r, O* o)
90 {
91     if ((O)r == 0)
92     {
93         ConfigVariable::setDivideByZero(true);
94     }
95     *o = (O)l / (O)r;
96 }
97
98 //x1 ./ x1c
99 template<typename T, typename U, typename O> inline static void dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
100 {
101     dotdiv((O)l * (O)r, (O)rc * (O)rc + (O)r * (O)r, o);
102     dotdiv((O)l * -(O)rc, (O)rc * (O)rc + (O)r * (O)r, oc);
103     //*o  = ((O)l * (O)r) / ((O)rc * (O)rc + (O)r * (O)r) ;
104     //*oc = ((O)l * -(O)rc) / ((O)rc * (O)rc + (O)r * (O)r) ;
105 }
106
107 //x1c ./ x1
108 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
109 {
110     dotdiv<T, U, O>(l, r, o);
111     dotdiv<T, U, O>(lc, r, oc);
112     //*o = (O)l / (O)r;
113     //*oc = (O)lc / (O)r;
114 }
115
116 //x1c ./ x1c
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     dotdiv((O)l * (O)r + (O)lc * (O)rc, (O)rc * (O)rc + (O)r * (O)r, o);
120     dotdiv((O)r * (O)lc - (O)rc * (O)l, (O)rc * (O)rc + (O)r * (O)r, oc);
121     //*o = ((O)l * (O)r + (O)lc * (O)rc) / ((O)rc * (O)rc + (O)r * (O)r);
122     //*oc = ((O)r * (O)lc - (O)rc * (O)l) / ((O)rc * (O)rc + (O)r * (O)r) ;
123 }
124
125
126 //x ./ x
127 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U* r, O* o)
128 {
129     for (size_t i = 0; i < size ; ++i)
130     {
131         //dotdiv(T l, U r, O* o)
132         dotdiv<T, U, O>(l[i], r[i], &o[i]);
133         //o[i] = (O)l[i] / (O)r[i];
134     }
135 }
136
137 //xC ./ x
138 template<typename T, typename U, typename O> inline static void dotdiv(T* l, T* lc, size_t size, U* r, O* o, O* oc)
139 {
140     for (size_t i = 0; i < size ; ++i)
141     {
142         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
143         dotdiv<T, U, O>(l[i], lc[i], (size_t)1, r[i], &o[i], &oc[i]);
144         //o[i] = (O)l[i] / (O)r[i];
145         //oc[i] = (O)lc[i] / (O)r[i];
146     }
147 }
148
149 //x ./ xC
150 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U* r, U* rc, O* o, O* oc)
151 {
152     for (size_t i = 0; i < size ; ++i)
153     {
154         //dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
155         dotdiv<T, U, O>(l[i], 1, r[i], rc[i], &o[i], &oc[i]);
156         //o[i] = ((O)l[i] * (O)r[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
157         //oc[i] = ((O)l[i] * -(O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
158     }
159 }
160
161 //xC ./ xC
162 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)
163 {
164     for (size_t i = 0; i < size ; ++i)
165     {
166         //dotdiv(T l, T lc, size_t size, U r, U rc, O* o, O* oc)
167         dotdiv<T, U, O>(l[i], lc[i], 1, r[i], rc[i], &o[i], &oc[i]);
168         //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]) ;
169         //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]) ;
170     }
171 }
172
173 //x ./ x1
174 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U r, O* o)
175 {
176     for (size_t i = 0; i < size ; ++i)
177     {
178         //dotdiv(T l, U r, O* o)
179         dotdiv<T, U, O>(l[i], r, &o[i]);
180         //o[i] = (O)l[i] / (O)r;
181     }
182 }
183
184 //x1 ./ x
185 template<typename T, typename U, typename O> inline static void dotdiv(T l, size_t size, U* r, O* o)
186 {
187     for (size_t i = 0; i < size ; ++i)
188     {
189         //dotdiv(T l, U r, O* o)
190         dotdiv<T, U, O>(l, r[i], &o[i]);
191         //o[i] = (O)l / (O)r[i];
192     }
193 }
194
195
196 //x ./ x1c
197 template<typename T, typename U, typename O> inline static void dotdiv(T* l, size_t size, U r, U rc, O* o, O* oc)
198 {
199     //O denum = ((O)rc * (O)rc + (O)r * (O)r);
200     for (size_t i = 0; i < size ; ++i)
201     {
202         //dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
203         dotdiv<T, U, O >(l[i], (size_t)1, r, rc, &o[i], &oc[i]);
204         //o[i] = ((O)l[i] * (O)r) / denum;
205         //oc[i] = ((O)l[i] * -(O)rc) / denum;
206     }
207 }
208
209 //x1 ./ xc
210 template<typename T, typename U, typename O> inline static void dotdiv(T l, size_t size, U* r, U* rc, O* o, O* oc)
211 {
212     for (size_t i = 0; i < size ; ++i)
213     {
214         //dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
215         dotdiv<T, U, O>(l, (size_t)1, r[i], rc[i], &o[i], &oc[i]);
216         //o[i] = ((O)l * (O)r[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
217         //oc[i] = ((O)l * -(O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
218     }
219 }
220
221 //xC ./ x1
222 template<typename T, typename U, typename O> inline static void dotdiv(T* l, T* lc, size_t size, U r, O* o, O* oc)
223 {
224     for (size_t i = 0; i < size ; ++i)
225     {
226         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
227         dotdiv<T, U, O>(l[i], lc[i], (size_t)1, r, &o[i], &oc[i]);
228         //o[i] = (O)l[i] / (O)r;
229         //oc[i] = (O)lc[i] / (O)r;
230     }
231 }
232
233 //x1C ./ x
234 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U* r, O* o, O* oc)
235 {
236     for (size_t i = 0; i < size ; ++i)
237     {
238         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
239         dotdiv<T, U, O>(l, lc, (size_t)1, r[i], &o[i], &oc[i]);
240         //o[i] = (O)l / (O)r[i];
241         //oc[i] = (O)lc / (O)r[i];
242     }
243 }
244
245
246 //xC ./ x1c
247 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)
248 {
249     //    O denum = ((O)rc * (O)rc + (O)r * (O)r);
250     for (size_t i = 0; i < size ; ++i)
251     {
252         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
253         dotdiv<T, U, O>(l[i], lc[i], (size_t)1, r, rc, &o[i], &oc[i]);
254         //o[i] = ((O)l[i] * (O)r + (O)lc[i] * (O)rc) / denum;
255         //oc[i] = ((O)r * (O)lc[i] - (O)rc * (O)l[i] ) / denum ;
256     }
257 }
258
259 //x1C ./ xc
260 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)
261 {
262     for (size_t i = 0; i < size ; ++i)
263     {
264         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
265         dotdiv<T, U, O>(l, lc, (size_t)1, r[i], rc[i], &o[i], &oc[i]);
266         //o[i] = ((O)l * (O)r[i] + (O)lc * (O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]);
267         //oc[i] = ((O)r[i] * (O)lc - (O)rc[i] * (O)l ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
268     }
269 }
270
271
272 #endif /* !__TYPES_DOTDIVIDE_HXX__ */