Missing arithmetic functions for boost.units

Issue #363 resolved
David Wright created an issue

Hello Klaus,

I have found that and arithmetic functions such as min() max(), etc. don’t work with boost.units:

For example, this piece of code works:

    const blaze::DynamicVector<double> x(100);


    double max    = blaze::max(x);
    double min    = blaze::min(x);
    double mean   = blaze::mean(x);
    double stdDev = blaze::sqrt(blaze::mean(blaze::pow2(x - mean)));

Whereas the same with boost.units does not:

    using unit = boost::units::quantity<boost::units::si::plane_angle>;

    const blaze::DynamicVector<unit> x(100, 1.0 * boost::units::si::radian);

    unit max    = blaze::max(x);
    unit min    = blaze::min(x);
    unit mean   = blaze::mean(x);
    unit stdDev = blaze::sqrt(blaze::mean(blaze::pow2(x - mean)));

Resulting in the following compile output:

16:30:03: Running steps for project LaserCalibration...
16:30:03: Starting: "/usr/local/Cellar/cmake/3.17.3/bin/cmake" --build . --target all
Scanning dependencies of target LaserCalibration
[ 10%] Building CXX object CMakeFiles/LaserCalibration.dir/LaserCalibration.cpp.o
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:44:
In file included from /usr/local/include/blaze/math/dense/DynamicMatrix.h:78:
/usr/local/include/blaze/math/traits/SubTrait.h:163:1: error: no type named 'Type' in 'blaze::SubTrait<double, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, void>'
using SubTrait_t = typename SubTrait<T1,T2>::Type;
^~~~~
/usr/local/include/blaze/math/expressions/DVecMapExpr.h:2767:23: note: in instantiation of template type alias 'SubTrait_t' requested here
   using ScalarType = SubTrait_t< UnderlyingBuiltin_t<VT>, ST >;
                      ^
/Users/dwright/projects/dv-laser-calibration/calibration-manager/ErrorStatistics.hpp:57:54: note: in instantiation of function template specialization 'blaze::operator-<blaze::DynamicVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, false, blaze::GroupTag<0> >, false, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, nullptr>' requested here
        unit stdDev = blaze::sqrt(blaze::mean(blaze::pow2(x - mean)));
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:57:
/usr/local/include/blaze/math/expressions/DVecMapExpr.h:2768:45: error: cannot convert 'boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'ScalarType' (aka 'int') without a conversion operator
   return map( ~vec, blaze::bind2nd( Sub{}, ScalarType( scalar ) ) );
                                            ^~~~~~~~~~~~~~~~~~
/Users/dwright/projects/dv-laser-calibration/calibration-manager/ErrorStatistics.hpp:57:54: note: in instantiation of function template specialization 'blaze::operator-<blaze::DynamicVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, false, blaze::GroupTag<0> >, false, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, nullptr>' requested here
        unit stdDev = blaze::sqrt(blaze::mean(blaze::pow2(x - mean)));
                                                            ^
/Users/dwright/projects/dv-laser-calibration/calibration-manager/ErrorStatistics.hpp:41:82: warning: unused parameter 'actual' [-Wunused-parameter]
ErrorStatistics<DataType>::ErrorStatistics(const blaze::DynamicVector<DataType> &actual, const DataType &expected) {
                                                                                 ^
/Users/dwright/projects/dv-laser-calibration/calibration-manager/ErrorStatistics.hpp:41:106: warning: unused parameter 'expected' [-Wunused-parameter]
ErrorStatistics<DataType>::ErrorStatistics(const blaze::DynamicVector<DataType> &actual, const DataType &expected) {
                                                                                                         ^
/Users/dwright/projects/dv-laser-calibration/calibration-manager/ErrorStatistics.hpp:83:96: warning: unused parameter 'other' [-Wunused-parameter]
template<class DataType> void ErrorStatistics<DataType>::swap(const ErrorStatistics<DataType> &other) {
                                                                                               ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
/Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:59:51: warning: parameter 'config' shadows member inherited from type 'ModuleBase' [-Wshadow-field]
        static void initConfigOptions(dv::RuntimeConfig &config) {
                                                         ^
/usr/local/include/dv-sdk/module_base.hpp:92:16: note: declared here
        RuntimeConfig config;
                      ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:3:
/Users/dwright/projects/dv-laser-calibration/exceptions/CameraCalibrationException.hpp:8:8: warning: 'CameraCalibrationException' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
struct CameraCalibrationException : virtual LaserCalibrationException {
       ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:9:
/Users/dwright/projects/dv-laser-calibration/exceptions/LaserCalibrationException.hpp:6:8: warning: 'LaserCalibrationException' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
struct LaserCalibrationException : virtual std::exception, virtual boost::exception {};
       ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:45:
In file included from /usr/local/include/blaze/math/DenseMatrix.h:73:
In file included from /usr/local/include/blaze/math/expressions/DMatDMatMapExpr.h:62:
/usr/local/include/blaze/math/functors/Max.h:92:14: error: no matching function for call to 'max'
      return max( a, b );
             ^~~
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:142:20: note: in instantiation of function template specialization 'blaze::Max::operator()<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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
      redux1 = op( op( redux1, tmp[i    ] ), tmp[i+1UL] );
                   ^
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:390:11: note: in instantiation of function template specialization 'blaze::dvecreduce<blaze::DynamicVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, false, blaze::GroupTag<0> >, false, blaze::Max>' requested here
   return dvecreduce( ~dv, std::move(op) );
          ^
/usr/local/include/blaze/math/simd/Max.h:66:36: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDint8' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDint8 max( const SIMDint8& a, const SIMDint8& b ) noexcept
                                   ^
/usr/local/include/blaze/math/simd/Max.h:95:37: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDuint8' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDuint8 max( const SIMDuint8& a, const SIMDuint8& b ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Max.h:132:37: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDint16' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDint16 max( const SIMDint16& a, const SIMDint16& b ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Max.h:161:38: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDuint16' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDuint16 max( const SIMDuint16& a, const SIMDuint16& b ) noexcept
                                     ^
/usr/local/include/blaze/math/simd/Max.h:198:37: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDint32' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDint32 max( const SIMDint32& a, const SIMDint32& b ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Max.h:227:38: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDuint32' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDuint32 max( const SIMDuint32& a, const SIMDuint32& b ) noexcept
                                     ^
/usr/local/include/blaze/math/simd/Max.h:267:4: note: candidate template ignored: could not match 'SIMDf32' against 'quantity'
   max( const SIMDf32<T1>& a, const SIMDf32<T2>& b ) noexcept
   ^
/usr/local/include/blaze/math/simd/Max.h:307:4: note: candidate template ignored: could not match 'SIMDf64' against 'quantity'
   max( const SIMDf64<T1>& a, const SIMDf64<T2>& b ) noexcept
   ^
/usr/local/include/blaze/util/algorithms/Max.h:72:4: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>]: no type named 'Type' in 'blaze::EnableIf<false, void>'
   max( const T1& a, const T2& b ) noexcept
   ^
/usr/local/include/blaze/math/proxy/Proxy.h:2124:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) max( const Proxy<PT1,RT1>& lhs, const Proxy<PT2,RT2>& rhs )
                      ^
/usr/local/include/blaze/math/proxy/Proxy.h:2142:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) max( const Proxy<PT,RT>& lhs, const T& rhs )
                      ^
/usr/local/include/blaze/math/proxy/Proxy.h:2160:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) max( const T& lhs, const Proxy<PT,RT>& rhs )
                      ^
/usr/local/include/blaze/util/algorithms/Max.h:93:4: note: candidate function template not viable: requires 3 arguments, but 2 were provided
   max( const T1& a, const T2& b, const T3& c ) noexcept
   ^
/usr/local/include/blaze/util/algorithms/Max.h:117:4: note: candidate function template not viable: requires at least 3 arguments, but 2 were provided
   max( const T1& a, const T2& b, const T3& c, const Ts&... args ) noexcept
   ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:143:20: error: no matching function for call to object of type 'blaze::Max'
      redux2 = op( op( redux2, tmp[i+2UL] ), tmp[i+3UL] );
                   ^~
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:390:11: note: in instantiation of function template specialization 'blaze::dvecreduce<blaze::DynamicVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, false, blaze::GroupTag<0> >, false, blaze::Max>' requested here
   return dvecreduce( ~dv, std::move(op) );
          ^
/usr/local/include/blaze/math/functors/Max.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:146:16: error: no matching function for call to object of type 'blaze::Max'
      redux1 = op( redux1, tmp[i    ] );
               ^~
/usr/local/include/blaze/math/functors/Max.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:147:16: error: no matching function for call to object of type 'blaze::Max'
      redux2 = op( redux2, tmp[i+1UL] );
               ^~
/usr/local/include/blaze/math/functors/Max.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:150:16: error: no matching function for call to object of type 'blaze::Max'
      redux1 = op( redux1, tmp[i] );
               ^~
/usr/local/include/blaze/math/functors/Max.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:153:11: error: no matching function for call to object of type 'blaze::Max'
   return op( redux1, redux2 );
          ^~
/usr/local/include/blaze/math/functors/Max.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:45:
In file included from /usr/local/include/blaze/math/DenseMatrix.h:73:
In file included from /usr/local/include/blaze/math/expressions/DMatDMatMapExpr.h:63:
/usr/local/include/blaze/math/functors/Min.h:92:14: error: no matching function for call to 'min'
      return min( a, b );
             ^~~
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:142:20: note: in instantiation of function template specialization 'blaze::Min::operator()<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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
      redux1 = op( op( redux1, tmp[i    ] ), tmp[i+1UL] );
                   ^
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:390:11: note: in instantiation of function template specialization 'blaze::dvecreduce<blaze::DynamicVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, false, blaze::GroupTag<0> >, false, blaze::Min>' requested here
   return dvecreduce( ~dv, std::move(op) );
          ^
/usr/local/include/blaze/math/simd/Min.h:66:36: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDint8' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDint8 min( const SIMDint8& a, const SIMDint8& b ) noexcept
                                   ^
/usr/local/include/blaze/math/simd/Min.h:95:37: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDuint8' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDuint8 min( const SIMDuint8& a, const SIMDuint8& b ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Min.h:132:37: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDint16' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDint16 min( const SIMDint16& a, const SIMDint16& b ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Min.h:161:38: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDuint16' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDuint16 min( const SIMDuint16& a, const SIMDuint16& b ) noexcept
                                     ^
/usr/local/include/blaze/math/simd/Min.h:198:37: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDint32' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDint32 min( const SIMDint32& a, const SIMDint32& b ) noexcept
                                    ^
/usr/local/include/blaze/math/simd/Min.h:227:38: note: candidate function not viable: no known conversion from 'const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 'const blaze::SIMDuint32' for 1st argument
BLAZE_ALWAYS_INLINE const SIMDuint32 min( const SIMDuint32& a, const SIMDuint32& b ) noexcept
                                     ^
/usr/local/include/blaze/math/simd/Min.h:267:4: note: candidate template ignored: could not match 'SIMDf32' against 'quantity'
   min( const SIMDf32<T1>& a, const SIMDf32<T2>& b ) noexcept
   ^
/usr/local/include/blaze/math/simd/Min.h:307:4: note: candidate template ignored: could not match 'SIMDf64' against 'quantity'
   min( const SIMDf64<T1>& a, const SIMDf64<T2>& b ) noexcept
   ^
/usr/local/include/blaze/util/algorithms/Min.h:72:4: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>]: no type named 'Type' in 'blaze::EnableIf<false, void>'
   min( const T1& a, const T2& b ) noexcept
   ^
/usr/local/include/blaze/math/proxy/Proxy.h:2070:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) min( const Proxy<PT1,RT1>& lhs, const Proxy<PT2,RT2>& rhs )
                      ^
/usr/local/include/blaze/math/proxy/Proxy.h:2088:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) min( const Proxy<PT,RT>& lhs, const T& rhs )
                      ^
/usr/local/include/blaze/math/proxy/Proxy.h:2106:23: note: candidate template ignored: could not match 'Proxy' against 'quantity'
inline decltype(auto) min( const T& lhs, const Proxy<PT,RT>& rhs )
                      ^
/usr/local/include/blaze/util/algorithms/Min.h:93:4: note: candidate function template not viable: requires 3 arguments, but 2 were provided
   min( const T1& a, const T2& b, const T3& c ) noexcept
   ^
/usr/local/include/blaze/util/algorithms/Min.h:117:4: note: candidate function template not viable: requires at least 3 arguments, but 2 were provided
   min( const T1& a, const T2& b, const T3& c, const Ts&... args ) noexcept
   ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:143:20: error: no matching function for call to object of type 'blaze::Min'
      redux2 = op( op( redux2, tmp[i+2UL] ), tmp[i+3UL] );
                   ^~
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:390:11: note: in instantiation of function template specialization 'blaze::dvecreduce<blaze::DynamicVector<boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, false, blaze::GroupTag<0> >, false, blaze::Min>' requested here
   return dvecreduce( ~dv, std::move(op) );
          ^
/usr/local/include/blaze/math/functors/Min.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:146:16: error: no matching function for call to object of type 'blaze::Min'
      redux1 = op( redux1, tmp[i    ] );
               ^~
/usr/local/include/blaze/math/functors/Min.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:147:16: error: no matching function for call to object of type 'blaze::Min'
      redux2 = op( redux2, tmp[i+1UL] );
               ^~
/usr/local/include/blaze/math/functors/Min.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:150:16: error: no matching function for call to object of type 'blaze::Min'
      redux1 = op( redux1, tmp[i] );
               ^~
