/*
 * Project: MoleCuilder
 * Description: creates and alters molecular systems
 * Copyright (C)  2010-2012 University of Bonn. All rights reserved.
 * 
 *
 *   This file is part of MoleCuilder.
 *
 *    MoleCuilder 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 2 of the License, or
 *    (at your option) any later version.
 *
 *    MoleCuilder 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 MoleCuilder.  If not, see .
 */
/*
 * MpqcParser_Parameters.cpp
 *
 *  Created on: Feb 3, 2011
 *      Author: heber
 */
// include config.h
#ifdef HAVE_CONFIG_H
#include 
#endif
//#include "CodePatterns/MemDebug.hpp"
#include 
#include "CodePatterns/Log.hpp"
#include "MpqcParser_Parameters.hpp"
#include "Parameters/Parameter.hpp"
MpqcParser_Parameters::MpqcParser_Parameters()
{
  Init();
}
void MpqcParser_Parameters::Init()
{
  // add all known basis
  initBasis();
  // add all parameter names
  {
    ParamNames.clear();
    ParamNames.resize(unknownParam);
    ParamNames[hessianParam] = "Hessian";
    ParamNames[savestateParam] = "savestate";
    ParamNames[do_gradientParam] = "do_gradient";
    ParamNames[maxiterParam] = "maxiter";
    ParamNames[memoryParam] = "memory";
    ParamNames[stdapproxParam] = "stdapprox";
    ParamNames[nfzcParam] = "nfzc";
    ParamNames[basisParam] = "basis";
    ParamNames[aux_basisParam] = "aux_basis";
    ParamNames[integrationParam] = "integration";
    ParamNames[theoryParam] = "theory";
    ParamNames[jobtypeParam] = "jobtype";
  }
  // create theory parameter
  {
    ValidTheories.clear();
    ValidTheories.resize(unknownTheory);
    ValidTheories[CLHF]="CLHF";
    ValidTheories[CLKS]="CLKS";
    ValidTheories[MBPT2]="MBPT2";
    ValidTheories[MBPT2_R12]="MBPT2_R12";
    appendParameter(
        new Parameter(
            ParamNames[theoryParam],
            ValidTheories,
            ValidTheories[MBPT2]));
  }
  //InvertMap(TheoryNames,TheoryLookup);
  // create Jobs parameter
  {
    ValidJobtypes.clear();
    ValidJobtypes.resize(unknownJob);
    ValidJobtypes[Default]="Default";
    ValidJobtypes[Optimization]="Optimization";
    appendParameter(
        new Parameter(
            ParamNames[jobtypeParam],
            ValidJobtypes,
            ValidJobtypes[Default]));
  }
  // create integration parameter
  {
    ValidIntegrationMethods.clear();
    ValidIntegrationMethods.resize(unknownIntegration);
    ValidIntegrationMethods[IntegralCints] = "IntegralCints";
    appendParameter(
        new Parameter(
            ParamNames[integrationParam],
            ValidIntegrationMethods,
            ValidIntegrationMethods[IntegralCints]));
  }
  // create hessian, savestate, do_gradient parameter
  {
    ValidBools.clear();
    ValidBools.resize(unknownBool);
    ValidBools[no]="no";
    ValidBools[yes]="yes";
    appendParameter(
        new Parameter(
            ParamNames[hessianParam],
            ValidBools,
            ValidBools[no]));
    appendParameter(
        new Parameter(
            ParamNames[savestateParam],
            ValidBools,
            ValidBools[no]));
    appendParameter(
        new Parameter(
            ParamNames[do_gradientParam],
            ValidBools,
            ValidBools[true]));
  }
  // add all continuous parameters
  {
    appendParameter(new Parameter(ParamNames[maxiterParam], 1000));
    appendParameter(new Parameter(ParamNames[memoryParam], 16000000));
    appendParameter(new Parameter(ParamNames[stdapproxParam], "A'"));
    appendParameter(new Parameter(ParamNames[nfzcParam], 1));
    appendParameter(new Parameter(ParamNames[basisParam], "3-21G"));
    appendParameter(new Parameter(ParamNames[aux_basisParam], "aug-cc-pVDZ"));
  }
}
MpqcParser_Parameters::~MpqcParser_Parameters()
{}
/** Getter for a specific Parameter.
 *
 * @param param index among enum Parameters
 * @return value of the desired Parameters
 */
const std::string MpqcParser_Parameters::getParameter(const enum Parameters param) const
{
  return FormatParser_Parameters::getParameter(ParamNames[param])->getAsString();
}
/** Setter for a specific Parameter.
 *
 * @param param index among enum Parameters
 * @param _value value to set desired Parameter to
 */
void MpqcParser_Parameters::setParameter(const enum Parameters param, const std::string &_value)
{
  const std::string &name = getParameterName(param);
  FormatParser_Parameters::getParameter(name)->setAsString(_value);
}
/** Getter for name of a specific Parameter.
 *
 * @param param index among enum Parameters
 * @return name of the desired Parameter
 */
const std::string &MpqcParser_Parameters::getParameterName(const enum Parameters param) const
{
  return ParamNames[param];
}
/** Getter for name of a specific Parameter.
 *
 * @param param index among enum Theory
 * @return name of the desired Theory
 */
const std::string &MpqcParser_Parameters::getTheoryName(const enum Theory theory) const
{
  return ValidTheories[theory];
}
/** Getter for name of a specific Parameter.
 *
 * @param param index among enum Jobtype
 * @return name of the desired Jobtype
 */
const std::string &MpqcParser_Parameters::getJobtypeName(const enum Jobtype jobtype) const
{
  return ValidJobtypes[jobtype];
}
/** Getter for the name of specific of IntegrationMethod.
 *
 * @param param index among enum IntegrationMethod
 * @return value of the desired IntegrationMethod
 */
const std::string &MpqcParser_Parameters::getIntegrationMethodName(const enum IntegrationMethod integration) const
{
  return ValidIntegrationMethods[integration];
}
/** Checks whether all elements in the world also have parameters in the basis.
 *
 * @return true - all elements parametrized, false - at least one element is missing.
 */
bool MpqcParser_Parameters::checkWorldElementsAgainstCurrentBasis() const
{
  ELOG(0, "MpqcParser_Parameters::checkWorldElementsAgainstCurrentBasis() - not implemented yet.");
  return false;
}