#pragma once #include "fesa/core/status.hpp" #include "fesa/math/vector.hpp" #include #include namespace fesa { struct SparsePattern; struct CooContribution { std::size_t row; std::size_t column; double value; std::size_t elementOrder; std::size_t localOrder; }; // Owns canonical 0-based CSR data independently of the dense Matrix adapter. class SparseMatrix { public: static Result fromCoo( std::size_t rows, std::size_t columns, std::vector contributions, const SparsePattern& expectedPattern); std::size_t rows() const noexcept; std::size_t columns() const noexcept; const std::vector& rowOffsets() const noexcept; const std::vector& columnIndices() const noexcept; const std::vector& values() const noexcept; Vector multiply(const Vector& rhs) const; Status validate() const; private: SparseMatrix( std::size_t rows, std::size_t columns, std::vector rowOffsets, std::vector columnIndices, std::vector values); std::size_t rows_; std::size_t columns_; std::vector rowOffsets_; std::vector columnIndices_; std::vector values_; }; } // namespace fesa