Skip to content

Commit

Permalink
Generalize treatment of scales
Browse files Browse the repository at this point in the history
  • Loading branch information
t7phy committed Oct 23, 2024
1 parent 5ff86af commit 342b7ff
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 76 deletions.
21 changes: 8 additions & 13 deletions pineappl/src/evolution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -293,13 +293,15 @@ fn ndarray_from_subgrid_orders_slice_many(
logs *= (xia * xia).ln();
}

let node_values = subgrid.node_values();

let x1_indices: Vec<Vec<_>> = kinematics
.iter()
.enumerate()
.filter_map(|(idx, kin)| matches!(kin, Kinematics::X(_)).then_some(idx))
.zip(&x1n)
.map(|(kin_idx, x1)| {
subgrid.node_values()[kin_idx]
node_values[kin_idx]
.iter()
.map(|&xs| {
x1.iter()
Expand All @@ -311,20 +313,13 @@ fn ndarray_from_subgrid_orders_slice_many(
})
.collect();

for (indices, value) in subgrid.indexed_iter() {
let fac = grid
.kinematics()
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
matches!(kin, &Kinematics::Scale(idx) if idx == 0).then_some(node_values)
})
// TODO: convert this into an error
.unwrap()[indices[0]];
// TODO: generalize this for multiple scales
let ren = fac;
let rens = grid.scales().ren.calc(&node_values, grid.kinematics());
let facs = grid.scales().fac.calc(&node_values, grid.kinematics());

for (indices, value) in subgrid.indexed_iter() {
// TODO: implement evolution for non-zero fragmentation scales
let ren = rens[grid.scales().ren.idx(&indices)];
let fac = facs[grid.scales().fac.idx(&indices)];

if !approx_eq!(f64, xif * xif * fac, fac1, ulps = EVOLUTION_TOL_ULPS) {
continue;
Expand Down
12 changes: 3 additions & 9 deletions pineappl/src/fk_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -332,15 +332,9 @@ impl TryFrom<Grid> for FkTable {
}

let [fac] = grid
.kinematics()
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
// TODO: generalize this for arbitrary scales
matches!(kin, &Kinematics::Scale(idx) if idx == 0).then_some(node_values)
})
// TODO: convert this into an error
.unwrap()[..]
.scales()
.fac
.calc(&subgrid.node_values(), grid.kinematics())[..]
else {
return Err(TryFromGridError::MultipleScales);
};
Expand Down
28 changes: 8 additions & 20 deletions pineappl/src/grid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1098,32 +1098,20 @@ impl Grid {
.then_some((&self.channels()[tuple.2], subgrid))
})
{
// ren1.extend(subgrid.mu2_grid().iter().map(|Mu2 { ren, .. }| *ren));
ren1.extend(
self.kinematics()
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
matches!(kin, &Kinematics::Scale(idx) if idx == 0).then_some(node_values)
})
// TODO: convert this into an error
.unwrap()
.into_iter(),
self.scales()
.ren
.calc(&subgrid.node_values(), self.kinematics())
.iter(),
);
ren1.sort_by(f64::total_cmp);
ren1.dedup_by(|a, b| approx_eq!(f64, *a, *b, ulps = EVOLVE_INFO_TOL_ULPS));

// fac1.extend(subgrid.mu2_grid().iter().map(|Mu2 { fac, .. }| *fac));
fac1.extend(
self.kinematics()
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
matches!(kin, &Kinematics::Scale(idx) if idx == 0).then_some(node_values)
})
// TODO: convert this into an error
.unwrap()
.into_iter(),
self.scales()
.fac
.calc(&subgrid.node_values(), self.kinematics())
.iter(),
);
fac1.sort_by(f64::total_cmp);
fac1.dedup_by(|a, b| approx_eq!(f64, *a, *b, ulps = EVOLVE_INFO_TOL_ULPS));
Expand Down
43 changes: 9 additions & 34 deletions pineappl_cli/src/export/applgrid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,10 @@ fn reconstruct_subgrid_params(grid: &Grid, order: usize, bin: usize) -> Result<V
.iter()
.filter(|subgrid| !subgrid.is_empty())
.flat_map(|subgrid| {
grid.kinematics()
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
matches!(kin, &Kinematics::Scale(idx) if idx == 0).then_some(node_values)
})
// TODO: convert this into an error
.unwrap()
grid.scales()
.fac
.calc(&subgrid.node_values(), grid.kinematics())
.into_owned()
})
.collect();
mu2_grid.dedup_by(|a, b| approx_eq!(f64, *a, *b, ulps = 128));
Expand Down Expand Up @@ -234,17 +230,9 @@ pub fn convert_into_applgrid(
.enumerate()
.filter(|(_, subgrid)| !subgrid.is_empty())
{
let appl_q2_idx: Vec<_> = grid
.kinematics()
let appl_q2_idx: Vec<_> = grid.scales().fac.calc(&subgrid.node_values(), grid.kinematics())
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
matches!(kin, &Kinematics::Scale(idx) if idx == 0).then_some(node_values)
})
// TODO: convert this into an error
.unwrap()
.into_iter()
.map(|fac| {
.map(|&fac| {
appl_q2
.iter()
.position(|&x| approx_eq!(f64, x, fac, ulps = 128))
Expand Down Expand Up @@ -313,13 +301,6 @@ pub fn convert_into_applgrid(
Vec::new(),
)
};
// let (x1_grid, x2_grid) = if has_pdf1 && has_pdf2 {
// (subgrid.x1_grid(), subgrid.x2_grid())
// } else if has_pdf1 {
// (subgrid.x1_grid(), Cow::Owned(vec![]))
// } else {
// (subgrid.x2_grid(), Cow::Owned(vec![]))
// };

let appl_x1_idx: Vec<_> = x1_grid
.iter()
Expand Down Expand Up @@ -358,15 +339,9 @@ pub fn convert_into_applgrid(
if value != 0.0 {
println!(
"WARNING: discarding non-matching scale muf2 = {}",
grid.kinematics()
.iter()
.zip(subgrid.node_values())
.find_map(|(kin, node_values)| {
matches!(kin, &Kinematics::Scale(idx) if idx == 0)
.then_some(node_values)
})
// TODO: convert this into an error
.unwrap()[iq2]
grid.scales()
.fac
.calc(&subgrid.node_values(), grid.kinematics())[iq2]
);
}

Expand Down

0 comments on commit 342b7ff

Please sign in to comment.