Skip to content

Add support for token weights during fuzzing - #206

Merged
Matthew Parkinson (mjp41) merged 9 commits into
microsoft:mainfrom
EliasC:features/weights
Oct 2, 2026
Merged

Matthew Parkinson (mjp41) merged 9 commits into
microsoft:mainfrom
EliasC:features/weights

Conversation

@EliasC

Copy link
Copy Markdown
Collaborator

This PR adds support for supplying token weights to the fuzzer. The weights are supplied as a map from tokens to integers and unmapped tokens defaults to 1. The driver CLI has been extended:

$ ./infix_trieste test --weights infix-int 2 infix-output 0
# prefer integers, exclude output statements

Note that setting a weight to zero may cause generation to abort with an exception if there is no viable option for a choice. I thought about checking for that up front (either checking for paths in the WF spec that lead to dead choices, or propagating dead choices upwards so that the path cannot happen), but I think the benefit doesn't outweigh the benefits in this case.

A possible future thing to add would be an automatic tuning of the weights based on the patterns of a pass: if the patterns have In(Foo) and T(Bar) that suggests that we should increase the weights of Foo and Bar. Preliminary experiments suggests that this reduces the number of trivial trees (trees that do not match a single rule).

Comment thread include/trieste/wf.h Outdated
[&](const Token& t) {
return static_cast<double>(weight_for(t));
});
return choose_weighted(tokens, std::move(offsets), parent, depth);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably doesn't mater, but I wonder if some of the calculation of weights for wf entry should be done once. My quick reading of this implies you calculate the cumulative distribution each time you select an element?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! Adressed in new (force pushed) version

Comment thread include/trieste/wf.h
Comment on lines +153 to +154
std::partial_sum(offsets.begin(), offsets.end(), offsets.begin());
return choose_from_cumulative(tokens, offsets, parent, depth);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very minor bit, here you rewrite the offsets vector to a cumulative vector in place. That it keeps the same name was slightly confusing to me.

@mjp41 Matthew Parkinson (mjp41) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@mjp41
Matthew Parkinson (mjp41) merged commit 4d29d2d into microsoft:main Oct 2, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants