Re: [eigen] Eigen2 to Eigen3 Migration Path

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




On Wed, Jan 12, 2011 at 6:48 AM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
2011/1/12 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
> 2011/1/12 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
>> OK, thought about this some more.
>>
>> If EIGEN2_SUPPORT doesn't work for you, then here's what you can do:
>>
>>  * about the namespace & mangling: go ahead with your Eigen -> Eigen3
>> renaming, this is a non-issue.
>
> Ah wait ... :) the linking is indeed a non-issue, but at compilation
> time, if the same file includes another library's headers that uses
> Eigen3 with the Eigen namespace non-renamed, this will fail.

ok last spam... sorry about the noise, there is a linking issue if a
binary library uses Eigen types in its API.

But this is actually also an argument against the EIGEN2_SUPPORT way.

Indeed, Eigen's type don't mangle in the same way between Eigen2 and
Eigen3, due to different default values of template parameters.

For example, in Eigen2, Matrix3f is Matrix<float,3,3,2,3,3>
But in Eigen3, Matrix3f is Matrix<float,3,3,0,3,3>

So the EIGEN2_SUPPORT solution won't solve linking issues.

At this point I still think that we should go on with the invasive
Eigen->Eigen3, EIGEN_->EIGEN3_ change. We can announce this change
very loudly. For users, adapting to it just some search&replace:
  namespace Eigen   ->  namespace Eigen3
  Eigen::   ->   Eigen3::
  EIGEN_   ->    EIGEN3_

 
I strongly support the proposal.  That is the cleanest way to progress forward.  It does impose a burden on the beta users.  However I believe that is better than imposing the corresponding burden on the users of the released version. 

In our testing we have found the EIGEN2_SUPPORT to be not feature complete in the API set we are using from Eigen2.  Also EIGEN2_SUPPORT does not solve the linking symbol collisions with libraries with Eigen2 compiled inside. 

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/