Struct ciphercore_base::ops::inverse_sqrt::InverseSqrt
source · 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: u64
Number of iterations of the Newton-Raphson algorithm
denominator_cap_2k: u64
Number 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<InverseSqrt> for InverseSqrt
impl PartialEq<InverseSqrt> for InverseSqrt
source§fn eq(&self, other: &InverseSqrt) -> bool
fn eq(&self, other: &InverseSqrt) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl Serialize for InverseSqrt
impl Serialize for InverseSqrt
impl Eq for InverseSqrt
impl StructuralEq for InverseSqrt
impl StructuralPartialEq for InverseSqrt
Auto Trait Implementations§
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 Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.