Skip to content

Make State a class and add Graph::mutated() - #589

Open
wbernoudy wants to merge 3 commits into
dwavesystems:mainfrom
wbernoudy:feature/graph-mutated-nodes
Open

Make State a class and add Graph::mutated()#589
wbernoudy wants to merge 3 commits into
dwavesystems:mainfrom
wbernoudy:feature/graph-mutated-nodes

Conversation

@wbernoudy

Copy link
Copy Markdown
Member

What does this implement/fix?

This PR adds the Graph::mutated() method which returns the list of decision nodes with "pending" changes (see docstring for more details). It also makes State a class rather than an alias to a vector of data pointers in order to help implement Graph::mutated().

Additional information

For now, I left the implementation of Graph::mutated() simple, and it will return only decision nodes, and not specific successors of DisjointListsNode and DisjointBitSetsNode. However, if we plan to use this directly with descendants()/propagate() etc., we may need to consider returning specific successors because of the known performance hit on models with large amounts of lists/sets on individual DisjointListsNode/DisjointBitSetsNodes.

AI Generation Disclosure

No AI tools used

struct Decision {};

class Graph {
friend class State;

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.

I don't think we need this?

return node_data_[index];
}

void resize(ssize_t size) { node_data_.resize(size); }

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.

Since we're granting friendship to Graph, do we want to make this private?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Looks like this is used by the cython as well (e.g. https://github.com/dwavesystems/dwave-optimization/blob/master/dwave/optimization/states.pyx#L305). Perhaps we could change the behavior of Graph::initialize_state(State&) to resize the state if the given size is zero?

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.

Ok, I am fine to leave this here then.

}

std::span<const DecisionNode*> Graph::mutated(State& state) const {
// We will want to eventually replace this implementation with an approach where

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.

IMO we want to do this as part of this PR. Probably means keeping a boolean array of flags as well to determine which decisions have already been added?

friend class Graph;

public:
State(ssize_t size = 0) : node_data_(size) {}

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.

Do we want to make the constructors private since we're granting friendship to Graph? We might want to leave the default (empty) constructor public for Cython reasons.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Yes, makes sense to me, I will split the empty constructor out.


void resize(ssize_t size) { node_data_.resize(size); }

ssize_t size() const { return node_data_.size(); }

@arcondello arcondello Aug 4, 2026

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.

Need to include dwave-optimization/common.hpp for ssize_t, this will fix the current windows CI failures.

@wbernoudy
wbernoudy force-pushed the feature/graph-mutated-nodes branch from 07ce407 to 423b6f4 Compare August 10, 2026 21:12
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