179 lines
3.6 KiB
C
179 lines
3.6 KiB
C
|
/*-----------------------------------------------------------------------------
|
||
|
| Copyright (c) 2013-2017, Nucleic Development Team.
|
||
|
|
|
||
|
| Distributed under the terms of the Modified BSD License.
|
||
|
|
|
||
|
| The full license is in the file LICENSE, 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
|