123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /*-----------------------------------------------------------------------------
- | Copyright (c) 2013-2017, Nucleic Development Team.
- |
- | Distributed under the terms of the Modified BSD License.
- |
- | The full license is in the file COPYING.txt, distributed with this software.
- |----------------------------------------------------------------------------*/
- #pragma once
- #include "constraint.h"
- #include "debug.h"
- #include "solverimpl.h"
- #include "strength.h"
- #include "variable.h"
- namespace kiwi
- {
- class Solver
- {
- public:
- Solver() {}
- ~Solver() {}
- /* Add a constraint to the solver.
- Throws
- ------
- DuplicateConstraint
- The given constraint has already been added to the solver.
- UnsatisfiableConstraint
- The given constraint is required and cannot be satisfied.
- */
- void addConstraint( const Constraint& constraint )
- {
- m_impl.addConstraint( constraint );
- }
- /* Remove a constraint from the solver.
- Throws
- ------
- UnknownConstraint
- The given constraint has not been added to the solver.
- */
- void removeConstraint( const Constraint& constraint )
- {
- m_impl.removeConstraint( constraint );
- }
- /* Test whether a constraint has been added to the solver.
- */
- bool hasConstraint( const Constraint& constraint ) const
- {
- return m_impl.hasConstraint( constraint );
- }
- /* Add an edit variable to the solver.
- This method should be called before the `suggestValue` method is
- used to supply a suggested value for the given edit variable.
- Throws
- ------
- DuplicateEditVariable
- The given edit variable has already been added to the solver.
- BadRequiredStrength
- The given strength is >= required.
- */
- void addEditVariable( const Variable& variable, double strength )
- {
- m_impl.addEditVariable( variable, strength );
- }
- /* Remove an edit variable from the solver.
- Throws
- ------
- UnknownEditVariable
- The given edit variable has not been added to the solver.
- */
- void removeEditVariable( const Variable& variable )
- {
- m_impl.removeEditVariable( variable );
- }
- /* Test whether an edit variable has been added to the solver.
- */
- bool hasEditVariable( const Variable& variable ) const
- {
- return m_impl.hasEditVariable( variable );
- }
- /* Suggest a value for the given edit variable.
- This method should be used after an edit variable as been added to
- the solver in order to suggest the value for that variable. After
- all suggestions have been made, the `solve` method can be used to
- update the values of all variables.
- Throws
- ------
- UnknownEditVariable
- The given edit variable has not been added to the solver.
- */
- void suggestValue( const Variable& variable, double value )
- {
- m_impl.suggestValue( variable, value );
- }
- /* Update the values of the external solver variables.
- */
- void updateVariables()
- {
- m_impl.updateVariables();
- }
- /* Reset the solver to the empty starting condition.
- This method resets the internal solver state to the empty starting
- condition, as if no constraints or edit variables have been added.
- This can be faster than deleting the solver and creating a new one
- when the entire system must change, since it can avoid unecessary
- heap (de)allocations.
- */
- void reset()
- {
- m_impl.reset();
- }
- /* Dump a representation of the solver internals to stdout.
- */
- void dump()
- {
- debug::dump( m_impl );
- }
- /* Dump a representation of the solver internals to a stream.
- */
- void dump( std::ostream& out )
- {
- debug::dump( m_impl, out );
- }
- /* Dump a representation of the solver internals to a string.
- */
- std::string dumps()
- {
- return debug::dumps( m_impl );
- }
- private:
- Solver( const Solver& );
- Solver& operator=( const Solver& );
- impl::SolverImpl m_impl;
- };
- } // namespace kiwi
|