#include <iostream>
#include <string>
struct lit {
const char *str;
lit(const char *str) : str(str) {}
};
std::istream& operator>>(std::istream& in, lit l)
{
char c; in >> c;
while (in && *l.str) {
if (*l.str != c) in.setstate(std::ios_base::failbit);
if (isspace(*++l.str))
in >> c, l.str++;
else
c = in.get();
}
return in;
}
struct HkmHeader {
std::string version;
int numNodes;
int numLeaves;
};
struct HkmParams {
int branchFactor;
int maxTreeDepth;
int desiredNumSamplesPerCluster;
int numClusteringRuns;
int standardization;
int meanSubtraction;
int noInternalLeafStats;
int termCritMaxCount;
float termCritEpsilon;
int termCritType;
};
struct HkmFile {
HkmHeader header;
HkmParams params;
};
std::istream& operator>>(std::istream& in, HkmHeader& f)
{
return in >> lit("class HkmTree Format:") >> f.version
>> lit("#nodes:") >> f.numNodes
>> lit("#leaves:") >> f.numLeaves;
}
std::istream& operator>>(std::istream& in, HkmParams& f)
{
int dummy;
return in >> lit("<HkmParams")
>> lit("branchFactor:") >> f.branchFactor
>> lit("maxTreeDepth:") >> f.maxTreeDepth
>> lit("desiredNumSamplesPerCluster:") >> f.desiredNumSamplesPerCluster
>> lit("minNumSamplesPerCluster:") >> dummy
>> lit("numClusteringRuns:") >> f.numClusteringRuns
>> lit("standardization:") >> f.standardization
>> lit("meanSubtraction:") >> f.meanSubtraction
>> lit("noInternalLeafStats:") >> f.noInternalLeafStats
>> lit("termCrit.maxCount:") >> f.termCritMaxCount
>> lit("termCrit.epsilon:") >> f.termCritEpsilon
>> lit("termCrit.type:") >> f.termCritType
>> lit(">");
}
std::istream& operator>>(std::istream& in, HkmFile& f)
{
return in >> f.header >> f.params;
}
std::ostream& operator<<(std::ostream& os, HkmParams const& f)
{
return os << "<HkmParams"
<< "\n branchFactor: " << f.branchFactor
<< "\n maxTreeDepth: " << f.maxTreeDepth
<< "\n desiredNumSamplesPerCluster: " << f.desiredNumSamplesPerCluster
<< "\n minNumSamplesPerCluster: " << "-1" // ?
<< "\n numClusteringRuns: " << f.numClusteringRuns
<< "\n standardization: " << f.standardization
<< "\n meanSubtraction: " << f.meanSubtraction
<< "\n noInternalLeafStats: " << f.noInternalLeafStats
<< "\n termCrit.maxCount: " << f.termCritMaxCount
<< "\n termCrit.epsilon: " << f.termCritEpsilon
<< "\n termCrit.type: " << f.termCritType
<< "\n>";
}
std::ostream& operator<<(std::ostream& os, HkmHeader const& p)
{
return os << "version: " << p.version
<< "\n#numNodes: " << p.numNodes
<< "\n#numLeaves: " << p.numLeaves;
}
std::ostream& operator<<(std::ostream& os, HkmFile const& f)
{
return os << f.header << "\n\n" << f.params;
}
int main()
{
HkmFile f;
if (std::cin >> f)
std::cout << f;
}