Correlate infrastructure payload tuples by compact prefix
This commit is contained in:
parent
c82b968259
commit
6a308c0d11
1 changed files with 539 additions and 47 deletions
|
|
@ -2053,6 +2053,9 @@ pub struct SmpSavePlacedStructureDynamicSideBufferFixedPolicySummary {
|
||||||
pub dominant_trailing_word_hex: Option<String>,
|
pub dominant_trailing_word_hex: Option<String>,
|
||||||
pub dominant_trailing_word_count: usize,
|
pub dominant_trailing_word_count: usize,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
pub compact_prefix_correlations:
|
||||||
|
Vec<SmpSavePlacedStructureDynamicSideBufferFixedPolicyCompactPrefixCorrelation>,
|
||||||
|
#[serde(default)]
|
||||||
pub sample_rows: Vec<SmpSavePlacedStructureDynamicSideBufferFixedPolicySample>,
|
pub sample_rows: Vec<SmpSavePlacedStructureDynamicSideBufferFixedPolicySample>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2072,6 +2075,39 @@ pub struct SmpSavePlacedStructureDynamicSideBufferFixedPolicySample {
|
||||||
pub trailing_word_hex: String,
|
pub trailing_word_hex: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpSavePlacedStructureDynamicSideBufferFixedPolicyCompactPrefixCorrelation {
|
||||||
|
pub prefix_leading_dword: u32,
|
||||||
|
pub prefix_leading_dword_hex: String,
|
||||||
|
pub prefix_trailing_word: u16,
|
||||||
|
pub prefix_trailing_word_hex: String,
|
||||||
|
pub prefix_separator_byte: u8,
|
||||||
|
pub prefix_separator_byte_hex: String,
|
||||||
|
pub row_count: usize,
|
||||||
|
pub unique_policy_tuple_count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_primary_name: Option<String>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_secondary_name: Option<String>,
|
||||||
|
pub dominant_name_pair_count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_mode_family: Option<String>,
|
||||||
|
pub dominant_mode_family_count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_first_triplet_dwords_hex: Vec<String>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_second_triplet_dwords_hex: Vec<String>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_trailing_word: Option<u16>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub dominant_trailing_word_hex: Option<String>,
|
||||||
|
pub dominant_policy_tuple_count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub mode_family_counts: Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeModeFamilyCount>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub sample_rows: Vec<SmpSavePlacedStructureDynamicSideBufferFixedPolicySample>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct SmpSavePlacedStructureDynamicSideBufferShortProfileFlagPairSummary {
|
pub struct SmpSavePlacedStructureDynamicSideBufferShortProfileFlagPairSummary {
|
||||||
pub row_count_with_0x06_profile_span: usize,
|
pub row_count_with_0x06_profile_span: usize,
|
||||||
|
|
@ -2218,14 +2254,17 @@ pub struct SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixCorrel
|
||||||
pub dominant_mode_family: Option<String>,
|
pub dominant_mode_family: Option<String>,
|
||||||
pub dominant_mode_family_count: usize,
|
pub dominant_mode_family_count: usize,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub mode_family_counts:
|
pub mode_family_counts: Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeModeFamilyCount>,
|
||||||
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeModeFamilyCount>,
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub name_pair_summaries:
|
pub name_pair_summaries:
|
||||||
Vec<SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanNamePairSummary>,
|
Vec<SmpSavePlacedStructureDynamicSideBufferDominantProfileSpanNamePairSummary>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub profile_span_counts:
|
pub profile_span_counts:
|
||||||
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixProfileSpanCount>,
|
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixProfileSpanCount>,
|
||||||
|
pub rows_with_previous_short_profile_flag_pair: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub previous_short_profile_flag_pair_counts:
|
||||||
|
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixFlagPairCount>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub sample_rows: Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample>,
|
pub sample_rows: Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample>,
|
||||||
}
|
}
|
||||||
|
|
@ -2236,6 +2275,15 @@ pub struct SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixProfil
|
||||||
pub count: usize,
|
pub count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixFlagPairCount {
|
||||||
|
pub first_flag_byte: u8,
|
||||||
|
pub first_flag_byte_hex: String,
|
||||||
|
pub second_flag_byte: u8,
|
||||||
|
pub second_flag_byte_hex: String,
|
||||||
|
pub count: usize,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
pub struct SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
||||||
pub sample_index: usize,
|
pub sample_index: usize,
|
||||||
|
|
@ -2303,8 +2351,7 @@ pub struct SmpSavePlacedStructureDynamicSideBufferNamePreludeProfileSpanCorrelat
|
||||||
pub dominant_mode_family: Option<String>,
|
pub dominant_mode_family: Option<String>,
|
||||||
pub dominant_mode_family_count: usize,
|
pub dominant_mode_family_count: usize,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub mode_family_counts:
|
pub mode_family_counts: Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeModeFamilyCount>,
|
||||||
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeModeFamilyCount>,
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub compact_prefix_pattern_summaries:
|
pub compact_prefix_pattern_summaries:
|
||||||
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeProfileSpanPrefixSummary>,
|
Vec<SmpSavePlacedStructureDynamicSideBufferNamePreludeProfileSpanPrefixSummary>,
|
||||||
|
|
@ -4582,6 +4629,76 @@ fn build_infrastructure_asset_trace_report(
|
||||||
.map(|summary| summary.dominant_trailing_word_count)
|
.map(|summary| summary.dominant_trailing_word_count)
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
),
|
),
|
||||||
|
side_buffer
|
||||||
|
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
||||||
|
.and_then(|summary| summary.fixed_policy_summary.as_ref())
|
||||||
|
.and_then(|summary| {
|
||||||
|
summary.compact_prefix_correlations.iter().find(|entry| {
|
||||||
|
entry.prefix_leading_dword == 0xff00_00ff
|
||||||
|
&& entry.prefix_trailing_word == 0x0001
|
||||||
|
&& entry.prefix_separator_byte == 0xff
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.map(|correlation| {
|
||||||
|
format!(
|
||||||
|
"the fixed 0x55f2 lane for exact 0xff0000ff/0x0001/0xff is now explicit too: unique policy tuples={}, dominant mode={:?} x{}, dominant tuple=({:?} | {:?} | {:?}) x{}, and sample rows={:?}",
|
||||||
|
correlation.unique_policy_tuple_count,
|
||||||
|
correlation.dominant_mode_family,
|
||||||
|
correlation.dominant_mode_family_count,
|
||||||
|
correlation.dominant_first_triplet_dwords_hex,
|
||||||
|
correlation.dominant_second_triplet_dwords_hex,
|
||||||
|
correlation.dominant_trailing_word_hex,
|
||||||
|
correlation.dominant_policy_tuple_count,
|
||||||
|
correlation
|
||||||
|
.sample_rows
|
||||||
|
.iter()
|
||||||
|
.map(|sample| format!(
|
||||||
|
"{}:{:?}/{:?}",
|
||||||
|
sample.name_tag_relative_offset,
|
||||||
|
sample.primary_name,
|
||||||
|
sample.secondary_name
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
"no fixed-policy compact-prefix correlation was available for 0xff0000ff/0x0001/0xff".to_string()
|
||||||
|
}),
|
||||||
|
side_buffer
|
||||||
|
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
||||||
|
.and_then(|summary| summary.fixed_policy_summary.as_ref())
|
||||||
|
.and_then(|summary| {
|
||||||
|
summary.compact_prefix_correlations.iter().find(|entry| {
|
||||||
|
entry.prefix_leading_dword == 0x0000_55f3
|
||||||
|
&& entry.prefix_trailing_word == 0x0001
|
||||||
|
&& entry.prefix_separator_byte == 0xff
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.map(|correlation| {
|
||||||
|
format!(
|
||||||
|
"the fixed 0x55f2 lane for exact 0x000055f3/0x0001/0xff is now explicit too: unique policy tuples={}, dominant mode={:?} x{}, dominant tuple=({:?} | {:?} | {:?}) x{}, and sample rows={:?}",
|
||||||
|
correlation.unique_policy_tuple_count,
|
||||||
|
correlation.dominant_mode_family,
|
||||||
|
correlation.dominant_mode_family_count,
|
||||||
|
correlation.dominant_first_triplet_dwords_hex,
|
||||||
|
correlation.dominant_second_triplet_dwords_hex,
|
||||||
|
correlation.dominant_trailing_word_hex,
|
||||||
|
correlation.dominant_policy_tuple_count,
|
||||||
|
correlation
|
||||||
|
.sample_rows
|
||||||
|
.iter()
|
||||||
|
.map(|sample| format!(
|
||||||
|
"{}:{:?}/{:?}",
|
||||||
|
sample.name_tag_relative_offset,
|
||||||
|
sample.primary_name,
|
||||||
|
sample.secondary_name
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
"no fixed-policy compact-prefix correlation was available for 0x000055f3/0x0001/0xff".to_string()
|
||||||
|
}),
|
||||||
side_buffer
|
side_buffer
|
||||||
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
||||||
.and_then(|summary| summary.dominant_profile_span_class_summary.as_ref())
|
.and_then(|summary| summary.dominant_profile_span_class_summary.as_ref())
|
||||||
|
|
@ -4880,7 +4997,7 @@ fn build_infrastructure_asset_trace_report(
|
||||||
})
|
})
|
||||||
.map(|correlation| {
|
.map(|correlation| {
|
||||||
format!(
|
format!(
|
||||||
"the exact 0xff0000ff/0x0001/0xff compact-prefix class is now explicit: dominant name={:?}/{:?} x{}, dominant span={:?} x{}, mode counts={:?}, name-pair counts={:?}, span counts={:?}, and sample rows={:?}",
|
"the exact 0xff0000ff/0x0001/0xff compact-prefix class is now explicit: dominant name={:?}/{:?} x{}, dominant span={:?} x{}, mode counts={:?}, name-pair counts={:?}, span counts={:?}, previous short-flag pairs={:?} across {} rows, and sample rows={:?}",
|
||||||
correlation.dominant_primary_name,
|
correlation.dominant_primary_name,
|
||||||
correlation.dominant_secondary_name,
|
correlation.dominant_secondary_name,
|
||||||
correlation.dominant_name_pair_count,
|
correlation.dominant_name_pair_count,
|
||||||
|
|
@ -4908,6 +5025,17 @@ fn build_infrastructure_asset_trace_report(
|
||||||
entry.count
|
entry.count
|
||||||
))
|
))
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
|
correlation
|
||||||
|
.previous_short_profile_flag_pair_counts
|
||||||
|
.iter()
|
||||||
|
.map(|entry| format!(
|
||||||
|
"{}/{}:{}",
|
||||||
|
entry.first_flag_byte_hex,
|
||||||
|
entry.second_flag_byte_hex,
|
||||||
|
entry.count
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
correlation.rows_with_previous_short_profile_flag_pair,
|
||||||
correlation
|
correlation
|
||||||
.sample_rows
|
.sample_rows
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -4923,6 +5051,63 @@ fn build_infrastructure_asset_trace_report(
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
"no grounded 0xff0000ff/0x0001/0xff compact-prefix correlation was available".to_string()
|
"no grounded 0xff0000ff/0x0001/0xff compact-prefix correlation was available".to_string()
|
||||||
}),
|
}),
|
||||||
|
side_buffer
|
||||||
|
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
||||||
|
.and_then(|summary| summary.name_prelude_candidate_summary.as_ref())
|
||||||
|
.and_then(|summary| {
|
||||||
|
summary.compact_prefix_correlations.iter().find(|entry| {
|
||||||
|
entry.prefix_leading_dword == 0x0000_55f3
|
||||||
|
&& entry.prefix_trailing_word == 0x0001
|
||||||
|
&& entry.prefix_separator_byte == 0xff
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.map(|correlation| {
|
||||||
|
format!(
|
||||||
|
"the exact 0x000055f3/0x0001/0xff compact-prefix class is now explicit too: dominant name={:?}/{:?} x{}, dominant span={:?} x{}, mode counts={:?}, name-pair counts={:?}, previous short-flag pairs={:?} across {} rows, and sample rows={:?}",
|
||||||
|
correlation.dominant_primary_name,
|
||||||
|
correlation.dominant_secondary_name,
|
||||||
|
correlation.dominant_name_pair_count,
|
||||||
|
correlation.dominant_profile_span,
|
||||||
|
correlation.dominant_profile_span_count,
|
||||||
|
correlation
|
||||||
|
.mode_family_counts
|
||||||
|
.iter()
|
||||||
|
.map(|mode| format!("{}:{}", mode.mode_family, mode.count))
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
correlation
|
||||||
|
.name_pair_summaries
|
||||||
|
.iter()
|
||||||
|
.map(|entry| format!(
|
||||||
|
"{:?}/{:?}:{}",
|
||||||
|
entry.primary_name, entry.secondary_name, entry.count
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
correlation
|
||||||
|
.previous_short_profile_flag_pair_counts
|
||||||
|
.iter()
|
||||||
|
.map(|entry| format!(
|
||||||
|
"{}/{}:{}",
|
||||||
|
entry.first_flag_byte_hex,
|
||||||
|
entry.second_flag_byte_hex,
|
||||||
|
entry.count
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
correlation.rows_with_previous_short_profile_flag_pair,
|
||||||
|
correlation
|
||||||
|
.sample_rows
|
||||||
|
.iter()
|
||||||
|
.map(|sample| format!(
|
||||||
|
"{}:{:?}/{:?}",
|
||||||
|
sample.name_tag_relative_offset,
|
||||||
|
sample.primary_name,
|
||||||
|
sample.secondary_name
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
"no grounded 0x000055f3/0x0001/0xff compact-prefix correlation was available".to_string()
|
||||||
|
}),
|
||||||
side_buffer
|
side_buffer
|
||||||
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
.and_then(|probe| probe.payload_envelope_summary.as_ref())
|
||||||
.and_then(|summary| summary.name_prelude_candidate_summary.as_ref())
|
.and_then(|summary| summary.name_prelude_candidate_summary.as_ref())
|
||||||
|
|
@ -13511,26 +13696,53 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
.collect(),
|
.collect(),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
let classify_side_buffer_mode_family =
|
||||||
|
|primary_name: Option<&str>, secondary_name: Option<&str>| -> &'static str {
|
||||||
|
let name = primary_name.or(secondary_name).unwrap_or_default();
|
||||||
|
if name.starts_with("Bridge") {
|
||||||
|
"bridge"
|
||||||
|
} else if name.starts_with("Tunnel") {
|
||||||
|
"tunnel"
|
||||||
|
} else if name.starts_with("BallastCap") {
|
||||||
|
"ballast_cap"
|
||||||
|
} else if name.starts_with("TrackCap") {
|
||||||
|
"track_cap"
|
||||||
|
} else if name.starts_with("Overpass") {
|
||||||
|
"overpass"
|
||||||
|
} else if name.is_empty() {
|
||||||
|
"unknown"
|
||||||
|
} else {
|
||||||
|
"other"
|
||||||
|
}
|
||||||
|
};
|
||||||
let fixed_policy_rows = payload_envelope_rows
|
let fixed_policy_rows = payload_envelope_rows
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|row| row.policy_chunk_len == Some(0x1a))
|
.filter(|row| row.policy_chunk_len == Some(0x1a))
|
||||||
.filter_map(|row| {
|
.filter_map(|row| {
|
||||||
|
let embedded_name_row = embedded_name_rows
|
||||||
|
.iter()
|
||||||
|
.find(|entry| entry.name_tag_relative_offset == row.name_tag_relative_offset)?;
|
||||||
let policy_tag_relative_offset = row.policy_tag_relative_offset?;
|
let policy_tag_relative_offset = row.policy_tag_relative_offset?;
|
||||||
let policy_payload = records_payload
|
let policy_payload = records_payload
|
||||||
.get(policy_tag_relative_offset + 4..policy_tag_relative_offset + 4 + 0x1a)?;
|
.get(policy_tag_relative_offset + 4..policy_tag_relative_offset + 4 + 0x1a)?;
|
||||||
let first_triplet_dwords = [0usize, 4, 8]
|
let first_triplet_dwords = [
|
||||||
.into_iter()
|
read_u32_at(policy_payload, 0)?,
|
||||||
.map(|offset| read_u32_at(policy_payload, offset))
|
read_u32_at(policy_payload, 4)?,
|
||||||
.collect::<Option<Vec<_>>>()?;
|
read_u32_at(policy_payload, 8)?,
|
||||||
let second_triplet_dwords = [12usize, 16, 20]
|
];
|
||||||
.into_iter()
|
let second_triplet_dwords = [
|
||||||
.map(|offset| read_u32_at(policy_payload, offset))
|
read_u32_at(policy_payload, 12)?,
|
||||||
.collect::<Option<Vec<_>>>()?;
|
read_u32_at(policy_payload, 16)?,
|
||||||
|
read_u32_at(policy_payload, 20)?,
|
||||||
|
];
|
||||||
let trailing_word = read_u16_at(policy_payload, 24)?;
|
let trailing_word = read_u16_at(policy_payload, 24)?;
|
||||||
Some((
|
Some((
|
||||||
row.name_tag_relative_offset,
|
row.name_tag_relative_offset,
|
||||||
row.primary_name.clone(),
|
row.primary_name.clone(),
|
||||||
row.secondary_name.clone(),
|
row.secondary_name.clone(),
|
||||||
|
embedded_name_row.prefix_leading_dword,
|
||||||
|
embedded_name_row.prefix_trailing_word,
|
||||||
|
embedded_name_row.prefix_separator_byte,
|
||||||
first_triplet_dwords,
|
first_triplet_dwords,
|
||||||
second_triplet_dwords,
|
second_triplet_dwords,
|
||||||
trailing_word,
|
trailing_word,
|
||||||
|
|
@ -13538,7 +13750,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let mut fixed_policy_trailing_word_counts = BTreeMap::<u16, usize>::new();
|
let mut fixed_policy_trailing_word_counts = BTreeMap::<u16, usize>::new();
|
||||||
for (_, _, _, _, _, trailing_word) in &fixed_policy_rows {
|
for (_, _, _, _, _, _, _, _, trailing_word) in &fixed_policy_rows {
|
||||||
*fixed_policy_trailing_word_counts
|
*fixed_policy_trailing_word_counts
|
||||||
.entry(*trailing_word)
|
.entry(*trailing_word)
|
||||||
.or_default() += 1;
|
.or_default() += 1;
|
||||||
|
|
@ -13551,6 +13763,219 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
.then_with(|| right_word.cmp(left_word))
|
.then_with(|| right_word.cmp(left_word))
|
||||||
})
|
})
|
||||||
.map(|(word, count)| (*word, *count));
|
.map(|(word, count)| (*word, *count));
|
||||||
|
let mut fixed_policy_compact_prefix_groups = BTreeMap::<
|
||||||
|
(u32, u16, u8),
|
||||||
|
Vec<(
|
||||||
|
usize,
|
||||||
|
Option<String>,
|
||||||
|
Option<String>,
|
||||||
|
[u32; 3],
|
||||||
|
[u32; 3],
|
||||||
|
u16,
|
||||||
|
)>,
|
||||||
|
>::new();
|
||||||
|
for (
|
||||||
|
name_tag_relative_offset,
|
||||||
|
primary_name,
|
||||||
|
secondary_name,
|
||||||
|
prefix_leading_dword,
|
||||||
|
prefix_trailing_word,
|
||||||
|
prefix_separator_byte,
|
||||||
|
first_triplet_dwords,
|
||||||
|
second_triplet_dwords,
|
||||||
|
trailing_word,
|
||||||
|
) in &fixed_policy_rows
|
||||||
|
{
|
||||||
|
fixed_policy_compact_prefix_groups
|
||||||
|
.entry((
|
||||||
|
*prefix_leading_dword,
|
||||||
|
*prefix_trailing_word,
|
||||||
|
*prefix_separator_byte,
|
||||||
|
))
|
||||||
|
.or_default()
|
||||||
|
.push((
|
||||||
|
*name_tag_relative_offset,
|
||||||
|
primary_name.clone(),
|
||||||
|
secondary_name.clone(),
|
||||||
|
*first_triplet_dwords,
|
||||||
|
*second_triplet_dwords,
|
||||||
|
*trailing_word,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let fixed_policy_compact_prefix_correlations = fixed_policy_compact_prefix_groups
|
||||||
|
.into_iter()
|
||||||
|
.map(
|
||||||
|
|((prefix_leading_dword, prefix_trailing_word, prefix_separator_byte), rows)| {
|
||||||
|
let mut name_pair_counts =
|
||||||
|
BTreeMap::<(Option<String>, Option<String>), usize>::new();
|
||||||
|
let mut mode_family_counts = BTreeMap::<String, usize>::new();
|
||||||
|
let mut policy_tuple_counts =
|
||||||
|
BTreeMap::<([u32; 3], [u32; 3], u16), usize>::new();
|
||||||
|
for (
|
||||||
|
_name_tag_relative_offset,
|
||||||
|
primary_name,
|
||||||
|
secondary_name,
|
||||||
|
first_triplet_dwords,
|
||||||
|
second_triplet_dwords,
|
||||||
|
trailing_word,
|
||||||
|
) in &rows
|
||||||
|
{
|
||||||
|
*name_pair_counts
|
||||||
|
.entry((primary_name.clone(), secondary_name.clone()))
|
||||||
|
.or_default() += 1;
|
||||||
|
*mode_family_counts
|
||||||
|
.entry(
|
||||||
|
classify_side_buffer_mode_family(
|
||||||
|
primary_name.as_deref(),
|
||||||
|
secondary_name.as_deref(),
|
||||||
|
)
|
||||||
|
.to_string(),
|
||||||
|
)
|
||||||
|
.or_default() += 1;
|
||||||
|
*policy_tuple_counts
|
||||||
|
.entry((
|
||||||
|
*first_triplet_dwords,
|
||||||
|
*second_triplet_dwords,
|
||||||
|
*trailing_word,
|
||||||
|
))
|
||||||
|
.or_default() += 1;
|
||||||
|
}
|
||||||
|
let dominant_name_pair = name_pair_counts
|
||||||
|
.iter()
|
||||||
|
.max_by(|(left_key, left_count), (right_key, right_count)| {
|
||||||
|
left_count
|
||||||
|
.cmp(right_count)
|
||||||
|
.then_with(|| right_key.cmp(left_key))
|
||||||
|
})
|
||||||
|
.map(|((primary_name, secondary_name), count)| {
|
||||||
|
(primary_name.clone(), secondary_name.clone(), *count)
|
||||||
|
});
|
||||||
|
let dominant_mode_family = mode_family_counts
|
||||||
|
.iter()
|
||||||
|
.max_by(|(left_key, left_count), (right_key, right_count)| {
|
||||||
|
left_count
|
||||||
|
.cmp(right_count)
|
||||||
|
.then_with(|| right_key.cmp(left_key))
|
||||||
|
})
|
||||||
|
.map(|(mode_family, count)| (mode_family.clone(), *count));
|
||||||
|
let dominant_policy_tuple = policy_tuple_counts
|
||||||
|
.iter()
|
||||||
|
.max_by(|(left_key, left_count), (right_key, right_count)| {
|
||||||
|
left_count
|
||||||
|
.cmp(right_count)
|
||||||
|
.then_with(|| right_key.cmp(left_key))
|
||||||
|
})
|
||||||
|
.map(
|
||||||
|
|(
|
||||||
|
(first_triplet_dwords, second_triplet_dwords, trailing_word),
|
||||||
|
count,
|
||||||
|
)| {
|
||||||
|
(
|
||||||
|
*first_triplet_dwords,
|
||||||
|
*second_triplet_dwords,
|
||||||
|
*trailing_word,
|
||||||
|
*count,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferFixedPolicyCompactPrefixCorrelation {
|
||||||
|
prefix_leading_dword,
|
||||||
|
prefix_leading_dword_hex: format!("0x{prefix_leading_dword:08x}"),
|
||||||
|
prefix_trailing_word,
|
||||||
|
prefix_trailing_word_hex: format!("0x{prefix_trailing_word:04x}"),
|
||||||
|
prefix_separator_byte,
|
||||||
|
prefix_separator_byte_hex: format!("0x{prefix_separator_byte:02x}"),
|
||||||
|
row_count: rows.len(),
|
||||||
|
unique_policy_tuple_count: policy_tuple_counts.len(),
|
||||||
|
dominant_primary_name: dominant_name_pair
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|(primary_name, _, _)| primary_name.clone()),
|
||||||
|
dominant_secondary_name: dominant_name_pair
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|(_, secondary_name, _)| secondary_name.clone()),
|
||||||
|
dominant_name_pair_count: dominant_name_pair
|
||||||
|
.map(|(_, _, count)| count)
|
||||||
|
.unwrap_or_default(),
|
||||||
|
dominant_mode_family: dominant_mode_family
|
||||||
|
.as_ref()
|
||||||
|
.map(|(mode_family, _)| mode_family.clone()),
|
||||||
|
dominant_mode_family_count: dominant_mode_family
|
||||||
|
.map(|(_, count)| count)
|
||||||
|
.unwrap_or_default(),
|
||||||
|
dominant_first_triplet_dwords_hex: dominant_policy_tuple
|
||||||
|
.as_ref()
|
||||||
|
.map(|(first_triplet_dwords, _, _, _)| {
|
||||||
|
first_triplet_dwords
|
||||||
|
.iter()
|
||||||
|
.map(|value| format!("0x{value:08x}"))
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.unwrap_or_default(),
|
||||||
|
dominant_second_triplet_dwords_hex: dominant_policy_tuple
|
||||||
|
.as_ref()
|
||||||
|
.map(|(_, second_triplet_dwords, _, _)| {
|
||||||
|
second_triplet_dwords
|
||||||
|
.iter()
|
||||||
|
.map(|value| format!("0x{value:08x}"))
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.unwrap_or_default(),
|
||||||
|
dominant_trailing_word: dominant_policy_tuple
|
||||||
|
.map(|(_, _, trailing_word, _)| trailing_word),
|
||||||
|
dominant_trailing_word_hex: dominant_policy_tuple
|
||||||
|
.map(|(_, _, trailing_word, _)| format!("0x{trailing_word:04x}")),
|
||||||
|
dominant_policy_tuple_count: dominant_policy_tuple
|
||||||
|
.map(|(_, _, _, count)| count)
|
||||||
|
.unwrap_or_default(),
|
||||||
|
mode_family_counts: mode_family_counts
|
||||||
|
.into_iter()
|
||||||
|
.map(|(mode_family, count)| {
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeModeFamilyCount {
|
||||||
|
mode_family,
|
||||||
|
count,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
sample_rows: rows
|
||||||
|
.iter()
|
||||||
|
.take(8)
|
||||||
|
.enumerate()
|
||||||
|
.map(
|
||||||
|
|(
|
||||||
|
sample_index,
|
||||||
|
(
|
||||||
|
name_tag_relative_offset,
|
||||||
|
primary_name,
|
||||||
|
secondary_name,
|
||||||
|
first_triplet_dwords,
|
||||||
|
second_triplet_dwords,
|
||||||
|
trailing_word,
|
||||||
|
),
|
||||||
|
)| {
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferFixedPolicySample {
|
||||||
|
sample_index,
|
||||||
|
name_tag_relative_offset: *name_tag_relative_offset,
|
||||||
|
primary_name: primary_name.clone(),
|
||||||
|
secondary_name: secondary_name.clone(),
|
||||||
|
first_triplet_dwords_hex: first_triplet_dwords
|
||||||
|
.iter()
|
||||||
|
.map(|value| format!("0x{value:08x}"))
|
||||||
|
.collect(),
|
||||||
|
second_triplet_dwords_hex: second_triplet_dwords
|
||||||
|
.iter()
|
||||||
|
.map(|value| format!("0x{value:08x}"))
|
||||||
|
.collect(),
|
||||||
|
trailing_word: *trailing_word,
|
||||||
|
trailing_word_hex: format!("0x{trailing_word:04x}"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.take(8)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
let fixed_policy_summary =
|
let fixed_policy_summary =
|
||||||
Some(SmpSavePlacedStructureDynamicSideBufferFixedPolicySummary {
|
Some(SmpSavePlacedStructureDynamicSideBufferFixedPolicySummary {
|
||||||
row_count_with_0x1a_policy_chunk: fixed_policy_rows.len(),
|
row_count_with_0x1a_policy_chunk: fixed_policy_rows.len(),
|
||||||
|
|
@ -13561,6 +13986,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
dominant_trailing_word_count: dominant_fixed_policy_trailing_word
|
dominant_trailing_word_count: dominant_fixed_policy_trailing_word
|
||||||
.map(|(_, count)| count)
|
.map(|(_, count)| count)
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
|
compact_prefix_correlations: fixed_policy_compact_prefix_correlations,
|
||||||
sample_rows: fixed_policy_rows
|
sample_rows: fixed_policy_rows
|
||||||
.iter()
|
.iter()
|
||||||
.take(8)
|
.take(8)
|
||||||
|
|
@ -13572,6 +13998,9 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
name_tag_relative_offset,
|
name_tag_relative_offset,
|
||||||
primary_name,
|
primary_name,
|
||||||
secondary_name,
|
secondary_name,
|
||||||
|
_prefix_leading_dword,
|
||||||
|
_prefix_trailing_word,
|
||||||
|
_prefix_separator_byte,
|
||||||
first_triplet_dwords,
|
first_triplet_dwords,
|
||||||
second_triplet_dwords,
|
second_triplet_dwords,
|
||||||
trailing_word,
|
trailing_word,
|
||||||
|
|
@ -13619,13 +14048,19 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
.get(previous_index)
|
.get(previous_index)
|
||||||
.and_then(|row| row.profile_chunk_len_to_next_name_or_end)
|
.and_then(|row| row.profile_chunk_len_to_next_name_or_end)
|
||||||
}),
|
}),
|
||||||
|
row_index.checked_sub(1).and_then(|previous_index| {
|
||||||
|
payload_envelope_rows.get(previous_index).and_then(|row| {
|
||||||
|
row.short_profile_first_flag_byte
|
||||||
|
.zip(row.short_profile_second_flag_byte)
|
||||||
|
})
|
||||||
|
}),
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let mut name_prelude_candidate_pattern_counts = BTreeMap::<(u16, u8), usize>::new();
|
let mut name_prelude_candidate_pattern_counts = BTreeMap::<(u16, u8), usize>::new();
|
||||||
let mut name_prelude_child_count_counts = BTreeMap::<u16, usize>::new();
|
let mut name_prelude_child_count_counts = BTreeMap::<u16, usize>::new();
|
||||||
let mut name_prelude_saved_primary_counts = BTreeMap::<u8, usize>::new();
|
let mut name_prelude_saved_primary_counts = BTreeMap::<u8, usize>::new();
|
||||||
for (_, _, _, _, _, _, child_count_candidate, saved_primary_child_byte_candidate, _) in
|
for (_, _, _, _, _, _, child_count_candidate, saved_primary_child_byte_candidate, _, _) in
|
||||||
&name_prelude_candidate_rows
|
&name_prelude_candidate_rows
|
||||||
{
|
{
|
||||||
*name_prelude_candidate_pattern_counts
|
*name_prelude_candidate_pattern_counts
|
||||||
|
|
@ -13674,25 +14109,6 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
.then_with(|| right_key.cmp(left_key))
|
.then_with(|| right_key.cmp(left_key))
|
||||||
})
|
})
|
||||||
.map(|(value, count)| (*value, *count));
|
.map(|(value, count)| (*value, *count));
|
||||||
let classify_side_buffer_mode_family =
|
|
||||||
|primary_name: Option<&str>, secondary_name: Option<&str>| -> &'static str {
|
|
||||||
let name = primary_name.or(secondary_name).unwrap_or_default();
|
|
||||||
if name.starts_with("Bridge") {
|
|
||||||
"bridge"
|
|
||||||
} else if name.starts_with("Tunnel") {
|
|
||||||
"tunnel"
|
|
||||||
} else if name.starts_with("BallastCap") {
|
|
||||||
"ballast_cap"
|
|
||||||
} else if name.starts_with("TrackCap") {
|
|
||||||
"track_cap"
|
|
||||||
} else if name.starts_with("Overpass") {
|
|
||||||
"overpass"
|
|
||||||
} else if name.is_empty() {
|
|
||||||
"unknown"
|
|
||||||
} else {
|
|
||||||
"other"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let mut name_prelude_pattern_groups = BTreeMap::<
|
let mut name_prelude_pattern_groups = BTreeMap::<
|
||||||
(u16, u8),
|
(u16, u8),
|
||||||
Vec<(usize, Option<String>, Option<String>, Option<usize>)>,
|
Vec<(usize, Option<String>, Option<String>, Option<usize>)>,
|
||||||
|
|
@ -13707,6 +14123,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
child_count_candidate,
|
child_count_candidate,
|
||||||
saved_primary_child_byte_candidate,
|
saved_primary_child_byte_candidate,
|
||||||
previous_span,
|
previous_span,
|
||||||
|
_previous_short_profile_flag_pair,
|
||||||
) in &name_prelude_candidate_rows
|
) in &name_prelude_candidate_rows
|
||||||
{
|
{
|
||||||
name_prelude_pattern_groups
|
name_prelude_pattern_groups
|
||||||
|
|
@ -13864,6 +14281,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
child_count_candidate,
|
child_count_candidate,
|
||||||
saved_primary_child_byte_candidate,
|
saved_primary_child_byte_candidate,
|
||||||
previous_span,
|
previous_span,
|
||||||
|
_previous_short_profile_flag_pair,
|
||||||
) in &name_prelude_candidate_rows
|
) in &name_prelude_candidate_rows
|
||||||
{
|
{
|
||||||
if let Some(previous_span) = previous_span {
|
if let Some(previous_span) = previous_span {
|
||||||
|
|
@ -14081,7 +14499,15 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let mut name_prelude_compact_prefix_groups = BTreeMap::<
|
let mut name_prelude_compact_prefix_groups = BTreeMap::<
|
||||||
(u32, u16, u8),
|
(u32, u16, u8),
|
||||||
Vec<(usize, Option<String>, Option<String>, u16, u8, Option<usize>)>,
|
Vec<(
|
||||||
|
usize,
|
||||||
|
Option<String>,
|
||||||
|
Option<String>,
|
||||||
|
u16,
|
||||||
|
u8,
|
||||||
|
Option<usize>,
|
||||||
|
Option<(u8, u8)>,
|
||||||
|
)>,
|
||||||
>::new();
|
>::new();
|
||||||
for (
|
for (
|
||||||
name_tag_relative_offset,
|
name_tag_relative_offset,
|
||||||
|
|
@ -14093,6 +14519,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
child_count_candidate,
|
child_count_candidate,
|
||||||
saved_primary_child_byte_candidate,
|
saved_primary_child_byte_candidate,
|
||||||
previous_span,
|
previous_span,
|
||||||
|
previous_short_profile_flag_pair,
|
||||||
) in &name_prelude_candidate_rows
|
) in &name_prelude_candidate_rows
|
||||||
{
|
{
|
||||||
name_prelude_compact_prefix_groups
|
name_prelude_compact_prefix_groups
|
||||||
|
|
@ -14109,6 +14536,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
*child_count_candidate,
|
*child_count_candidate,
|
||||||
*saved_primary_child_byte_candidate,
|
*saved_primary_child_byte_candidate,
|
||||||
*previous_span,
|
*previous_span,
|
||||||
|
*previous_short_profile_flag_pair,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
let compact_prefix_correlations = name_prelude_compact_prefix_groups
|
let compact_prefix_correlations = name_prelude_compact_prefix_groups
|
||||||
|
|
@ -14123,6 +14551,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
let mut profile_span_counts = BTreeMap::<usize, usize>::new();
|
let mut profile_span_counts = BTreeMap::<usize, usize>::new();
|
||||||
let mut candidate_pattern_counts = BTreeMap::<(u16, u8), usize>::new();
|
let mut candidate_pattern_counts = BTreeMap::<(u16, u8), usize>::new();
|
||||||
let mut mode_family_counts = BTreeMap::<String, usize>::new();
|
let mut mode_family_counts = BTreeMap::<String, usize>::new();
|
||||||
|
let mut flag_pair_counts = BTreeMap::<(u8, u8), usize>::new();
|
||||||
for (
|
for (
|
||||||
_name_tag_relative_offset,
|
_name_tag_relative_offset,
|
||||||
primary_name,
|
primary_name,
|
||||||
|
|
@ -14130,6 +14559,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
child_count_candidate,
|
child_count_candidate,
|
||||||
saved_primary_child_byte_candidate,
|
saved_primary_child_byte_candidate,
|
||||||
previous_span,
|
previous_span,
|
||||||
|
previous_short_profile_flag_pair,
|
||||||
) in &rows
|
) in &rows
|
||||||
{
|
{
|
||||||
*name_pair_counts
|
*name_pair_counts
|
||||||
|
|
@ -14150,6 +14580,13 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
.to_string(),
|
.to_string(),
|
||||||
)
|
)
|
||||||
.or_default() += 1;
|
.or_default() += 1;
|
||||||
|
if let Some((first_flag_byte, second_flag_byte)) =
|
||||||
|
previous_short_profile_flag_pair
|
||||||
|
{
|
||||||
|
*flag_pair_counts
|
||||||
|
.entry((*first_flag_byte, *second_flag_byte))
|
||||||
|
.or_default() += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let dominant_name_pair = name_pair_counts
|
let dominant_name_pair = name_pair_counts
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -14264,6 +14701,22 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.collect(),
|
.collect(),
|
||||||
|
rows_with_previous_short_profile_flag_pair: flag_pair_counts
|
||||||
|
.values()
|
||||||
|
.copied()
|
||||||
|
.sum(),
|
||||||
|
previous_short_profile_flag_pair_counts: flag_pair_counts
|
||||||
|
.into_iter()
|
||||||
|
.map(|((first_flag_byte, second_flag_byte), count)| {
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixFlagPairCount {
|
||||||
|
first_flag_byte,
|
||||||
|
first_flag_byte_hex: format!("0x{first_flag_byte:02x}"),
|
||||||
|
second_flag_byte,
|
||||||
|
second_flag_byte_hex: format!("0x{second_flag_byte:02x}"),
|
||||||
|
count,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
sample_rows: rows
|
sample_rows: rows
|
||||||
.iter()
|
.iter()
|
||||||
.take(8)
|
.take(8)
|
||||||
|
|
@ -14278,6 +14731,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
child_count_candidate,
|
child_count_candidate,
|
||||||
saved_primary_child_byte_candidate,
|
saved_primary_child_byte_candidate,
|
||||||
previous_profile_chunk_len_to_next_name_or_end,
|
previous_profile_chunk_len_to_next_name_or_end,
|
||||||
|
_previous_short_profile_flag_pair,
|
||||||
),
|
),
|
||||||
)| {
|
)| {
|
||||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
||||||
|
|
@ -14343,6 +14797,7 @@ fn parse_save_placed_structure_dynamic_side_buffer_probe(
|
||||||
child_count_candidate,
|
child_count_candidate,
|
||||||
saved_primary_child_byte_candidate,
|
saved_primary_child_byte_candidate,
|
||||||
previous_profile_chunk_len_to_next_name_or_end,
|
previous_profile_chunk_len_to_next_name_or_end,
|
||||||
|
_previous_short_profile_flag_pair,
|
||||||
),
|
),
|
||||||
)| {
|
)| {
|
||||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCandidateSample {
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCandidateSample {
|
||||||
|
|
@ -25115,6 +25570,7 @@ mod tests {
|
||||||
dominant_trailing_word: Some(1),
|
dominant_trailing_word: Some(1),
|
||||||
dominant_trailing_word_hex: Some("0x0001".to_string()),
|
dominant_trailing_word_hex: Some("0x0001".to_string()),
|
||||||
dominant_trailing_word_count: 118,
|
dominant_trailing_word_count: 118,
|
||||||
|
compact_prefix_correlations: Vec::new(),
|
||||||
sample_rows: Vec::new(),
|
sample_rows: Vec::new(),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
@ -25414,6 +25870,16 @@ mod tests {
|
||||||
count: 17,
|
count: 17,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
rows_with_previous_short_profile_flag_pair: 17,
|
||||||
|
previous_short_profile_flag_pair_counts: vec![
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixFlagPairCount {
|
||||||
|
first_flag_byte: 0x00,
|
||||||
|
first_flag_byte_hex: "0x00".to_string(),
|
||||||
|
second_flag_byte: 0x01,
|
||||||
|
second_flag_byte_hex: "0x01".to_string(),
|
||||||
|
count: 17,
|
||||||
|
},
|
||||||
|
],
|
||||||
sample_rows: vec![
|
sample_rows: vec![
|
||||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
||||||
sample_index: 0,
|
sample_index: 0,
|
||||||
|
|
@ -25473,6 +25939,16 @@ mod tests {
|
||||||
count: 1,
|
count: 1,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
rows_with_previous_short_profile_flag_pair: 1,
|
||||||
|
previous_short_profile_flag_pair_counts: vec![
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixFlagPairCount {
|
||||||
|
first_flag_byte: 0x00,
|
||||||
|
first_flag_byte_hex: "0x00".to_string(),
|
||||||
|
second_flag_byte: 0x01,
|
||||||
|
second_flag_byte_hex: "0x01".to_string(),
|
||||||
|
count: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
sample_rows: vec![
|
sample_rows: vec![
|
||||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
||||||
sample_index: 0,
|
sample_index: 0,
|
||||||
|
|
@ -25532,6 +26008,16 @@ mod tests {
|
||||||
count: 2,
|
count: 2,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
rows_with_previous_short_profile_flag_pair: 2,
|
||||||
|
previous_short_profile_flag_pair_counts: vec![
|
||||||
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixFlagPairCount {
|
||||||
|
first_flag_byte: 0x00,
|
||||||
|
first_flag_byte_hex: "0x00".to_string(),
|
||||||
|
second_flag_byte: 0x01,
|
||||||
|
second_flag_byte_hex: "0x01".to_string(),
|
||||||
|
count: 2,
|
||||||
|
},
|
||||||
|
],
|
||||||
sample_rows: vec![
|
sample_rows: vec![
|
||||||
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
SmpSavePlacedStructureDynamicSideBufferNamePreludeCompactPrefixSample {
|
||||||
sample_index: 0,
|
sample_index: 0,
|
||||||
|
|
@ -25708,11 +26194,13 @@ mod tests {
|
||||||
trace.candidate_consumer_hypotheses[0]
|
trace.candidate_consumer_hypotheses[0]
|
||||||
.blockers
|
.blockers
|
||||||
.iter()
|
.iter()
|
||||||
.any(|line| line.contains("remaining mixed exact compact-prefix classes")
|
.any(
|
||||||
|
|line| line.contains("remaining mixed exact compact-prefix classes")
|
||||||
&& line.contains("0xff0000ff/0x0002/0xff is pure bridge")
|
&& line.contains("0xff0000ff/0x0002/0xff is pure bridge")
|
||||||
&& line.contains("0x0005d368/0x0001/0xff is pure track-cap")
|
&& line.contains("0x0005d368/0x0001/0xff is pure track-cap")
|
||||||
&& line.contains("0xff0000ff/0x0001/0xff")
|
&& line.contains("0xff0000ff/0x0001/0xff")
|
||||||
&& line.contains("0x000055f3/0x0001/0xff"))
|
&& line.contains("0x000055f3/0x0001/0xff")
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert!(
|
assert!(
|
||||||
trace.candidate_consumer_hypotheses[0]
|
trace.candidate_consumer_hypotheses[0]
|
||||||
|
|
@ -25880,18 +26368,22 @@ mod tests {
|
||||||
trace.candidate_consumer_hypotheses[0]
|
trace.candidate_consumer_hypotheses[0]
|
||||||
.evidence
|
.evidence
|
||||||
.iter()
|
.iter()
|
||||||
.any(|line| line.contains("objdump on 0x531030/0x5a464d/0x5a44a8")
|
.any(
|
||||||
|
|line| line.contains("objdump on 0x531030/0x5a464d/0x5a44a8")
|
||||||
&& line.contains("0x531030 just forwards")
|
&& line.contains("0x531030 just forwards")
|
||||||
&& line.contains("0x5a44a8 is the shared chunked stream write path"))
|
&& line.contains("0x5a44a8 is the shared chunked stream write path")
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert!(
|
assert!(
|
||||||
trace.candidate_consumer_hypotheses[0]
|
trace.candidate_consumer_hypotheses[0]
|
||||||
.evidence
|
.evidence
|
||||||
.iter()
|
.iter()
|
||||||
.any(|line| line.contains("cannot come from selector-copy state alone")
|
.any(
|
||||||
|
|line| line.contains("cannot come from selector-copy state alone")
|
||||||
&& line.contains("0xff0000ff/0x0001/0xff")
|
&& line.contains("0xff0000ff/0x0001/0xff")
|
||||||
&& line.contains("dominant TrackCap rows")
|
&& line.contains("dominant TrackCap rows")
|
||||||
&& line.contains("tunnel residue"))
|
&& line.contains("tunnel residue")
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert!(
|
assert!(
|
||||||
trace.candidate_consumer_hypotheses[0]
|
trace.candidate_consumer_hypotheses[0]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue