optmization fix

This commit is contained in:
microproofs 2023-07-28 19:39:52 -04:00 committed by Kasey
parent 5aecb96668
commit f5c7d222aa
1 changed files with 99 additions and 27 deletions

View File

@ -2,9 +2,10 @@ use std::rc::Rc;
use indexmap::IndexMap; use indexmap::IndexMap;
use itertools::Itertools; use itertools::Itertools;
use pallas_primitives::babbage::{BigInt, PlutusData};
use crate::{ use crate::{
ast::{Name, Program, Term}, ast::{Constant, Data, Name, Program, Term, Type},
builtins::DefaultFunction, builtins::DefaultFunction,
}; };
@ -324,12 +325,11 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
return; return;
}; };
let Term::Apply { function: inner_func, argument: inner_arg } = Rc::make_mut(argument) if let Term::Apply {
else { function: inner_func,
wrap_data_reduce(Rc::make_mut(argument)); argument: inner_arg,
return; } = Rc::make_mut(argument)
}; {
let Term::Builtin(second_action) = inner_func.as_ref() let Term::Builtin(second_action) = inner_func.as_ref()
else { else {
wrap_data_reduce(Rc::make_mut(argument)); wrap_data_reduce(Rc::make_mut(argument));
@ -352,6 +352,78 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
wrap_data_reduce(Rc::make_mut(argument)); wrap_data_reduce(Rc::make_mut(argument));
} }
} }
} else if let Term::Constant(c) = Rc::make_mut(argument) {
match (first_action, Rc::make_mut(c)) {
(
DefaultFunction::UnIData,
Constant::Data(PlutusData::BigInt(BigInt::Int(i))),
) => {
*term = Term::integer(i128::from(*i).into());
}
(DefaultFunction::IData, Constant::Integer(i)) => {
*term = Term::data(Data::integer(i.clone()));
}
(DefaultFunction::UnBData, Constant::Data(PlutusData::BoundedBytes(b))) => {
*term = Term::byte_string(b.clone().into());
}
(DefaultFunction::BData, Constant::ByteString(b)) => {
*term = Term::data(Data::bytestring(b.clone()));
}
(DefaultFunction::UnListData, Constant::Data(PlutusData::Array(l))) => {
*term = Term::list_values(
l.iter()
.map(|item| Constant::Data(item.clone()))
.collect_vec(),
);
}
(DefaultFunction::ListData, Constant::ProtoList(_, l)) => {
*term = Term::data(Data::list(
l.iter()
.map(|item| match item {
Constant::Data(d) => d.clone(),
_ => unreachable!(),
})
.collect_vec(),
));
}
(DefaultFunction::MapData, Constant::ProtoList(_, m)) => {
*term = Term::data(Data::map(
m.iter()
.map(|m| match m {
Constant::ProtoPair(_, _, f, s) => {
match (f.as_ref(), s.as_ref()) {
(Constant::Data(d), Constant::Data(d2)) => {
(d.clone(), d2.clone())
}
_ => unreachable!(),
}
}
_ => unreachable!(),
})
.collect_vec(),
));
}
(DefaultFunction::UnMapData, Constant::Data(PlutusData::Map(m))) => {
*term = Term::map_values(
m.iter()
.map(|item| {
Constant::ProtoPair(
Type::Data,
Type::Data,
Constant::Data(item.0.clone()).into(),
Constant::Data(item.1.clone()).into(),
)
})
.collect_vec(),
);
}
_ => {
wrap_data_reduce(Rc::make_mut(argument));
}
}
} else {
wrap_data_reduce(Rc::make_mut(argument));
};
} }
Term::Force(f) => { Term::Force(f) => {
wrap_data_reduce(Rc::make_mut(f)); wrap_data_reduce(Rc::make_mut(f));