/* Copyright 2013 IST Austria Contributed by: Ulrich Bauer, Michael Kerber, Jan Reininghaus This file is part of PHAT. PHAT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. PHAT 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with PHAT. If not, see . */ #pragma once #include namespace phat { class persistence_pairs { protected: std::vector< std::pair< index, index > > pairs; public: index get_num_pairs() const { return (index)pairs.size(); } void append_pair( index birth, index death ) { pairs.push_back( std::make_pair( birth, death ) ); } std::pair< index, index > get_pair( index idx ) const { return pairs[ idx ]; } void set_pair( index idx, index birth, index death ) { pairs[ idx ] = std::make_pair( birth, death ); } void clear() { pairs.clear(); } void sort() { std::sort( pairs.begin(), pairs.end() ); } // Loads the persistence pairs from given file in asci format // Format: nr_pairs % newline % birth1 % death1 % newline % birth2 % death2 % newline ... bool load_ascii( std::string filename ) { std::ifstream input_stream( filename.c_str() ); if( input_stream.fail() ) return false; int64_t nr_pairs; input_stream >> nr_pairs; pairs.clear(); for( index idx = 0; idx < nr_pairs; idx++ ) { int64_t birth; input_stream >> birth; int64_t death; input_stream >> death; append_pair( (index)birth, (index)death ); } input_stream.close(); return true; } // Saves the persistence pairs to given file in binary format // Format: nr_pairs % newline % birth1 % death1 % newline % birth2 % death2 % newline ... bool save_ascii( std::string filename ) { std::ofstream output_stream( filename.c_str() ); if( output_stream.fail() ) return false; this->sort(); output_stream << get_num_pairs() << std::endl; for( std::size_t idx = 0; idx < pairs.size(); idx++ ) { output_stream << pairs[idx].first << " " << pairs[idx].second << std::endl; } output_stream.close(); return true; } // Loads the persistence pairs from given file in binary format // Format: nr_pairs % birth1 % death1 % birth2 % death2 ... bool load_binary( std::string filename ) { std::ifstream input_stream( filename.c_str(), std::ios_base::binary | std::ios_base::in ); if( input_stream.fail() ) return false; int64_t nr_pairs; input_stream.read( (char*)&nr_pairs, sizeof( int64_t ) ); for( index idx = 0; idx < nr_pairs; idx++ ) { int64_t birth; input_stream.read( (char*)&birth, sizeof( int64_t ) ); int64_t death; input_stream.read( (char*)&death, sizeof( int64_t ) ); append_pair( (index)birth, (index)death ); } input_stream.close(); return true; } // Saves the persistence pairs to given file in binary format // Format: nr_pairs % birth1 % death1 % birth2 % death2 ... bool save_binary( std::string filename ) { std::ofstream output_stream( filename.c_str(), std::ios_base::binary | std::ios_base::out ); if( output_stream.fail() ) return false; this->sort(); int64_t nr_pairs = get_num_pairs(); output_stream.write( (char*)&nr_pairs, sizeof( int64_t ) ); for( std::size_t idx = 0; idx < pairs.size(); idx++ ) { int64_t birth = pairs[ idx ].first; output_stream.write( (char*)&birth, sizeof( int64_t ) ); int64_t death = pairs[ idx ].second; output_stream.write( (char*)&death, sizeof( int64_t ) ); } output_stream.close(); return true; } bool operator==( persistence_pairs& other_pairs ) { this->sort(); other_pairs.sort(); if( pairs.size() != (std::size_t)other_pairs.get_num_pairs() ) return false; for( index idx = 0; idx < (index)pairs.size(); idx++ ) if( get_pair( idx ) != other_pairs.get_pair( idx ) ) return false; return true; } bool operator!=( persistence_pairs& other_pairs ) { return !( *this == other_pairs ); } }; }