Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into cudatoolkit
Browse files Browse the repository at this point in the history
  • Loading branch information
ye-luo committed Sep 29, 2021
2 parents 57e55d3 + ed14d86 commit 81457ad
Show file tree
Hide file tree
Showing 16 changed files with 345 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/Estimators/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ set(QMCEST_SRC
OperatorEstBase.cpp
SpinDensityNew.cpp
MomentumDistribution.cpp
)
OneBodyDensityMatricesInput.cpp)

####################################
# create libqmcestimators
Expand Down
6 changes: 2 additions & 4 deletions src/Estimators/InputSection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ void InputSection::readXML(xmlNodePtr cur)

// check input validity
check_valid();

//report();
}

Expand All @@ -79,7 +78,6 @@ void InputSection::init(const std::unordered_map<std::string, std::any>& init_va

// check input validity
check_valid();

//report();
}

Expand All @@ -91,7 +89,6 @@ void InputSection::set_defaults()
set_from_value(name, default_value);
}


void InputSection::set_from_stream(const std::string& name, std::istringstream& svalue)
{
if (is_string(name))
Expand Down Expand Up @@ -158,7 +155,8 @@ void InputSection::check_valid()
<< " has not been assigned\n";
throw UniformCommunicateError(error.str());
}
}
this->checkParticularValidity();
};


void InputSection::report() const
Expand Down
9 changes: 8 additions & 1 deletion src/Estimators/InputSection.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class InputSection
// Enable read-only access to variable values.
// Needs updating to allow copy-less return.
template<typename T>
T get(const std::string& name) const
const T get(const std::string& name) const
{
return std::any_cast<T>(values.at(name));
}
Expand All @@ -74,6 +74,13 @@ class InputSection
// Initialize from unordered_map/initializer list
void init(const std::unordered_map<std::string, std::any>& init_values);

protected:
/** Do validation for a particular subtype of InputSection
* Called by check_valid.
* Default implementation is noop
*/
virtual void checkParticularValidity() {}

private:
// Query functions
bool is_attribute(const std::string& name) const { return attributes.find(name) != attributes.end(); }
Expand Down
42 changes: 42 additions & 0 deletions src/Estimators/OneBodyDensityMatricesInput.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//////////////////////////////////////////////////////////////////////////////////////
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2021 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//
// Some code refactored from: DensityMatrices1b.cpp
//////////////////////////////////////////////////////////////////////////////////////

#include "string_utils.h"
#include "OneBodyDensityMatricesInput.h"

namespace qmcplusplus
{

OneBodyDensityMatricesInput::OneBodyDensityMatricesInput(){};
OneBodyDensityMatricesInput::OneBodyDensityMatricesInput(xmlNodePtr cur)
{
// This results in checkParticularValidity being called on OneBodyDensityMatrixInputSection
input_section_.readXML(cur);
}

void OneBodyDensityMatricesInput::OneBodyDensityMatrixInputSection::checkParticularValidity()
{
if (has("scale"))
{
Real scale = get<Real>("scale");
std::cout << "SCALE is :" << scale << '\n';
if (scale > 1.0 + 1e-10)
throw UniformCommunicateError("OneBodyDensityMatrices input: scale must be less than one");
else if (scale < 0.0 - 1e-10)
throw UniformCommunicateError("OneBodyDensityMatrices input: scale must be greater than zero");
}
std::string basis_str = get<std::string>("basis");
auto basis_set_names = split(basis_str);
if (basis_set_names.size() == 0 || basis_set_names[0].size() == 0)
throw UniformCommunicateError("OneBodyDensityMatrices input: basis must have at least one sposet");
}

} // namespace qmcplusplus
120 changes: 120 additions & 0 deletions src/Estimators/OneBodyDensityMatricesInput.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
//////////////////////////////////////////////////////////////////////////////////////
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2021 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//
// Some code refactored from: DensityMatrices1b.h
//////////////////////////////////////////////////////////////////////////////////////

#ifndef QMCPLUSPLUS_ONE_BODY_DENSITY_MATRICES_INPUT_H
#define QMCPLUSPLUS_ONE_BODY_DENSITY_MATRICES_INPUT_H

