Closed whedon closed 2 years ago
Hello human, I'm @whedon, a robot that can help you with some common editorial tasks. @mnwright, @pdwaggoner it looks like you're currently assigned to review this paper :tada:.
:warning: JOSS reduced service mode :warning:
Due to the challenges of the COVID-19 pandemic, JOSS is currently operating in a "reduced service mode". You can read more about what that means in our blog post.
:star: Important :star:
If you haven't already, you should seriously consider unsubscribing from GitHub notifications for this (https://github.com/openjournals/joss-reviews) repository. As a reviewer, you're probably currently watching this repository which means for GitHub's default behaviour you will receive notifications (emails) for all reviews 😿
To fix this do the following two things:
For a list of things I can do to help you, just type:
@whedon commands
For example, to regenerate the paper pdf after making changes in the paper's md or bib files, type:
@whedon generate pdf
Wordcount for paper.md
is 2766
Software report (experimental):
github.com/AlDanial/cloc v 1.88 T=0.03 s (594.6 files/s, 87811.0 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 2 304 55 980
R 11 92 42 547
Markdown 2 76 0 142
Rmd 1 102 143 137
TeX 1 11 0 108
C 1 4 4 20
C/C++ Header 1 11 12 16
-------------------------------------------------------------------------------
SUM: 19 600 256 1950
-------------------------------------------------------------------------------
Statistical information for the repository '08378bffd337f88f29666b71' was
gathered on 2021/09/29.
The following historical commit information, by author, was found:
Author Commits Insertions Deletions % of changes
Arkajyoti Saha 4 1837 431 100.00
Below are the number of rows from each author that have survived and are still
intact in the current revision:
Author Rows Stability Age % in comments
Arkajyoti Saha 1406 76.5 0.6 5.12
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):
OK DOIs
- 10.1080/01621459.2021.1950003 is OK
- 10.1007/bf00058655 is OK
- 10.1023/A:1010933404324 is OK
- 10.7717/peerj.5518 is OK
- 10.1080/10106049.2019.1595177 is OK
- 10.1016/j.najef.2018.06.013 is OK
- 10.1080/01621459.2015.1044091 is OK
- 10.1109/99.660313 is OK
- 10.1201/9781315139470 is OK
MISSING DOIs
- None
INVALID DOIs
- None
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
👋🏼 @ArkajyotiSaha @mnwright @pdwaggoner
this is the review thread for the paper. All of our communications will happen here from now on.
Both reviewers have checklists at the top of this thread with the JOSS requirements. As you go over the submission, please check any items that you feel have been satisfied. There are also links to the JOSS reviewer guidelines.
The JOSS review is different from most other journals. Our goal is to work with the authors to help them meet our criteria instead of merely passing judgment on the submission. As such, the reviewers are encouraged to submit issues and pull requests on the software repository. When doing so, please mention openjournals/joss-reviews#REVIEW_NUMBER
so that a link is created to this thread (and I can keep an eye on what is happening). Please also feel free to comment and ask questions on this thread. In my experience, it is better to post comments/questions/suggestions as you come across them instead of waiting until you've reviewed the entire package.
We aim for reviews to be completed within about 2-4 weeks (Marvin already told me he might need a little bit more time, that's fine). Please let me know if you expect additional delays. We can also use Whedon (our bot) to set automatic reminders if you know you'll be away for a known period of time.
Please feel free to ping me (@fabian-s) if you have any questions/concerns.
@ArkajyotiSaha @fabian-s et al. - Overall, this package is great. A useful extension of RF, and a great complement to the paper introducing the method. My feedback is mostly focused on high level items and involves fixes to ease consumption of the paper and code, and thus application and interpretation. No PRs as nothing major needed to be changed, by me at least. I hope there are some useful comments here for the authors. Thanks!
Re: the code, how is optimization defined when param_estimate = TRUE
in the context of unknown covariance parameters? More defining and defending this (ideally in the paper and code/documentation) would be useful.
Re: the code, and specifically this criterion from JOSS: “A summary describing the high-level functionality and purpose of the software for a diverse, non-specialist audience.”, the summary (and statement of need by extension) don’t fully meet this standard. The language does a job focusing on the computational benefits of RandomForestsGLS
, as well as the value in a statistical sense. But the functionality and focus of the package (rather than the method), is lacking. The details and value of the method, though needed at a high level to understand the package, are fully unpacked in the saha2021random
paper. So, I wanted much more focus on introducing and convincing a non-specialist, skeptical audience of the need and value of this software tool. To be sure, the details of the package construction and design are well-discussed. But the implementation of the package, and how it might be tied into the modal ML workflow, for example, are missing. Of note: Once addressed, I will check off the related item in the review form. Ping me (@pdwaggoner
) once addressed so I can complete the review form.
Why only choose autoregression for the time series dependency? As with any method, there are several assumptions with this approach/method (namely, assuming autoregressive errors). Its definitely widely used and AR is often the most common type of history dependence, and thus a good starting place. But I’d recommend, perhaps even for later package versions, other time series methods to be included in this framework, both parametric and nonparametric (e.g., ECM, ARFIMA, random walk, and so on).
Re: the paper, there were many grammatical issues throughout (e.g., "felicitates” in the Statement of Need), as well as informal syntax (contractions like “doesn't” used throughout). I recommend cleaning up and revising the manuscript several times across several readers. These types of mistakes are a bit distracting. Of note: Once addressed, I will check off the related item in the review form. Ping me (@pdwaggoner
) once addressed so I can complete the review form.
Re: the paper, I wanted to see a more explicit and clearer definition of the core concept, “dependency” up front. It is mentioned a lot throughout and in the title. The authors do a good job of relating the similarity of OLS -> GLS, for the current move from RF -> RF-GLS. And there is a reference to “spatial and temporal correlation” in the Summary. But other than this, I was a bit confused and often left wondering about the many other contexts, definitions and cases that “dependency” could mean. So a crisper set up and definition for such a central concept would really benefit the paper and help situate the reader right off the bat.
Though in the vignette, I don’t get the purpose of the following in the RFGLS_estimate_timeseries.Rd manual page:
rmvn <- function(n, mu = 0, V = matrix(1)){
p <- length(mu)
if(any(is.na(match(dim(V),p))))
stop("Dimension not right!")
D <- chol(V)
t(matrix(rnorm(n*p), ncol=p)\%*\%D + rep(mu,rep(n,p)))
}
I couldn’t see anywhere rmvn
was called. Could’ve missed something.
I could imagine core functions (e.g., RFGLS_estimate_spatial
) being slow with big data sets. On replicating some of the parts of the vignette, it was pretty fast. But perhaps wrapping computation in a progress bar would be a nice UI addition. For example, something like:
RFGLS_estimate_spatial <- function(coords, y, X, Xtest = NULL, nrnodes = NULL, nthsize = 20, mtry = 1, pinv_choice = 1, n_omp = 1, ntree = 50, h = 1,
sigma.sq = 1, tau.sq = 0.1, phi = 5, nu = 0.5, n.neighbors = 15, cov.model = "exponential", search.type = "tree",
param_estimate = FALSE, verbose = FALSE){
progressr::with_progress( # start progress bar here via `progressr`
n <- nrow(coords)
nsample <- n
if(is.null(nrnodes)){
nrnodes <- 2 * nsample + 1
}
if(is.null(Xtest)){
Xtest <- X
}
if(ncol(Xtest) != ncol(X)){ stop(paste("error: Xtest must have ",ncol(X)," columns\n"))}
if(param_estimate){
sp <- randomForest(X, y, nodesize = nthsize)
sp_input_est <- predict(sp, X)
rf_residual <- y - sp_input_est
if(verbose){
cat(paste(("----------------------------------------"), collapse=" "), "\n"); cat(paste(("\tParameter Estimation"), collapse=" "), "\n"); cat(paste(("----------------------------------------"), collapse=" "), "\n")
}
est_theta <- BRISC_estimation(coords, x = matrix(1,n,1), y = rf_residual, verbose = verbose, cov.model = cov.model)
sigma.sq <- est_theta$Theta[1]
tau.sq <- est_theta$Theta[2]
phi <- est_theta$Theta[3]
if(cov.model =="matern"){
nu <- est_theta$Theta[4]
}
}
cov.model.names <- c("exponential","spherical","matern","gaussian")
cov.model.indx <- which(cov.model == cov.model.names) - 1
storage.mode(cov.model.indx) <- "integer"
##Parameter values
if(cov.model!="matern"){
initiate <- c(sigma.sq, tau.sq, phi)
names(initiate) <- c("sigma.sq", "tau.sq", "phi")
}
else{
initiate <- c(sigma.sq, tau.sq, phi, nu)
names(initiate) <- c("sigma.sq", "tau.sq", "phi", "nu")}
alpha.sq.starting <- sqrt(tau.sq/sigma.sq)
phi.starting <- sqrt(phi)
nu.starting <- sqrt(nu)
storage.mode(alpha.sq.starting) <- "double"
storage.mode(phi.starting) <- "double"
storage.mode(nu.starting) <- "double"
search.type.names <- c("brute", "tree")
if(!search.type %in% search.type.names){
stop("error: specified search.type '",search.type,"' is not a valid option; choose from ", paste(search.type.names, collapse=", ", sep="") ,".")
}
search.type.indx <- which(search.type == search.type.names)-1
storage.mode(search.type.indx) <- "integer"
##Option for Multithreading if compiled with OpenMp support
n.omp.threads <- as.integer(n_omp)
storage.mode(n.omp.threads) <- "integer"
fix_nugget <- 1
##type conversion
storage.mode(n) <- "integer"
storage.mode(coords) <- "double"
storage.mode(n.neighbors) <- "integer"
storage.mode(verbose) <- "integer"
if(verbose){
cat(paste(("----------------------------------------"), collapse=" "), "\n"); cat(paste(("\tRFGLS Model Fitting"), collapse=" "), "\n"); cat(paste(("----------------------------------------"), collapse=" "), "\n")
}
res_BF <- .Call("RFGLS_BFcpp", n, n.neighbors, coords, cov.model.indx, alpha.sq.starting, phi.starting, nu.starting, search.type.indx, n.omp.threads, verbose, PACKAGE = "RandomForestsGLS")
res_Z <- .Call("RFGLS_invZcpp", as.integer(length(res_BF$nnIndxLU)/2), as.integer(res_BF$nnIndx), as.integer(res_BF$nnIndxLU), as.integer(rep(0, length(res_BF$nnIndxLU)/2)), as.integer(0*res_BF$nnIndx), as.integer(rep(0, length(res_BF$nnIndxLU)/2 + 1)), as.integer(rep(0, length(res_BF$nnIndxLU)/2)), PACKAGE = "RandomForestsGLS")
p <- ncol(X)
storage.mode(p) <- "integer"
storage.mode(nsample) <- "integer"
storage.mode(nthsize) <- "integer"
if(is.null(nrnodes)){
nrnodes <- 2 * nsample + 1
}
storage.mode(nrnodes) <- "integer"
storage.mode(mtry) <- "integer"
treeSize <- 0
storage.mode(treeSize) <- "integer"
storage.mode(pinv_choice) <- "integer"
ntest <- nrow(Xtest)
storage.mode(ntest) <- "integer"
if(is.null(h)){h <- 1}
q <- 0
storage.mode(q) <- "integer"
local_seed <- sample(.Random.seed, 1)
if(h > 1){
cl <- makeCluster(h)
clusterExport(cl=cl, varlist=c("X", "y", "res_BF", "res_Z", "mtry", "n", "p",
"nsample", "nthsize", "nrnodes", "treeSize", "pinv_choice", "Xtest", "ntest",
"n.omp.threads", "RFGLS_tree", "q", "local_seed"),envir=environment())
if(verbose == TRUE){
cat(paste(("----------------------------------------"), collapse=" "), "\n"); cat(paste(("\tRF Progress"), collapse=" "), "\n"); cat(paste(("----------------------------------------"), collapse=" "), "\n")
pboptions(type = "txt", char = "=")
result <- pblapply(1:ntree,RFGLS_tree, X, y, res_BF, res_Z, mtry, n, p,
nsample, nthsize, nrnodes, treeSize, pinv_choice, Xtest, ntest,
n.omp.threads, q, local_seed, cl = cl)
}
if(verbose != TRUE){result <- parLapply(cl,1:ntree,RFGLS_tree, X, y, res_BF, res_Z, mtry, n, p,
nsample, nthsize, nrnodes, treeSize, pinv_choice, Xtest, ntest,
n.omp.threads, q, local_seed)}
stopCluster(cl)
}
if(h == 1){
if(verbose == TRUE){
cat(paste(("----------------------------------------"), collapse=" "), "\n"); cat(paste(("\tRF Progress"), collapse=" "), "\n"); cat(paste(("----------------------------------------"), collapse=" "), "\n")
pboptions(type = "txt", char = "=")
result <- pblapply(1:ntree,RFGLS_tree, X, y, res_BF, res_Z, mtry, n, p,
nsample, nthsize, nrnodes, treeSize, pinv_choice, Xtest, ntest,
n.omp.threads, q, local_seed)
}
if(verbose != TRUE){
result <- lapply(1:ntree,RFGLS_tree, X, y, res_BF, res_Z, mtry, n, p,
nsample, nthsize, nrnodes, treeSize, pinv_choice, Xtest, ntest,
n.omp.threads, q, local_seed)
}
}
RFGLS_out <- list()
RFGLS_out$P_matrix <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$P_index))
RFGLS_out$predicted_matrix <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$ytest))
RFGLS_out$predicted <- rowMeans(RFGLS_out$predicted_matrix)
RFGLS_out$X <- X
RFGLS_out$y <- y
RFGLS_out$coords <- coords
RFGLS_out$RFGLS_object <- list()
RFGLS_out$RFGLS_object$ldaughter <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$lDaughter))
RFGLS_out$RFGLS_object$rdaughter <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$rDaughter))
RFGLS_out$RFGLS_object$nodestatus <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$nodestatus))
RFGLS_out$RFGLS_object$upper <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$upper))
RFGLS_out$RFGLS_object$avnode <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$avnode))
RFGLS_out$RFGLS_object$mbest <- do.call(cbind, lapply(1:ntree, function(i) result[[i]]$mbest))
) # close progress bar here
return(RFGLS_out)
}
If you like this, happy to open a PR and drop it in the functions for each if it would help. Let me know.
:wave: @mnwright, please update us on how your review is going (this is an automated reminder).
:wave: @pdwaggoner, please update us on how your review is going (this is an automated reminder).
Finished mine a while ago (14 days). See above in this thread
Ping @ArkajyotiSaha and @fabian-s
@ArkajyotiSaha while we wait for @mnwright to start their review, please adress @pdwaggoner points/questions/remarks from their comment above?
Sounds great! I am working on addressing @pdwaggoner comments, will let @fabian-s and @pdwaggoner know, once I am done with them!
I think this is a very useful extension of random forests and a promising package. The examples where the methods outperforms standard RF are quite impressing! I have a few general questions, some on the package and some on the paper:
@ArkajyotiSaha what's your timeline for adressing our reviewers' comments?
@fabian-s I am working on the revision and am almost done with them. I plan to submit them by the end of the thanksgiving weekend (29th Nov). Please let me know if the timeline works for you. Thanks!
great, thanks for the update.
@fabian-s , @pdwaggoner @mnwright We thank the Editor and the reviewers for their positive feedback and thoughtful comments which have helped to improve the manuscript. We have tried to address all the reviewer comments in the software and the paper. Updated versions of the package and the paper are available in the associated GitHub repository (https://github.com/ArkajyotiSaha/RandomForestsGLS). A detailed point-by-point response letter is available in https://github.com/ArkajyotiSaha/RandomForestsGLS/blob/main/JOSS_authors_response_letter.pdf . The response letter is divided in two sections, with each section addressing the comments of one of the reviewers (Section 1: @pdwaggoner ; Section 2: @mnwright). Please let me know if I can provide any additional information. Thanks for your time and consideration!
@whedon generate pdf
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
Satisfied. Well done!
@mnwright please let us know if you see any remaining points that need to be adressed.
Thanks for the extensive revision. It looks fine except one thing: I still cannot find the comments in the .cpp
files.
@mnwright Extremely sorry! Thanks so much for pointing this out. I have somehow missed updating the version of RFGLS.cpp in the GitHub with the commented version. I have now updated the version. The new comments can be found in the updated version of RFGLS.cpp. For your convenience, I am also adding a link to the latest edit history, which highlights the comments at https://github.com/ArkajyotiSaha/RandomForestsGLS/commit/8e1b11236274844ec92be371d10d8d08dfd33844 . Please let me know if this works. Thanks again!
@whedon generate pdf
@whedon check references
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):
OK DOIs
- 10.1080/01621459.2021.1950003 is OK
- 10.1007/bf00058655 is OK
- 10.1023/A:1010933404324 is OK
- 10.7717/peerj.5518 is OK
- 10.1080/10106049.2019.1595177 is OK
- 10.1016/j.najef.2018.06.013 is OK
- 10.1080/01621459.2015.1044091 is OK
- 10.1109/99.660313 is OK
- 10.1201/9781315139470 is OK
MISSING DOIs
- None
INVALID DOIs
- None
@ArkajyotiSaha It seems both reviewers are now satisified with the software and the paper, thank you for taking on these revisions.
However, JOSS submissions are typically 500-1000 words, while your article currently has >3000 words. Please shorten as much as you can. Especially l. 180 - 260 contain much more technical and mathematical detail than we expect for a JOSS paper, please remove anything that is not a high-level summary of what the software offers from a user perspective as well as anything that is also contained in more detail in your package vignettes or your methodological papers.
Thank you so much @fabian-s . I am working on the article to shorten it such that it doesn't take anything away from a high-level summary, but does away with the intricate technical and mathematical details by referring to existing associated literature in package vignettes/methodological paper/github repo description of the package. Will update you once I am done with the update, thanks!
@fabian-s I have updated the text. We have moved most of 180 - 260 in package README. Since the analysis of time series data is an important part of the package, and is not highlighted in the methodological paper, we wanted to keep it in this article. In order to further reduce the length of the article, we have alsomoved the discussion on unknown parameter estimation to README section. Please let me know if this works, thanks!
@whedon generate pdf
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
Thanks @ArkajyotiSaha , this is much better already but we're still at ~2000 words.
I think by consistently cutting out all verbosity and rhetorical flourishes (e.g. by following some of the tips here: https://redwoodink.com/resources/10-tricks-to-reduce-your-word-count-in-academic-writing) you could easily reduce that by another 20-40% without losing any relevant conten -- could I ask you to try to do so? I'm sorry for all this back and forth, I should have raised this problem much sooner during the review.
As an example for the kind of editing you could do, consider my attempt at making your Discussion section more concise:
Original (240 words):
In this package, we have developed an efficient, parallel implementation of the RF-GLS method proposed in @saha2021random. This accounts for the correlation in the data by incorporating it in the node splitting criteria and the node representative update rule. The package accounts for spatial correlation, modeled with Matérn GP and serial autocorrelation. More often than not, the model parameters are unknown to the users, hence the package has inbuilt parameter estimation corresponding to both the covariance structures. Efficient implementation through C/C++ takes advantage of the NNGP approximation and scalable node splitting update rules which reduces the execution time. For details regarding package features, unknown parameter estimation and parallelization, we refer the readers to the package README. Present implementation of RF-GLS is slower than that of RF due to the additional computational complexity associated with the split criteria evaluation. In RF-GLS, evaluation of cost function, corresponding to a potential split has $O(t^3)$ computational complexity, where $t$ is the number of leaf nodes at the present split. For very deep trees, this would lead to significant added computational burden over RF, where this step has $O(1)$ complexity. As a future extension of the package, implementation of covariate specific parallel optimization corresponding to each node splitting and improving overall computational complexity of the algorithm can be of independent research interest. We also plan to implement additional forms of time series dependency and perform thorough empirical validation, prior to making it available in the software.
Concise (135 words):
This package provides an efficient, parallel implementation of the RF-GLS method proposed in @saha2021random which accounts for correlated data with modified node splitting criteria and node representative update rule. The package accounts for spatial correlation via Matérn GP or serial autocorrelation. It provides parameter estimation for both covariance structures. Efficient implementation through C/C++ takes advantage of the NNGP approximation and scalable node splitting update rules which reduces the execution time. More details on package features, parameter estimation and parallelization can be found in the package README. Since the computational complexity of evaluating potential splits is cubic in the number of leaf nodes for RF-GLS, but constant for standard RF, improving the computational complexity of the algorithm is of independent research interest. We also plan to implement and validate additional forms of time series dependency.
@fabian-s Thank you so much for the detailed example and the reference! I will take a second pass through the paper and reduce it significantly. Will update you once I am done. Thanks again!
@ArkajyotiSaha please let us know how much time you'll need for your edits.
@fabian-s I am done with the initial edits (which have reduced the word count ~800 words as per your recommendations) and presently working on finalizing them. Hope to submit the final version by the end of the next week!
@ArkajyotiSaha please let us know about your progress
@fabian-s I completed my edits and sent them to my coauthors for comments. I am waiting to hear back from them. I have also sent them a reminder. Hope to submit the final version by end of the week.
@fabian-s I have updated the manuscript accordingly, which has resulted in significant reduction in manuscript length. Please let me know your thoughts on this.
@whedon generate pdf
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
Thanks -- almost done here, finally! Please take a look at the typos / grammatical errors I fixed at https://github.com/ArkajyotiSaha/RandomForestsGLS/pull/1 incorporate as necessary/sensible, then please do run another spell check and proof-read closely and ping me again.
@fabian-s I have incorporated your corrections. Thanks so much for them! I have also gone through the manuscript for another round of proof-read and made some minor corrections.
@whedon generate pdf
@whedon check references
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):
OK DOIs
- 10.1080/01621459.2021.1950003 is OK
- 10.1007/bf00058655 is OK
- 10.1023/A:1010933404324 is OK
- 10.7717/peerj.5518 is OK
- 10.1080/10106049.2019.1595177 is OK
- 10.1016/j.najef.2018.06.013 is OK
- 10.1080/01621459.2015.1044091 is OK
- 10.1109/99.660313 is OK
- 10.1201/9781315139470 is OK
MISSING DOIs
- None
INVALID DOIs
- None
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
:partying_face: @ArkajyotiSaha
Wonderful -- at this point could you:
I can then move forward with accepting the submission.
I made minor updates in the package vignette and updated the package version.
Please let me know if any additional information is needed.
@ArkajyotiSaha thanks, almost done,
please make sure the title of your Zenodo deposit matches the title of your JOSS paper -- it's
"ArkajyotiSaha/RandomForestsGLS: v0.1.4"
right now, it should be
"RandomForestsGLS: An R package for Random Forests for dependent data"
Submitting author: !--author-handle-->@ArkajyotiSaha<!--end-author-handle-- (Arkajyoti Saha) Repository: https://github.com/ArkajyotiSaha/RandomForestsGLS Branch with paper.md (empty if default branch): Version: v0.1.4.JOSS Editor: !--editor-->@fabian-s<!--end-editor-- Reviewers: @mnwright, @pdwaggoner Archive: 10.5281/zenodo.6257157
:warning: JOSS reduced service mode :warning:
Due to the challenges of the COVID-19 pandemic, JOSS is currently operating in a "reduced service mode". You can read more about what that means in our blog post.
Status
Status badge code:
Reviewers and authors:
Please avoid lengthy details of difficulties in the review thread. Instead, please create a new issue in the target repository and link to those issues (especially acceptance-blockers) by leaving comments in the review thread below. (For completists: if the target issue tracker is also on GitHub, linking the review thread in the issue or vice versa will create corresponding breadcrumb trails in the link target.)
Reviewer instructions & questions
@mnwright & @pdwaggoner, please carry out your review in this issue by updating the checklist below. If you cannot edit the checklist please:
The reviewer guidelines are available here: https://joss.readthedocs.io/en/latest/reviewer_guidelines.html. Any questions/concerns please let @fabian-s know.
✨ Please start on your review when you are able, and be sure to complete your review in the next six weeks, at the very latest ✨
Review checklist for @mnwright
✨ Important: Please do not use the Convert to issue functionality when working through this checklist, instead, please open any new issues associated with your review in the software repository associated with the submission. ✨
Conflict of interest
Code of Conduct
General checks
Functionality
Documentation
Software paper
Review checklist for @pdwaggoner
✨ Important: Please do not use the Convert to issue functionality when working through this checklist, instead, please open any new issues associated with your review in the software repository associated with the submission. ✨
Conflict of interest
Code of Conduct
General checks
Functionality
Documentation
Software paper