project_matrix() is now implemented in C++ internally. Additionally, several internal calculations used by log_posteriori_of_gips() and find_MAP(optimizer = "BF") were optimized.
For Brute Force optimization:
| permutation size | 6 | 7 | 8 | 9 | |---|---:|---:|---:|---:| | v1.2.3 | 1.26 s | 4.06 s | 30.19 s | 4.35 min | | v1.2.3.9000 | 0.64 s | 2.66 s | 16.31 s | 2.17 min |
For log_posteriori_of_gips() evaluated on 1000 random permutations of a given size:
| permutation size | 30 | 50 | 100 | 200 | 300 | |---|---:|---:|---:|---:|---:| | v1.2.3 | 2.31 s | 2.31 s | 11.70 s | 46.49 s | 110.17 s | | v1.2.3.9000 | 0.84 s | 1.26 s | 3.24 s | 15.73 s | 39.47 s |
The above tables based on the code from Pull Request #99.
plot.gips() now uses ggplot2 for all plot types.There was a significant speed improvement in get_structure_constants(), which is used internally by posterior calculations. For 1000 random permutations of a given size:
| permutation size | 30 | 50 | 100 | 200 | 300 | |---|---:|---:|---:|---:|---:| | v1.2.2 | 0.09 s | 0.10 s | 0.25 s | ~10 s | ~25 s | | v1.2.3 | 0.07 s | 0.08 s | 0.10 s | 0.17 s | ~0.20 s |
This change consequently improved log_posteriori_of_gips(). For 1000 random permutations of a given size:
| permutation size | 30 | 50 | 100 | 200 | 300 | |---|---:|---:|---:|---:|---:| | v1.2.2 | 1.50 s | 2.49 s | 7.08 s | 55.25 s | 169.77 s | | v1.2.3 | 1.29 s | 2.24 s | 6.84 s | 31.73 s | 85.10 s |
plot.gips() can get type = "n0", which will plot the change of n0 along the "MH" optimization. Handy for deciding of burn-in time;find_MAP(optimizer = "MH") tracks the n0 along the optimization;summary.gips() calculates Likelihood-Ratio test.logLik.gips() will return an object of class logLik;BIC.gips()AIC.gips()logLik.gips()as.character.gips()gips() has a new default D_matrix = mean(diag(S)) * diag(p);summary.gips() calculates AIC, BIC, and n_parameters (number of free parameters in the covariance matrix);get_probabilities_from_gips() will return a sorted vector;compare_posteriories_of_perms() and compare_log_posteriories_of_perms() have a new parameter digits;gips object can now be passed and interpreted as a permutation. Those are:
perm in gips(), project_matrix(), prepare_orthogonal_matrix(), get_structure_constants(), calculate_gamma_function();perm1 and perm2 in compare_posteriories_of_perms(), compare_log_posteriories_of_perms();x in gips_perm();plot.gips() can get type = "MLE", which is an alias for type = "heatmap";find_MAP(optimizer = "BF") is 3 times faster;find_MAP(optimizer = "BF") is default for perm_size <= 9.post_probabilities underflows to 0. This is appropriately validated now;NaNs should not occur in find_MAP() for D_matrix <- diag(ncol(S)) * d when 1000 < d < 1e300;NaNs do occur in find_MAP(), they will throw an error (used to show a warning);Inf better handled in print.gips();print.*() functions will print \n in the end;print.gips();delta parameter of gips() has to be bigger than 1. We used to restrict it to bigger than 2;project_matrix() shows a warning when the non-positive-semi-definite matrix is passed as an S argument;project_matrix() preserves colnames() and rownames() of a matrix;D_matrix is checked for containing any NaN or Inf values;integer. Now we use double;compare_log_posteriories_of_perms() and compare_posteriories_of_perms() show an error when given two incomparable gips objects (with different parameters).