#include "Configuration.h"
#include "InputSection.h"

namespace qmcplusplus
{
/** Native representation for DensityMatrices1B Estimator's inputs
*/
class OneBodyDensityMatricesInput
{
public:
enum class Integrators
{
UNIFORM_GRID,
UNIFORM,
DENSITY,
NO_INTEGRATOR
};

enum class Evaluators
{
LOOP,
MATRIX,
NO_EVALUATOR
};

enum class Samplings
{
VOLUME_BASED,
METROPOLIS,
NO_SAMPLING
};

class OneBodyDensityMatrixInputSection : public InputSection
{
public:
/** parse time definition of input parameters */
OneBodyDensityMatrixInputSection()
{
section_name = "OneBodyDensityMatrix";
attributes = {"name", "type"};
parameters = {"basis", "energy_matrix", "integrator", "evaluator", "scale",
"center", "points", "samples", "warmup", "timestep",
"use_drift", "check_overlap", "check_derivatives", "acceptance_ratio", "rstats",
"normalized", "volumed_normed"};
bools = {"energy_matrix", "use_drift", "normalized", "volume_normed",
"check_overlap", "check_derivatives", "rstats", "acceptance_ratio"};
strings = {"name", "type", "basis", "integrator", "evaluator"};
integers = {"points", "samples"};
reals = {"scale", "timestep"};
required = {"name", "basis"};
// I'd much rather see the default defined in simple native c++ as below
}

/** do parse time checks of input */
void checkParticularValidity() override;
};

using Position = QMCTraits::PosType;
using Real = QMCTraits::FullPrecRealType;

OneBodyDensityMatricesInput();
OneBodyDensityMatricesInput(xmlNodePtr cur);

private:
OneBodyDensityMatrixInputSection input_section_;

bool energy_matrix_ = false;
bool use_drift_ = false;
bool normalized_ = true;
bool volume_normalized_ = true;
bool check_overlap_ = false;
bool check_derivatives_ = false;
bool rstats_ = false;
bool acceptance_ratio_ = false;
Integrators integrator_ = Integrators::UNIFORM_GRID;
Samplings sampling_ = Samplings::VOLUME_BASED;
Evaluators evaluator_ = Evaluators::LOOP;
Real scale_ = 1.0;
Position center_ = 0.0;
Real timestep_ = 0.5;
int points_ = 10;
int samples_ = 10;
int warmup_samples_ = 30;
public:
bool get_energy_matrix() const { return energy_matrix_; }
bool get_use_drift() const { return use_drift_; }
bool get_normalized() const { return normalized_; }
bool get_volume_normalized() const { return volume_normalized_; }
bool get_check_overlap() const { return check_overlap_; }
bool get_check_derivatives() const { return check_derivatives_; }
bool get_rstats() const { return rstats_; }
bool get_acceptance_ratio() const { return acceptance_ratio_; }
Integrators get_integrator() const { return integrator_; }
Samplings get_sampling() const { return sampling_; }
Evaluators get_evaluator() const { return evaluator_; }
Real get_scale() const { return scale_; }
Position get_center() const { return center_; }
Real get_timestep() const { return timestep_; }
int get_points() const { return points_; }
int get_samples() const { return samples_; }
int get_warmup_samples() const { return warmup_samples_; }
};

} // namespace qmcplusplus

#endif
3 changes: 2 additions & 1 deletion src/Estimators/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ set(SRCS
test_manager.cpp
test_EstimatorManagerNew.cpp
test_trace_manager.cpp
SpinDensityTesting.cpp
EstimatorTesting.cpp
test_SpinDensityInput.cpp
test_SpinDensityNew.cpp
test_InputSection.cpp
test_OneBodyDensityMatricesInput.cpp
)

add_executable(${UTEST_EXE} ${SRCS})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2020 QMCPACK developers.
// Copyright (c) 2021 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//
// File created by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//////////////////////////////////////////////////////////////////////////////////////

#include "SpinDensityTesting.h"
#include "EstimatorTesting.h"

namespace qmcplusplus
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2020 QMCPACK developers.
// Copyright (c) 2021 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//
// File created by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//////////////////////////////////////////////////////////////////////////////////////

#ifndef QMCPLUSPLUS_SPINDENSITYTESTING_H
#define QMCPLUSPLUS_SPINDENSITYTESTING_H
#ifndef QMCPLUSPLUS_ESTIMATOR_TESTING_H
#define QMCPLUSPLUS_ESTIMATOR_TESTING_H

#include "ParticleSet.h"

Expand Down
53 changes: 53 additions & 0 deletions src/Estimators/tests/InvalidOneBodyDensityMatricesInput.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//////////////////////////////////////////////////////////////////////////////////////
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2021 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Lab
//
// File created by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Lab
//////////////////////////////////////////////////////////////////////////////////////

#ifndef QMCPLUSPLUS_INVALID_OBDM_INPUT_H
#define QMCPLUSPLUS_INVALID_OBDM_INPUT_H

#include <array>

namespace qmcplusplus
{
namespace testing
{
// clang-format: off
constexpr std::array<const char*, 2> invalid_one_body_density_matrices_input_sections{
R"(
<estimator type="dm1b" name="DensityMatrices">
<parameter name="basis" > spo_u spo_uv </parameter>
<parameter name="evaluator" > matrix </parameter>
<parameter name="integrator" > path </parameter>
<parameter name="scale" > -0.2 </parameter>
<parameter name="samples" > 64 </parameter>
<parameter name="timestep" > 0.5 </parameter>
<parameter name="use_drift" > no </parameter>
</estimator>
)",
R"(
<estimator type="dm1b" name="DensityMatrices">
<parameter name="basis" > dm_basis </parameter>
<parameter name="evaluator" > loop </parameter>
<parameter name="integrator" > uniform </parameter>
<parameter name="samples" > 128 </parameter>
<parameter name="scale" > 1.1 </parameter>
<parameter name="timestep" > 0.5 </parameter>
<parameter name="use_drift" > yes </parameter>
</estimator>
)"
// clang-format: on
};

constexpr int invalid_obdm_input_bad_integrator = 0;
constexpr int invalid_obdm_input_bad_scale = 1;
} // namespace testing
} // namespace qmcplusplus

#endif
53 changes: 53 additions & 0 deletions src/Estimators/tests/ValidOneBodyDensityMatricesInput.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//////////////////////////////////////////////////////////////////////////////////////
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2021 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Lab
//
// File created by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Lab
//////////////////////////////////////////////////////////////////////////////////////

#ifndef QMCPLUSPLUS_VALID_OBDM_INPUT_H
#define QMCPLUSPLUS_VALID_OBDM_INPUT_H

#include <array>

namespace qmcplusplus
{
namespace testing
{
// clang-format: off
constexpr std::array<const char*, 2> valid_one_body_density_matrices_input_sections{
R"(
<estimator type="dm1b" name="DensityMatrices">
<parameter name="basis" > spo_u spo_uv </parameter>
<parameter name="evaluator" > matrix </parameter>
<parameter name="integrator" > density </parameter>
<parameter name="samples" > 64 </parameter>
<parameter name="timestep" > 0.5 </parameter>
<parameter name="use_drift" > no </parameter>
</estimator>
)",
R"(
<estimator type="dm1b" name="DensityMatrices">
<parameter name="basis" > dm_basis </parameter>
<parameter name="evaluator" > loop </parameter>
<parameter name="integrator" > uniform </parameter>
<parameter name="samples" > 128 </parameter>
<parameter name="scale" > 0.8 </parameter>
<parameter name="timestep" > 0.5 </parameter>
<parameter name="use_drift" > yes </parameter>
</estimator>
)"
// clang-format: on
};

constexpr int valid_obdm_input = 0;
constexpr int vlaid_obdm_input_scale = 1;

} // namespace testing
} // namespace qmcplusplus

#endif
Loading

0 comments on commit 81457ad

Please sign in to comment.