pub mod devectorize;
pub mod expand;
pub mod gpudims;
pub mod linearize;
pub mod optimizer;
pub mod passes;
pub mod rangeify;
pub mod symbolic;
#[cfg(feature = "testing")]
pub mod testing;
#[cfg(feature = "z3")]
pub mod z3;
#[cfg(test)]
pub mod test;
pub use morok_ir::pattern;
pub use morok_ir::rewrite;
pub use linearize::{CFGContext, linearize, linearize_with_cfg};
pub use morok_ir::pattern::{Matcher, RewriteResult, TypedPatternMatcher};
pub use morok_ir::rewrite::graph_rewrite;
pub use rangeify::{RangeifyResult, rangeify, rangeify_with_map, run_kernel_split_pipeline};
pub use expand::{expander, pm_group_for_reduce, pm_pre_expander, pre_expand};
pub use devectorize::devectorize;
pub use gpudims::pm_add_gpudims;
pub use passes::{build_linear_index, compute_row_major_strides, count_divmod, extract_index_dimension};
pub use optimizer::{
BeamConfig, BeamResult, HeuristicsConfig, OptError, OptStrategy, OptimizerConfig, Renderer as OptimizerRenderer,
Scheduler, TcOptLevel, TcSelect, TcUsage, apply_post_optimization, apply_post_optimization_with_renderer,
beam_search_cached, hand_coded_optimizations, optimize_kernel, optimize_kernel_with_config,
optimize_kernel_with_strategy, prepare_scheduler,
};
pub use morok_ir::UOp;
pub use morok_macros::{cached_patterns, patterns};
pub(crate) fn argsort(perm: &[usize]) -> Vec<usize> {
let mut inv = vec![0; perm.len()];
for (i, &p) in perm.iter().enumerate() {
inv[p] = i;
}
inv
}