#ifndef __IPGENTMATRIX_HPP__
#define __IPGENTMATRIX_HPP__
#include "IpUtils.hpp"
#include "IpMatrix.hpp"
namespace Ipopt
{
class GenTMatrixSpace;
class IPOPTLIB_EXPORT GenTMatrix: public Matrix
{
public:
GenTMatrix(
const GenTMatrixSpace* owner_space
);
~GenTMatrix();
void SetValues(
const Number* Values
);
Index Nonzeros() const;
const Index* Irows() const;
const Index* Jcols() const;
const Number* Values() const
{
return values_;
}
Number* Values()
{
ObjectChanged();
initialized_ = true;
return values_;
}
protected:
virtual void MultVectorImpl(
Number alpha,
const Vector& x,
Number beta,
Vector& y
) const;
virtual void TransMultVectorImpl(
Number alpha,
const Vector& x,
Number beta,
Vector& y
) const;
virtual bool HasValidNumbersImpl() const;
virtual void ComputeRowAMaxImpl(
Vector& rows_norms,
bool init
) const;
virtual void ComputeColAMaxImpl(
Vector& cols_norms,
bool init
) const;
virtual void PrintImpl(
const Journalist& jnlst,
EJournalLevel level,
EJournalCategory category,
const std::string& name,
Index indent,
const std::string& prefix
) const
{
PrintImplOffset(jnlst, level, category, name, indent, prefix, 0);
}
void PrintImplOffset(
const Journalist& jnlst,
EJournalLevel level,
EJournalCategory category,
const std::string& name,
Index indent,
const std::string& prefix,
Index offset
) const;
friend class ParGenMatrix;
private:
GenTMatrix();
GenTMatrix(
const GenTMatrix&
);
void operator=(
const GenTMatrix&
);
const GenTMatrixSpace* owner_space_;
Number* values_;
bool initialized_;
};
class IPOPTLIB_EXPORT GenTMatrixSpace: public MatrixSpace
{
public:
GenTMatrixSpace(
Index nRows,
Index nCols,
Index nonZeros,
const Index* iRows,
const Index* jCols
);
~GenTMatrixSpace()
{
delete[] iRows_;
delete[] jCols_;
}
GenTMatrix* MakeNewGenTMatrix() const
{
return new GenTMatrix(this);
}
virtual Matrix* MakeNew() const
{
return MakeNewGenTMatrix();
}
Index Nonzeros() const
{
return nonZeros_;
}
const Index* Irows() const
{
return iRows_;
}
const Index* Jcols() const
{
return jCols_;
}
private:
const Index nonZeros_;
Index* jCols_;
Index* iRows_;
Number* AllocateInternalStorage() const;
void FreeInternalStorage(
Number* values
) const;
friend class GenTMatrix;
};
inline Index GenTMatrix::Nonzeros() const
{
return owner_space_->Nonzeros();
}
inline const Index* GenTMatrix::Irows() const
{
return owner_space_->Irows();
}
inline const Index* GenTMatrix::Jcols() const
{
return owner_space_->Jcols();
}
} #endif