/usr/local/include/blaze/math/functors/Min.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.cpp:1:
In file included from /Users/dwright/projects/dv-laser-calibration/LaserCalibration.hpp:6:
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/Angle.hpp:4:
In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:
In file included from /usr/local/include/blaze/math/DynamicVector.h:45:
In file included from /usr/local/include/blaze/math/DenseVector.h:62:
/usr/local/include/blaze/math/expressions/DVecReduceExpr.h:153:11: error: no matching function for call to object of type 'blaze::Min'
   return op( redux1, redux2 );
          ^~
/usr/local/include/blaze/math/functors/Min.h:90:61: note: candidate template ignored: substitution failure [with T1 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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>, T2 = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::plane_angle_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 T1& a, const T2& b ) const
                                                            ^
6 warnings and 14 errors generated.
make[2]: *** [CMakeFiles/LaserCalibration.dir/LaserCalibration.cpp.o] Error 1
make[1]: *** [CMakeFiles/LaserCalibration.dir/all] Error 2
make: *** [all] Error 2
16:30:09: The process "/usr/local/Cellar/cmake/3.17.3/bin/cmake" exited with code 2.
Error while building/deploying project LaserCalibration (kit: Imported Kit)
When executing step "CMake Build"
16:30:09: Elapsed time: 00:06.

Comments (10)

  1. Klaus Iglberger

    Hi David!

    Thanks again for reporting problems with Blaze. Luckily, this time all problems can be resolved rather easily:

    • boost.units does not provide a min() and max() function. However, they provide a fmin() and fmax() function in <boost/units/cmath.hpp>. You can provide the according wrappers for them and use them in combination with blaze::reduce().
    • In order to compute the standard deviation, please create a uniform vector from the mean value by means of blaze::uniform().

    The following shows the complete code, which should compile and work flawlessly:

    struct Fmin
    {
       template< typename T1, typename T2 >
       constexpr decltype(auto) operator()( const T1& a, const T2& b ) const
       {
          return fmin( a, b );
       }
    };
    
    
    struct Fmax
    {
       template< typename T1, typename T2 >
       constexpr decltype(auto) operator()( const T1& a, const T2& b ) const
       {
          return fmax( a, b );
       }
    };
    
    int main()
    {
       using namespace boost::units;
       using unit = boost::units::quantity<boost::units::si::plane_angle>;
    
       const DynamicVector<unit> x{ 1.0 * si::radian, 2.0 * si::radian };
    
       const unit max    = blaze::reduce( x, Fmax{} );
       const unit min    = blaze::reduce( x, Fmin{} );
       const unit mean   = blaze::mean(x);
       const unit stddev = sqrt( blaze::mean( blaze::pow2( x - blaze::uniform(2,mean) ) ) );
    
       std::cerr << "\n"
                 << "max    = " << max << "\n"
                 << "min    = " << min << "\n"
                 << "mean   = " << mean << "\n"
                 << "stddev = " << stddev << "\n"
                 << "\n";
    }
    

    On my machine this prints:

    max    = 2 rad
    min    = 1 rad
    mean   = 1.5 rad
    stddev = 0.5 rad
    

    Does this solve the problem for you?

    Best regards,

    Klaus!

  2. David Wright reporter

    Indeed this solves the problem perfectly! Thank you for your fantastic support once again, Klaus!

    And have a nice weekend!

  3. Klaus Iglberger

    Hi David!

    Thanks again for reporting this problem. It took some time and some refactoring, but now you’re able to use your original code without any problems. In case you encounter a similar problem, please feel free to report it again. Thanks,

    Best regards,

    Klaus!

  4. David Wright reporter

    Hello Klaus,

    thank you very much for your continuous effort! I was just trying out your latest changes (I pulled f7d985dd85) but I now seem to again run into similar problems with vector/scalar multiplication and division as you have resolved in a previous issue that I opened: #385.

    Code producing the error:

                const boost::units::quantity<boost::units::si::length> bandwidth = 1.0 * boost::units::si::metre;
                const blaze::DynamicVector<boost::units::quantity<boost::units::si::length>> sample
                    = {1.0 * boost::units::si::metre, 1.0 * boost::units::si::metre};
                const blaze::DynamicVector<boost::units::quantity<boost::units::si::dimensionless>> weights
                    = sample / bandwidth;
    
    
                const double scale                                                                  = 1.0;
                const blaze::DynamicVector<boost::units::quantity<boost::units::si::length>> scaled = sample / scale;
    

    Compiler log:

    /usr/local/include/blaze/math/expressions/DVecScalarDivExpr.h:1090:11: error: no matching constructor for initialization of 'ReturnType' (aka 'const DVecScalarMultExpr<blaze::DynamicVector<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>, false, blaze::GroupTag<0> >, boost::units::quantity<boost::units::unit<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>, false>')

    return ReturnType( ~vec, inv(scalar) );

    ^ ~~~~~

    /usr/local/include/blaze/math/expressions/DVecScalarDivExpr.h:1130:11: note: in instantiation of function template specialization 'blaze::dvecscalardiv<blaze::DynamicVector<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>, false, blaze::GroupTag<0> >, false, 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>, nullptr>' requested here

    return dvecscalardiv( ~vec, scalar );

    ^

    /Users/dwright/projects/dv-laser-calibration/calibration-manager/MeanShift.hpp:168:14: note: in instantiation of function template specialization 'blaze::operator/<blaze::DynamicVector<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>, false, blaze::GroupTag<0> >, 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>, false, nullptr>' requested here

    = sample / bandwidth;

    ^

    /usr/local/include/blaze/math/expressions/DVecScalarMultExpr.h:449:11: note: candidate constructor not viable: no known conversion from 'quantity<unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type>, [2 * ...]>, [...]>' to 'quantity<unit<boost::units::dimensionless_type, [2 * ...]>, [...]>' for 2nd argument

    inline DVecScalarMultExpr( const VT& vector, ST scalar ) noexcept

    ^

    /usr/local/include/blaze/math/expressions/Forward.h:138:44: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided

    template< typename, typename, bool > class DVecScalarMultExpr;

    ^

    /usr/local/include/blaze/math/expressions/Forward.h:138:44: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided

    In file included from /Users/dwright/projects/dv-laser-calibration/calibration-manager/CalibrationManager.cpp:3:

    /Users/dwright/projects/dv-laser-calibration/calibration-manager/MeanShift.hpp:170:17: warning: declaration shadows a local variable [-Wshadow]

    const double scale = 1.0;

    ^

    /Users/dwright/projects/dv-laser-calibration/calibration-manager/MeanShift.hpp:155:9: note: previous declaration is here

    double scale;

    ^

    In file included from /Users/dwright/projects/dv-laser-calibration/calibration-manager/CalibrationManager.cpp:1:

    In file included from /Users/dwright/projects/dv-laser-calibration/calibration-manager/CalibrationManager.hpp:8:

    In file included from /Users/dwright/projects/dv-laser-calibration/calibration-manager/CalibrationParameters.hpp:6:

    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/Angle.hpp:4:

    In file included from /usr/local/include/blaze/math/DynamicMatrix.h:46:

    In file included from /usr/local/include/blaze/math/DynamicVector.h:45:

    In file included from /usr/local/include/blaze/math/DenseVector.h:64:

    /usr/local/include/blaze/math/expressions/DVecScalarDivExpr.h:1090:11: error: no matching constructor for initialization of 'ReturnType' (aka 'const DVecScalarMultExpr<blaze::DynamicVector<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>, false, blaze::GroupTag<0> >, 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>, false>')

    return ReturnType( ~vec, inv(scalar) );

    ^ ~~~~~

    /usr/local/include/blaze/math/expressions/DVecScalarDivExpr.h:1130:11: note: in instantiation of function template specialization 'blaze::dvecscalardiv<blaze::DynamicVector<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>, false, blaze::GroupTag<0> >, false, double, nullptr>' requested here

    return dvecscalardiv( ~vec, scalar );

    ^

    /Users/dwright/projects/dv-laser-calibration/calibration-manager/MeanShift.hpp:171:97: note: in instantiation of function template specialization 'blaze::operator/<blaze::DynamicVector<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>, false, blaze::GroupTag<0> >, double, false, nullptr>' requested here

    const blaze::DynamicVector<boost::units::quantity<boost::units::si::length>> scaled = sample / scale;

    ^

    /usr/local/include/blaze/math/expressions/DVecScalarMultExpr.h:449:11: note: candidate constructor not viable: no known conversion from 'double' to '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>' for 2nd argument

    inline DVecScalarMultExpr( const VT& vector, ST scalar ) noexcept

    ^

    /usr/local/include/blaze/math/expressions/Forward.h:138:44: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided

    template< typename, typename, bool > class DVecScalarMultExpr;

    ^

    /usr/local/include/blaze/math/expressions/Forward.h:138:44: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided

  5. Klaus Iglberger

    Hi David!

    I apologize for the regression. Commit 119b90a fixes the compilation issues and you should now be able to cleanly compile all your examples.

    Best regards,

    Klaus!

  6. Log in to comment