------------------------------------------------------------------------ {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
| 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 |