Implement new costing function for {divide,quotient,mod,remainder}_integer

As well as fixing a couple of other issues thanks to conformance
  tests. Some functions like multiply_integer or verify_ed25519_signature
  have also slightly changed their costing function.
This commit is contained in:
KtorZ 2024-08-14 02:46:04 +02:00
parent 2cb87f4f8f
commit 42784965d2
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
5 changed files with 352 additions and 181 deletions

View File

@ -1320,116 +1320,84 @@ impl BuiltinCosts {
intercept: 0,
slope: 1,
}),
cpu: TwoArguments::AddedSizes(AddedSizes {
cpu: TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: 90434,
slope: 519,
}),
},
// FIXME: Costing function for divide_integer has changed in v3
//
// "divideInteger-cpu-arguments-constant": 85848,
// "divideInteger-cpu-arguments-model-arguments-c00": 123203,
// "divideInteger-cpu-arguments-model-arguments-c01": 7305,
// "divideInteger-cpu-arguments-model-arguments-c02": -900,
// "divideInteger-cpu-arguments-model-arguments-c10": 1716,
// "divideInteger-cpu-arguments-model-arguments-c11": 549,
// "divideInteger-cpu-arguments-model-arguments-c20": 57,
// "divideInteger-cpu-arguments-model-arguments-minimum": 85848,
// "divideInteger-memory-arguments-intercept": 0,
// "divideInteger-memory-arguments-minimum": 1,
// "divideInteger-memory-arguments-slope": 1,
divide_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
intercept: 0,
slope: 1,
minimum: 1,
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: 196500,
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: 453240,
slope: 220,
})),
}),
cpu: TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
85848,
TwoArgumentsQuadraticFunction {
minimum: 85848,
coeff_00: 123203,
coeff_01: 7305,
coeff_02: -900,
coeff_10: 1716,
coeff_11: 549,
coeff_20: 57,
},
),
},
// FIXME Costing function for quotient_integer has changed in v3
//
// "quotientInteger-cpu-arguments-constant": 85848,
// "quotientInteger-cpu-arguments-model-arguments-c00": 123203,
// "quotientInteger-cpu-arguments-model-arguments-c01": 7305,
// "quotientInteger-cpu-arguments-model-arguments-c02": -900,
// "quotientInteger-cpu-arguments-model-arguments-c10": 1716,
// "quotientInteger-cpu-arguments-model-arguments-c11": 549,
// "quotientInteger-cpu-arguments-model-arguments-c20": 57,
// "quotientInteger-cpu-arguments-model-arguments-minimum": 85848,
// "quotientInteger-memory-arguments-intercept": 0,
// "quotientInteger-memory-arguments-minimum": 1,
// "quotientInteger-memory-arguments-slope": 1,
quotient_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
intercept: 0,
slope: 1,
minimum: 1,
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: 196500,
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: 453240,
slope: 220,
})),
}),
cpu: TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
85848,
TwoArgumentsQuadraticFunction {
minimum: 85848,
coeff_00: 123203,
coeff_01: 7305,
coeff_02: -900,
coeff_10: 1716,
coeff_11: 549,
coeff_20: 57,
},
),
},
// FIXME Costing function for remainder_integer has changed in v3
//
// "remainderInteger-cpu-arguments-constant": 85848,
// "remainderInteger-cpu-arguments-model-arguments-c00": 123203,
// "remainderInteger-cpu-arguments-model-arguments-c01": 7305,
// "remainderInteger-cpu-arguments-model-arguments-c02": -900,
// "remainderInteger-cpu-arguments-model-arguments-c10": 1716,
// "remainderInteger-cpu-arguments-model-arguments-c11": 549,
// "remainderInteger-cpu-arguments-model-arguments-c20": 57,
// "remainderInteger-cpu-arguments-model-arguments-minimum": 85848,
// "remainderInteger-memory-arguments-intercept": 0,
// "remainderInteger-memory-arguments-slope": 1,
remainder_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
mem: TwoArguments::LinearInY(LinearSize {
intercept: 0,
slope: 1,
minimum: 1,
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: 196500,
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: 453240,
slope: 220,
})),
}),
cpu: TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
85848,
TwoArgumentsQuadraticFunction {
minimum: 85848,
coeff_00: 123203,
coeff_01: 7305,
coeff_02: -900,
coeff_10: 1716,
coeff_11: 549,
coeff_20: 57,
},
),
},
// FIXME: Costing function for mod_integer has changed in v3
//
// "modInteger-cpu-arguments-constant": 85848,
// "modInteger-cpu-arguments-model-arguments-c00": 123203,
// "modInteger-cpu-arguments-model-arguments-c01": 7305,
// "modInteger-cpu-arguments-model-arguments-c02": -900,
// "modInteger-cpu-arguments-model-arguments-c10": 1716,
// "modInteger-cpu-arguments-model-arguments-c11": 549,
// "modInteger-cpu-arguments-model-arguments-c20": 57,
// "modInteger-cpu-arguments-model-arguments-minimum": 85848,
// "modInteger-memory-arguments-intercept": 0,
// "modInteger-memory-arguments-slope": 1,
mod_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
mem: TwoArguments::LinearInY(LinearSize {
intercept: 0,
slope: 1,
minimum: 1,
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: 196500,
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: 453240,
slope: 220,
})),
}),
cpu: TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
85848,
TwoArgumentsQuadraticFunction {
minimum: 85848,
coeff_00: 123203,
coeff_01: 7305,
coeff_02: -900,
coeff_10: 1716,
coeff_11: 549,
coeff_20: 57,
},
),
},
equals_integer: CostingFun {
mem: TwoArguments::ConstantCost(1),
@ -1479,7 +1447,7 @@ impl BuiltinCosts {
}),
cpu: ThreeArguments::LinearInZ(LinearSize {
intercept: 20467,
slope: 0,
slope: 1,
}),
},
length_of_byte_string: CostingFun {
@ -1535,7 +1503,7 @@ impl BuiltinCosts {
},
verify_ed25519_signature: CostingFun {
mem: ThreeArguments::ConstantCost(10),
cpu: ThreeArguments::LinearInZ(LinearSize {
cpu: ThreeArguments::LinearInY(LinearSize {
intercept: 53384111,
slope: 14333,
}),
@ -3158,14 +3126,26 @@ pub fn initialize_cost_model(version: &Language, costs: &[i64]) -> CostModel {
.get("multiply_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
}),
cpu: TwoArguments::AddedSizes(AddedSizes {
intercept: *cost_map
.get("multiply_integer-cpu-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("multiply_integer-cpu-arguments-slope")
.unwrap_or(&30000000000),
}),
cpu: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::AddedSizes(AddedSizes {
intercept: *cost_map
.get("multiply_integer-cpu-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("multiply_integer-cpu-arguments-slope")
.unwrap_or(&30000000000),
})
}
Language::PlutusV3 => TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get("multiply_integer-cpu-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("multiply_integer-cpu-arguments-slope")
.unwrap_or(&30000000000),
}),
},
},
divide_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
@ -3179,19 +3159,51 @@ pub fn initialize_cost_model(version: &Language, costs: &[i64]) -> CostModel {
.get("divide_integer-mem-arguments-minimum")
.unwrap_or(&30000000000),
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("divide_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get("divide_integer-cpu-arguments-model-arguments-intercept")
cpu: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("divide_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get("divide_integer-cpu-arguments-model-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("divide_integer-cpu-arguments-model-arguments-slope")
.unwrap_or(&30000000000),
})),
})
}
Language::PlutusV3 => TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
*cost_map
.get("divide_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
slope: *cost_map
.get("divide_integer-cpu-arguments-model-arguments-slope")
.unwrap_or(&30000000000),
})),
}),
TwoArgumentsQuadraticFunction {
minimum: *cost_map
.get("divide_integer-cpu-arguments-minimum")
.unwrap_or(&30000000000),
coeff_00: *cost_map
.get("divide_integer-cpu-arguments-c00")
.unwrap_or(&30000000000),
coeff_10: *cost_map
.get("divide_integer-cpu-arguments-c10")
.unwrap_or(&30000000000),
coeff_01: *cost_map
.get("divide_integer-cpu-arguments-c01")
.unwrap_or(&30000000000),
coeff_20: *cost_map
.get("divide_integer-cpu-arguments-c20")
.unwrap_or(&30000000000),
coeff_11: *cost_map
.get("divide_integer-cpu-arguments-c11")
.unwrap_or(&30000000000),
coeff_02: *cost_map
.get("divide_integer-cpu-arguments-c02")
.unwrap_or(&30000000000),
},
),
},
},
quotient_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
@ -3205,71 +3217,193 @@ pub fn initialize_cost_model(version: &Language, costs: &[i64]) -> CostModel {
.get("quotient_integer-mem-arguments-minimum")
.unwrap_or(&30000000000),
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("quotient_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get("quotient_integer-cpu-arguments-model-arguments-intercept")
cpu: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("quotient_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get("quotient_integer-cpu-arguments-model-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("quotient_integer-cpu-arguments-model-arguments-slope")
.unwrap_or(&30000000000),
})),
})
}
Language::PlutusV3 => TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
*cost_map
.get("quotient_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
slope: *cost_map
.get("quotient_integer-cpu-arguments-model-arguments-slope")
.unwrap_or(&30000000000),
})),
}),
TwoArgumentsQuadraticFunction {
minimum: *cost_map
.get("quotient_integer-cpu-arguments-minimum")
.unwrap_or(&30000000000),
coeff_00: *cost_map
.get("quotient_integer-cpu-arguments-c00")
.unwrap_or(&30000000000),
coeff_10: *cost_map
.get("quotient_integer-cpu-arguments-c10")
.unwrap_or(&30000000000),
coeff_01: *cost_map
.get("quotient_integer-cpu-arguments-c01")
.unwrap_or(&30000000000),
coeff_20: *cost_map
.get("quotient_integer-cpu-arguments-c20")
.unwrap_or(&30000000000),
coeff_11: *cost_map
.get("quotient_integer-cpu-arguments-c11")
.unwrap_or(&30000000000),
coeff_02: *cost_map
.get("quotient_integer-cpu-arguments-c02")
.unwrap_or(&30000000000),
},
),
},
},
remainder_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
intercept: *cost_map
.get("remainder_integer-mem-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("remainder_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
minimum: *cost_map
.get("remainder_integer-mem-arguments-minimum")
.unwrap_or(&30000000000),
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("remainder_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
mem: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::SubtractedSizes(SubtractedSizes {
intercept: *cost_map
.get("remainder_integer-mem-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("remainder_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
minimum: *cost_map
.get("remainder_integer-mem-arguments-minimum")
.unwrap_or(&30000000000),
})
}
Language::PlutusV3 => TwoArguments::LinearInY(LinearSize {
intercept: *cost_map
.get("remainder_integer-cpu-arguments-model-arguments-intercept")
.get("remainder_integer-mem-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("remainder_integer-cpu-arguments-model-arguments-slope")
.get("remainder_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
})),
}),
}),
},
cpu: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("remainder_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get(
"remainder_integer-cpu-arguments-model-arguments-intercept",
)
.unwrap_or(&30000000000),
slope: *cost_map
.get("remainder_integer-cpu-arguments-model-arguments-slope")
.unwrap_or(&30000000000),
})),
})
}
Language::PlutusV3 => TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
*cost_map
.get("remainder_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
TwoArgumentsQuadraticFunction {
minimum: *cost_map
.get("remainder_integer-cpu-arguments-minimum")
.unwrap_or(&30000000000),
coeff_00: *cost_map
.get("remainder_integer-cpu-arguments-c00")
.unwrap_or(&30000000000),
coeff_10: *cost_map
.get("remainder_integer-cpu-arguments-c10")
.unwrap_or(&30000000000),
coeff_01: *cost_map
.get("remainder_integer-cpu-arguments-c01")
.unwrap_or(&30000000000),
coeff_20: *cost_map
.get("remainder_integer-cpu-arguments-c20")
.unwrap_or(&30000000000),
coeff_11: *cost_map
.get("remainder_integer-cpu-arguments-c11")
.unwrap_or(&30000000000),
coeff_02: *cost_map
.get("remainder_integer-cpu-arguments-c02")
.unwrap_or(&30000000000),
},
),
},
},
mod_integer: CostingFun {
mem: TwoArguments::SubtractedSizes(SubtractedSizes {
intercept: *cost_map
.get("mod_integer-mem-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("mod_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
minimum: *cost_map
.get("mod_integer-mem-arguments-minimum")
.unwrap_or(&30000000000),
}),
cpu: TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("mod_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
mem: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::SubtractedSizes(SubtractedSizes {
intercept: *cost_map
.get("mod_integer-mem-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("mod_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
minimum: *cost_map
.get("mod_integer-mem-arguments-minimum")
.unwrap_or(&30000000000),
})
}
Language::PlutusV3 => TwoArguments::LinearInY(LinearSize {
intercept: *cost_map
.get("mod_integer-cpu-arguments-model-arguments-intercept")
.get("mod_integer-mem-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("mod_integer-cpu-arguments-model-arguments-slope")
.get("mod_integer-mem-arguments-slope")
.unwrap_or(&30000000000),
})),
}),
}),
},
cpu: match version {
Language::PlutusV1 | Language::PlutusV2 => {
TwoArguments::ConstAboveDiagonal(ConstantOrTwoArguments {
constant: *cost_map
.get("mod_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
model: Box::new(TwoArguments::MultipliedSizes(MultipliedSizes {
intercept: *cost_map
.get("mod_integer-cpu-arguments-model-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("mod_integer-cpu-arguments-model-arguments-slope")
.unwrap_or(&30000000000),
})),
})
}
Language::PlutusV3 => TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(
*cost_map
.get("mod_integer-cpu-arguments-constant")
.unwrap_or(&30000000000),
TwoArgumentsQuadraticFunction {
minimum: *cost_map
.get("mod_integer-cpu-arguments-minimum")
.unwrap_or(&30000000000),
coeff_00: *cost_map
.get("mod_integer-cpu-arguments-c00")
.unwrap_or(&30000000000),
coeff_10: *cost_map
.get("mod_integer-cpu-arguments-c10")
.unwrap_or(&30000000000),
coeff_01: *cost_map
.get("mod_integer-cpu-arguments-c01")
.unwrap_or(&30000000000),
coeff_20: *cost_map
.get("mod_integer-cpu-arguments-c20")
.unwrap_or(&30000000000),
coeff_11: *cost_map
.get("mod_integer-cpu-arguments-c11")
.unwrap_or(&30000000000),
coeff_02: *cost_map
.get("mod_integer-cpu-arguments-c02")
.unwrap_or(&30000000000),
},
),
},
},
equals_integer: CostingFun {
mem: TwoArguments::ConstantCost(
@ -3493,14 +3627,21 @@ pub fn initialize_cost_model(version: &Language, costs: &[i64]) -> CostModel {
.get("verify_ed25519_signature-mem-arguments")
.unwrap_or(&30000000000),
),
cpu: ThreeArguments::LinearInZ(LinearSize {
intercept: *cost_map
.get("verify_ed25519_signature-cpu-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("verify_ed25519_signature-cpu-arguments-slope")
.unwrap_or(&30000000000),
}),
cpu: {
let sizes = LinearSize {
intercept: *cost_map
.get("verify_ed25519_signature-cpu-arguments-intercept")
.unwrap_or(&30000000000),
slope: *cost_map
.get("verify_ed25519_signature-cpu-arguments-slope")
.unwrap_or(&30000000000),
};
match version {
Language::PlutusV1 | Language::PlutusV2 => ThreeArguments::LinearInZ(sizes),
Language::PlutusV3 => ThreeArguments::LinearInY(sizes),
}
},
},
verify_ecdsa_secp256k1_signature: CostingFun {
mem: ThreeArguments::ConstantCost(
@ -4238,6 +4379,7 @@ pub enum TwoArguments {
ConstAboveDiagonal(ConstantOrTwoArguments),
ConstBelowDiagonal(ConstantOrTwoArguments),
QuadraticInY(QuadraticFunction),
ConstAboveDiagonalIntoQuadraticXAndY(i64, TwoArgumentsQuadraticFunction),
}
impl TwoArguments {
@ -4275,6 +4417,21 @@ impl TwoArguments {
}
}
TwoArguments::QuadraticInY(q) => q.coeff_0 + (q.coeff_1 * y) + (q.coeff_2 * y * y),
TwoArguments::ConstAboveDiagonalIntoQuadraticXAndY(constant, q) => {
if x < y {
*constant
} else {
std::cmp::max(
q.minimum,
q.coeff_00
+ q.coeff_10 * x
+ q.coeff_01 * y
+ q.coeff_20 * x * x
+ q.coeff_11 * x * y
+ q.coeff_02 * y * y,
)
}
}
}
}
}
@ -4380,6 +4537,17 @@ pub struct QuadraticFunction {
coeff_2: i64,
}
#[derive(Debug, PartialEq, Clone)]
pub struct TwoArgumentsQuadraticFunction {
minimum: i64,
coeff_00: i64,
coeff_10: i64,
coeff_01: i64,
coeff_20: i64,
coeff_11: i64,
coeff_02: i64,
}
#[repr(u8)]
pub enum StepKind {
Constant = 0,

View File

@ -63,8 +63,8 @@ pub enum Error {
Utf8(#[from] FromUtf8Error),
#[error("Out of Bounds\n\nindex: {}\nbytestring: {}\npossible: 0 - {}", .0, hex::encode(.1), .1.len() - 1)]
ByteStringOutOfBounds(BigInt, Vec<u8>),
#[error("Attempt to consByteString something bigger than one byte {0}")]
ByteStringConsBiggerThanOneByte(BigInt),
#[error("Attempt to consByteString something than isn't a byte between [0-255]: {0}")]
ByteStringConsNotAByte(BigInt),
#[error("Divide By Zero\n\n{0} / {1}")]
DivideByZero(BigInt, BigInt),
#[error("Ed25519S PublicKey should be 32 bytes but it was {0}")]

View File

@ -485,8 +485,8 @@ impl DefaultFunction {
wrap.try_into().unwrap()
}
BuiltinSemantics::V2 => {
if *arg1 > 255.into() {
return Err(Error::ByteStringConsBiggerThanOneByte(arg1.clone()));
if *arg1 > 255.into() || *arg1 < 0.into() {
return Err(Error::ByteStringConsNotAByte(arg1.clone()));
}
arg1.try_into().unwrap()

View File

@ -1,16 +1,13 @@
use std::{ops::Neg, rc::Rc, str::FromStr};
use crate::{
ast::{Constant, Name, Program, Term, Type},
builtins::DefaultFunction,
machine::runtime::Compressable,
machine::value::to_pallas_bigint,
machine::{runtime::Compressable, value::to_pallas_bigint},
};
use interner::Interner;
use num_bigint::BigInt;
use pallas_primitives::alonzo::PlutusData;
use peg::{error::ParseError, str::LineCol};
use std::{ops::Neg, rc::Rc, str::FromStr};
pub mod interner;
@ -195,10 +192,10 @@ peg::parser! {
= n:$(['0'..='9']+) {? n.parse().or(Err("usize")) }
rule number() -> isize
= n:$("-"* ['0'..='9']+) {? n.parse().or(Err("isize")) }
= n:$(("-"/"+")* ['0'..='9']+) {? n.parse().or(Err("isize")) }
rule big_number() -> BigInt
= n:$("-"* ['0'..='9']+) {? (if n.starts_with('-') { BigInt::parse_bytes(&n.as_bytes()[1..], 10).map(|i| i.neg()) } else { BigInt::parse_bytes(n.as_bytes(), 10) }).ok_or("BigInt") }
= n:$(("-"/"+")* ['0'..='9']+) {? (if n.starts_with('-') { BigInt::parse_bytes(&n.as_bytes()[1..], 10).map(|i| i.neg()) } else { BigInt::parse_bytes(n.as_bytes(), 10) }).ok_or("BigInt") }
rule boolean() -> bool
= b:$("True" / "False") { b == "True" }
@ -375,11 +372,12 @@ peg::parser! {
#[cfg(test)]
mod tests {
use crate::{
ast::{Constant, Name, Program, Term, Type, Unique},
builtins::DefaultFunction,
};
use num_bigint::BigInt;
use pretty_assertions::assert_eq;
use crate::ast::{Constant, Name, Program, Term, Type, Unique};
use crate::builtins::DefaultFunction;
use std::rc::Rc;
#[test]

View File

@ -94,8 +94,13 @@ fn plutus_conformance_tests(language: Language) {
match eval {
Ok((actual, cost)) => {
pretty_assertions::assert_eq!(expected, Ok(actual), "{}", path.display());
if let Ok(budget) = file_to_budget(&expected_budget_file) {
pretty_assertions::assert_eq!(budget, cost, "{}", path.display());
match language {
Language::PlutusV1 | Language::PlutusV2 => {}
Language::PlutusV3 => {
if let Ok(budget) = file_to_budget(&expected_budget_file) {
pretty_assertions::assert_eq!(budget, cost, "{}", path.display());
}
}
}
}
Err(err) => pretty_assertions::assert_eq!(expected, Err(err), "{}", path.display()),