- Added a new way of specifying lotri matrices:

Before you could specify matrices as:

```
<- lotri({
m + b ~ c(1,
a 0.5, 1)
})
```

Now you can specify per row as:

```
<- lotri({
m ~ 1
a ~ c(0.5, 1)
b })
```

This form is now the default when converting from a matrix to a lotri expression. In addition if the matrix is large enough (by default a 5x5 matrix), these would be named when changing them to an expression:

```
<- lotri({
m ~ c(a=1)
a ~ c(a=0.5, b=1)
b ~ c(a=0.5, b=0.5, c=1)
c ~ c(a=0.5, b=0.5, c=0.5, d=1)
d ~ c(a=0.5, b=0.5, c=0.5, d=1,
e e=1)
})
```

This way changing to an R parsed expression will be rendered in a more human readable format.

You can change the deparsing options that are used by default with
`lotri`

with `options(lotri.plusNames=TRUE)`

which
prefers the `a+b+c`

syntax when deparsing. Otherwise, the
line format is used by default. The dimension number before naming the
values in the line-format can be controlled with
`options(lotri.nameEst=2)`

or some other dimension.

New option of

`cov`

added which check for matrix suitability for covariance matrix. When`cov=TRUE`

, off-diagonal elements in covariance matrices may no longer be nonzero if the diagonal value is zero (rxode2#481). This will also check tht the matrix is non-positive definite on the non-diagonal terms.`cov`

can also be a function to allow correction of the matrix to a positive definite matrix automatically.New option of

`rcm`

; When enabled, and`lotriIsBlockMat()`

is not true,`lotri()`

will permute the matrix to try to get a banded matrix using the Reverse Cuthill McKee algorithm.Change internals for

`lotri`

so that new`rxode2`

is no longer required to be binary linked to`lotri`

.Add new function

`rcm()`

which permutes the matrix to get a band matrix (if possible). This uses the Reverse Reverse Cuthill McKee (RCM) algorithm.Moved

`nmNearPD()`

to this package and renamed to`lotriNearPD()`

. In addition to moving, this function will now retain the dimension names.New exported function

`lotriAsExpression()`

which has more fine control than`as.expression()`

and will work without converting the matrix to a lotri form. This by default uses the new line form, but can be changed back to the`option(lotri.plusNames=TRUE)`

. Also be default it will name each element in a matrix when the dimension is above`5x5`

. You can change that number by`option(lotri.nameEst=10)`

to increase it to be named above`10x10`

. If you do not like the naming you can also disable it with`option(lotri.nameEst=TRUE)`

, or if you always want it on you can use `option(lotri.nameEst=FALSE)

- Bug fix for non-standard evaluation where you take the numeric
vector from the evaluating environment when using
`lotri(n1+n2~omega)`

- Bug fix for etas that were not named correctly for large order problems

- Bug fix for etas that are inconsistently numbered
- Add case for empty initialization block

Can convert lotri objects to data-frames similar to the internal data frame used in

`nlmixr()`

; These can then be converted back with`as.lotri()`

Added the ability to add estimates to a lotri object. These estimates are an attached

`data.frame`

to the original lotri matrix. You can extract them or drop them with the function`lotriEst()`

Allow specifying fixed components in

`lotri()`

matrices.Add

`cov`

,`cor`

,`sd`

,`var`

, and`chol`

options for matrix specification. The final matrix will always be the covariance matrixAdd function

`lotriMatInv()`

which takes a symmetric block matrix and converts it into a list of matrices. An sort of inverse operation of`lotriMat()`

Add error for

`lotri(~c(40))`

Added ability to flag

`fixed`

and`unfixed`

components in a matrix. Currently`lotri`

only supports one type.For the

`lotriFix`

objects, ie those created with population types of estimates and covariance estimates, allow them to be converted to an equivalent expression with`as.expression()`

for the lotri object and`lotriDataFrameToLotriExpression()`

for the`data.frame`

Added

`lotriIsBlockMat()`

to check to see if a matrix is in a block diagonal matrix form.

- Change errors/warnings to use
`call.=FALSE`

or equivalent. - Refactor C code to reduce complexity
- Change C code to play nicely with
`rchk`

- Allow
`lotriMat`

to mix named and unnamed matrices; When mixed, an unnamed matrix will be returned.

- Bug fix for conditional matrices
- Now accessing
`$lower`

and`$upper`

gives default values even if it wasn’t specified. - Can change the default conditional matrix to some other value like “id”
- Can add properties to matrix->lotri by as.lotri(matrix, lower=3, default=“id”)
- Dropped
`Matrix`

import and added`lotriMat`

to create banded matrices (faster than`Matrix`

for now included repeated matrices with`list(matrix, rep)`

). - Bug fix for default properties when both
`upper`

and`lower`

bounds are specified

- Added conditional matrix specification
`|`

; Returns a list of matrices where each condition is the name of the matrix returned. - The conditional matrix can also include properties ie
`| id(lower=c(eta1=3))`

- Added a
`NEWS.md`

file to track changes to the package.

- Initial Release