<Next version of Ox> <Previous version of Ox>

# Ox 4.0: new features and fixes

New features and enhancements
Fixed problems and new features in 4.1
Problems fixed in 4.04
Problems fixed in 4.02
Problems in version 3.40 fixed in 4.00
OxGauss

## New features and enhancements

- Added `switch` and `switch_single` language constructs (and keywords).
- Direct access to data member variables of a class can now be provided (`struct`, `public`, `protected`). In a `struct` all members are public. In a `class`, `public` can be used to make data public (but `protected` and `public` do not apply to functions).
- New default uniform random number generator (MWC8222_52) with period 2^8222 and using full 52-bit floating point precision. Also new (and faster) standard normal generator based on the ziggurat method. Use `ranseed("PM")` to reset the old default for uniform and normal, in order to replicate results from older Ox versions.
- New FFT function `fft1d`, which is faster and works for arbitrary sample size. The original `fft` now uses the faster FFT version, and still converts the sample size to a power of two. Modified `dfft` to make it compatible with `fft1d`/`fft1d`. The new FFT is based on FFTE 2.0 by Daisuke Takahashi.
- `dayofeaster`, `dayofmonth`, `timeofday`, `"%C"` format.
- W test for normality (NormTestW in lib/normtest).
- Added `polyeval`.
- `MaxSQP`: removed singularity message in Maratos correction (now QR based), and many other improvements.
- `%t` and `%T` `sscan`/`fscan` formats to scan a token
- `%v` `sscan`/`fscan` and `print`/`fprint` formats to read and write values a Ox constant (literals). This can be used, e.g. to read and write the entire contants of a class object. An example is in `samples/inout/percent_v.ox`.
- Small improvement to format handling in `print`/`fprint` makes it easier to print strings with % in it. For example in `print("%s", "%GDP")` the second argument is treated as a string to print, not as a format.
- `Database` class uses `findsample` in `SetSelSample`; added `GetSelSampleMode`/`SetSelSampleMode`; added `Save` and `SetVar`. Added support for daily data (dated database). Ability to read Excel files with date/time columns.
- Extensions to `Modelbase` class to support many enhancements of OxPack.
- Added `findsample`; `loadmat`/`savemat` can handle variable names
- Slightly more accurate tailn/probn for probablities > 1e-20 (about 14-15 significant digits correct, instead of 10-11 before).
- Ox can run Ox files that use non-English characters in the filename (Windows 2000/XP).
- The default symbol table size is now 3000.

## Fixed problems and new features in version 4.1:

- Improved PcFiml output for single equation models.
- 10^10 as a constant expression (i.e. outside any function) would overflow (using integer arithmetic). Now works same as the run-time expression.
- `Modelbase::DoOptionsDlg` calls `SaveOptions()` when successful.
- The 64-bit version of Ox defines OX_64_BIT. Also, the 64-bit version will first try `xyz_64` (with the appropriate .so or .dll extension) if the dynamic link library is specified as `xyz` in the extern statement. So now, e.g., `arfima.so` and `arfima_64.so` can be installed in the arfima folder, and the correct version will be used automatically.
- Fixed several problems with loading CSV files.
- `densbinomial`, `densgeometric`, `densnegbin` returned .NaN with p=1 or p=0.
- Random number generators for distributions with two parameters (such as `rangamma`) would in some circumstances use the second argument as the third. This would only happen if they are both matrices, conformant to the dimension of the generated matrix (so not if both are scalars, the most common case).
- The following code:

      	  decl as = {"a","b"}, v = <0,1,2>;
      	  println(as[v[<0:1>]]);

  gave a runtime error: 'matrix[1][2]' cannot cast to int while it should just work.
- Select Variables dialog (OP_SELECTVAR) would allow database changes based on the previous incantation rather than the current. The actual database change also didn't work.
- `GetSampleByIndex` in help: link does not work
- `countc` could crash; now the second argument in `countc`/`countr` can be a column as well as a row vector
- Fixed some corner cases of `probf`/`tailf`: argument 0 always returns 0 (1 for `tailf`), +.Inf returns 1 (0 for `tailf`).
- `quanbeta` breaks down for large values of a and b (when distribution becomes quite rectangular). This was partially because of bad starting values.
- `unvech` with a scalar argument returns 0 instead of a 1x1 matrix with the scalar.
- reading xls file with embedded chart data (perhaps without actually holding a chart) could go wrong.
- Missing values for min/max in `DrawAxis` causes infinite loop
- `PcFiml` class: Chow test didn't work in a model without regressors.

## Problems which have been fixed in version 4.04:

- Ox Console install in OxEdit: added Ox - compile command to Run menu.
- Changed .oxo link error to a warning if a version 3 compiled oxo file is used under version 4. Note that this will not help with code that imports a class that has changed (Database, Modelbase e.g.).
- `countc`/`countr` now skip over missing values.
- `savemat` for .mat/.fmt file: now ignores third argument if it is an array (previously generated a run-time error).
- Loading Excel files:
  Problem: if the first column looks like it defines a fixed frequency sample and has no label, it is not loaded. This has been fixed: the first column is maintained if it has a label or if it has numeric data. (same as GiveWin and Ox 3, Ox 4.00/4.02 would drop it).
  Enhancements:
  - A dot or any text starting with #N/A is treated as a missing value (previously it was only #N/A exactly).
  - Now dropping columns which have no entries at all (as happened in Ox 3/GiveWin)
  - `loadmat` defaults to treating strings as missing values (this is as in Ox 3, but different from loading an Excel file using the Database class). Dates are also left untranslated by default. This maintains symmetry between `loadmat` and `savemat`.
  - If the format argument of `loadmat` is set to 1 for an xls file, strings and dates are read in the same way as using the Database class. So `loadmat("x.xls")` is now the same as Ox 3.x), while `loadmat("x.xls", 1)` maintains strings as numbers and translates dates).
- `deletec(x,<>)` and `selectc(x,<>)` crash on empty second argument.
- `insertc`/`insertr` at the position of one plus the last column/row crashes.

## Problems in version 4.00 which have been fixed in version 4.02:

- OxPack:
  - main help command was not working
  - No `OP_ESTIMATE` or `OP_ESTIMATE_NODB`: always switch test menu entries on.
- `Modelbase::DbDrawTMatrix` did not grow the database correctly when required.
- `eigensym`: possible error in eigenvectors of blockdiagonal symmetric matrix.
- `eigensymgen`: now much faster for large matrices.
- `switch`/`switch_single` which doesn't end with `default` leads to IE Stack Error if the last case is executed and FALSE. `CTL_SAMPLEINDEX` field inside `OP_MATRIX_CTL`: entering a number before the inline edit field is shown leads to crash (is fine in all other control types)
- `getenv` will (most likely) lead to a crash
- 64-bit linux only: using a log file can lead to a crash when printing strings with string format specifier.
- g2ox.ox: `loaddata` and `savedata` definition wrong

## Problems in version 3.40 which have been fixed in version 4.00:

- Fixed problem with: `delete x[i]` where x is an array of objects.
- Fixed: accessing a baseclass static variable from inside a derived class did not work, because it behaved as if the derived class had its own copy. Using the baseclass's access function (if written) would work correctly though.
- this->undeclared[someindex] = somevalue; would lead to crash in parsing after several warning messages
- Fixed problem with destructor within namespace
- trace of a scalar double is wrong (so no problem with `trace(<1>)` but with `trace(1.0)`). `cdiv(< .;1 >,< .;1 >)` would give divide by zero warning. Now it returns `< .;. >`.
- The following should work but gave an error message that a scalar was expected:

      	  decl v = <10, 20>, a = new array[ v[0] ];

- `countr`, `countc`: if the intervals are not ordered, the return value is filled with missing values.
- `sortcindex(<>)` crashes.
- Cannot load an in7/bn7 data file which has only one observation.
- `MaxSQP` could (rarely: when `vc.==0`) get stuck in an infinite loop in the computation of the slope w.r.t. constraints in merit function. Also improved `MaxSQP` line search.
- `SolveQP_chol` could (very rarely) get stuck in an infinite loop when the `ddiag` value is zero.

## OxGauss

- Added support for `varput`/`varget`.
- Fixed a bug has been identified in a procedure which (1) calls as yet undefined procedures, (2) includes two or more for loops. In that case, the second (and further) loop incrementation can go awry. The reason is that there is insufficient space for the loop-local variables on the stack.
- Fixed bug in y/x when it means regression and trap(2) is on (replacing missing values with 0). ftos with character matrix didn't work:

      	    let s = "test";
      		print ftos( s, "%*.*s", 7, 7 );

Ox version 4.10. © JA Doornik

This file last changed
.