TR-mbed 1.0
Loading...
Searching...
No Matches
AssignEvaluator.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
5// Copyright (C) 2011-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
6// Copyright (C) 2011-2012 Jitse Niesen <jitse@maths.leeds.ac.uk>
7//
8// This Source Code Form is subject to the terms of the Mozilla
9// Public License v. 2.0. If a copy of the MPL was not distributed
10// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
11
12#ifndef EIGEN_ASSIGN_EVALUATOR_H
13#define EIGEN_ASSIGN_EVALUATOR_H
14
15namespace Eigen {
16
17// This implementation is based on Assign.h
18
19namespace internal {
20
21/***************************************************************************
22* Part 1 : the logic deciding a strategy for traversal and unrolling *
23***************************************************************************/
24
25// copy_using_evaluator_traits is based on assign_traits
26
27template <typename DstEvaluator, typename SrcEvaluator, typename AssignFunc, int MaxPacketSize = -1>
29{
30 typedef typename DstEvaluator::XprType Dst;
31 typedef typename Dst::Scalar DstScalar;
32
33 enum {
34 DstFlags = DstEvaluator::Flags,
35 SrcFlags = SrcEvaluator::Flags
36 };
37
38public:
39 enum {
40 DstAlignment = DstEvaluator::Alignment,
41 SrcAlignment = SrcEvaluator::Alignment,
44 };
45
46private:
47 enum {
48 InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)
49 : int(DstFlags)&RowMajorBit ? int(Dst::ColsAtCompileTime)
50 : int(Dst::RowsAtCompileTime),
51 InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)
52 : int(DstFlags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime)
53 : int(Dst::MaxRowsAtCompileTime),
54 RestrictedInnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(InnerSize,MaxPacketSize),
55 RestrictedLinearSize = EIGEN_SIZE_MIN_PREFER_FIXED(Dst::SizeAtCompileTime,MaxPacketSize),
57 MaxSizeAtCompileTime = Dst::SizeAtCompileTime
58 };
59
60 // TODO distinguish between linear traversal and inner-traversals
61 typedef typename find_best_packet<DstScalar,RestrictedLinearSize>::type LinearPacketType;
62 typedef typename find_best_packet<DstScalar,RestrictedInnerSize>::type InnerPacketType;
63
64 enum {
67 };
68
69public:
70 enum {
73 };
74
75private:
76 enum {
77 DstIsRowMajor = DstFlags&RowMajorBit,
78 SrcIsRowMajor = SrcFlags&RowMajorBit,
79 StorageOrdersAgree = (int(DstIsRowMajor) == int(SrcIsRowMajor)),
80 MightVectorize = bool(StorageOrdersAgree)
83 MayInnerVectorize = MightVectorize
84 && int(InnerSize)!=Dynamic && int(InnerSize)%int(InnerPacketSize)==0
85 && int(OuterStride)!=Dynamic && int(OuterStride)%int(InnerPacketSize)==0
87 MayLinearize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & LinearAccessBit),
88 MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize) && bool(DstHasDirectAccess)
89 && (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)) || MaxSizeAtCompileTime == Dynamic),
90 /* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
91 so it's only good for large enough sizes. */
92 MaySliceVectorize = bool(MightVectorize) && bool(DstHasDirectAccess)
93 && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=(EIGEN_UNALIGNED_VECTORIZE?InnerPacketSize:(3*InnerPacketSize)))
94 /* slice vectorization can be slow, so we only want it if the slices are big, which is
95 indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block
96 in a fixed-size matrix
97 However, with EIGEN_UNALIGNED_VECTORIZE and unrolling, slice vectorization is still worth it */
98 };
99
100public:
101 enum {
102 Traversal = int(Dst::SizeAtCompileTime) == 0 ? int(AllAtOnceTraversal) // If compile-size is zero, traversing will fail at compile-time.
103 : (int(MayLinearVectorize) && (LinearPacketSize>InnerPacketSize)) ? int(LinearVectorizedTraversal)
104 : int(MayInnerVectorize) ? int(InnerVectorizedTraversal)
105 : int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
106 : int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
107 : int(MayLinearize) ? int(LinearTraversal)
112 };
113
114 typedef typename conditional<int(Traversal)==LinearVectorizedTraversal, LinearPacketType, InnerPacketType>::type PacketType;
115
116private:
117 enum {
118 ActualPacketSize = int(Traversal)==LinearVectorizedTraversal ? LinearPacketSize
119 : Vectorized ? InnerPacketSize
120 : 1,
121 UnrollingLimit = EIGEN_UNROLLING_LIMIT * ActualPacketSize,
122 MayUnrollCompletely = int(Dst::SizeAtCompileTime) != Dynamic
123 && int(Dst::SizeAtCompileTime) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit),
124 MayUnrollInner = int(InnerSize) != Dynamic
125 && int(InnerSize) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit)
126 };
127
128public:
129 enum {
131 ? (
135 )
139 : int(NoUnrolling) )
142 : int(NoUnrolling) )
146 : int(NoUnrolling) )
147#endif
149 };
150
151#ifdef EIGEN_DEBUG_ASSIGN
152 static void debug()
153 {
154 std::cerr << "DstXpr: " << typeid(typename DstEvaluator::XprType).name() << std::endl;
155 std::cerr << "SrcXpr: " << typeid(typename SrcEvaluator::XprType).name() << std::endl;
156 std::cerr.setf(std::ios::hex, std::ios::basefield);
157 std::cerr << "DstFlags" << " = " << DstFlags << " (" << demangle_flags(DstFlags) << " )" << std::endl;
158 std::cerr << "SrcFlags" << " = " << SrcFlags << " (" << demangle_flags(SrcFlags) << " )" << std::endl;
159 std::cerr.unsetf(std::ios::hex);
165 EIGEN_DEBUG_VAR(InnerSize)
166 EIGEN_DEBUG_VAR(InnerMaxSize)
167 EIGEN_DEBUG_VAR(LinearPacketSize)
168 EIGEN_DEBUG_VAR(InnerPacketSize)
169 EIGEN_DEBUG_VAR(ActualPacketSize)
170 EIGEN_DEBUG_VAR(StorageOrdersAgree)
171 EIGEN_DEBUG_VAR(MightVectorize)
172 EIGEN_DEBUG_VAR(MayLinearize)
173 EIGEN_DEBUG_VAR(MayInnerVectorize)
174 EIGEN_DEBUG_VAR(MayLinearVectorize)
175 EIGEN_DEBUG_VAR(MaySliceVectorize)
176 std::cerr << "Traversal" << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
177 EIGEN_DEBUG_VAR(SrcEvaluator::CoeffReadCost)
178 EIGEN_DEBUG_VAR(DstEvaluator::CoeffReadCost)
179 EIGEN_DEBUG_VAR(Dst::SizeAtCompileTime)
180 EIGEN_DEBUG_VAR(UnrollingLimit)
183 std::cerr << "Unrolling" << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
184 std::cerr << std::endl;
185 }
186#endif
187};
188
189/***************************************************************************
190* Part 2 : meta-unrollers
191***************************************************************************/
192
193/************************
194*** Default traversal ***
195************************/
196
197template<typename Kernel, int Index, int Stop>
199{
200 // FIXME: this is not very clean, perhaps this information should be provided by the kernel?
201 typedef typename Kernel::DstEvaluatorType DstEvaluatorType;
202 typedef typename DstEvaluatorType::XprType DstXprType;
203
204 enum {
205 outer = Index / DstXprType::InnerSizeAtCompileTime,
206 inner = Index % DstXprType::InnerSizeAtCompileTime
207 };
208
210 {
211 kernel.assignCoeffByOuterInner(outer, inner);
213 }
214};
215
216template<typename Kernel, int Stop>
221
222template<typename Kernel, int Index_, int Stop>
231
232template<typename Kernel, int Stop>
237
238/***********************
239*** Linear traversal ***
240***********************/
241
242template<typename Kernel, int Index, int Stop>
251
252template<typename Kernel, int Stop>
257
258/**************************
259*** Inner vectorization ***
260**************************/
261
262template<typename Kernel, int Index, int Stop>
264{
265 // FIXME: this is not very clean, perhaps this information should be provided by the kernel?
266 typedef typename Kernel::DstEvaluatorType DstEvaluatorType;
267 typedef typename DstEvaluatorType::XprType DstXprType;
268 typedef typename Kernel::PacketType PacketType;
269
270 enum {
271 outer = Index / DstXprType::InnerSizeAtCompileTime,
272 inner = Index % DstXprType::InnerSizeAtCompileTime,
273 SrcAlignment = Kernel::AssignmentTraits::SrcAlignment,
274 DstAlignment = Kernel::AssignmentTraits::DstAlignment
275 };
276
283};
284
285template<typename Kernel, int Stop>
290
291template<typename Kernel, int Index_, int Stop, int SrcAlignment, int DstAlignment>
302
303template<typename Kernel, int Stop, int SrcAlignment, int DstAlignment>
308
309/***************************************************************************
310* Part 3 : implementation of all cases
311***************************************************************************/
312
313// dense_assignment_loop is based on assign_impl
314
315template<typename Kernel,
316 int Traversal = Kernel::AssignmentTraits::Traversal,
317 int Unrolling = Kernel::AssignmentTraits::Unrolling>
319
320/************************
321***** Special Cases *****
322************************/
323
324// Zero-sized assignment is a no-op.
325template<typename Kernel, int Unrolling>
327{
329 {
330 typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
331 EIGEN_STATIC_ASSERT(int(DstXprType::SizeAtCompileTime) == 0,
332 EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT)
333 }
334};
335
336/************************
337*** Default traversal ***
338************************/
339
340template<typename Kernel>
342{
344 {
345 for(Index outer = 0; outer < kernel.outerSize(); ++outer) {
346 for(Index inner = 0; inner < kernel.innerSize(); ++inner) {
347 kernel.assignCoeffByOuterInner(outer, inner);
348 }
349 }
350 }
351};
352
353template<typename Kernel>
362
363template<typename Kernel>
365{
367 {
368 typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
369
370 const Index outerSize = kernel.outerSize();
371 for(Index outer = 0; outer < outerSize; ++outer)
373 }
374};
375
376/***************************
377*** Linear vectorization ***
378***************************/
379
380
381// The goal of unaligned_dense_assignment_loop is simply to factorize the handling
382// of the non vectorizable beginning and ending parts
383
384template <bool IsAligned = false>
386{
387 // if IsAligned = true, then do nothing
388 template <typename Kernel>
390};
391
392template <>
394{
395 // MSVC must not inline this functions. If it does, it fails to optimize the
396 // packet access path.
397 // FIXME check which version exhibits this issue
398#if EIGEN_COMP_MSVC
399 template <typename Kernel>
400 static EIGEN_DONT_INLINE void run(Kernel &kernel,
401 Index start,
402 Index end)
403#else
404 template <typename Kernel>
406 Index start,
407 Index end)
408#endif
409 {
410 for (Index index = start; index < end; ++index)
411 kernel.assignCoeff(index);
412 }
413};
414
415template<typename Kernel>
417{
419 {
420 const Index size = kernel.size();
421 typedef typename Kernel::Scalar Scalar;
422 typedef typename Kernel::PacketType PacketType;
423 enum {
424 requestedAlignment = Kernel::AssignmentTraits::LinearRequiredAlignment,
426 dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment),
428 : int(Kernel::AssignmentTraits::DstAlignment),
429 srcAlignment = Kernel::AssignmentTraits::JointAlignment
430 };
433
435
436 for(Index index = alignedStart; index < alignedEnd; index += packetSize)
438
440 }
441};
442
443template<typename Kernel>
445{
447 {
448 typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
449 typedef typename Kernel::PacketType PacketType;
450
451 enum { size = DstXprType::SizeAtCompileTime,
454
457 }
458};
459
460/**************************
461*** Inner vectorization ***
462**************************/
463
464template<typename Kernel>
466{
467 typedef typename Kernel::PacketType PacketType;
468 enum {
469 SrcAlignment = Kernel::AssignmentTraits::SrcAlignment,
470 DstAlignment = Kernel::AssignmentTraits::DstAlignment
471 };
473 {
474 const Index innerSize = kernel.innerSize();
475 const Index outerSize = kernel.outerSize();
477 for(Index outer = 0; outer < outerSize; ++outer)
478 for(Index inner = 0; inner < innerSize; inner+=packetSize)
480 }
481};
482
483template<typename Kernel>
492
493template<typename Kernel>
495{
497 {
498 typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
499 typedef typename Kernel::AssignmentTraits Traits;
500 const Index outerSize = kernel.outerSize();
501 for(Index outer = 0; outer < outerSize; ++outer)
502 copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, DstXprType::InnerSizeAtCompileTime,
503 Traits::SrcAlignment, Traits::DstAlignment>::run(kernel, outer);
504 }
505};
506
507/***********************
508*** Linear traversal ***
509***********************/
510
511template<typename Kernel>
513{
515 {
516 const Index size = kernel.size();
517 for(Index i = 0; i < size; ++i)
518 kernel.assignCoeff(i);
519 }
520};
521
522template<typename Kernel>
524{
526 {
527 typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
529 }
530};
531
532/**************************
533*** Slice vectorization ***
534***************************/
535
536template<typename Kernel>
538{
540 {
541 typedef typename Kernel::Scalar Scalar;
542 typedef typename Kernel::PacketType PacketType;
543 enum {
545 requestedAlignment = int(Kernel::AssignmentTraits::InnerRequiredAlignment),
546 alignable = packet_traits<Scalar>::AlignedOnScalar || int(Kernel::AssignmentTraits::DstAlignment)>=sizeof(Scalar),
547 dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment),
549 : int(Kernel::AssignmentTraits::DstAlignment)
550 };
551 const Scalar *dst_ptr = kernel.dstDataPtr();
552 if((!bool(dstIsAligned)) && (UIntPtr(dst_ptr) % sizeof(Scalar))>0)
553 {
554 // the pointer is not aligned-on scalar, so alignment is not possible
556 }
558 const Index innerSize = kernel.innerSize();
559 const Index outerSize = kernel.outerSize();
560 const Index alignedStep = alignable ? (packetSize - kernel.outerStride() % packetSize) & packetAlignedMask : 0;
562
563 for(Index outer = 0; outer < outerSize; ++outer)
564 {
566 // do the non-vectorizable part of the assignment
567 for(Index inner = 0; inner<alignedStart ; ++inner)
568 kernel.assignCoeffByOuterInner(outer, inner);
569
570 // do the vectorizable part of the assignment
571 for(Index inner = alignedStart; inner<alignedEnd; inner+=packetSize)
573
574 // do the non-vectorizable part of the assignment
575 for(Index inner = alignedEnd; inner<innerSize ; ++inner)
576 kernel.assignCoeffByOuterInner(outer, inner);
577
578 alignedStart = numext::mini((alignedStart+alignedStep)%packetSize, innerSize);
579 }
580 }
581};
582
583#if EIGEN_UNALIGNED_VECTORIZE
584template<typename Kernel>
585struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, InnerUnrolling>
586{
587 EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
588 {
589 typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
590 typedef typename Kernel::PacketType PacketType;
591
592 enum { innerSize = DstXprType::InnerSizeAtCompileTime,
593 packetSize =unpacket_traits<PacketType>::size,
594 vectorizableSize = (int(innerSize) / int(packetSize)) * int(packetSize),
595 size = DstXprType::SizeAtCompileTime };
596
597 for(Index outer = 0; outer < kernel.outerSize(); ++outer)
598 {
599 copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, vectorizableSize, 0, 0>::run(kernel, outer);
600 copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, vectorizableSize, innerSize>::run(kernel, outer);
601 }
602 }
603};
604#endif
605
606
607/***************************************************************************
608* Part 4 : Generic dense assignment kernel
609***************************************************************************/
610
611// This class generalize the assignment of a coefficient (or packet) from one dense evaluator
612// to another dense writable evaluator.
613// It is parametrized by the two evaluators, and the actual assignment functor.
614// This abstraction level permits to keep the evaluation loops as simple and as generic as possible.
615// One can customize the assignment using this generic dense_assignment_kernel with different
616// functors, or by completely overloading it, by-passing a functor.
617template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor, int Version = Specialized>
619{
620protected:
621 typedef typename DstEvaluatorTypeT::XprType DstXprType;
622 typedef typename SrcEvaluatorTypeT::XprType SrcXprType;
623public:
624
627 typedef typename DstEvaluatorType::Scalar Scalar;
629 typedef typename AssignmentTraits::PacketType PacketType;
630
631
634 : m_dst(dst), m_src(src), m_functor(func), m_dstExpr(dstExpr)
635 {
636 #ifdef EIGEN_DEBUG_ASSIGN
637 AssignmentTraits::debug();
638 #endif
639 }
640
647
650
653 {
654 m_functor.assignCoeff(m_dst.coeffRef(row,col), m_src.coeff(row,col));
655 }
656
659 {
660 m_functor.assignCoeff(m_dst.coeffRef(index), m_src.coeff(index));
661 }
662
665 {
666 Index row = rowIndexByOuterInner(outer, inner);
667 Index col = colIndexByOuterInner(outer, inner);
668 assignCoeff(row, col);
669 }
670
671
672 template<int StoreMode, int LoadMode, typename PacketType>
674 {
675 m_functor.template assignPacket<StoreMode>(&m_dst.coeffRef(row,col), m_src.template packet<LoadMode,PacketType>(row,col));
676 }
677
678 template<int StoreMode, int LoadMode, typename PacketType>
680 {
681 m_functor.template assignPacket<StoreMode>(&m_dst.coeffRef(index), m_src.template packet<LoadMode,PacketType>(index));
682 }
683
684 template<int StoreMode, int LoadMode, typename PacketType>
686 {
687 Index row = rowIndexByOuterInner(outer, inner);
688 Index col = colIndexByOuterInner(outer, inner);
690 }
691
693 {
694 typedef typename DstEvaluatorType::ExpressionTraits Traits;
695 return int(Traits::RowsAtCompileTime) == 1 ? 0
696 : int(Traits::ColsAtCompileTime) == 1 ? inner
697 : int(DstEvaluatorType::Flags)&RowMajorBit ? outer
698 : inner;
699 }
700
702 {
703 typedef typename DstEvaluatorType::ExpressionTraits Traits;
704 return int(Traits::ColsAtCompileTime) == 1 ? 0
705 : int(Traits::RowsAtCompileTime) == 1 ? inner
706 : int(DstEvaluatorType::Flags)&RowMajorBit ? inner
707 : outer;
708 }
709
711 {
712 return m_dstExpr.data();
713 }
714
715protected:
719 // TODO find a way to avoid the needs of the original expression
721};
722
723// Special kernel used when computing small products whose operands have dynamic dimensions. It ensures that the
724// PacketSize used is no larger than 4, thereby increasing the chance that vectorized instructions will be used
725// when computing the product.
726
727template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor>
743
744/***************************************************************************
745* Part 5 : Entry point for dense rectangular assignment
746***************************************************************************/
747
748template<typename DstXprType,typename SrcXprType, typename Functor>
750void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const Functor &/*func*/)
751{
754 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
755}
756
757template<typename DstXprType,typename SrcXprType, typename T1, typename T2>
759void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const internal::assign_op<T1,T2> &/*func*/)
760{
761 Index dstRows = src.rows();
762 Index dstCols = src.cols();
763 if(((dst.rows()!=dstRows) || (dst.cols()!=dstCols)))
764 dst.resize(dstRows, dstCols);
765 eigen_assert(dst.rows() == dstRows && dst.cols() == dstCols);
766}
767
768template<typename DstXprType, typename SrcXprType, typename Functor>
770{
771 typedef evaluator<DstXprType> DstEvaluatorType;
772 typedef evaluator<SrcXprType> SrcEvaluatorType;
773
774 SrcEvaluatorType srcEvaluator(src);
775
776 // NOTE To properly handle A = (A*A.transpose())/s with A rectangular,
777 // we need to resize the destination after the source evaluator has been created.
779
780 DstEvaluatorType dstEvaluator(dst);
781
783 Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived());
784
786}
787
788// Specialization for filling the destination with a constant value.
789#ifndef EIGEN_GPU_COMPILE_PHASE
790template<typename DstXprType>
796#endif
797
798template<typename DstXprType, typename SrcXprType>
803
804/***************************************************************************
805* Part 6 : Generic assignment
806***************************************************************************/
807
808// Based on the respective shapes of the destination and source,
809// the class AssignmentKind determine the kind of assignment mechanism.
810// AssignmentKind must define a Kind typedef.
811template<typename DstShape, typename SrcShape> struct AssignmentKind;
812
813// Assignment kind defined in this file:
814struct Dense2Dense {};
816
817template<typename,typename> struct AssignmentKind { typedef EigenBase2EigenBase Kind; };
818template<> struct AssignmentKind<DenseShape,DenseShape> { typedef Dense2Dense Kind; };
819
820// This is the main assignment class
821template< typename DstXprType, typename SrcXprType, typename Functor,
823 typename EnableIf = void>
825
826
827// The only purpose of this call_assignment() function is to deal with noalias() / "assume-aliasing" and automatic transposition.
828// Indeed, I (Gael) think that this concept of "assume-aliasing" was a mistake, and it makes thing quite complicated.
829// So this intermediate function removes everything related to "assume-aliasing" such that Assignment
830// does not has to bother about these annoying details.
831
832template<typename Dst, typename Src>
838template<typename Dst, typename Src>
844
845// Deal with "assume-aliasing"
846template<typename Dst, typename Src, typename Func>
848void call_assignment(Dst& dst, const Src& src, const Func& func, typename enable_if< evaluator_assume_aliasing<Src>::value, void*>::type = 0)
849{
852}
853
854template<typename Dst, typename Src, typename Func>
856void call_assignment(Dst& dst, const Src& src, const Func& func, typename enable_if<!evaluator_assume_aliasing<Src>::value, void*>::type = 0)
857{
859}
860
861// by-pass "assume-aliasing"
862// When there is no aliasing, we require that 'dst' has been properly resized
863template<typename Dst, template <typename> class StorageBase, typename Src, typename Func>
866{
867 call_assignment_no_alias(dst.expression(), src, func);
868}
869
870
871template<typename Dst, typename Src, typename Func>
873void call_assignment_no_alias(Dst& dst, const Src& src, const Func& func)
874{
875 enum {
876 NeedToTranspose = ( (int(Dst::RowsAtCompileTime) == 1 && int(Src::ColsAtCompileTime) == 1)
877 || (int(Dst::ColsAtCompileTime) == 1 && int(Src::RowsAtCompileTime) == 1)
878 ) && int(Dst::SizeAtCompileTime) != 1
879 };
880
884
885 // TODO check whether this is the right place to perform these checks:
888 EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scalar);
889
891}
892
893template<typename Dst, typename Src, typename Func>
896{
897 typedef evaluator<Dst> DstEvaluatorType;
898 typedef evaluator<Src> SrcEvaluatorType;
900
902 EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename Dst::Scalar,typename Src::Scalar);
903
904 SrcEvaluatorType srcEvaluator(src);
906
907 DstEvaluatorType dstEvaluator(dst);
908 Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived());
909
911}
912
913template<typename Dst, typename Src>
919
920template<typename Dst, typename Src, typename Func>
923{
924 // TODO check whether this is the right place to perform these checks:
927 EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename Dst::Scalar,typename Src::Scalar);
928
930}
931template<typename Dst, typename Src>
937
938// forward declaration
939template<typename Dst, typename Src> void check_for_aliasing(const Dst &dst, const Src &src);
940
941// Generic Dense to Dense assignment
942// Note that the last template argument "Weak" is needed to make it possible to perform
943// both partial specialization+SFINAE without ambiguous specialization
944template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
945struct Assignment<DstXprType, SrcXprType, Functor, Dense2Dense, Weak>
946{
948 static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
949 {
950#ifndef EIGEN_NO_DEBUG
951 internal::check_for_aliasing(dst, src);
952#endif
953
955 }
956};
957
958// Generic assignment through evalTo.
959// TODO: not sure we have to keep that one, but it helps porting current code to new evaluator mechanism.
960// Note that the last template argument "Weak" is needed to make it possible to perform
961// both partial specialization+SFINAE without ambiguous specialization
962template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
963struct Assignment<DstXprType, SrcXprType, Functor, EigenBase2EigenBase, Weak>
964{
967 {
968 Index dstRows = src.rows();
969 Index dstCols = src.cols();
970 if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
971 dst.resize(dstRows, dstCols);
972
973 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
974 src.evalTo(dst);
975 }
976
977 // NOTE The following two functions are templated to avoid their instantiation if not needed
978 // This is needed because some expressions supports evalTo only and/or have 'void' as scalar type.
979 template<typename SrcScalarType>
981 static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,SrcScalarType> &/*func*/)
982 {
983 Index dstRows = src.rows();
984 Index dstCols = src.cols();
985 if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
986 dst.resize(dstRows, dstCols);
987
988 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
989 src.addTo(dst);
990 }
991
992 template<typename SrcScalarType>
994 static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,SrcScalarType> &/*func*/)
995 {
996 Index dstRows = src.rows();
997 Index dstCols = src.cols();
998 if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
999 dst.resize(dstRows, dstCols);
1000
1001 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
1002 src.subTo(dst);
1003 }
1004};
1005
1006} // namespace internal
1007
1008} // end namespace Eigen
1009
1010#endif // EIGEN_ASSIGN_EVALUATOR_H
int i
Definition BiCGSTAB_step_by_step.cpp:9
#define EIGEN_UNALIGNED_VECTORIZE
Definition ConfigureVectorization.h:186
if((m *x).isApprox(y))
Definition FullPivLU_solve.cpp:6
#define EIGEN_PLAIN_ENUM_MIN(a, b)
Definition Macros.h:1288
#define EIGEN_NOEXCEPT
Definition Macros.h:1418
#define EIGEN_DEBUG_VAR(x)
Definition Macros.h:898
#define EIGEN_CONSTEXPR
Definition Macros.h:787
#define EIGEN_DEVICE_FUNC
Definition Macros.h:976
#define EIGEN_DONT_INLINE
Definition Macros.h:940
#define EIGEN_ONLY_USED_FOR_DEBUG(x)
Definition Macros.h:1049
#define eigen_assert(x)
Definition Macros.h:1037
#define EIGEN_STRONG_INLINE
Definition Macros.h:917
#define EIGEN_SIZE_MIN_PREFER_FIXED(a, b)
Definition Macros.h:1302
m col(1)
m row(1)
#define EIGEN_UNROLLING_LIMIT
Definition Settings.h:24
#define EIGEN_STATIC_ASSERT_LVALUE(Derived)
Definition StaticAssert.h:202
#define EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0, TYPE1)
Definition StaticAssert.h:192
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition StaticAssert.h:127
#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP, LHS, RHS)
Definition XprHelper.h:850
Scalar Scalar int size
Definition benchVecAdd.cpp:17
SCALAR Scalar
Definition bench_gemm.cpp:46
Generic expression of a matrix where all coefficients are defined by a functor.
Definition CwiseNullaryOp.h:61
Convenience specialization of Stride to specify only an outer stride See class Map for some examples.
Definition Stride.h:107
Definition AssignEvaluator.h:619
DstXprType & m_dstExpr
Definition AssignEvaluator.h:720
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index index)
Definition AssignEvaluator.h:679
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:641
const SrcEvaluatorType & m_src
Definition AssignEvaluator.h:717
EIGEN_DEVICE_FUNC const Scalar * dstDataPtr() const
Definition AssignEvaluator.h:710
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE generic_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType &dstExpr)
Definition AssignEvaluator.h:633
EIGEN_DEVICE_FUNC DstEvaluatorType & dstEvaluator() EIGEN_NOEXCEPT
Definition AssignEvaluator.h:648
DstEvaluatorTypeT DstEvaluatorType
Definition AssignEvaluator.h:625
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:644
AssignmentTraits::PacketType PacketType
Definition AssignEvaluator.h:629
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:645
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index row, Index col)
Assign src(row,col) to dst(row,col) through the assignment functor.
Definition AssignEvaluator.h:652
SrcEvaluatorTypeT SrcEvaluatorType
Definition AssignEvaluator.h:626
DstEvaluatorType & m_dst
Definition AssignEvaluator.h:716
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerSize() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:643
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner)
Definition AssignEvaluator.h:685
const Functor & m_functor
Definition AssignEvaluator.h:718
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index index)
Definition AssignEvaluator.h:658
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerStride() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:646
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index innerSize() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:642
EIGEN_DEVICE_FUNC const SrcEvaluatorType & srcEvaluator() const EIGEN_NOEXCEPT
Definition AssignEvaluator.h:649
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index row, Index col)
Definition AssignEvaluator.h:673
copy_using_evaluator_traits< DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor > AssignmentTraits
Definition AssignEvaluator.h:628
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner)
Definition AssignEvaluator.h:692
SrcEvaluatorTypeT::XprType SrcXprType
Definition AssignEvaluator.h:622
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner)
Definition AssignEvaluator.h:701
DstEvaluatorTypeT::XprType DstXprType
Definition AssignEvaluator.h:621
DstEvaluatorType::Scalar Scalar
Definition AssignEvaluator.h:627
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeffByOuterInner(Index outer, Index inner)
Definition AssignEvaluator.h:664
Base::DstXprType DstXprType
Definition AssignEvaluator.h:734
EIGEN_DEVICE_FUNC restricted_packet_dense_assignment_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, const Functor &func, DstXprType &dstExpr)
Definition AssignEvaluator.h:738
generic_dense_assignment_kernel< DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, BuiltIn > Base
Definition AssignEvaluator.h:731
AssignmentTraits::PacketType PacketType
Definition AssignEvaluator.h:736
copy_using_evaluator_traits< DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, 4 > AssignmentTraits
Definition AssignEvaluator.h:735
Base::Scalar Scalar
Definition AssignEvaluator.h:733
const unsigned int LinearAccessBit
Definition Constants.h:130
const unsigned int DirectAccessBit
Definition Constants.h:155
const unsigned int RowMajorBit
Definition Constants.h:66
return int(ret)+1
std::size_t UIntPtr
Definition Meta.h:92
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_restricted_packet_assignment_no_alias(Dst &dst, const Src &src, const Func &func)
Definition AssignEvaluator.h:895
void check_for_aliasing(const Dst &dst, const Src &src)
Definition Transpose.h:452
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize_if_allowed(DstXprType &dst, const SrcXprType &src, const Functor &)
Definition AssignEvaluator.h:750
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment_no_alias(Dst &dst, const Src &src, const Func &func)
Definition AssignEvaluator.h:873
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment(Dst &dst, const Src &src)
Definition AssignEvaluator.h:834
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType &dst, const SrcXprType &src, const Functor &func)
Definition AssignEvaluator.h:769
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment_no_alias_no_transpose(Dst &dst, const Src &src, const Func &func)
Definition AssignEvaluator.h:922
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
const unsigned int ActualPacketAccessBit
Definition Constants.h:107
@ InnerVectorizedTraversal
Definition Constants.h:282
@ LinearVectorizedTraversal
Definition Constants.h:285
@ DefaultTraversal
Definition Constants.h:277
@ SliceVectorizedTraversal
Definition Constants.h:288
@ LinearTraversal
Definition Constants.h:279
@ AllAtOnceTraversal
Definition Constants.h:292
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
@ InnerUnrolling
Definition Constants.h:301
@ CompleteUnrolling
Definition Constants.h:304
@ NoUnrolling
Definition Constants.h:299
const int Dynamic
Definition Constants.h:22
Definition BandTriangularSolver.h:13
Definition Constants.h:528
Definition TensorMeta.h:50
Dense2Dense Kind
Definition AssignEvaluator.h:818
Definition AssignEvaluator.h:817
EigenBase2EigenBase Kind
Definition AssignEvaluator.h:817
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
Definition AssignEvaluator.h:948
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op< typename DstXprType::Scalar, SrcScalarType > &)
Definition AssignEvaluator.h:994
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op< typename DstXprType::Scalar, SrcScalarType > &)
Definition AssignEvaluator.h:981
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition AssignEvaluator.h:966
Definition AssignEvaluator.h:824
Definition AssignEvaluator.h:814
Definition AssignEvaluator.h:815
Definition ForwardDeclarations.h:151
Definition Meta.h:109
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &)
Definition AssignEvaluator.h:219
DstEvaluatorType::XprType DstXprType
Definition AssignEvaluator.h:202
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:209
Kernel::DstEvaluatorType DstEvaluatorType
Definition AssignEvaluator.h:201
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &, Index)
Definition AssignEvaluator.h:235
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer)
Definition AssignEvaluator.h:225
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &)
Definition AssignEvaluator.h:255
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:245
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &)
Definition AssignEvaluator.h:288
Kernel::PacketType PacketType
Definition AssignEvaluator.h:268
Kernel::DstEvaluatorType DstEvaluatorType
Definition AssignEvaluator.h:266
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:277
DstEvaluatorType::XprType DstXprType
Definition AssignEvaluator.h:267
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &, Index)
Definition AssignEvaluator.h:306
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer)
Definition AssignEvaluator.h:295
Kernel::PacketType PacketType
Definition AssignEvaluator.h:294
Definition AssignEvaluator.h:29
@ SrcFlags
Definition AssignEvaluator.h:35
@ DstFlags
Definition AssignEvaluator.h:34
@ InnerRequiredAlignment
Definition AssignEvaluator.h:72
@ LinearRequiredAlignment
Definition AssignEvaluator.h:71
@ Vectorized
Definition AssignEvaluator.h:109
@ Traversal
Definition AssignEvaluator.h:102
@ SrcAlignment
Definition AssignEvaluator.h:41
@ JointAlignment
Definition AssignEvaluator.h:43
@ DstAlignment
Definition AssignEvaluator.h:40
@ DstHasDirectAccess
Definition AssignEvaluator.h:42
DstEvaluator::XprType Dst
Definition AssignEvaluator.h:30
conditional< int(Traversal)==LinearVectorizedTraversal, LinearPacketType, InnerPacketType >::type PacketType
Definition AssignEvaluator.h:114
@ Unrolling
Definition AssignEvaluator.h:130
Dst::Scalar DstScalar
Definition AssignEvaluator.h:31
static EIGEN_DEVICE_FUNC void EIGEN_STRONG_INLINE run(Kernel &)
Definition AssignEvaluator.h:328
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:356
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:366
static EIGEN_DEVICE_FUNC void EIGEN_STRONG_INLINE run(Kernel &kernel)
Definition AssignEvaluator.h:343
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:486
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:496
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:472
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:525
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:514
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:446
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:418
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel)
Definition AssignEvaluator.h:539
Definition AssignEvaluator.h:318
Definition Meta.h:273
Definition CoreEvaluators.h:84
storage_kind_to_shape< typenametraits< T >::StorageKind >::Shape Shape
Definition CoreEvaluators.h:74
find_best_packet_helper< Size, typenamepacket_traits< T >::type >::type type
Definition XprHelper.h:208
Definition XprHelper.h:176
Definition DenseCoeffsBase.h:671
Definition GenericPacketMath.h:107
Definition XprHelper.h:295
Definition ForwardDeclarations.h:17
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &kernel, Index start, Index end)
Definition AssignEvaluator.h:405
Definition AssignEvaluator.h:386
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Kernel &, Index, Index)
Definition AssignEvaluator.h:389
Definition GenericPacketMath.h:133
@ size
Definition GenericPacketMath.h:138
Definition NonLinearOptimization.cpp:118
Definition benchGeometry.cpp:23