UNPKG

@tensorflow/tfjs-core

Version:

Hardware-accelerated JavaScript library for machine intelligence

74 lines 3.08 kB
/** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ import { ENGINE } from '../engine'; import { Select } from '../kernel_names'; import { convertToTensor } from '../tensor_util_env'; import { assert, assertShapesMatch } from '../util'; import { broadcastTo } from './broadcast_to'; import { assertAndGetBroadcastShape } from './broadcast_util'; import { op } from './operation'; /** * Returns the elements, either `a` or `b` depending on the `condition`. * * If the condition is true, select from `a`, otherwise select from `b`. * * ```js * const cond = tf.tensor1d([false, false, true], 'bool'); * const a = tf.tensor1d([1 , 2, 3]); * const b = tf.tensor1d([-1, -2, -3]); * * a.where(cond, b).print(); * ``` * * @param condition The input condition. Must be of dtype bool. * @param a If `condition` is rank 1, `a` may have a higher rank but * its first dimension must match the size of `condition`. * @param b A tensor with the same dtype as `a` and with shape that is * compatible with `a`. * @return A tensor with same dtype as `a` and `b`, and shape that is * broadcastable from `a` and `b`. * * @doc {heading: 'Operations', subheading: 'Logical'} */ function where_(condition, a, b) { const $a = convertToTensor(a, 'a', 'where'); const $b = convertToTensor(b, 'b', 'where'); const $condition = convertToTensor(condition, 'condition', 'where', 'bool'); // TODO: move this logic to forward function when the broadcastTo op is // implemented in WASM. // Find the broadcastable shape for $a and $b. const broadcastShape = assertAndGetBroadcastShape($a.shape, $b.shape); const $broadcastedA = broadcastTo($a, broadcastShape); const $broadcastedB = broadcastTo($b, broadcastShape); if ($condition.rank === 1) { // If condition rank is 1, then the first dimension must match the size of // condition. assert($condition.shape[0] === $a.shape[0], () => 'The first dimension of `a` must match the size of `condition`.'); } if ($condition.rank !== 1) { // A must have the same shape as condition. assertShapesMatch($condition.shape, $broadcastedB.shape, 'Error in where: '); } const inputs = { condition: $condition, t: $broadcastedA, e: $broadcastedB }; return ENGINE.runKernel(Select, inputs); } export const where = op({ where_ }); //# sourceMappingURL=where.js.map