Re: [eigen] Eigen2 to Eigen3 Migration Path

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Tully, Radu, Stuart, this seems to be a very important point to discuss:

2011/1/12 Tully Foote <tfoote@xxxxxxxxxxxxxxxx>:
> In our testing we have found the EIGEN2_SUPPORT to be not feature complete
> in the API set we are using from Eigen2.

For sure, EIGEN2_SUPPORT doesn't have 100% of the Eigen2 API, but that
can be helped. Most, if not all, of the Eigen2 API that you're missing
could be added. A list would be very useful, if (see also below) that
could make the EIGEN2_SUPPORT solution practical for you.

>  Also EIGEN2_SUPPORT does not solve
> the linking symbol collisions with libraries with Eigen2 compiled inside.

Indeed, as I said... *unless*, as Gael suggests, you can synchronize
with the people building these libraries to rebuild everything against
Eigen3 + EIGEN2_SUPPORT. If we provided an improved EIGEN2_SUPPORT
that does all what you and these libraries need, would that be
feasible?

Gael: maybe we should just move forward and make a 100% complete
EIGEN2_SUPPORT (I don't remember if there is an unsolvable conflict
between the Eigen2 and Eigen3 API). We could build the Eigen2 test
suite against EIGEN2_SUPPORT to validate it.

Benoit

