Skip to content
Snippets Groups Projects
Commit 068e4429 authored by William F Godoy's avatar William F Godoy
Browse files

Getting more metadata info

parent 661be424
No related branches found
No related tags found
1 merge request!294Bp1read : Initial Reading Capabilities and latest API
...@@ -41,13 +41,18 @@ int main(int argc, char *argv[]) ...@@ -41,13 +41,18 @@ int main(int argc, char *argv[])
/** Engine derived class, spawned to start IO operations */ /** Engine derived class, spawned to start IO operations */
adios2::Engine &bpReader = bpIO.Open("myVector.bp", adios2::Mode::Read); adios2::Engine &bpReader = bpIO.Open("myVector.bp", adios2::Mode::Read);
const std::map<std::string, std::string> variables = const std::map<std::string, adios2::Params> variables =
bpIO.GetAvailableVariables(); bpIO.GetAvailableVariables();
for (const auto variablePair : variables) for (const auto &variablePair : variables)
{ {
std::cout << "Name: " << variablePair.first std::cout << "Name: " << variablePair.first;
<< " type: " << variablePair.second << "\n";
for (const auto &parameter : variablePair.second)
{
std::cout << "\t" << parameter.first << ": " << parameter.second
<< "\n";
}
} }
/** Write variable for buffering */ /** Write variable for buffering */
...@@ -60,7 +65,7 @@ int main(int argc, char *argv[]) ...@@ -60,7 +65,7 @@ int main(int argc, char *argv[])
bpReader.GetSync<float>(*bpFloats, myFloats.data()); bpReader.GetSync<float>(*bpFloats, myFloats.data());
} }
if (bpFloats != nullptr) // means not found if (bpInts != nullptr) // means not found
{ {
bpReader.GetSync<int>(*bpInts, myInts.data()); bpReader.GetSync<int>(*bpInts, myInts.data());
} }
......
...@@ -262,7 +262,11 @@ struct FixedWidthInt<8, false> ...@@ -262,7 +262,11 @@ struct FixedWidthInt<8, false>
// Some core type information that may be useful at compile time // Some core type information that may be useful at compile time
template <typename T, typename Enable = void> template <typename T, typename Enable = void>
struct TypeInfo; struct TypeInfo
{
using IOType = T;
using ValueType = T;
};
template <typename T> template <typename T>
struct TypeInfo<T, typename std::enable_if<std::is_integral<T>::value>::type> struct TypeInfo<T, typename std::enable_if<std::is_integral<T>::value>::type>
......
...@@ -77,6 +77,14 @@ ADIOS2_FOREACH_LAUNCH_MODE(declare_launch_mode) ...@@ -77,6 +77,14 @@ ADIOS2_FOREACH_LAUNCH_MODE(declare_launch_mode)
{ \ { \
if (m_DebugMode) \ if (m_DebugMode) \
{ \ { \
if (&variable == nullptr) \
{ \
throw std::invalid_argument("ERROR: variable reference is " \
"undefined, try using " \
"IO::InquireVariable(name) " \
"function first, in call to Get" + \
std::string(#L) + "\n"); \
} \
variable.CheckDimensions("Get" + std::string(#L)); \ variable.CheckDimensions("Get" + std::string(#L)); \
\ \
if (data == nullptr) \ if (data == nullptr) \
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "IO.h" #include "IO.h"
#include "IO.tcc" #include "IO.tcc"
#include <sstream>
#include "adios2/ADIOSMPI.h" #include "adios2/ADIOSMPI.h"
#include "adios2/engine/bp/BPFileReader.h" #include "adios2/engine/bp/BPFileReader.h"
#include "adios2/engine/bp/BPFileWriter.h" #include "adios2/engine/bp/BPFileWriter.h"
...@@ -145,14 +147,38 @@ bool IO::RemoveVariable(const std::string &name) noexcept ...@@ -145,14 +147,38 @@ bool IO::RemoveVariable(const std::string &name) noexcept
return isRemoved; return isRemoved;
} }
std::map<std::string, std::string> IO::GetAvailableVariables() const noexcept std::map<std::string, Params> IO::GetAvailableVariables() noexcept
{ {
std::map<std::string, std::string> variables; std::map<std::string, Params> variablesInfo;
for (const auto &variablePair : m_Variables) for (const auto &variablePair : m_Variables)
{ {
variables[variablePair.first] = variablePair.second.first; const std::string name(variablePair.first);
const std::string type(variablePair.second.first);
variablesInfo[name]["Type"] = type;
if (type == "compound")
{
}
#define declare_template_instantiation(T) \
else if (type == GetType<T>()) \
{ \
Variable<T> &variable = *InquireVariable<T>(name); \
std::ostringstream minSS; \
minSS << variable.m_Min; \
variablesInfo[name]["Min"] = minSS.str(); \
std::ostringstream maxSS; \
maxSS << variable.m_Max; \
variablesInfo[name]["Max"] = maxSS.str(); \
variablesInfo[name]["StepsStart"] = \
std::to_string(variable.m_AvailableStepsStart); \
variablesInfo[name]["StepsCount"] = \
std::to_string(variable.m_AvailableStepsCount); \
}
ADIOS2_FOREACH_TYPE_1ARG(declare_template_instantiation)
#undef declare_template_instantiation
} }
return variables; // TODO: add dimensions
return variablesInfo;
} }
std::string IO::InquireVariableType(const std::string &name) const noexcept std::string IO::InquireVariableType(const std::string &name) const noexcept
......
...@@ -181,7 +181,7 @@ public: ...@@ -181,7 +181,7 @@ public:
* Map with variables info: key: name, value: type * Map with variables info: key: name, value: type
* @return populate map with current variables * @return populate map with current variables
*/ */
std::map<std::string, std::string> GetAvailableVariables() const noexcept; std::map<std::string, Params> GetAvailableVariables() noexcept;
/** /**
* Gets an existing variable of primitive type by name * Gets an existing variable of primitive type by name
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <vector> #include <vector>
/// \endcond /// \endcond
#include "adios2/ADIOSTypes.h"
#include "adios2/core/VariableBase.h" #include "adios2/core/VariableBase.h"
namespace adios2 namespace adios2
...@@ -31,15 +32,10 @@ class Variable : public VariableBase ...@@ -31,15 +32,10 @@ class Variable : public VariableBase
{ {
public: public:
/** typename TypeInfo<T>::ValueType m_Min;
* Unique constructor typename TypeInfo<T>::ValueType m_Max;
* @param name typename TypeInfo<T>::ValueType m_Value;
* @param shape
* @param start
* @param count
* @param constantShape
* @param debugMode
*/
Variable<T>(const std::string &name, const Dims &shape, const Dims &start, Variable<T>(const std::string &name, const Dims &shape, const Dims &start,
const Dims &count, const bool constantShape, T *data, const Dims &count, const bool constantShape, T *data,
const bool debugMode); const bool debugMode);
......
...@@ -326,15 +326,17 @@ protected: ...@@ -326,15 +326,17 @@ protected:
uint64_t PayloadOffset; uint64_t PayloadOffset;
T Min; T Min;
T Max; T Max;
T Value;
uint32_t Step; uint32_t Step;
uint32_t FileIndex; uint32_t FileIndex;
uint32_t MemberID; uint32_t MemberID;
bool IsValue = false;
}; };
template <class T> template <class T>
struct Characteristics struct Characteristics
{ {
Stats<T> Statistics; Stats<typename TypeInfo<T>::ValueType> Statistics;
Dims Shape; Dims Shape;
Dims Start; Dims Start;
Dims Count; Dims Count;
......
...@@ -187,19 +187,23 @@ BP3Base::ReadElementIndexCharacteristics(const std::vector<char> &buffer, ...@@ -187,19 +187,23 @@ BP3Base::ReadElementIndexCharacteristics(const std::vector<char> &buffer,
case (characteristic_value): case (characteristic_value):
{ // TODO make sure it's string or string array { // TODO make sure it's string or string array
characteristics.Statistics.Min = ReadValue<T>(buffer, position); characteristics.Statistics.Value =
ReadValue<typename TypeInfo<T>::ValueType>(buffer, position);
characteristics.Statistics.IsValue = true;
break; break;
} }
case (characteristic_min): case (characteristic_min):
{ {
characteristics.Statistics.Min = ReadValue<T>(buffer, position); characteristics.Statistics.Min =
ReadValue<typename TypeInfo<T>::ValueType>(buffer, position);
break; break;
} }
case (characteristic_max): case (characteristic_max):
{ {
characteristics.Statistics.Max = ReadValue<T>(buffer, position); characteristics.Statistics.Max =
ReadValue<typename TypeInfo<T>::ValueType>(buffer, position);
break; break;
} }
......
...@@ -55,12 +55,22 @@ void BP3Deserializer::DefineVariableInIO(const ElementIndexHeader &header, ...@@ -55,12 +55,22 @@ void BP3Deserializer::DefineVariableInIO(const ElementIndexHeader &header,
} }
Variable<T> *variable = nullptr; Variable<T> *variable = nullptr;
if (characteristics.Statistics.IsValue)
{
std::lock_guard<std::mutex> lock(m_Mutex);
variable = &io.DefineVariable<T>(variableName);
variable->m_Min = characteristics.Statistics.Value;
variable->m_Max = characteristics.Statistics.Value;
}
else
{ {
// std::mutex portion
std::lock_guard<std::mutex> lock(m_Mutex); std::lock_guard<std::mutex> lock(m_Mutex);
variable = variable =
&io.DefineVariable<T>(variableName, characteristics.Shape, &io.DefineVariable<T>(variableName, characteristics.Shape,
characteristics.Start, characteristics.Count); characteristics.Start, characteristics.Count);
variable->m_Min = characteristics.Statistics.Min;
variable->m_Max = characteristics.Statistics.Max;
} }
// going back to get variable index position // going back to get variable index position
...@@ -83,8 +93,9 @@ void BP3Deserializer::DefineVariableInIO(const ElementIndexHeader &header, ...@@ -83,8 +93,9 @@ void BP3Deserializer::DefineVariableInIO(const ElementIndexHeader &header,
const size_t subsetPosition = position; const size_t subsetPosition = position;
// read until step is found // read until step is found
const Characteristics<T> subsetCharacteristics = const Characteristics<typename TypeInfo<T>::ValueType>
ReadElementIndexCharacteristics<T>(buffer, position, true); subsetCharacteristics = ReadElementIndexCharacteristics<
typename TypeInfo<T>::ValueType>(buffer, position, false);
if (subsetCharacteristics.Statistics.Step > currentStep) if (subsetCharacteristics.Statistics.Step > currentStep)
{ {
...@@ -94,6 +105,16 @@ void BP3Deserializer::DefineVariableInIO(const ElementIndexHeader &header, ...@@ -94,6 +105,16 @@ void BP3Deserializer::DefineVariableInIO(const ElementIndexHeader &header,
subsetPositions.clear(); subsetPositions.clear();
} }
if (subsetCharacteristics.Statistics.Min < variable->m_Min)
{
variable->m_Min = subsetCharacteristics.Statistics.Min;
}
if (subsetCharacteristics.Statistics.Max > variable->m_Max)
{
variable->m_Max = subsetCharacteristics.Statistics.Max;
}
subsetPositions.push_back(subsetPosition); subsetPositions.push_back(subsetPosition);
position = subsetPosition + subsetCharacteristics.EntryLength + 5; position = subsetPosition + subsetCharacteristics.EntryLength + 5;
......
...@@ -208,39 +208,53 @@ void BPLS2::ProcessTransport() const ...@@ -208,39 +208,53 @@ void BPLS2::ProcessTransport() const
endianness = "Big Endian"; endianness = "Big Endian";
} }
std::cout << " endianness: " << endianness << "\n"; std::cout << " endianness: " << endianness << "\n";
std::cout << " statistics: Min / Max / Avg / Std_dev\n" << std::endl; std::cout << " statistics: Min / Max\n";
std::cout << "\n";
}; };
auto lf_PrintVariables = auto lf_PrintVariables =
[&](const std::map<std::string, std::string> &variablesMap) { [&](const std::map<std::string, Params> &variablesMap)
// get maximum sizes {
size_t maxTypeSize = 0; // get maximum sizes
size_t maxNameSize = 0; size_t maxTypeSize = 0;
for (const auto &variablePair : variablesMap) size_t maxNameSize = 0;
for (const auto &variablePair : variablesMap)
{
const size_t nameSize = variablePair.first.size();
if (nameSize > maxNameSize)
{
maxNameSize = nameSize;
}
const Params &parameters = variablePair.second;
const size_t typeSize = parameters.at("Type").size();
if (typeSize > maxTypeSize)
{ {
const size_t nameSize = variablePair.first.size(); maxTypeSize = typeSize;
if (nameSize > maxNameSize)
{
maxNameSize = nameSize;
}
const size_t typeSize = variablePair.second.size();
if (typeSize > maxTypeSize)
{
maxTypeSize = typeSize;
}
} }
}
for (const auto &variablePair : variablesMap) for (const auto &variablePair : variablesMap)
{
const std::string name(variablePair.first);
const Params &parameters = variablePair.second;
const std::string type(parameters.at("Type"));
std::cout << " ";
std::cout << std::left << std::setw(maxTypeSize) << type << " ";
std::cout << std::left << std::setw(maxNameSize) << name << " ";
// print min max
if (m_Parameters.count("long") == 1)
{ {
std::cout << " "; std::cout << parameters.at("Min") << " / "
std::cout << std::left << std::setw(maxTypeSize) << parameters.at("Max");
<< variablePair.second << " ";
std::cout << std::left << std::setw(maxNameSize)
<< variablePair.first << std::endl;
} }
}; std::cout << "\n";
}
std::cout << std::endl;
};
ADIOS adios(true); ADIOS adios(true);
IO &io = adios.DeclareIO("bpls2"); IO &io = adios.DeclareIO("bpls2");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment