Skip to content

Commit

Permalink
Add utility for reading binary headers
Browse files Browse the repository at this point in the history
  • Loading branch information
etphipp committed Jan 19, 2023
1 parent 7fe1ca2 commit 5f260c5
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 2 deletions.
31 changes: 30 additions & 1 deletion src/Genten_TensorIO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,6 @@ DntnFileHeader::readBinary(std::istream& in)
in.read(reinterpret_cast<char*>(&ndims), sizeof(nd_type));

// Floating point size
float_size_type float_data_size;
in.read(reinterpret_cast<char*>(&float_bits), sizeof(float_size_type));

// Size of each dimension
Expand Down Expand Up @@ -736,6 +735,36 @@ parallelReadBinaryDense(std::vector<ttb_indx>& global_dims,
}
#endif

template <typename ExecSpace>
SptnFileHeader
TensorReader<ExecSpace>::
readBinarySparseHeader() const
{
std::ifstream infile(filename, std::ios::binary);
if (!infile)
Genten::error("Could not open input file " + filename);

SptnFileHeader h;
h.readBinary(infile);

return h;
}

template <typename ExecSpace>
DntnFileHeader
TensorReader<ExecSpace>::
readBinaryDenseHeader() const
{
std::ifstream infile(filename, std::ios::binary);
if (!infile)
Genten::error("Could not open input file " + filename);

DntnFileHeader h;
h.readBinary(infile);

return h;
}

template <typename ExecSpace>
void
TensorReader<ExecSpace>::
Expand Down
3 changes: 3 additions & 0 deletions src/Genten_TensorIO.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,9 @@ class TensorReader {
SptensorT<ExecSpace> getSparseTensor() { return X_sparse; }
TensorT<ExecSpace> getDenseTensor() { return X_dense; }

SptnFileHeader readBinarySparseHeader() const;
DntnFileHeader readBinaryDenseHeader() const;

private:
std::string filename;
ttb_indx index_base;
Expand Down
5 changes: 5 additions & 0 deletions tools/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,8 @@ ADD_EXECUTABLE(convert_tensor
${Genten_SOURCE_DIR}/tools/convert_tensor.cpp)
TARGET_LINK_LIBRARIES (convert_tensor ${GENTEN_LINK_LIBS})
INSTALL(TARGETS convert_tensor)

ADD_EXECUTABLE(read_binary_header
${Genten_SOURCE_DIR}/tools/read_binary_header.cpp)
TARGET_LINK_LIBRARIES (read_binary_header ${GENTEN_LINK_LIBS})
INSTALL(TARGETS read_binary_header)
2 changes: 1 addition & 1 deletion tools/convert_tensor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ int main(int argc, char* argv[])
if (argc < 9 || argc > 11 || help) {
std::cout << "\nconvert-tensor: a helper utility for converting tensor data between\n"
<< "tensor formats (sparse or dense), and file types (text or binary).\n\n"
<< "Usage: " << argv[0] << " --input-file <string> --output-file <string> --output-format <sparse|dense> --output-type <text|binary>\n [options] \n"
<< "Usage: " << argv[0] << " --input-file <string> --output-file <string> --output-format <sparse|dense> --output-type <text|binary> [options] \n"
<< "Options:\n"
<< " --input-gz Input tensor is Gzip compressed (text-only, default: off)\n"
<< " --output-gz Output tensor is Gzip compressed (text-only, default: off)\n"
Expand Down
118 changes: 118 additions & 0 deletions tools/read_binary_header.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
//@HEADER
// ************************************************************************
// Genten: Software for Generalized Tensor Decompositions
// by Sandia National Laboratories
//
// Sandia National Laboratories is a multimission laboratory managed
// and operated by National Technology and Engineering Solutions of Sandia,
// LLC, a wholly owned subsidiary of Honeywell International, Inc., for the
// U.S. Department of Energy's National Nuclear Security Administration under
// contract DE-NA0003525.
//
// Copyright 2017 National Technology & Engineering Solutions of Sandia, LLC
// (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S.
// Government retains certain rights in this software.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// ************************************************************************
//@HEADER

#include "Genten_TensorIO.hpp"



void read_tensor_file(const std::string& filename,
std::string& format, std::string& type, bool gz,
Genten::Sptensor& x_sparse, Genten::Tensor& x_dense)
{
Genten::TensorReader<Genten::DefaultHostExecutionSpace> reader(filename,0,gz);
reader.read();

if (reader.isSparse()) {
format = "sparse";
x_sparse = reader.getSparseTensor();
}
else if (reader.isDense()) {
format = "dense";
x_dense = reader.getDenseTensor();
}

if (reader.isBinary())
type = "binary";
else if (reader.isText())
type = "text";
}

int main(int argc, char* argv[])
{
int ret = 0;

auto args = Genten::build_arg_list(argc,argv);
const bool help =
Genten::parse_ttb_bool(args, "--help", "--no-help", false);
if (argc != 3 || help) {
std::cout << "\ntensor-header: a helper utility for reading headers of binary tensor files.\n\n"
<< "Usage: " << argv[0] << " --input-file <string>\n";
return 0;
}

try {
Kokkos::initialize(argc, argv);

const std::string filename =
Genten::parse_string(args, "--input-file", "");

Genten::TensorReader<Genten::DefaultHostExecutionSpace> reader(filename);
if (!reader.isBinary())
Genten::error("Can only read headers of binary files!");

std::cout << "\nTensor file: " << filename << std::endl;
if (reader.isSparse())
std::cout << reader.readBinarySparseHeader() << std::endl;
if (reader.isDense())
std::cout << reader.readBinaryDenseHeader() << std::endl;

}
catch(const std::exception& e)
{
std::cout << "*** Call to genten threw an exception:" << std::endl
<< " " << e.what() << std::endl;
ret = -1;
}
catch(const std::string& s)
{
std::cout << "*** Call to genten threw an exception:" << std::endl
<< " " << s << std::endl;
ret = -1;
}
catch(...)
{
std::cout << "*** Call to genten threw an unknown exception"
<< std::endl;
ret = -1;
}

Kokkos::finalize();
return ret;
}

0 comments on commit 5f260c5

Please sign in to comment.