/// This function confirms that all of the input expressions are direct SATInts, and returns vectors for each input of their bits
/// This function also normalizes direct SATInt operands to a common value range by zero-padding.
// TODO: In the future it may be possible to optimize operations between integers with different bit sizes
let (binding, old_min, old_max) = validate_direct_int_operands(vec![value.as_ref().clone()])?;
/// Matches a `|SATInt|` with an absolute value operation and rewrites it to a direct-encoded absolute-value `SATInt` by grouping input indicator bits by `|value|` and OR-ing each group (named here as buckets) into the corresponding output bit.
// The new range is from the minimum absolute value to the maximum absolute value. The minimum absolute value is either 0 if the old range includes 0, or the smaller of the absolute values of the old min and max if the old range does not include 0. The maximum absolute value is the larger of the absolute values of the old min and max.
// Iterates over all possible input values, calculate their absolute value, and place them in the corresponding bucket. Each bucket corresponds to a possible output value, and contains the disjunction of all input bits that could produce that output.
// For each bucket, if it's empty then the output bit is false, if it contains one element then the output bit is that element, and if it contains multiple elements then the output bit is the OR of all elements in the bucket.