-
Notifications
You must be signed in to change notification settings - Fork 518
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Greybox Objectives #3364
base: main
Are you sure you want to change the base?
Greybox Objectives #3364
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I haven't reviewed changes in _evaluate_hessian_if_necessary_and_cache
yet, but this looks fine.
Just curious, what is the motivation for doing this instead of just using outputs and putting them in the objective? Is there some motivating use case where this works better?
input_values | ||
""" | ||
raise NotImplementedError( | ||
'evaluate_objective called but not ' 'implemented in the derived class.' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you fix black's weird auto-formatting here?
return self._pyomo_nlp.evaluate_objective() | ||
obj = 0 | ||
for nlp in self._nlps: | ||
obj += nlp.evaluate_objective() | ||
return obj | ||
|
||
# overloaded from NLP | ||
def evaluate_grad_objective(self, out=None): | ||
return self._pyomo_nlp.evaluate_grad_objective(out=out) | ||
ret = np.zeros(self.n_primals(), dtype=float) | ||
for nlp in self._nlps: | ||
ret += nlp.evaluate_grad_objective() | ||
|
||
if out is not None: | ||
ret.copyto(out) | ||
return out | ||
|
||
return ret |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we want to sum multiple objectives? At first thought, it seems like we should only allow one objective to be implemented. If each grey box intends to implement an objective term, maybe the methods on ExternalGreyBoxModel
should be called e.g. evaluate_objective_term
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with Robby in principle that I don't always want to sum my objectives. But am happy to accept this as a first pass
This is me. For applications I work with, it's common for people to just come with a black box and say "minimize". Clearly that approach is not ideal, but allowing this capability will enable us to reach out to people who are used to doing optimization that way and help us convert them to the light side of the force... |
Okay, so this is basically just for convenience.
I don't think it's clear at all. I'm usually a fan of eliminating auxiliary variables where possible, so this approach appeals to me. I was just curious if there was an example where it actually mattered for performance or reliability. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, will test functionality over the next few weeks
It is not ideal in the context of it hides structure I could potentially implement in my optimization problem. IE, what if my black box is hiding a convex optimization problem? But yea, it is a matter of convenience not performance. |
@michaelbynum , @Robbybp - We are hoping to cut a patch release on Monday (the 14th). Any chance this is going to make it into that? |
Summary/Motivation:
This PR adds support for objectives in PyNumero grey box models.
Legal Acknowledgement
By contributing to this software project, I have read the contribution guide and agree to the following terms and conditions for my contribution: