pub struct InverseSqrt {
pub iterations: u64,
pub denominator_cap_2k: u64,
}Expand description
A structure that defines the custom operation InverseSqrt that computes an approximate inverse square root using Newton iterations.
In particular, this operation computes an approximation of 2denominator_cap_2k / sqrt(input).
Input must be of the scalar type UINT64/INT64 and be in (0, 22 * denominator_cap_2k - 1) range. The input is also assumed to be small enough (less than 221), otherwise integer overflows are possible, yielding incorrect results. In case of INT64 type, negative inputs yield undefined behavior.
Optionally, an initial approximation for the Newton iterations can be provided. In this case, the operation might be faster and of lower depth, however, it must be guaranteed that 22 * denominator_cap_2k - 2 <= input * initial_approximation <= 22 * denominator_cap_2k.
The following formula for the Newton iterations is used: x_{i + 1} = x_i * (3 / 2 - d / 2 * x_i * x_i).
§Custom operation arguments
- Node containing an unsigned 64-bit array or scalar to compute the inverse square root
- (optional) Node containing an array or scalar that serves as an initial approximation of the Newton iterations
§Custom operation returns
New InverseSqrt node
§Example
let c = create_context().unwrap();
let g = c.create_graph().unwrap();
let t = array_type(vec![2, 3], UINT64);
let n1 = g.input(t.clone()).unwrap();
let guess_n = g.input(t.clone()).unwrap();
let n2 = g.custom_op(CustomOperation::new(InverseSqrt {iterations: 10, denominator_cap_2k: 4}), vec![n1, guess_n]).unwrap();Fields§
§iterations: u64Number of iterations of the Newton-Raphson algorithm
denominator_cap_2k: u64Number of output bits that are approximated
Trait Implementations§
Source§impl CustomOperationBody for InverseSqrt
impl CustomOperationBody for InverseSqrt
Source§impl Debug for InverseSqrt
impl Debug for InverseSqrt
Source§impl<'de> Deserialize<'de> for InverseSqrt
impl<'de> Deserialize<'de> for InverseSqrt
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Hash for InverseSqrt
impl Hash for InverseSqrt
Source§impl PartialEq for InverseSqrt
impl PartialEq for InverseSqrt
Source§impl Serialize for InverseSqrt
impl Serialize for InverseSqrt
impl Eq for InverseSqrt
impl StructuralPartialEq for InverseSqrt
Auto Trait Implementations§
impl Freeze for InverseSqrt
impl RefUnwindSafe for InverseSqrt
impl Send for InverseSqrt
impl Sync for InverseSqrt
impl Unpin for InverseSqrt
impl UnwindSafe for InverseSqrt
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.