//#####################################################################
// Copyright 2002-2007, Ronald Fedkiw, Geoffrey Irving, Neil Molino, Craig Schroeder, Tamar Shinar.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class NONLINEAR_FUNCTION
//#####################################################################
#ifndef __NONLINEAR_FUNCTION__
#define __NONLINEAR_FUNCTION__

#include <functional>
namespace PhysBAM{

template<class F> class NONLINEAR_FUNCTION;
template<class T> class KRYLOV_SYSTEM_BASE;
template<class T> class KRYLOV_VECTOR_BASE;

template<class T>
class NONLINEAR_FUNCTION<T(KRYLOV_VECTOR_BASE<T>&)>
{
public:
    virtual ~NONLINEAR_FUNCTION();
//#####################################################################
    virtual void Compute(const KRYLOV_VECTOR_BASE<T>& x,KRYLOV_SYSTEM_BASE<T>* h,
        KRYLOV_VECTOR_BASE<T>* g,T* e) const=0;
    virtual T operator()(const KRYLOV_VECTOR_BASE<T>& x) const;
    void Test(const KRYLOV_VECTOR_BASE<T>& x,KRYLOV_SYSTEM_BASE<T>& h,
        const char* name_f,const char* name_df,bool project_dx=true,
        std::function<void(KRYLOV_VECTOR_BASE<T>& x)> make_feasible=0) const;
    virtual void Make_Feasible(KRYLOV_VECTOR_BASE<T>& x) const;
//#####################################################################
};
}
#endif
