MCPcopy Create free account
hub / github.com/coin-or/CppAD / CondExpOp

Function CondExpOp

include/cppad/example/valvector/class.hpp:972–1044  ·  view source on GitHub ↗

------------------------------------------------------------------------ {xrst_begin valvector_condexp} {xrst_spell valvectors } The valvector Conditional Expressions ##################################### Computes element-by-element :ref:`CondExp-name` values where the arguments are valvectors. Syntax ****** *result* = ``CondExp`` *Rel* ( *left* , *right* , *i

Source from the content-addressed store, hash-verified

970 {xrst_end valvector_condexp}
971 */
972 inline valvector CondExpOp(
973 enum CompareOp cop ,
974 const valvector& left ,
975 const valvector& right ,
976 const valvector& if_true ,
977 const valvector& if_false )
978 { //
979 // result_size
980 size_t result_size = std::max(left.size(), right.size());
981 result_size = std::max(result_size, if_true.size());
982 result_size = std::max(result_size, if_false.size());
983 //
984 // size_ok
985 bool size_ok = true;
986 size_ok &= left.size() == 1 || left.size() == result_size;
987 size_ok &= right.size() == 1 || right.size() == result_size;
988 size_ok &= if_true.size() == 1 || if_true.size() == result_size;
989 size_ok &= if_false.size() == 1 || if_false.size() == result_size;
990 CPPAD_VALVECTOR_ASSERT_KNOWN(
991 size_ok,
992 "argument sizes do not agree in conditional expression"
993 );
994 //
995 // result
996 valvector result;
997 result.resize(result_size);
998 //
999 for(size_t i = 0; i < result_size; ++i)
1000 { switch( cop )
1001 {
1002 case CompareLt:
1003 if( left[i] < right[i] )
1004 result[i] = if_true[i];
1005 else
1006 result[i] = if_false[i];;
1007 break;
1008
1009 case CompareLe:
1010 if( left[i] <= right[i] )
1011 result[i] = if_true[i];
1012 else
1013 result[i] = if_false[i];;
1014 break;
1015
1016 case CompareEq:
1017 if( left[i] == right[i] )
1018 result[i] = if_true[i];
1019 else
1020 result[i] = if_false[i];;
1021 break;
1022
1023 case CompareGe:
1024 if( left[i] >= right[i] )
1025 result[i] = if_true[i];
1026 else
1027 result[i] = if_false[i];;
1028 break;
1029

Callers

nothing calls this directly

Calls 2

sizeMethod · 0.45
resizeMethod · 0.45

Tested by

no test coverage detected