Ensure that Armadillo doesn't release memory with Armadillo 10+.
This commit is contained in:
@@ -66,7 +66,7 @@ void IO_SetParamBool(const char* paramName, bool paramValue)
|
||||
* Call IO::SetParam<std::vector<std::string>>() to set the length.
|
||||
*/
|
||||
void IO_SetParamVectorStrLen(const char* paramName,
|
||||
const size_t length)
|
||||
const size_t length)
|
||||
{
|
||||
IO::GetParam<std::vector<std::string>>(paramName).clear();
|
||||
IO::GetParam<std::vector<std::string>>(paramName).resize(length);
|
||||
@@ -77,8 +77,8 @@ void IO_SetParamVectorStrLen(const char* paramName,
|
||||
* Call IO::SetParam<std::vector<std::string>>() to set an individual element.
|
||||
*/
|
||||
void IO_SetParamVectorStrStr(const char* paramName,
|
||||
const char* str,
|
||||
const size_t element)
|
||||
const char* str,
|
||||
const size_t element)
|
||||
{
|
||||
IO::GetParam<std::vector<std::string>>(paramName)[element] =
|
||||
std::string(str);
|
||||
@@ -88,8 +88,8 @@ void IO_SetParamVectorStrStr(const char* paramName,
|
||||
* Call IO::SetParam<std::vector<int>>().
|
||||
*/
|
||||
void IO_SetParamVectorInt(const char* paramName,
|
||||
int* ints,
|
||||
const size_t length)
|
||||
int* ints,
|
||||
const size_t length)
|
||||
{
|
||||
// Create a std::vector<int> object; unfortunately this requires copying the
|
||||
// vector elements.
|
||||
@@ -106,10 +106,10 @@ void IO_SetParamVectorInt(const char* paramName,
|
||||
* Call IO::SetParam<arma::mat>().
|
||||
*/
|
||||
void IO_SetParamMat(const char* paramName,
|
||||
double* memptr,
|
||||
const size_t rows,
|
||||
const size_t cols,
|
||||
const bool pointsAsRows)
|
||||
double* memptr,
|
||||
const size_t rows,
|
||||
const size_t cols,
|
||||
const bool pointsAsRows)
|
||||
{
|
||||
// Create the matrix as an alias.
|
||||
arma::mat m(memptr, arma::uword(rows), arma::uword(cols), false, true);
|
||||
@@ -121,10 +121,10 @@ void IO_SetParamMat(const char* paramName,
|
||||
* Call IO::SetParam<arma::Mat<size_t>>().
|
||||
*/
|
||||
void IO_SetParamUMat(const char* paramName,
|
||||
size_t* memptr,
|
||||
const size_t rows,
|
||||
const size_t cols,
|
||||
const bool pointsAsRows)
|
||||
size_t* memptr,
|
||||
const size_t rows,
|
||||
const size_t cols,
|
||||
const bool pointsAsRows)
|
||||
{
|
||||
// Create the matrix as an alias.
|
||||
arma::Mat<size_t> m(memptr, arma::uword(rows), arma::uword(cols), false,
|
||||
@@ -138,8 +138,8 @@ void IO_SetParamUMat(const char* paramName,
|
||||
* Call IO::SetParam<arma::rowvec>().
|
||||
*/
|
||||
void IO_SetParamRow(const char* paramName,
|
||||
double* memptr,
|
||||
const size_t cols)
|
||||
double* memptr,
|
||||
const size_t cols)
|
||||
{
|
||||
arma::rowvec m(memptr, arma::uword(cols), false, true);
|
||||
IO::GetParam<arma::rowvec>(paramName) = std::move(m);
|
||||
@@ -150,8 +150,8 @@ void IO_SetParamRow(const char* paramName,
|
||||
* Call IO::SetParam<arma::Row<size_t>>().
|
||||
*/
|
||||
void IO_SetParamURow(const char* paramName,
|
||||
size_t* memptr,
|
||||
const size_t cols)
|
||||
size_t* memptr,
|
||||
const size_t cols)
|
||||
{
|
||||
arma::Row<size_t> m(memptr, arma::uword(cols), false, true);
|
||||
IO::GetParam<arma::Row<size_t>>(paramName) = std::move(m);
|
||||
@@ -162,8 +162,8 @@ void IO_SetParamURow(const char* paramName,
|
||||
* Call IO::SetParam<arma::vec>().
|
||||
*/
|
||||
void IO_SetParamCol(const char* paramName,
|
||||
double* memptr,
|
||||
const size_t rows)
|
||||
double* memptr,
|
||||
const size_t rows)
|
||||
{
|
||||
arma::vec m(memptr, arma::uword(rows), false, true);
|
||||
IO::GetParam<arma::vec>(paramName) = std::move(m);
|
||||
@@ -174,8 +174,8 @@ void IO_SetParamCol(const char* paramName,
|
||||
* Call IO::SetParam<arma::Row<size_t>>().
|
||||
*/
|
||||
void IO_SetParamUCol(const char* paramName,
|
||||
size_t* memptr,
|
||||
const size_t rows)
|
||||
size_t* memptr,
|
||||
const size_t rows)
|
||||
{
|
||||
arma::Col<size_t> m(memptr, arma::uword(rows), false, true);
|
||||
IO::GetParam<arma::Col<size_t>>(paramName) = std::move(m);
|
||||
@@ -186,11 +186,11 @@ void IO_SetParamUCol(const char* paramName,
|
||||
* Call IO::SetParam<std::tuple<data::DatasetInfo, arma::mat>>().
|
||||
*/
|
||||
void IO_SetParamMatWithInfo(const char* paramName,
|
||||
bool* dimensions,
|
||||
double* memptr,
|
||||
const size_t rows,
|
||||
const size_t cols,
|
||||
const bool pointsAreRows)
|
||||
bool* dimensions,
|
||||
double* memptr,
|
||||
const size_t rows,
|
||||
const size_t cols,
|
||||
const bool pointsAreRows)
|
||||
{
|
||||
data::DatasetInfo d(pointsAreRows ? cols : rows);
|
||||
for (size_t i = 0; i < d.Dimensionality(); ++i)
|
||||
@@ -316,6 +316,9 @@ double* IO_GetParamMat(const char* paramName)
|
||||
else
|
||||
{
|
||||
arma::access::rw(mat.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(mat.n_alloc) = 0;
|
||||
#endif
|
||||
return mat.memptr();
|
||||
}
|
||||
}
|
||||
@@ -344,20 +347,19 @@ size_t IO_GetParamUMatCols(const char* paramName)
|
||||
size_t* IO_GetParamUMat(const char* paramName)
|
||||
{
|
||||
arma::Mat<size_t>& mat = IO::GetParam<arma::Mat<size_t>>(paramName);
|
||||
|
||||
// Are we using preallocated memory? If so we have to handle this more
|
||||
// carefully.
|
||||
if (mat.n_elem <= arma::arma_config::mat_prealloc)
|
||||
{
|
||||
// Copy the memory to something that we can give back to Julia.
|
||||
size_t* newMem = new size_t[mat.n_elem];
|
||||
arma::arrayops::copy(newMem, mat.mem, mat.n_elem);
|
||||
// We believe Julia will free it. Hopefully we are right.
|
||||
return newMem;
|
||||
return newMem; // We believe Julia will free it. Hopefully we are right.
|
||||
}
|
||||
else
|
||||
{
|
||||
arma::access::rw(mat.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(mat.n_alloc) = 0;
|
||||
#endif
|
||||
return mat.memptr();
|
||||
}
|
||||
}
|
||||
@@ -390,6 +392,9 @@ double* IO_GetParamCol(const char* paramName)
|
||||
else
|
||||
{
|
||||
arma::access::rw(vec.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(vec.n_alloc) = 0;
|
||||
#endif
|
||||
return vec.memptr();
|
||||
}
|
||||
}
|
||||
@@ -410,20 +415,19 @@ size_t IO_GetParamUColRows(const char* paramName)
|
||||
size_t* IO_GetParamUCol(const char* paramName)
|
||||
{
|
||||
arma::Col<size_t>& vec = IO::GetParam<arma::Col<size_t>>(paramName);
|
||||
|
||||
// Are we using preallocated memory? If so we have to handle this more
|
||||
// carefully.
|
||||
if (vec.n_elem <= arma::arma_config::mat_prealloc)
|
||||
{
|
||||
// Copy the memory to something we can give back to Julia.
|
||||
size_t* newMem = new size_t[vec.n_elem];
|
||||
arma::arrayops::copy(newMem, vec.mem, vec.n_elem);
|
||||
// We believe Julia will free it. Hopefully we are right.
|
||||
return newMem;
|
||||
return newMem; // We believe Julia will free it. Hopefully we are right.
|
||||
}
|
||||
else
|
||||
{
|
||||
arma::access::rw(vec.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(vec.n_alloc) = 0;
|
||||
#endif
|
||||
return vec.memptr();
|
||||
}
|
||||
}
|
||||
@@ -456,6 +460,9 @@ double* IO_GetParamRow(const char* paramName)
|
||||
else
|
||||
{
|
||||
arma::access::rw(vec.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(vec.n_alloc) = 0;
|
||||
#endif
|
||||
return vec.memptr();
|
||||
}
|
||||
}
|
||||
@@ -476,9 +483,6 @@ size_t IO_GetParamURowCols(const char* paramName)
|
||||
size_t* IO_GetParamURow(const char* paramName)
|
||||
{
|
||||
arma::Row<size_t>& vec = IO::GetParam<arma::Row<size_t>>(paramName);
|
||||
|
||||
// Are we using preallocated memory? If so we have to handle this more
|
||||
// carefully.
|
||||
if (vec.n_elem <= arma::arma_config::mat_prealloc)
|
||||
{
|
||||
// Copy the memory to something we can give back to Julia.
|
||||
@@ -489,6 +493,9 @@ size_t* IO_GetParamURow(const char* paramName)
|
||||
else
|
||||
{
|
||||
arma::access::rw(vec.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(vec.n_alloc) = 0;
|
||||
#endif
|
||||
return vec.memptr();
|
||||
}
|
||||
}
|
||||
@@ -547,6 +554,9 @@ double* IO_GetParamMatWithInfoPtr(const char* paramName)
|
||||
else
|
||||
{
|
||||
arma::access::rw(m.mem_state) = 1;
|
||||
#if ARMA_VERSION_MAJOR >= 10
|
||||
arma::access::rw(m.n_alloc) = 0;
|
||||
#endif
|
||||
return m.memptr();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user