⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.h

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 H
字号:
//// function.h//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Curtis Janssen <cljanss@limitpt.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#ifdef __GNUC__#pragma interface#endif#ifndef _math_optimize_function_h#define _math_optimize_function_h#include <math.h>#include <float.h>#include <util/state/state.h>#include <math/optimize/transform.h>#include <math/scmat/matrix.h>#include <math/scmat/result.h>namespace sc {/** The Function class is an abstract base class that,    given a set of coordinates, will compute a value and possibly    a gradient and hessian at that point. */class Function: virtual public SavableState, public Compute {  protected:    Ref<SCMatrixKit> matrixkit_;          ///< Used to construct new matrices.    RefSCVector x_;                     ///< The variables.    RefSCDimension dim_;                ///< The dimension of x_.    AccResultdouble value_;             ///< The value of the function at x_.    AccResultRefSCVector gradient_;     ///< The gradient at x_    AccResultRefSymmSCMatrix hessian_;  ///< The hessian at x_.    /** @name Update Members        Update the various computable results.    */    //@{    virtual void set_value(double);    virtual void set_gradient(RefSCVector&);    virtual void set_hessian(RefSymmSCMatrix&);    //@}    /** Set the SCMatrixKit that should be used to        construct the requisite vectors and matrices. */    virtual void set_matrixkit(const Ref<SCMatrixKit>&);    virtual void set_dimension(const RefSCDimension&);    /** @name Accuracy Setting Members        Set the accuracies with which the various computables        have been computed. */    //@{    virtual void set_actual_value_accuracy(double);    virtual void set_actual_gradient_accuracy(double);    virtual void set_actual_hessian_accuracy(double);    //@}    /// Get read/write access to the coordinates for modification.    RefSCVector& get_x_reference() { obsolete(); return x_; }    /** Change the coordinate system and apply the given transform to        intermediates matrices and vectors. */    void do_change_coordinates(const Ref<NonlinearTransform>&);  public:    Function();    Function(StateIn&);    Function(const Function&);    /** The keyval constructor reads the following keywords:        <dl>        <dt><tt>matrixkit</tt><dd> Gives a SCMatrixKit        object.  If it is not specified, a default SCMatrixKit is selected.        <dt><tt>value_accuracy</tt><dd> Sets the accuracy to which values are        computed.  The default is the machine accuracy.        <dt><tt>gradient_accuracy</tt><dd> Sets the accuracy to which        gradients are computed.  The default is the machine accuracy.        <dt><tt>hessian_accuracy</tt><dd> Sets the accuracy to which        hessians are computed.  The default is the machine accuracy.        </dl> */    Function(const Ref<KeyVal>&, double funcacc = DBL_EPSILON,             double gradacc = DBL_EPSILON, double hessacc = DBL_EPSILON);    virtual ~Function();    Function & operator=(const Function&);    /** Return the SCMatrixKit used to construct        vectors and matrices. */    Ref<SCMatrixKit> matrixkit() const;    /// Return the SCDimension of the problem.    RefSCDimension dimension() const;    virtual void save_data_state(StateOut&);    /// Return the value of the function.    virtual double value();    /// Returns nonzero if the current value is not up-to-date.    int value_needed() const;    /** If passed a nonzero number, compute the value the next        time compute() is called.  Return a nonzero number        if the value was previously to be computed. */    int do_value(int);    AccResultdouble& value_result() { return value_; }    /// Set the accuracy to which the value is to be computed.    virtual void set_desired_value_accuracy(double);    /// Return the accuracy with which the value has been computed.    virtual double actual_value_accuracy() const;    /// Return the accuracy with which the value is to be computed.    virtual double desired_value_accuracy() const;    /** @name Gradient Members        These are analogous to the routines that deal with values,        but work with gradients instead. */    //@{    virtual RefSCVector gradient();    int gradient_needed() const;    int do_gradient(int);    virtual void set_desired_gradient_accuracy(double);    virtual double actual_gradient_accuracy() const;    virtual double desired_gradient_accuracy() const;    AccResultRefSCVector& gradient_result() { return gradient_; }    //@}    /** @name Hessian Members        These are analogous to the routines that deal with values,        but work with the hessian instead. */    //@{    virtual RefSymmSCMatrix hessian();    int hessian_needed() const;    int do_hessian(int);    virtual void set_desired_hessian_accuracy(double);    virtual double actual_hessian_accuracy() const;    virtual double desired_hessian_accuracy() const;    AccResultRefSymmSCMatrix& hessian_result() { return hessian_; }    //@}    // hessian by gradients at finite displacements    // virtual RefSCMatrix fd1_hessian();    /// Compute a quick, approximate hessian.    virtual void guess_hessian(RefSymmSCMatrix&);    virtual RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);    /** Information about the availability of values, gradients,        and hessians. */    virtual int value_implemented() const;    virtual int gradient_implemented() const;    virtual int hessian_implemented() const;    /// Set and retrieve the coordinate values.    virtual void set_x(const RefSCVector&);    RefSCVector get_x() const { return x_.copy(); }    const RefSCVector& get_x_no_copy() const { return x_; }    /** An optimizer can call change coordinates periodically to give the        function an opportunity to change its coordinate system.  A return        value of 0 means the coordinates were not changed.  Otherwise, a        transform object to the new coordinate system is return.  The        function object applies the transform to any objects it contains.        This will obsolete the function data. */    virtual Ref<NonlinearTransform> change_coordinates();    /// Print information about the object.    virtual void print(std::ostream& = ExEnv::out0()) const;};}#endif// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -