BayesOpt / include / mean_atomic.hpp

Ruben Martinez-C… 6862528 






















Ruben Martinez-C… 1f47f4c 

Ruben Martinez-C… 6862528 



Ruben Martinez-C… 2862636 

Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 





Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 





Ruben Martinez-C… 71d10a5 
Ruben Martinez-C… 2862636 
Ruben Martinez-C… 71d10a5 





Ruben Martinez-C… 2862636 
Ruben Martinez-C… 71d10a5 
Ruben Martinez-C… 2862636 










Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 



Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 



Ruben Martinez-C… 71d10a5 
Ruben Martinez-C… 2862636 




Ruben Martinez-C… 6862528 

Ruben Martinez-C… 2862636 






Ruben Martinez-C… 71d10a5 
Ruben Martinez-C… 2862636 





Ruben Martinez-C… 6862528 

Ruben Martinez-C… 2862636 














Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 



Ruben Martinez-C… 1f47f4c 
Ruben Martinez-C… 2862636 










Ruben Martinez-C… 1f47f4c 
Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 



Ruben Martinez-C… 1f47f4c 
Ruben Martinez-C… 2862636 







Ruben Martinez-C… 71d10a5 
Ruben Martinez-C… 2862636 
Ruben Martinez-C… 71d10a5 





Ruben Martinez-C… 2862636 


Ruben Martinez-C… 71d10a5 
Ruben Martinez-C… 2862636 
















Ruben Martinez-C… 1f47f4c 
Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 
Ruben Martinez-C… 6862528 
Ruben Martinez-C… 2862636 
Ruben Martinez-C… 6862528 
/** \file mean_atomic.hpp \brief Atomic (simple) parametric functions */
/*
-------------------------------------------------------------------------
   This file is part of BayesOpt, an efficient C++ library for 
   Bayesian optimization.

   Copyright (C) 2011-2013 Ruben Martinez-Cantin <rmcantin@unizar.es>
 
   BayesOpt is free software: you can redistribute it and/or modify it 
   under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   BayesOpt 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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with BayesOpt.  If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------------
*/

#ifndef  _MEAN_ATOMIC_HPP_
#define  _MEAN_ATOMIC_HPP__

#include <boost/numeric/ublas/vector_proxy.hpp>
#include "mean_functors.hpp"

namespace bayesopt
{

  /**\addtogroup ParametricFunctions
   * @{
   */

  /** \brief Abstract class for an atomic kernel */
  class AtomicFunction : public ParametricFunction
  {
  public:
    virtual int init(size_t input_dim)
    {
      n_inputs = input_dim;
      return 0;
    };
    int setParameters(const vectord &theta) 
    {
      if(theta.size() != n_params)
	{
	  FILE_LOG(logERROR) << "Wrong number of mean function parameters"; 
	  return -1; 
	}
   
      mParameters = theta;
      return 0;
    };
    vectord getParameters() {return mParameters;};
    size_t nParameters() {return n_params;};
    size_t nFeatures() {return n_features;};

    virtual ~AtomicFunction(){};

  protected:
    size_t n_params;
    size_t n_features;
    vectord mParameters;
  };


  /** \brief Constant zero function */
  class ZeroFunction: public AtomicFunction
  {
  public:
    int init(size_t input_dim)
    {
      n_inputs = input_dim;
      n_params = 1;
      n_features = 1;
      return 0;
    };
    double getMean (const vectord& x) { return 0.0; };
    vectord getFeatures(const vectord& x) { return zvectord(1); };  
  };

  /** \brief Constant one function */
  class OneFunction: public AtomicFunction
  {
  public:
    int init(size_t input_dim)
    {
      n_inputs = input_dim;
      n_params = 1;
      n_features = 1;
      return 0;
    };
    double getMean (const vectord& x) { return 1.0; };
    vectord getFeatures(const vectord& x) { return svectord(1,1.0); };  
  };


  /** \brief Constant function. 
      The first parameter indicates the constant value. */
  class ConstantFunction: public AtomicFunction
  {
  public:
    int init(size_t input_dim)
    {
      n_inputs = input_dim;
      n_params = 1;
      n_features = 1;
      return 0;
    };
    double getMean (const vectord& x) { return mParameters(0); };
    vectord getFeatures(const vectord& x) { return svectord(1,1.0); };  
  };


  /** \brief Linear combination function. 
      Each parameter indicates the coefficient of each dimension. */
  class LinearFunction: public AtomicFunction
  {
  public:
    int init(size_t input_dim)
    {
      n_inputs = input_dim;
      n_params = input_dim;
      n_features = input_dim;
      return 0;
    };
    double getMean (const vectord& x)
    { return boost::numeric::ublas::inner_prod(x,mParameters);  };
    vectord getFeatures(const vectord& x) { return x; };  
  };


  /** \brief Linear combination plus constant function. 
      The first parameter indicates the constant value. */
  class LinearPlusConstantFunction: public AtomicFunction
  {
  public:
    int init(size_t input_dim)
    {
      n_inputs = input_dim;
      n_params = input_dim + 1;
      n_features = input_dim + 1;
      return 0;
    };
    int setParameters(const vectord& params)
    { 
      if(params.size() != n_params)
	{
	  FILE_LOG(logERROR) << "Wrong number of mean function parameters"; 
	  return -1; 
	}

      mConstParam = params(0);
      mParameters = boost::numeric::ublas::project(params, 
						   boost::numeric::ublas::range(1, params.size())); 
      return 0;
    };
  
    double getMean (const vectord& x)
    { return boost::numeric::ublas::inner_prod(x,mParameters) + mConstParam;  };

    vectord getFeatures(const vectord& x) 
    {
      using boost::numeric::ublas::range;
      using boost::numeric::ublas::project;
      vectord res(x.size()+1);
      res(0) = 1;
      project(res,range(1,res.size())) = x;
      return res; 
    };  

  protected:
    double mConstParam;
  };

  //@}

} //namespace bayesopt

#endif
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.