Issues with boost.units when trying to calculate the absolute value of a vector

Issue #357 resolved
David Wright created an issue

Hello,

I am trying to implement the MeanShift algorithm with blaze and boost.units. Everything has been working fine so far for basic matrix/vector operations, but I have just stumbled across a problem with calculating the norm of a boost.units based vector.

I the issue is with the following lines (simplified for debugging purposes):

    blaze::StaticVector<boost::units::quantity<boost::units::si::length, double>, 2, blaze::columnVector> vec(
        {1.0 * boost::units::si::metre, 1.0 * boost::units::si::metre});
    const auto abs = blaze::norm(vec);

The Error output is as follows:

[  8%] Building CXX object CMakeFiles/LaserCalibration.dir/maths/Maths.cpp.o
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.hpp:6:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/CalibrationParameters.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Include.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Dimensionless.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:44:
In file included from /usr/local/include/blaze/math/DenseMatrix.h:85:
In file included from /usr/local/include/blaze/math/expressions/DMatMapExpr.h:54:
In file included from /usr/local/include/blaze/math/Functors.h:145:
/usr/local/include/blaze/math/functors/Sqrt.h:94:14: error: no matching function for call to 'sqrt'
      return sqrt( a );
             ^~~~
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:158:35: note: in instantiation of function template specialization 'blaze::Sqrt::operator()<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >' requested here
   using RT = decltype( evaluate( root( std::declval<ET>() ) ) );
                                  ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:282:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, abs, power, root, Bool_t< DVecNormHelper<VT,Abs,Power>::value >() );
          ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:309:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, SqrAbs(), Noop(), Sqrt() );
          ^
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:90:26: note: in instantiation of function template specialization 'blaze::norm<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false>' requested here
        const auto abs = blaze::norm(vec);
                                ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/math.h:433:15: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>' to 'double' for 1st argument
extern double sqrt(double);
              ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/math.h:1030:46: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>' to 'float' for 1st argument
inline _LIBCPP_INLINE_VISIBILITY float       sqrt(float __lcpp_x) _NOEXCEPT       {return ::sqrtf(__lcpp_x);}
                                             ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/math.h:1031:46: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>' to 'long double' for 1st argument
inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __lcpp_x) _NOEXCEPT {return ::sqrtl(__lcpp_x);}
                                             ^
/usr/local/include/blaze/math/simd/Sqrt.h:66:37: note: candidate template ignored: could not match 'SIMDf32' against 'quantity'
BLAZE_ALWAYS_INLINE const SIMDfloat sqrt( const SIMDf32<T>& a ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Sqrt.h:103:38: note: candidate template ignored: could not match 'SIMDf64' against 'quantity'
BLAZE_ALWAYS_INLINE const SIMDdouble sqrt( const SIMDf64<T>& a ) noexcept
                                     ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/math.h:1037:1: note: candidate template ignored: requirement 'std::is_integral<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >::value' was not satisfied [with _A1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>]
sqrt(_A1 __lcpp_x) _NOEXCEPT {return ::sqrt((double)__lcpp_x);}
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/complex:1043:1: note: candidate template ignored: could not match 'complex' against 'quantity'
sqrt(const complex<_Tp>& __x)
^
/usr/local/include/blaze/math/proxy/Proxy.h:1308:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) sqrt( const Proxy<PT,RT>& proxy )
                      ^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.hpp:6:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/CalibrationParameters.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Include.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Dimensionless.hpp:8:
In file included from /usr/local/include/boost/units/quantity.hpp:29:
In file included from /usr/local/include/boost/units/conversion.hpp:17:
/usr/local/include/boost/units/detail/conversion_impl.hpp:340:78: error: no matching function for call to 'conversion_factor'
        return(destination_type::from_value(static_cast<T2>(source.value() * conversion_factor(Unit1(), Unit2()))));
                                                                             ^~~~~~~~~~~~~~~~~
/usr/local/include/boost/units/quantity.hpp:193:70: note: in instantiation of member function 'boost::units::conversion_helper<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >::convert' requested here
             : val_(conversion_helper<quantity<Unit2,YY>,this_type>::convert(source).value())
                                                                     ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:166:7: note: in instantiation of function template specialization 'boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>' requested here
   ET norm( power( abs( tmp[0UL] ) ) );
      ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:282:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, abs, power, root, Bool_t< DVecNormHelper<VT,Abs,Power>::value >() );
          ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:309:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, SqrAbs(), Noop(), Sqrt() );
          ^
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:90:26: note: in instantiation of function template specialization 'blaze::norm<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false>' requested here
        const auto abs = blaze::norm(vec);
                                ^
/usr/local/include/boost/units/conversion.hpp:177:1: note: candidate template ignored: substitution failure [with FromUnit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, ToUnit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>]: implicit instantiation of undefined template 'boost::units::detail::conversion_factor_helper<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void> >'
conversion_factor(const FromUnit&,const ToUnit&)
^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.hpp:6:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/CalibrationParameters.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Include.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Dimensionless.hpp:8:
In file included from /usr/local/include/boost/units/quantity.hpp:29:
In file included from /usr/local/include/boost/units/conversion.hpp:17:
In file included from /usr/local/include/boost/units/detail/conversion_impl.hpp:20:
In file included from /usr/local/include/boost/units/heterogeneous_system.hpp:34:
In file included from /usr/local/include/boost/units/static_rational.hpp:25:
/usr/local/include/boost/units/operators.hpp:63:64: error: invalid operands to binary expression ('boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>' and 'boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>')
    BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, (typeof_::make<X>()+typeof_::make<Y>()))
                                             ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/usr/local/include/boost/typeof/decltype.hpp:22:34: note: expanded from macro 'BOOST_TYPEOF_NESTED_TYPEDEF_TPL'
        typedef BOOST_TYPEOF_TPL(expr) type;\
                                 ^~~~
/usr/local/include/boost/typeof/decltype.hpp:17:69: note: expanded from macro 'BOOST_TYPEOF'
#define BOOST_TYPEOF(expr) boost::type_of::remove_cv_ref_t<decltype(expr)>
                                                                    ^~~~
/usr/local/include/boost/units/operators.hpp:64:22: note: in instantiation of member class 'boost::units::add_typeof_helper<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void> >::nested' requested here
    typedef typename nested::type type;
                     ^
/usr/local/include/boost/units/quantity.hpp:248:58: note: in instantiation of template class 'boost::units::add_typeof_helper<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void> >' requested here
            BOOST_STATIC_ASSERT((boost::is_same<typename add_typeof_helper<Unit, Unit2>::type, Unit>::value));
                                                         ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:170:12: note: in instantiation of function template specialization 'boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>::operator+=<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>' requested here
      norm += power( abs( tmp[i    ] ) ) + power( abs( tmp[i+1UL] ) ) +
           ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:282:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, abs, power, root, Bool_t< DVecNormHelper<VT,Abs,Power>::value >() );
          ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:309:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, SqrAbs(), Noop(), Sqrt() );
          ^
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:90:26: note: in instantiation of function template specialization 'blaze::norm<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false>' requested here
        const auto abs = blaze::norm(vec);
                                ^
/usr/local/include/boost/units/quantity.hpp:1140:1: note: candidate template ignored: could not match 'quantity' against 'unit'
operator+(const quantity<Unit1,X>& lhs,
^
/usr/local/include/boost/units/unit.hpp:356:1: note: candidate template ignored: substitution failure [with Dim1 = boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, Dim2 = boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, System1 = boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, System2 = boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >]: no type named 'type' in 'boost::units::add_typeof_helper<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void> >'
operator+(const unit<Dim1,System1>&,const unit<Dim2,System2>&)
^
/usr/local/include/boost/units/quantity.hpp:1114:1: note: candidate function template not viable: requires single argument 'val', but 2 arguments were provided
operator+(const quantity<Unit,Y>& val)
^
/usr/local/include/boost/units/unit.hpp:330:1: note: candidate function template not viable: requires 1 argument, but 2 were provided
operator+(const unit<Dim,System>&)
^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.hpp:6:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/CalibrationParameters.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Include.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Dimensionless.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:45:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:60:
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:174:12: error: no viable overloaded '+='
      norm += power( abs( tmp[i] ) ) + power( abs( tmp[i+1UL] ) );
      ~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:282:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, abs, power, root, Bool_t< DVecNormHelper<VT,Abs,Power>::value >() );
          ^
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:309:11: note: in instantiation of function template specialization 'blaze::norm_backend<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false, blaze::SqrAbs, blaze::Noop, blaze::Sqrt>' requested here
   return norm_backend( ~dv, SqrAbs(), Noop(), Sqrt() );
          ^
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:90:26: note: in instantiation of function template specialization 'blaze::norm<blaze::StaticVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>, 2, false, blaze::aligned, blaze::padded, blaze::GroupTag<0> >, false>' requested here
        const auto abs = blaze::norm(vec);
                                ^
/usr/local/include/blaze/math/simd/BasicTypes.h:1356:25: note: candidate template ignored: could not match 'SIMDPack' against 'quantity'
BLAZE_ALWAYS_INLINE T1& operator+=( SIMDPack<T1>& lhs, const SIMDPack<T2>& rhs )
                        ^
/usr/local/include/blaze/math/proxy/Proxy.h:310:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) operator+=( T& lhs, const Proxy<PT,RT>& rhs )
                      ^
/usr/local/include/blaze/math/dense/DenseMatrix.h:386:13: note: candidate template ignored: could not match 'DenseMatrix' against 'quantity'
inline auto operator+=( DenseMatrix<MT,SO>& mat, ST scalar )
            ^
/usr/local/include/blaze/math/dense/DenseMatrix.h:424:13: note: candidate template ignored: could not match 'DenseMatrix' against 'quantity'
inline auto operator+=( DenseMatrix<MT,SO>&& mat, ST scalar )
            ^
/usr/local/include/blaze/math/dense/DenseVector.h:314:13: note: candidate template ignored: could not match 'DenseVector' against 'quantity'
inline auto operator+=( DenseVector<VT,TF>& vec, ST scalar )
            ^
/usr/local/include/blaze/math/dense/DenseVector.h:350:13: note: candidate template ignored: could not match 'DenseVector' against 'quantity'
inline auto operator+=( DenseVector<VT,TF>&& vec, ST scalar )
            ^
/usr/local/include/boost/units/quantity.hpp:246:42: note: candidate template ignored: substitution failure [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, YY = double]
        BOOST_CXX14_CONSTEXPR this_type& operator+=(const quantity<Unit2, YY>& source)
                                         ^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.hpp:6:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/CalibrationParameters.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Include.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Dimensionless.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:45:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:60:
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:177:12: error: no viable overloaded '+='
      norm += power( abs( tmp[i] ) );
      ~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/blaze/math/simd/BasicTypes.h:1356:25: note: candidate template ignored: could not match 'SIMDPack' against 'quantity'
BLAZE_ALWAYS_INLINE T1& operator+=( SIMDPack<T1>& lhs, const SIMDPack<T2>& rhs )
                        ^
/usr/local/include/blaze/math/proxy/Proxy.h:310:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) operator+=( T& lhs, const Proxy<PT,RT>& rhs )
                      ^
/usr/local/include/blaze/math/dense/DenseMatrix.h:386:13: note: candidate template ignored: could not match 'DenseMatrix' against 'quantity'
inline auto operator+=( DenseMatrix<MT,SO>& mat, ST scalar )
            ^
/usr/local/include/blaze/math/dense/DenseMatrix.h:424:13: note: candidate template ignored: could not match 'DenseMatrix' against 'quantity'
inline auto operator+=( DenseMatrix<MT,SO>&& mat, ST scalar )
            ^
/usr/local/include/blaze/math/dense/DenseVector.h:314:13: note: candidate template ignored: could not match 'DenseVector' against 'quantity'
inline auto operator+=( DenseVector<VT,TF>& vec, ST scalar )
            ^
/usr/local/include/blaze/math/dense/DenseVector.h:350:13: note: candidate template ignored: could not match 'DenseVector' against 'quantity'
inline auto operator+=( DenseVector<VT,TF>&& vec, ST scalar )
            ^
/usr/local/include/boost/units/quantity.hpp:246:42: note: candidate template ignored: substitution failure [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, YY = double]
        BOOST_CXX14_CONSTEXPR this_type& operator+=(const quantity<Unit2, YY>& source)
                                         ^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.hpp:6:
In file included from /Users/dwright/projects/dv-laser-calibration/maths/CalibrationParameters.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Include.hpp:4:
In file included from /Users/dwright/projects/dv-laser-calibration/blaze-units/Dimensionless.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:45:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:60:
/usr/local/include/blaze/math/expressions/DVecNormExpr.h:180:21: error: no matching function for call to object of type 'blaze::Sqrt'
   return evaluate( root( norm ) );
                    ^~~~
/usr/local/include/blaze/math/functors/Sqrt.h:92:61: note: candidate template ignored: substitution failure [with T = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double>]
   BLAZE_ALWAYS_INLINE BLAZE_DEVICE_CALLABLE decltype(auto) operator()( const T& a ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:3:
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:81:91: warning: unused parameter 'visited' [-Wunused-parameter]
uint64_t MeanShift<DataType>::performShift(ColumnVectorX &currentMode, std::vector<bool> &visited) {
                                                                                          ^
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:40:10: warning: returning reference to local temporary object [-Wreturn-stack-address]
                return blaze::column(dataPoints, sampleIndex);
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:67:17: note: in instantiation of member function 'MeanShift<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >::getSample' requested here
                currentMode = getSample(i);
                              ^
/Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:17:55: note: in instantiation of member function 'MeanShift<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >::fit' requested here
        std::tie(clusterCentres, clusterIndices) = meanShift.fit();
                                                             ^
In file included from /Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:3:
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:85:11: warning: unused variable 'shift' [-Wunused-variable]
        DataType shift;
                 ^
/Users/dwright/projects/dv-laser-calibration/maths/MeanShift.hpp:69:3: note: in instantiation of member function 'MeanShift<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >::performShift' requested here
                performShift(currentMode, visited);
                ^
/Users/dwright/projects/dv-laser-calibration/maths/Maths.cpp:17:55: note: in instantiation of member function 'MeanShift<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, static_rational<3> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >::fit' requested here
        std::tie(clusterCentres, clusterIndices) = meanShift.fit();
                                                             ^
3 warnings and 6 errors generated.
make[2]: *** [CMakeFiles/LaserCalibration.dir/maths/Maths.cpp.o] Error 1
make[1]: *** [CMakeFiles/LaserCalibration.dir/all] Error 2
make: *** [all] Error 2
11:51:21: The process "/usr/local/Cellar/cmake/3.17.2/bin/cmake" exited with code 2.
Error while building/deploying project LaserCalibration (kit: Imported Kit)
When executing step "CMake Build"
11:51:21: Elapsed time: 00:05.

Comments (7)

  1. Klaus Iglberger

    Hi David!

    Thanks a lot for creating this defect report. You are correct, the norm calculation does not yet work flawlessly with Blaze. We apologize for the inconvenience and promise to resolve this issue as quickly as possible. For now, please use the following expression to compute the norm:

    const auto norm = root<2>( trans(vec)*vec );
    

    Again, thanks for creating this defect report,

    Best regards,

    Klaus!

  2. Klaus Iglberger

    Hi David!

    Commit 06fed49 fixes the internal return type evaluation of the dense vector norm() computation. Unfortunately this is not enough: boost.units does not provide a sqrt() function for the computation of the square root, but instead provides a root() function. Since Blaze assumes a sqrt() function for all types, it is necessary to overload sqrt() for the boost::units::quantity class template:

    namespace boost {
    namespace units {
    
    template< typename T >
    decltype(auto) sqrt( const quantity<T>& q )
    {
       return root<2>( q );
    }
    
    } // namespace units
    } // namespace boost
    

    With this the norm() computation works flawlessly. Again, thanks for creating this defect report,

    Best regards,

    Klaus!

  3. Klaus Iglberger

    Commit 06fed49 fixes the return type evaluation of the dense vector norm expressions. The fix is immediately available via cloning the Blaze repository and will be officially released in Blaze 3.8.

  4. David Wright reporter

    Hi Klaus,

    thank you for your prompt response and resolution! I just pulled the latest master and will see if everything works. Also I found that boost.units provides a function sqrt in boost/units/cmath.hpp.

    Best,

    David

  5. Klaus Iglberger

    Thanks for the information that boost.units provides a sqrt() function. I didn't explicitly search for it since the documentation said that it instead provides a root() function. That information will prove to be useful. Thanks again!

  6. Log in to comment