> Radu or Stu, can you provide more information on the problems you
> encountered using EIGEN2_SUPPORT?
>
> With respect to changing the namespace I know that it's a big change however
> I believe that it can be scoped well and automated into a single script.  To
> that end below is the sed script which we have been using to mangle our
> installation of Eigen3 to use namespace Eigen3.  We've been running it for a
> while and are pretty confident it's working well converting the Eigen base.
> I expect that with a little testing it can also convert users code
> reliably.
>
> Tully
>
> #!/bin/bash
>
> if [ "$1" == "" ]; then
>     echo "Usage: $0 <path>"
>     echo ""
>     echo "Replaces Eigen by Eigen3 recursively in all files in <path>."
>     exit 1
> fi
>
> for f in $(grep -lr 'namespace Eigen\|Eigen::\|Eigen/\|EIGEN' $1 | grep -v
> '.svn'); do
>     echo "Processing $f"
>     sed -i -e 's/namespace Eigen/namespace Eigen3/g' $f
>     sed -i -e 's/Eigen::/Eigen3::/g' $f
>     sed -i -e 's/Eigen\//Eigen3\//g' $f
>     sed -i -e 's/^#ifndef EIGEN_\(.*\)_H/#ifndef EIGEN3_\1_H/g' $f
>     sed -i -e 's/^#define EIGEN_\(.*\)_H/#define EIGEN3_\1_H/g' $f
>
>     sed -i \
>     -e 's/ei_aligned_stack_alloc/ei3_aligned_stack_alloc/g' \
>     -e 's/ei_aligned_stack_delete/ei3_aligned_stack_delete/g' \
>     -e 's/ei_aligned_stack_free/ei3_aligned_stack_free/g' \
>     -e 's/ei_aligned_stack_new/ei3_aligned_stack_new/g' \
>     -e 's/ei_assert/ei3_assert/g' \
>     -e 's/ei_internal_assert/ei3_internal_assert/g' \
>     -e 's/ei_vec2d_swizzle1/ei3_vec2d_swizzle1/g' \
>     -e 's/ei_vec4f_swizzle1/ei3_vec4f_swizzle1/g' \
>     -e 's/ei_vec4f_swizzle2/ei3_vec4f_swizzle2/g' \
>     -e 's/ei_vec4i_swizzle1/ei3_vec4i_swizzle1/g' \
>     -e 's/ei_vec4i_swizzle2/ei3_vec4i_swizzle2/g' \
>     -e 's/_EIGEN_ACCUMULATE_PACKETS/_EIGEN3_ACCUMULATE_PACKETS/g' \
>     -e 's/EIGEN_ALIGN/EIGEN3_ALIGN/g' \
>     -e 's/EIGEN_ALIGN16/EIGEN3_ALIGN16/g' \
>     -e 's/EIGEN_ALIGN_STATICALLY/EIGEN3_ALIGN_STATICALLY/g' \
>     -e 's/EIGEN_ALIGN_TO_BOUNDARY/EIGEN3_ALIGN_TO_BOUNDARY/g' \
>     -e 's/EIGEN_ALWAYS_INLINE_ATTRIB/EIGEN3_ALWAYS_INLINE_ATTRIB/g' \
>     -e
> 's/EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS/EIGEN3_ARCH_DEFAULT_NUMBER_OF_REGISTERS/g'
> \
>     -e
> 's/EIGEN_ARCH_WANTS_STACK_ALIGNMENT/EIGEN3_ARCH_WANTS_STACK_ALIGNMENT/g' \
>     -e
> 's/EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY/EIGEN3_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY/g'
> \
>     -e
> 's/EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY/EIGEN3_ARRAY_DECLARE_GLOBAL_STD_UNARY/g'
> \
>     -e 's/EIGEN_ASM_COMMENT/EIGEN3_ASM_COMMENT/g' \
>     -e
> 's/EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD/EIGEN3_CACHEFRIENDLY_PRODUCT_THRESHOLD/g'
> \
>     -e 's/EIGEN_CAT/EIGEN3_CAT/g' \
>     -e 's/EIGEN_CAT2/EIGEN3_CAT2/g' \
>     -e
> 's/EIGEN_CHECK_BINARY_COMPATIBILIY/EIGEN3_CHECK_BINARY_COMPATIBILIY/g' \
>     -e 's/EIGEN_CWISE_BINOP_RETURN_TYPE/EIGEN3_CWISE_BINOP_RETURN_TYPE/g' \
>     -e
> 's/EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE/EIGEN3_CWISE_COMP_TO_SCALAR_RETURN_TYPE/g'
> \
>     -e
> 's/EIGEN_CWISE_PRODUCT_RETURN_TYPE/EIGEN3_CWISE_PRODUCT_RETURN_TYPE/g' \
>     -e 's/EIGEN_CWISE_UNOP_RETURN_TYPE/EIGEN3_CWISE_UNOP_RETURN_TYPE/g' \
>     -e 's/EIGEN_DBG_SPARSE/EIGEN3_DBG_SPARSE/g' \
>     -e 's/EIGEN_DEBUG_ALIGNED_LOAD/EIGEN3_DEBUG_ALIGNED_LOAD/g' \
>     -e 's/EIGEN_DEBUG_ALIGNED_STORE/EIGEN3_DEBUG_ALIGNED_STORE/g' \
>     -e 's/EIGEN_DEBUG_UNALIGNED_LOAD/EIGEN3_DEBUG_UNALIGNED_LOAD/g' \
>     -e 's/EIGEN_DEBUG_UNALIGNED_STORE/EIGEN3_DEBUG_UNALIGNED_STORE/g' \
>     -e
> 's/_EIGEN_DECLARE_CONST_FAST_Packet4f/_EIGEN3_DECLARE_CONST_FAST_Packet4f/g'
> \
>     -e
> 's/_EIGEN_DECLARE_CONST_FAST_Packet4i/_EIGEN3_DECLARE_CONST_FAST_Packet4i/g'
> \
>     -e 's/_EIGEN_DECLARE_CONST_Packet4f/_EIGEN3_DECLARE_CONST_Packet4f/g' \
>     -e
> 's/_EIGEN_DECLARE_CONST_Packet4f_FROM_INT/_EIGEN3_DECLARE_CONST_Packet4f_FROM_INT/g'
> \
>     -e 's/_EIGEN_DECLARE_CONST_Packet4i/_EIGEN3_DECLARE_CONST_Packet4i/g' \
>     -e
> 's/EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS/EIGEN3_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS/g'
> \
>     -e
> 's/EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION/EIGEN3_DEFAULT_MATRIX_STORAGE_ORDER_OPTION/g'
> \
>     -e
> 's/EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS/EIGEN3_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS/g'
> \
>     -e
> 's/EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION/EIGEN3_DEFINE_STL_DEQUE_SPECIALIZATION/g'
> \
>     -e
> 's/EIGEN_DEFINE_STL_LIST_SPECIALIZATION/EIGEN3_DEFINE_STL_LIST_SPECIALIZATION/g'
> \
>     -e
> 's/EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION/EIGEN3_DEFINE_STL_VECTOR_SPECIALIZATION/g'
> \
>     -e 's/EIGEN_DENSE_PUBLIC_INTERFACE/EIGEN3_DENSE_PUBLIC_INTERFACE/g' \
>     -e 's/EIGEN_DEPRECATED/EIGEN3_DEPRECATED/g' \
>     -e
> 's/EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT/EIGEN3_DISABLE_UNALIGNED_ARRAY_ASSERT/g'
> \
>     -e 's/EIGEN_DOCS_IO_FORMAT/EIGEN3_DOCS_IO_FORMAT/g' \
>     -e 's/EIGEN_DONT_ALIGN_STATICALLY/EIGEN3_DONT_ALIGN_STATICALLY/g' \
>     -e 's/EIGEN_DONT_INLINE/EIGEN3_DONT_INLINE/g' \
>     -e 's/EIGEN_EMPTY/EIGEN3_EMPTY/g' \
>     -e 's/EIGEN_EMPTY_STRUCT_CTOR/EIGEN3_EMPTY_STRUCT_CTOR/g' \
>     -e
> 's/EIGEN_EXPLICIT_STL_DEQUE_INSTANTIATION/EIGEN3_EXPLICIT_STL_DEQUE_INSTANTIATION/g'
> \
>     -e
> 's/EIGEN_EXPLICIT_STL_LIST_INSTANTIATION/EIGEN3_EXPLICIT_STL_LIST_INSTANTIATION/g'
> \
>     -e
> 's/EIGEN_EXPLICIT_STL_VECTOR_INSTANTIATION/EIGEN3_EXPLICIT_STL_VECTOR_INSTANTIATION/g'
> \
>     -e 's/EIGEN_FAST_MATH/EIGEN3_FAST_MATH/g' \
>     -e 's/EIGEN_FLATTEN_ATTRIB/EIGEN3_FLATTEN_ATTRIB/g' \
>     -e
> 's/EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED/EIGEN3_FREEBSD_MALLOC_ALREADY_ALIGNED/g'
> \
>     -e 's/EIGEN_GCC3_OR_OLDER/EIGEN3_GCC3_OR_OLDER/g' \
>     -e
> 's/EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT/EIGEN3_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT/g'
> \
>     -e 's/EIGEN_GENERIC_PUBLIC_INTERFACE/EIGEN3_GENERIC_PUBLIC_INTERFACE/g'
> \
>     -e
> 's/EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED/EIGEN3_GLIBC_MALLOC_ALREADY_ALIGNED/g'
> \
>     -e 's/EIGEN_GNUC_AT_LEAST/EIGEN3_GNUC_AT_LEAST/g' \
>     -e 's/EIGEN_HAS_FUSE_CJMADD/EIGEN3_HAS_FUSE_CJMADD/g' \
>     -e 's/EIGEN_HAS_MM_MALLOC/EIGEN3_HAS_MM_MALLOC/g' \
>     -e 's/EIGEN_HAS_POSIX_MEMALIGN/EIGEN3_HAS_POSIX_MEMALIGN/g' \
>     -e 's/EIGEN_IMPLIES/EIGEN3_IMPLIES/g' \
>     -e
> 's/EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR/EIGEN3_INHERIT_ASSIGNMENT_EQUAL_OPERATOR/g'
> \
>     -e
> 's/EIGEN_INHERIT_ASSIGNMENT_OPERATORS/EIGEN3_INHERIT_ASSIGNMENT_OPERATORS/g'
> \
>     -e 's/EIGEN_INT_DEBUG_MATRIX_CTOR/EIGEN3_INT_DEBUG_MATRIX_CTOR/g' \
>     -e 's/EIGEN_LOGICAL_XOR/EIGEN3_LOGICAL_XOR/g' \
>     -e 's/EIGEN_MAJOR_VERSION/EIGEN3_MAJOR_VERSION/g' \
>     -e
> 's/EIGEN_MAKE_ALIGNED_OPERATOR_NEW/EIGEN3_MAKE_ALIGNED_OPERATOR_NEW/g' \
>     -e
> 's/EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF/EIGEN3_MAKE_ALIGNED_OPERATOR_NEW_IF/g'
> \
>     -e
> 's/EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE/EIGEN3_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE/g'
> \
>     -e
> 's/EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW/EIGEN3_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW/g'
> \
>     -e
> 's/EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS/EIGEN3_MAKE_ARRAY_FIXED_TYPEDEFS/g' \
>     -e 's/EIGEN_MAKE_ARRAY_TYPEDEFS/EIGEN3_MAKE_ARRAY_TYPEDEFS/g' \
>     -e
> 's/EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES/EIGEN3_MAKE_ARRAY_TYPEDEFS_ALL_SIZES/g'
> \
>     -e 's/EIGEN_MAKE_CWISE_BINARY_OP/EIGEN3_MAKE_CWISE_BINARY_OP/g' \
>     -e 's/EIGEN_MAKE_FIXED_TYPEDEFS/EIGEN3_MAKE_FIXED_TYPEDEFS/g' \
>     -e 's/EIGEN_MAKE_IMAGE_HELPERS/EIGEN3_MAKE_IMAGE_HELPERS/g' \
>     -e 's/EIGEN_MAKE_KERNEL_HELPERS/EIGEN3_MAKE_KERNEL_HELPERS/g' \
>     -e
> 's/EIGEN_MAKE_SCALAR_CWISE_UNARY_OP/EIGEN3_MAKE_SCALAR_CWISE_UNARY_OP/g' \
>     -e 's/EIGEN_MAKE_SOLVE_HELPERS/EIGEN3_MAKE_SOLVE_HELPERS/g' \
>     -e 's/EIGEN_MAKESTRING/EIGEN3_MAKESTRING/g' \
>     -e 's/EIGEN_MAKESTRING2/EIGEN3_MAKESTRING2/g' \
>     -e 's/EIGEN_MAKE_TYPEDEFS/EIGEN3_MAKE_TYPEDEFS/g' \
>     -e 's/EIGEN_MAKE_TYPEDEFS_ALL_SIZES/EIGEN3_MAKE_TYPEDEFS_ALL_SIZES/g' \
>     -e
> 's/EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT/EIGEN3_MAKE_UNALIGNED_ARRAY_ASSERT/g' \
>     -e 's/EIGEN_MALLOC_ALREADY_ALIGNED/EIGEN3_MALLOC_ALREADY_ALIGNED/g' \
>     -e 's/EIGEN_MATHFUNC_IMPL/EIGEN3_MATHFUNC_IMPL/g' \
>     -e 's/EIGEN_MATHFUNC_RETVAL/EIGEN3_MATHFUNC_RETVAL/g' \
>     -e 's/EIGEN_MEMBER_FUNCTOR/EIGEN3_MEMBER_FUNCTOR/g' \
>     -e 's/EIGEN_MINOR_VERSION/EIGEN3_MINOR_VERSION/g' \
>     -e 's/EIGEN_NO_DEBUG/EIGEN3_NO_DEBUG/g' \
>     -e 's/EIGEN_ONLY_USED_FOR_DEBUG/EIGEN3_ONLY_USED_FOR_DEBUG/g' \
>     -e
> 's/EIGEN_PREDICATE_SAME_MATRIX_SIZE/EIGEN3_PREDICATE_SAME_MATRIX_SIZE/g' \
>     -e 's/EIGEN_PRODUCT_PUBLIC_INTERFACE/EIGEN3_PRODUCT_PUBLIC_INTERFACE/g'
> \
>     -e 's/EIGEN_REF_TO_TEMPORARY/EIGEN3_REF_TO_TEMPORARY/g' \
>     -e 's/EIGEN_RESTRICT/EIGEN3_RESTRICT/g' \
>     -e 's/EIGEN_SIZE_MAX/EIGEN3_SIZE_MAX/g' \
>     -e 's/EIGEN_SIZE_MIN_PREFER_DYNAMIC/EIGEN3_SIZE_MIN_PREFER_DYNAMIC/g' \
>     -e 's/EIGEN_SIZE_MIN_PREFER_FIXED/EIGEN3_SIZE_MIN_PREFER_FIXED/g' \
>     -e
> 's/EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE/EIGEN3_SPARSE_CWISE_PRODUCT_RETURN_TYPE/g'
> \
>     -e
> 's/EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR/EIGEN3_SPARSE_INHERIT_ASSIGNMENT_OPERATOR/g'
> \
>     -e
> 's/EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS/EIGEN3_SPARSE_INHERIT_ASSIGNMENT_OPERATORS/g'
> \
>     -e
> 's/EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR/EIGEN3_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR/g'
> \
>     -e 's/_EIGEN_SPARSE_PUBLIC_INTERFACE/_EIGEN3_SPARSE_PUBLIC_INTERFACE/g'
> \
>     -e 's/EIGEN_SPARSE_PUBLIC_INTERFACE/EIGEN3_SPARSE_PUBLIC_INTERFACE/g' \
>     -e 's/EIGEN_STACK_ALLOCATION_LIMIT/EIGEN3_STACK_ALLOCATION_LIMIT/g' \
>     -e 's/EIGEN_STATIC_ASSERT/EIGEN3_STATIC_ASSERT/g' \
>     -e
> 's/EIGEN_STATIC_ASSERT_DYNAMIC_SIZE/EIGEN3_STATIC_ASSERT_DYNAMIC_SIZE/g' \
>     -e 's/EIGEN_STATIC_ASSERT_FIXED_SIZE/EIGEN3_STATIC_ASSERT_FIXED_SIZE/g'
> \
>     -e
> 's/EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE/EIGEN3_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE/g'
> \
>     -e
> 's/EIGEN_STATIC_ASSERT_NON_INTEGER/EIGEN3_STATIC_ASSERT_NON_INTEGER/g' \
>     -e
> 's/EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE/EIGEN3_STATIC_ASSERT_SAME_MATRIX_SIZE/g'
> \
>     -e
> 's/EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE/EIGEN3_STATIC_ASSERT_SAME_VECTOR_SIZE/g'
> \
>     -e
> 's/EIGEN_STATIC_ASSERT_VECTOR_ONLY/EIGEN3_STATIC_ASSERT_VECTOR_ONLY/g' \
>     -e
> 's/EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE/EIGEN3_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE/g'
> \
>     -e
> 's/EIGEN_STD_DEQUE_SPECIALIZATION_BODY/EIGEN3_STD_DEQUE_SPECIALIZATION_BODY/g'
> \
>     -e
> 's/EIGEN_STD_LIST_SPECIALIZATION_BODY/EIGEN3_STD_LIST_SPECIALIZATION_BODY/g'
> \
>     -e
> 's/EIGEN_STD_VECTOR_SPECIALIZATION_BODY/EIGEN3_STD_VECTOR_SPECIALIZATION_BODY/g'
> \
>     -e 's/EIGEN_STRONG_INLINE/EIGEN3_STRONG_INLINE/g' \
>     -e 's/EIGEN_TUNE_FOR_CPU_CACHE_SIZE/EIGEN3_TUNE_FOR_CPU_CACHE_SIZE/g' \
>     -e
> 's/EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH/EIGEN3_TUNE_TRIANGULAR_PANEL_WIDTH/g' \
>     -e 's/EIGEN_UNROLLING_LIMIT/EIGEN3_UNROLLING_LIMIT/g' \
>     -e 's/EIGEN_UNUSED/EIGEN3_UNUSED/g' \
>     -e 's/EIGEN_UNUSED_VARIABLE/EIGEN3_UNUSED_VARIABLE/g' \
>     -e 's/EIGEN_USING_ARRAY_TYPEDEFS/EIGEN3_USING_ARRAY_TYPEDEFS/g' \
>     -e
> 's/EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE/EIGEN3_USING_ARRAY_TYPEDEFS_FOR_TYPE/g'
> \
>     -e
> 's/EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE/EIGEN3_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE/g'
> \
>     -e 's/EIGEN_USING_MATRIX_TYPEDEFS/EIGEN3_USING_MATRIX_TYPEDEFS/g' \
>     -e
> 's/EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE/EIGEN3_USING_MATRIX_TYPEDEFS_FOR_TYPE/g'
> \
>     -e
> 's/EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE/EIGEN3_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE/g'
> \
>     -e 's/EIGEN_VERSION_AT_LEAST/EIGEN3_VERSION_AT_LEAST/g' \
>     -e
> 's/EIGEN_WORKAROUND_MSVC_STL_SUPPORT/EIGEN3_WORKAROUND_MSVC_STL_SUPPORT/g' \
>     -e 's/EIGEN_WORLD_VERSION/EIGEN3_WORLD_VERSION/g' \
>     -e 's/MADD/EIGEN3_MADD/g' \
>     $f
> done
>
>>
>> Benoit
>>
>>
>> >
>> > Benoit
>> >
>> >> Indeed, every .cpp files that makes
>> >> Eigen calls, #includes the corresponding Eigen sources itself, so it
>> >> will never have to link to another object file to find a function
>> >> definition. This means that the only bad effect of this namespace
>> >> renaming is at worst to have redundant code (the same function
>> >> compiled with Eigen and with Eigen3) which is not a big deal since
>> >> it's temporary. You won't get linking failures, and you won't
>> >> accidentally link to the wrong function definition.
>> >>
>> >>  * about the include guards and macros, first of all check if it is
>> >> really the case that a single .cpp file really needs to include both
>> >> eigen2 and eigen3, as opposed to separate .cpp files, some linking to
>> >> eigen2 and some to eigen3 ?
>> >>
>> >> Benoit
>> >>
>> >> 2011/1/12 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
>> >>> 2011/1/12 Gael Guennebaud <gael.guennebaud@xxxxxxxxx>:
>> >>>> On Wed, Jan 12, 2011 at 1:57 PM, Benoit Jacob
>> >>>> <jacob.benoit.1@xxxxxxxxx> wrote:
>> >>>>> The trivial solution would have been to replace Eigen by Eigen3 and
>> >>>>> EIGEN_ by EIGEN3_ everywhere in the Eigen3 sources, but that is
>> >>>>> quite
>> >>>>> invasive at this stage.
>> >>>>>
>> >>>>> However, given that that solves the problem once and for all, also
>> >>>>> for
>> >>>>> any future version, it's quite tempting.
>> >>>>>
>> >>>>> Would you agree with such a change?
>> >>>>
>> >>>> but think about the hundreds of projects which are already using
>> >>>> Eigen3... I'm afraid this is much too late for such a change. Let's
>> >>>> first see whether EIGEN2_SUPPORT could not solve the issue.
>> >>>
>> >>> My assumption here was that Eigen2 still has many more users than
>> >>> Eigen3 has, but indeed experimental data proves me wrong:
>> >>>   http://stats.tuxfamily.org/eigen.tuxfamily.org/
>> >>> I copied the list of visited pages on our website with number of
>> >>> visits in January 2011, and did:
>> >>>
>> >>> bjacob@cahouette:~$ grep /dox/ stats | cut -f 2 -d ' ' | awk '{ SUM +=
>> >>> $1} END { print SUM }'
>> >>> 663
>> >>> bjacob@cahouette:~$ grep /dox\-devel/ stats | cut -f 2 -d ' ' | awk '{
>> >>> SUM += $1} END { print SUM }'
>> >>> 617
>> >>>
>> >>> So we seem to have almost as many users on Eigen3 as we have on
>> >>> Eigen2.
>> >>>
>> >>> Solving the present problem with EIGEN2_SUPPORT would be great indeed.
>> >>> Let's wait to hear back from Tully about that. We can probably extend
>> >>> EIGEN2_SUPPORT to do many more things you may need.
>> >>>
>> >>> Benoit
>> >>>
>> >>>
>> >>>>
>> >>>> gael
>> >>>>
>> >>>>
>> >>>>
>> >>>
>> >>
>> >
>>
>>
>
>
>



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/