1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00
ZoKrates/zokrates_core/src/optimizer/mod.rs
2023-01-26 15:18:31 +01:00

62 lines
2.2 KiB
Rust

//! Module containing flat program optimization
//!
//! @file mod.rs
//! @author Thibaut Schaeffer <thibaut@schaeff.fr>
//! @date 2018
mod canonicalizer;
mod directive;
mod duplicate;
mod redefinition;
mod tautology;
use self::canonicalizer::Canonicalizer;
use self::directive::DirectiveOptimizer;
use self::duplicate::DuplicateOptimizer;
use self::redefinition::RedefinitionOptimizer;
use self::tautology::TautologyOptimizer;
use zokrates_ast::ir::{ProgIterator, Statement};
use zokrates_field::Field;
pub fn optimize<'ast, T: Field, I: IntoIterator<Item = Statement<'ast, T>>>(
p: ProgIterator<'ast, T, I>,
) -> ProgIterator<'ast, T, impl IntoIterator<Item = Statement<'ast, T>>> {
// remove redefinitions
log::debug!("Optimizer: Remove redefinitions and tautologies and directives and duplicates");
// define all optimizer steps
let mut redefinition_optimizer = RedefinitionOptimizer::init(&p);
let mut tautologies_optimizer = TautologyOptimizer::default();
let mut directive_optimizer = DirectiveOptimizer::default();
let mut canonicalizer = Canonicalizer::default();
let mut duplicate_optimizer = DuplicateOptimizer::default();
use zokrates_ast::ir::folder::Folder;
let r = ProgIterator {
arguments: p
.arguments
.into_iter()
.map(|a| redefinition_optimizer.fold_argument(a))
.map(|a| {
<TautologyOptimizer as Folder<T>>::fold_argument(&mut tautologies_optimizer, a)
})
.map(|a| directive_optimizer.fold_argument(a))
.map(|a| <DuplicateOptimizer as Folder<T>>::fold_argument(&mut duplicate_optimizer, a))
.collect(),
statements: p
.statements
.into_iter()
.flat_map(move |s| redefinition_optimizer.fold_statement(s))
.flat_map(move |s| tautologies_optimizer.fold_statement(s))
.flat_map(move |s| canonicalizer.fold_statement(s))
.flat_map(move |s| directive_optimizer.fold_statement(s))
.flat_map(move |s| duplicate_optimizer.fold_statement(s)),
return_count: p.return_count,
solvers: p.solvers,
};
log::debug!("Done");
r
}