STK++ 0.9.13
STK_ArrayByArrayProduct.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------*/
2/* Copyright (C) 2004-2016 Serge Iovleff, Université Lille 1, Inria
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this program; if not, write to the
16 Free Software Foundation, Inc.,
17 59 Temple Place,
18 Suite 330,
19 Boston, MA 02111-1307
20 USA
21
22 Contact : S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
23*/
24
25/*
26 * Project: stkpp::Arrays
27 * created on: 30 déc. 2012
28 * Author: iovleff, S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
29 **/
30
36#ifndef STK_ARRAYBYARRAYPRODUCT_H
37#define STK_ARRAYBYARRAYPRODUCT_H
38
39namespace STK
40{
41
42namespace hidden
43{
44//template<typename Lhs, typename Rhs, typename Result, bool Orient_> struct bp;
45template<typename Lhs, typename Rhs, typename Result> struct BlockByPanel;
46template<typename Lhs, typename Rhs, typename Result> struct PanelByBlock;
47template<typename Lhs, typename Rhs, typename Result> struct BlockPanelProduct;
48template<typename Lhs, typename Rhs, typename Result> struct PanelBlockProduct;
49
57template<typename Lhs, typename Rhs, typename Result>
59{
60 typedef typename Result::Type Type;
65
69 static void run(Lhs const& lhs, Rhs const& rhs, Result& res)
70 {
71#ifdef STK_ARRAYS_DEBUG
72 stk_cout << _T("Entering BlockByPanel::run()\n");
73#endif
74 // compute dimensions
75 int nbInnerLoop = lhs.sizeCols()/blockSize_; // = rhs.sizeRows()/blockSize_;
76 int nbBlocks = lhs.sizeRows()/blockSize_;
77 int nbPanels = rhs.sizeCols()/panelSize_;
78 // remaining sizes in the matrices
79 int pSize = rhs.sizeCols() - panelSize_*nbPanels;
80 int bSize = lhs.sizeRows() - blockSize_*nbBlocks;
81 int tSize = lhs.sizeCols() - blockSize_*nbInnerLoop;
82 // = rhs.sizeRows() - rhs.sizeRows()/blockSize_
83 int iLastRow = lhs.beginRows() + nbBlocks * blockSize_;
84 int jLastCol = rhs.beginCols() + nbPanels * panelSize_;
85 int kLastPos = lhs.beginCols() + blockSize_ * nbInnerLoop;
86 // start
87 if (nbInnerLoop)
88 {
89 // create panels and blocks
92 // start blocks by panel
93 for (int k = 0,kPos = lhs.beginCols(); k<nbInnerLoop; ++k, kPos += blockSize_)
94 {
95 // data caching
96 for (int i = 0, iRow = lhs.beginRows(); i<nbBlocks; ++i, iRow += blockSize_)
99 for (int j = 0, jCol = rhs.beginCols(); j<nbPanels; ++j, jCol += panelSize_)
102 // block by panel products
103#ifdef _OPENMP
104#pragma omp parallel for
105#endif
106 for (int i = 0; i<nbBlocks; ++i)
107 {
108 int iRow = lhs.beginRows()+ i * blockSize_;
109 for (int j = 0, jCol = rhs.beginCols(); j<nbPanels; ++j, jCol += panelSize_)
111 }
112 for (int i = 0, iRow = lhs.beginRows(); i<nbBlocks; ++i,iRow += blockSize_)
114#ifdef _OPENMP
115#pragma omp parallel for
116#endif
117 for (int j = 0; j<nbPanels; ++j)
120 } // InnerLoop
121 delete[] tabBlock;
122 delete[] tabPanel;
123 } // if IneerLoop
124 // treat the remaining rows, columns
125 switch (tSize)
126 {
127 case 0: break;
128 case 1: MultCoeff::mult1Outer(lhs, rhs, res, kLastPos); break;
129 case 2: MultCoeff::mult2Outer(lhs, rhs, res, kLastPos); break;
130 case 3: MultCoeff::mult3Outer(lhs, rhs, res, kLastPos); break;
131 default:break;
132 }
133 }
135 static void multBlockByPanel( Block<Type> const& block, Panel<Type> const& panel, Result& res
136 , int iRow, int jCol)
137 {
138 for (int j=0; j<panelSize_; ++j)
139 {
140 res.elt(iRow ,jCol+j) += panel[j*blockSize_] * block[0]
141 + panel[j*blockSize_+ 1] * block[1]
142 + panel[j*blockSize_+ 2] * block[2]
143 + panel[j*blockSize_+ 3] * block[3];
144 res.elt(iRow+1,jCol+j) += panel[j*blockSize_] * block[4]
145 + panel[j*blockSize_+ 1] * block[5]
146 + panel[j*blockSize_+ 2] * block[6]
147 + panel[j*blockSize_+ 3] * block[7];
148 res.elt(iRow+2,jCol+j) += panel[j*blockSize_] * block[8]
149 + panel[j*blockSize_+ 1] * block[9]
150 + panel[j*blockSize_+ 2] * block[10]
151 + panel[j*blockSize_+ 3] * block[11];
152 res.elt(iRow+3,jCol+j) += panel[j*blockSize_] * block[12]
153 + panel[j*blockSize_+ 1] * block[13]
154 + panel[j*blockSize_+ 2] * block[14]
155 + panel[j*blockSize_+ 3] * block[15];
156 }
157 }
159 static void multBlockByPanel( Block<Type> const& block, Panel<Type> const& panel, Result& res
160 , int iRow, int jCol, int pSize)
161 {
162 for (int j=0; j<pSize; ++j)
163 {
164 res.elt(iRow ,jCol+j) += panel[j*blockSize_] * block[0]
165 + panel[j*blockSize_+ 1] * block[1]
166 + panel[j*blockSize_+ 2] * block[2]
167 + panel[j*blockSize_+ 3] * block[3];
168 res.elt(iRow+1,jCol+j) += panel[j*blockSize_] * block[4]
169 + panel[j*blockSize_+ 1] * block[5]
170 + panel[j*blockSize_+ 2] * block[6]
171 + panel[j*blockSize_+ 3] * block[7];
172 res.elt(iRow+2,jCol+j) += panel[j*blockSize_] * block[8]
173 + panel[j*blockSize_+ 1] * block[9]
174 + panel[j*blockSize_+ 2] * block[10]
175 + panel[j*blockSize_+ 3] * block[11];
176 res.elt(iRow+3,jCol+j) += panel[j*blockSize_] * block[12]
177 + panel[j*blockSize_+ 1] * block[13]
178 + panel[j*blockSize_+ 2] * block[14]
179 + panel[j*blockSize_+ 3] * block[15];
180 }
181 }
183 static void multBlockByPanel( Block<Type> const& block, Panel<Type> const& panel, Result& res
184 , int iRow, int jCol, int pSize, int bSize)
185 {
186 for (int i=0; i<bSize; ++i)
187 for (int j=0; j<pSize; ++j)
188 { res.elt(iRow+i,jCol+j) += panel[j*blockSize_] * block[i*blockSize_]
189 + panel[j*blockSize_+1] * block[i*blockSize_+1]
190 + panel[j*blockSize_+2] * block[i*blockSize_+2]
191 + panel[j*blockSize_+3] * block[i*blockSize_+3];
192 }
193 }
194}; // struct BlockByPanel
195
196
203template<typename Lhs, typename Rhs, typename Result>
205{
206 typedef typename Result::Type Type;
214 static void run(Lhs const& lhs, Rhs const& rhs, Result& res)
215 {
216#ifdef STK_ARRAYS_DEBUG
217 stk_cout << _T("Entering PanelByBlock::run()\n");
218#endif
219 // compute dimensions
220 int nbInnerLoop = lhs.sizeCols()/blockSize_; // = rhs.sizeRows()/blockSize_;
221 int nbBlocks = rhs.sizeCols()/blockSize_;
222 int nbPanels = lhs.sizeRows()/panelSize_;
223
224 // remaining sizes in the matrices
225 int pSize = lhs.sizeRows() - panelSize_ * nbPanels;
226 int bSize = rhs.sizeCols() - blockSize_ * nbBlocks;
227 int tSize = lhs.sizeCols() - blockSize_ * nbInnerLoop;
228
229 // index of the remaining positions
230 int jLastCol = rhs.beginCols() + blockSize_ * nbBlocks;
231 int iLastRow = lhs.beginRows() + panelSize_ * nbPanels;
232 int kLastPos = rhs.beginRows() + blockSize_ * nbInnerLoop;
233
234 if (nbInnerLoop)
235 {
236 // create panels
239 // start blocks by panel
240 for (int k = 0, kPos = rhs.beginRows(); k<nbInnerLoop; ++k,kPos += blockSize_)
241 {
242 // data caching
243 for (int i = 0, iRow= lhs.beginRows(); i<nbPanels; ++i, iRow+= panelSize_)
246 // get blocks
247 for (int j = 0, jCol = rhs.beginCols(); j<nbBlocks; ++j, jCol+=blockSize_)
250 // perform the products panels * blocks
251#ifdef _OPENMP
252#pragma omp parallel for
253#endif
254 for (int j = 0; j<nbBlocks; ++j)
255 {
256 int jCol = rhs.beginCols() + j* blockSize_;
257 for (int i = 0,iRow = lhs.beginRows(); i<nbPanels; ++i, iRow += panelSize_)
260 }
261#ifdef _OPENMP
262#pragma omp parallel for
263#endif
264 for (int i = 0; i<nbPanels; ++i)
267 } // k loop
268 delete[] tabPanel;
269 delete[] tabBlock;
270 }
271 // treat the remaining rows, columns
272 switch (tSize)
273 {
274 case 0: break;
275 case 1: MultCoeff::mult1Outer(lhs, rhs, res, kLastPos); break;
276 case 2: MultCoeff::mult2Outer(lhs, rhs, res, kLastPos); break;
277 case 3: MultCoeff::mult3Outer(lhs, rhs, res, kLastPos); break;
278 default:break;
279 }
280 }
282 static void multPanelByBlock( Panel<Type> const& panel, Block<Type> const& block, Result& res
283 , int iRow, int jCol)
284 {
285 for (int i=0; i<panelSize_; ++i)
286 {
287 res.elt(iRow+i,jCol) += panel[i*blockSize_] * block[0]
288 + panel[i*blockSize_+ 1] * block[1]
289 + panel[i*blockSize_+ 2] * block[2]
290 + panel[i*blockSize_+ 3] * block[3];
291 res.elt(iRow+i,jCol+1) += panel[i*blockSize_] * block[4]
292 + panel[i*blockSize_+ 1] * block[5]
293 + panel[i*blockSize_+ 2] * block[6]
294 + panel[i*blockSize_+ 3] * block[7];
295 res.elt(iRow+i,jCol+2) += panel[i*blockSize_] * block[8]
296 + panel[i*blockSize_+ 1] * block[9]
297 + panel[i*blockSize_+ 2] * block[10]
298 + panel[i*blockSize_+ 3] * block[11];
299 res.elt(iRow+i,jCol+3) += panel[i*blockSize_] * block[12]
300 + panel[i*blockSize_+ 1] * block[13]
301 + panel[i*blockSize_+ 2] * block[14]
302 + panel[i*blockSize_+ 3] * block[15];
303 }
304 }
305 static void multPanelByBlock( Panel<Type> const& panel, Block<Type> const& block, Result& res
306 , int iRow, int jCol, int pSize)
307 {
308 for (int i=0; i<pSize; ++i)
309 {
310 res.elt(iRow+i,jCol) += panel[i*blockSize_] * block[0]
311 + panel[i*blockSize_+ 1] * block[1]
312 + panel[i*blockSize_+ 2] * block[2]
313 + panel[i*blockSize_+ 3] * block[3];
314 res.elt(iRow+i,jCol+1) += panel[i*blockSize_] * block[4]
315 + panel[i*blockSize_+ 1] * block[5]
316 + panel[i*blockSize_+ 2] * block[6]
317 + panel[i*blockSize_+ 3] * block[7];
318 res.elt(iRow+i,jCol+2) += panel[i*blockSize_] * block[8]
319 + panel[i*blockSize_+ 1] * block[9]
320 + panel[i*blockSize_+ 2] * block[10]
321 + panel[i*blockSize_+ 3] * block[11];
322 res.elt(iRow+i,jCol+3) += panel[i*blockSize_] * block[12]
323 + panel[i*blockSize_+ 1] * block[13]
324 + panel[i*blockSize_+ 2] * block[14]
325 + panel[i*blockSize_+ 3] * block[15];
326 }
327 }
329 static void multPanelByBlock( Panel<Type> const& panel, Block<Type> const& block, Result& res
330 , int iRow, int jCol, int pSize, int bSize)
331 {
332 for (int i=0; i<pSize; ++i)
333 for (int j=0; j<bSize; ++j)
334 res.elt(iRow+i,jCol+j) += panel[i*blockSize_] * block[j*blockSize_]
335 + panel[i*blockSize_+1] * block[j*blockSize_+1]
336 + panel[i*blockSize_+2] * block[j*blockSize_+2]
337 + panel[i*blockSize_+3] * block[j*blockSize_+3];
338 }
339}; // struct PanelByBlock
340
341
348template<typename Lhs, typename Rhs, typename Result>
350{
351 typedef typename Result::Type Type;
354
358 static void run(Lhs const& lhs, Rhs const& rhs, Result& res)
359 {
360#ifdef STK_DEBUG
361 stk_cout << _T("Entering BlockPanelProduct::run()\n");
362#endif
363 // compute number of loops
364 int nbInnerLoop = lhs.sizeCols()/blockSize_;
365 int nbBlocks = lhs.sizeRows()/blockSize_;
366 int nbPanels = rhs.sizeCols()/panelSize_;
367
368 // remaining sizes in the matrices
369 int bSize = lhs.sizeRows() - blockSize_ * nbBlocks;
370 int pSize = rhs.sizeCols() - panelSize_ * nbPanels;
371 int tSize = lhs.sizeCols() - blockSize_ * nbInnerLoop;
372
373 // remaining positions in the matrices
374 int kLastPos = lhs.beginCols() + blockSize_ * nbInnerLoop;
375
376 // start blocks by panel
377 for (int k = 0; k<nbInnerLoop; ++k)
378 {
379 TRange<blockSize_> innerRange(lhs.beginCols() + k * blockSize_, blockSize_);
380#ifdef _OPENMP
381#pragma omp parallel for
382#endif
383 for (int i = 0; i<nbBlocks; ++i)
384 {
385 TRange<blockSize_> rowRange(lhs.beginRows() + i * blockSize_, blockSize_);
386 for (int j = 0; j<nbPanels; ++j)
387 {
388 TRange<panelSize_> colRange(rhs.beginCols() + j * panelSize_, panelSize_);
390 }
391 // remaining incomplete panels
392 Range colRange(rhs.beginCols() + nbPanels * panelSize_, pSize);
394 }
395 Range rowRange(lhs.beginRows() + nbBlocks * blockSize_, bSize);
396#ifdef _OPENMP
397#pragma omp parallel for
398#endif
399 for (int j = 0; j<nbPanels; ++j)
400 {
403 }
404 // remaining incomplete panels
405 Range colRange(res.beginCols() + nbPanels * panelSize_, pSize);
407 } // InnerLoop
408 // treat the remaining rows/columns not in outer loop k
409 switch (tSize)
410 {
411 case 1: MultCoeff::mult1Outer(lhs, rhs, res, kLastPos); break;
412 case 2: MultCoeff::mult2Outer(lhs, rhs, res, kLastPos); break;
413 case 3: MultCoeff::mult3Outer(lhs, rhs, res, kLastPos); break;
414 default:break;
415 }
416 }
418 template<class SubLhs, class SubRhs>
419 static void multBlockByPanel( SubLhs const& lhs, SubRhs const& rhs, Result& res)
420 {
421 const int k= rhs.beginRows();
422 for (int j=rhs.beginCols(); j<rhs.endCols(); ++j)
423 {
424 int i = lhs.beginRows();
425 res.elt(i,j) += lhs(i ,k) * rhs(k ,j) + lhs(i ,k+1) * rhs(k+1,j)
426 + lhs(i ,k+2) * rhs(k+2,j) + lhs(i ,k+3) * rhs(k+3,j);
427 ++i;
428 res.elt(i,j) += lhs(i,k) * rhs(k ,j) + lhs(i,k+1) * rhs(k+1,j)
429 + lhs(i,k+2) * rhs(k+2,j) + lhs(i,k+3) * rhs(k+3,j);
430 ++i;
431 res.elt(i,j) += lhs(i,k) * rhs(k ,j) + lhs(i,k+1) * rhs(k+1,j)
432 + lhs(i,k+2) * rhs(k+2,j) + lhs(i,k+3) * rhs(k+3,j);
433 ++i;
434 res.elt(i,j) += lhs(i,k) * rhs(k ,j) + lhs(i,k+1) * rhs(k+1,j)
435 + lhs(i,k+2) * rhs(k+2,j) + lhs(i,k+3) * rhs(k+3,j);
436 }
437 }
439 template<class SubLhs, class SubRhs>
440 static void multBlockPartByPanel( SubLhs const& lhs, SubRhs const& rhs, Result& res)
441 {
442 const int k= rhs.beginRows();
443 for (int j=rhs.beginCols(); j<rhs.endCols(); ++j)
444 for(int i=lhs.beginRows(); i<lhs.endRows(); ++i)
445 res.elt(i,j) += lhs(i,k ) * rhs(k ,j) + lhs(i,k+1) * rhs(k+1,j)
446 + lhs(i,k+2) * rhs(k+2,j) + lhs(i,k+3) * rhs(k+3,j);
447 }
448}; // struct BlockPanelProduct
449
457template<typename Lhs, typename Rhs, typename Result>
459{
460 typedef typename Result::Type Type;
463
467 static void run(Lhs const& lhs, Rhs const& rhs, Result& res)
468 {
469#ifdef STK_ARRAYS_DEBUG
470 stk_cout << _T("Entering PanelBlockProduct::run()\n");
471#endif
472 // compute dimensions
473 int nbInnerLoop = lhs.sizeCols()/blockSize_; // = rhs.sizeRows()/blockSize_;
474 int nbBlocks = rhs.sizeCols()/blockSize_;
475 int nbPanels = lhs.sizeRows()/panelSize_;
476
477 // remaining sizes in the matrices
478 int bSize = rhs.sizeCols() - blockSize_ * nbBlocks;
479 int pSize = lhs.sizeRows() - panelSize_ * nbPanels;
480 int tSize = lhs.sizeCols() - blockSize_ * nbInnerLoop;
481
482 // index of the remaining positions
483 int kLastPos = lhs.beginCols() + blockSize_ * nbInnerLoop;
484
485 // start blocks by panel
486 for (int k = 0; k<nbInnerLoop; ++k)
487 {
488 TRange<blockSize_> innerRange(lhs.beginCols() + k * blockSize_, blockSize_);
489#ifdef _OPENMP
490#pragma omp parallel for
491#endif
492 for (int j = 0; j<nbBlocks; ++j)
493 {
494 TRange<blockSize_> colRange(rhs.beginCols() + j * blockSize_, blockSize_);
495 for (int i = 0; i<nbPanels; ++i)
496 {
497 TRange<panelSize_> rowRange(lhs.beginRows() + i * panelSize_, panelSize_);
499 }
500 // remaining incomplete
501 Range rowRange(lhs.beginRows() + nbPanels * panelSize_, pSize);
503 }
504 Range colRange(rhs.beginCols() + nbBlocks * blockSize_, bSize);
505#ifdef _OPENMP
506#pragma omp parallel for
507#endif
508 for (int i = 0; i<nbPanels; ++i)
509 {
510 TRange<panelSize_> rowRange(lhs.beginRows() + i * panelSize_, panelSize_);
512 }
513 // remaining incomplete panels
514 Range rowRange(lhs.beginRows() + nbPanels * panelSize_, pSize);
516 } // InnerLoop
517 // treat the remaining rows/columns not in outer loop k
518 switch (tSize)
519 {
520 case 0: break;
521 case 1: MultCoeff::mult1Outer(lhs, rhs, res, kLastPos); break;
522 case 2: MultCoeff::mult2Outer(lhs, rhs, res, kLastPos); break;
523 case 3: MultCoeff::mult3Outer(lhs, rhs, res, kLastPos); break;
524 default:break;
525 }
526 }
528 template<class SubLhs, class SubRhs>
529 static void multPanelByBlock( SubLhs const& lhs, SubRhs const& rhs, Result& res)
530 {
531 int const k= lhs.beginCols();
532 for (int i=lhs.beginRows(); i<lhs.endRows(); ++i)
533 {
534 int j = rhs.beginCols();
535 res.elt(i,j) += lhs(i, k ) * rhs(k , j) + lhs(i, k+1) * rhs(k+1, j)
536 + lhs(i, k+2) * rhs(k+2, j) + lhs(i, k+3) * rhs(k+3, j);
537 ++j;
538 res.elt(i,j) += lhs(i, k ) * rhs(k , j) + lhs(i, k+1) * rhs(k+1, j)
539 + lhs(i, k+2) * rhs(k+2, j) + lhs(i, k+3) * rhs(k+3, j);
540 ++j;
541 res.elt(i,j) += lhs(i, k ) * rhs(k , j) + lhs(i, k+1) * rhs(k+1, j)
542 + lhs(i, k+2) * rhs(k+2, j) + lhs(i, k+3) * rhs(k+3, j);
543 ++j;
544 res.elt(i,j) += lhs(i, k ) * rhs(k , j) + lhs(i, k+1) * rhs(k+1, j)
545 + lhs(i, k+2) * rhs(k+2, j) + lhs(i, k+3) * rhs(k+3, j);
546 }
547 }
549 template<class SubLhs, class SubRhs>
550 static void multPanelByBlockPart( SubLhs const& lhs, SubRhs const& rhs, Result& res)
551 {
552 const int k= lhs.beginCols();
553 for (int i=lhs.beginRows(); i<lhs.endRows(); ++i)
554 for (int j=rhs.beginCols(); j<rhs.endCols(); ++j)
555 res.elt(i,j) += lhs(i, k ) * rhs(k , j) + lhs(i, k+1) * rhs(k+1, j)
556 + lhs(i, k+2) * rhs(k+2, j) + lhs(i, k+3) * rhs(k+3, j);
557 }
558}; // struct PanelBlockProduct
559
560} // namespace hidden
561
562} // namespace STK
563
564#endif /* STK_ARRAYBYARRAYPRODUCT_H */
#define stk_cout
Standard stk output stream.
#define _T(x)
Let x unmodified.
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
Index sub-vector region: Specialization when the size is unknown.
Definition STK_Range.h:265
The namespace STK is the main domain space of the Statistical ToolKit project.
const int panelSize_
const int blockSize_
Methods to use for C=AB with A divided in blocks and B divided in panels.
hidden::MultCoefImpl< Lhs, Rhs, Result > MultCoeff
static void multBlockByPanel(Block< Type > const &block, Panel< Type > const &panel, Result &res, int iRow, int jCol)
Default dimension.
static void multBlockByPanel(Block< Type > const &block, Panel< Type > const &panel, Result &res, int iRow, int jCol, int pSize, int bSize)
with panel size given
static void multBlockByPanel(Block< Type > const &block, Panel< Type > const &panel, Result &res, int iRow, int jCol, int pSize)
with panel size given
hidden::CopySubArrayImpl< Rhs, Type > CopyRhsImpl
hidden::CopySubArrayImpl< Lhs, Type > CopyLhsImpl
static void run(Lhs const &lhs, Rhs const &rhs, Result &res)
Main method for matrices multiplication implementation.
hidden::MultImpl< Type > Cmult
Methods to use for C=AB with A divided in blocks and B divided in panels.
static void run(Lhs const &lhs, Rhs const &rhs, Result &res)
Main method for Matrices multiplication implementation.
static void multBlockByPanel(SubLhs const &lhs, SubRhs const &rhs, Result &res)
matrix product between a lhs block and a rhs panel
hidden::MultCoefImpl< Lhs, Rhs, Result > MultCoeff
static void multBlockPartByPanel(SubLhs const &lhs, SubRhs const &rhs, Result &res)
matrix product between a lhs block and a rhs panel
This structure regroup the methods to used for copying part of an array in a Block or a Panel.
static void arrayToPanel(Array const &m, Panel< Type > &panel, int iRow, int jCol)
copy a part of an array in a Panel
static void arrayToBlockByCol(Array const &m, Block< Type > &block, int iRow, int jCol)
default dimensions
static void arrayToBlock(Array const &m, Block< Type > &block, int iRow, int jCol)
copy a part of an Array in a Block
static void arrayToPanelByCol(Array const &m, Panel< Type > &panel, int iRow, int kPos)
default dimensions
This structure regroup the methods to used after block multiplication in order to perform the product...
static void mult2Outer(Lhs const &lhs, Rhs const &rhs, Result &res, int k)
multiplication with two outer rows/columns
static void mult1Outer(Lhs const &lhs, Rhs const &rhs, Result &res, int k)
multiplication with one outer rows/columns
static void mult3Outer(Lhs const &lhs, Rhs const &rhs, Result &res, int k)
multiplication with three outer rows/columns
this structure regroup all the methods using only pointers on the Type
Methods to use for C=AB with A divided in panels and B divided in blocks.
static void run(Lhs const &lhs, Rhs const &rhs, Result &res)
Main method for Matrices multiplication implementation.
static void multPanelByBlockPart(SubLhs const &lhs, SubRhs const &rhs, Result &res)
Default dimension.
hidden::MultCoefImpl< Lhs, Rhs, Result > MultCoeff
static void multPanelByBlock(SubLhs const &lhs, SubRhs const &rhs, Result &res)
Default dimension.
Methods to use for C=AB with A divided in panels and B divided in blocks.
static void multPanelByBlock(Panel< Type > const &panel, Block< Type > const &block, Result &res, int iRow, int jCol, int pSize, int bSize)
with panel size and block size dimension given
hidden::MultImpl< Type > Cmult
static void run(Lhs const &lhs, Rhs const &rhs, Result &res)
Main method for Matrices multiplication implementation.
hidden::MultCoefImpl< Lhs, Rhs, Result > MultCoeff
hidden::CopySubArrayImpl< Lhs, Type > CopyLhsImpl
static void multPanelByBlock(Panel< Type > const &panel, Block< Type > const &block, Result &res, int iRow, int jCol, int pSize)
hidden::CopySubArrayImpl< Rhs, Type > CopyRhsImpl
static void multPanelByBlock(Panel< Type > const &panel, Block< Type > const &block, Result &res, int iRow, int jCol)
Default dimension.