Joss-reviews: [REVIEW]: pyOptSparse: A Python framework for large-scale constrained nonlinear optimization of sparse systems

Created on 11 Aug 2020  Β·  69Comments  Β·  Source: openjournals/joss-reviews

Submitting author: @nwu63 (Neil Wu)
Repository: https://github.com/mdolab/pyoptsparse/
Version: v2.2.1
Editor: @poulson
Reviewer: @jgoldfar, @vissarion, @matbesancon
Archive: 10.5281/zenodo.4110792

: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

Status badge code:

HTML: <a href="https://joss.theoj.org/papers/8edb06e7e0f2ae60fcccec3d2889d5e7"><img src="https://joss.theoj.org/papers/8edb06e7e0f2ae60fcccec3d2889d5e7/status.svg"></a>
Markdown: [![status](https://joss.theoj.org/papers/8edb06e7e0f2ae60fcccec3d2889d5e7/status.svg)](https://joss.theoj.org/papers/8edb06e7e0f2ae60fcccec3d2889d5e7)

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

@jgoldfar & @vissarion & @matbesancon, please carry out your review in this issue by updating the checklist below. If you cannot edit the checklist please:

  1. Make sure you're logged in to your GitHub account
  2. Be sure to accept the invite at this URL: https://github.com/openjournals/joss-reviews/invitations

The reviewer guidelines are available here: https://joss.readthedocs.io/en/latest/reviewer_guidelines.html. Any questions/concerns please let @poulson 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 @jgoldfar

Conflict of interest

  • [x] I confirm that I have read the JOSS conflict of interest (COI) policy and that: I have no COIs with reviewing this work or that any perceived COIs have been waived by JOSS for the purpose of this review.

Code of Conduct

General checks

  • [x] Repository: Is the source code for this software available at the repository url?
  • [x] License: Does the repository contain a plain-text LICENSE file with the contents of an OSI approved software license?
  • [x] Contribution and authorship: Has the submitting author (@nwu63) made major contributions to the software? Does the full list of paper authors seem appropriate and complete?
  • [x] Substantial scholarly effort: Does this submission meet the scope eligibility described in the JOSS guidelines

Functionality

  • [ ] Installation: Does installation proceed as outlined in the documentation?
  • [ ] Functionality: Have the functional claims of the software been confirmed?
  • [ ] Performance: If there are any performance claims of the software, have they been confirmed? (If there are no claims, please check off this item.)

Documentation

  • [ ] A statement of need: Do the authors clearly state what problems the software is designed to solve and who the target audience is?
  • [ ] Installation instructions: Is there a clearly-stated list of dependencies? Ideally these should be handled with an automated package management solution.
  • [ ] Example usage: Do the authors include examples of how to use the software (ideally to solve real-world analysis problems).
  • [ ] Functionality documentation: Is the core functionality of the software documented to a satisfactory level (e.g., API method documentation)?
  • [ ] Automated tests: Are there automated tests or manual steps described so that the functionality of the software can be verified?
  • [ ] Community guidelines: Are there clear guidelines for third parties wishing to 1) Contribute to the software 2) Report issues or problems with the software 3) Seek support

Software paper

  • [ ] Summary: Has a clear description of the high-level functionality and purpose of the software for a diverse, non-specialist audience been provided?
  • [ ] A statement of need: Do the authors clearly state what problems the software is designed to solve and who the target audience is?
  • [ ] State of the field: Do the authors describe how this software compares to other commonly-used packages?
  • [ ] Quality of writing: Is the paper well written (i.e., it does not require editing for structure, language, or writing quality)?
  • [ ] References: Is the list of references complete, and is everything cited appropriately that should be cited (e.g., papers, datasets, software)? Do references in the text use the proper citation syntax?

Review checklist for @vissarion

Conflict of interest

  • [x] I confirm that I have read the JOSS conflict of interest (COI) policy and that: I have no COIs with reviewing this work or that any perceived COIs have been waived by JOSS for the purpose of this review.

Code of Conduct

General checks

  • [x] Repository: Is the source code for this software available at the repository url?
  • [x] License: Does the repository contain a plain-text LICENSE file with the contents of an OSI approved software license?
  • [x] Contribution and authorship: Has the submitting author (@nwu63) made major contributions to the software? Does the full list of paper authors seem appropriate and complete?
  • [x] Substantial scholarly effort: Does this submission meet the scope eligibility described in the JOSS guidelines

Functionality

  • [x] Installation: Does installation proceed as outlined in the documentation?
  • [x] Functionality: Have the functional claims of the software been confirmed?
  • [ ] Performance: If there are any performance claims of the software, have they been confirmed? (If there are no claims, please check off this item.)

Documentation

  • [x] A statement of need: Do the authors clearly state what problems the software is designed to solve and who the target audience is?
  • [x] Installation instructions: Is there a clearly-stated list of dependencies? Ideally these should be handled with an automated package management solution.
  • [x] Example usage: Do the authors include examples of how to use the software (ideally to solve real-world analysis problems).
  • [x] Functionality documentation: Is the core functionality of the software documented to a satisfactory level (e.g., API method documentation)?
  • [x] Automated tests: Are there automated tests or manual steps described so that the functionality of the software can be verified?
  • [x] Community guidelines: Are there clear guidelines for third parties wishing to 1) Contribute to the software 2) Report issues or problems with the software 3) Seek support

Software paper

  • [x] Summary: Has a clear description of the high-level functionality and purpose of the software for a diverse, non-specialist audience been provided?
  • [x] A statement of need: Do the authors clearly state what problems the software is designed to solve and who the target audience is?
  • [x] State of the field: Do the authors describe how this software compares to other commonly-used packages?
  • [x] Quality of writing: Is the paper well written (i.e., it does not require editing for structure, language, or writing quality)?
  • [x] References: Is the list of references complete, and is everything cited appropriately that should be cited (e.g., papers, datasets, software)? Do references in the text use the proper citation syntax?

Review checklist for @matbesancon

Conflict of interest

  • [x] I confirm that I have read the JOSS conflict of interest (COI) policy and that: I have no COIs with reviewing this work or that any perceived COIs have been waived by JOSS for the purpose of this review.

Code of Conduct

General checks

  • [x] Repository: Is the source code for this software available at the repository url?
  • [x] License: Does the repository contain a plain-text LICENSE file with the contents of an OSI approved software license?
  • [x] Contribution and authorship: Has the submitting author (@nwu63) made major contributions to the software? Does the full list of paper authors seem appropriate and complete?
  • [x] Substantial scholarly effort: Does this submission meet the scope eligibility described in the JOSS guidelines

Functionality

  • [x] Installation: Does installation proceed as outlined in the documentation?
  • [x] Functionality: Have the functional claims of the software been confirmed?
  • [x] Performance: If there are any performance claims of the software, have they been confirmed? (If there are no claims, please check off this item.)

Documentation

  • [x] A statement of need: Do the authors clearly state what problems the software is designed to solve and who the target audience is?
  • [x] Installation instructions: Is there a clearly-stated list of dependencies? Ideally these should be handled with an automated package management solution.
  • [x] Example usage: Do the authors include examples of how to use the software (ideally to solve real-world analysis problems).
  • [x] Functionality documentation: Is the core functionality of the software documented to a satisfactory level (e.g., API method documentation)?
  • [x] Automated tests: Are there automated tests or manual steps described so that the functionality of the software can be verified?
  • [x] Community guidelines: Are there clear guidelines for third parties wishing to 1) Contribute to the software 2) Report issues or problems with the software 3) Seek support

Software paper

  • [x] Summary: Has a clear description of the high-level functionality and purpose of the software for a diverse, non-specialist audience been provided?
  • [x] A statement of need: Do the authors clearly state what problems the software is designed to solve and who the target audience is?
  • [x] State of the field: Do the authors describe how this software compares to other commonly-used packages?
  • [ ] Quality of writing: Is the paper well written (i.e., it does not require editing for structure, language, or writing quality)?
  • [x] References: Is the list of references complete, and is everything cited appropriately that should be cited (e.g., papers, datasets, software)? Do references in the text use the proper citation syntax?
CSS Fortran Python accepted published recommend-accept review

All 69 comments

Hello human, I'm @whedon, a robot that can help you with some common editorial tasks. @jgoldfar, @vissarion, @matbesancon 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:

  1. Set yourself as 'Not watching' https://github.com/openjournals/joss-reviews:

watching

  1. You may also like to change your default settings for this watching repositories in your GitHub profile here: https://github.com/settings/notifications

notifications

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

PDF failed to compile for issue #2564 with the following error:

Can't find any papers to compile :-(

:warning: As noted by @vissarion and @matbesancon in the pre-review, both of them expect to be unable to start their review until September. :warning:

@whedon generate pdf from branch paper

Attempting PDF compilation from custom branch paper. Reticulating splines etc...

@whedon remind @matbesancon in 3 weeks

I'm sorry @matbesancon, I'm afraid I can't do that. That's something only editors are allowed to do.

  1. Comparisons

I took a preliminary look at the paper, it would be interesting to compare the features with other optimization packages including solvers like Ipopt, SCIP and their Python bindings and solver-agnostic modelling languages like Pyomo or JuMP.
Is PyOpt more a solving or modeling package. If it is of the latter, what solvers are currently supported and how easy is it to switch between solvers?

  1. Usage

Their could be a section focused more on usage of the package. Non-linear optimization is notoriously hard to make user-friendly. There could be a representative usage example. How are non-linear functions passed to the packages? Are arbitrary Python functions supported?

Hi Mathieu, thanks for taking your time to do this review.

  1. pyOptSparse is a wrapper for several popular optimizers, with a particular focus on large-scale nonlinear programming of continuous variables. As such, it is closer to frameworks such as pyomo and scipy, where the optimization problem is defined in a particular syntax and pyOptSparse performs the conversion to the specific form required for each optimizer. The main distinguishing feature for pyOptSparse is the support for sparse constraint Jacobians, both for linear and nonlinear constraints, and particularly for supporting sparse sub-blocks of the Jacobian. Through the unified framework, it's straightforward to switch between say SNOPT and IPOPT by changing one line of code, and all conversion will be done automatically including converting the sparse Jacobian into a different format. There are also other features such as the ability to perform finite-difference or complex-step to compute derivatives automatically, and MPI support for parallel function evaluations.

    The list of solvers is shown in the documentation (for example the side bar here). To switch between optimizers, the user would need to 1) change the options dictionary, and 2) change the name of the optimizer in the optimize call, for example replacing SLSQP with IPOPT in the line opt = OPT("SLSQP", options=optOptions). I hesitate to provide a list and description of the optimizers in the paper because the list may change over time, with older optimizers eventually become deprecated and new ones added.

  2. Yes, arbitrary Python functions are supported, and the data is stored in a dictionary. A nested dictionary is used for gradients if they are supplied. It's a little bit unclear for me what type of information should be in the paper, and what should be in the documentation site of the repository. I would prefer, if possible, to keep most of this information in the documentation since API may change and users typically will refer to that instead of the journal paper for help on using the package. But please let me know if JOSS takes a different view and I'd be happy to add more information to the paper. For reference, please see the Quickstart for a basic example, and the Guide for a complete example with sparse linear and nonlinear constraints.

I agree that listing the solvers is not super relevant to the paper which should be more of a permanent document presenting the package. The fact that multiple solvers can be used with the same uniform syntax should be highlighted more.

There are also other features such as the ability to perform finite-difference or complex-step to compute derivatives automatically, and MPI support for parallel function evaluations.

I think this could be presented in the paper, as it can be of interest to the reader comparing different frameworks.

For the second point, I think more should go in the paper without going into the internal details that are likely to change. I think having at least a high-level example with arbitrary Python functions would be of value to the article

Hi Mathieu, I agree with your points and I will push an update to the paper soon.

I finished my review.

I agree with the points listed above. I would also like to see a high-level example probably with the comment that links to the documentation for more details.

One more comment, I think it would be useful to note in the paper the current release version of the package.

Hi Mathieu and Vissarion,

Thanks for your feedback and apologies for not replying sooner, but I have been working with co-authors to update the paper. There are some substantial changes:

  • I have added a Features section to explain in more detail some salient features of the software which are not found elsewhere
  • I have added a section containing an example optimization script. There is no guarantee that the public API would remain stable, but I do think it's useful in showing what an optimization script would look like.
  • I have addressed other, more minor comments

The paper is located under the paper branch of the repo, please take a look and let me know if you have any feedback.

Cheers,
Neil

Thanks for the substantial revision Neil. The paper now looks much better and useful for the reader. I do not have further comments.

@whedon generate pdf from branch paper

Attempting PDF compilation from custom branch paper. Reticulating splines etc...

Posted on https://github.com/mdolab/pyoptsparse/issues/145 for the testing part which seems to have issues

Ok nevermind the tests do work. On the installation instructions here, I would recommend you state upfront that a fortran compiler is needed (maybe recommend gfortran directly)

I've updated the installation instructions in this PR.

perfect thanks!

@jgoldfar I might have checked your tick boxes by accident, not sure

This is a friendly reminder now that we're coming up on 6 weeks, @matbesancon and @jgoldfar are you done with the review? Also @poulson I noticed that Jonathan is not assigned to this issue, I don't know if that causes anything. Thanks!

Hi @poulson and @labarba, is there anything for me to do to get things moving again?

hi, sorry about the delay on coming back to this review, I'll be on it in the coming days

Regarding the paper, thanks to the authors for the modifications. It is much clearer as-is. Few additional comments and remarks:

  • The key motivation for the software is to handle sparse structures. Could the authors provide an idea of the size of problems where the sparse structure pays off compared to representing the problem with dense data structures (vectors and matrices)? Have some comparisons been made with PyOpt?
  • Leveraging the history file seems like an interesting feature. It is hard to understand from the paragraph how the information is represented and what this file consists of. Is it a list of the previously-solved problems and their solutions? Is it automatically storing all problems or does the user have to store a problem and solution themselves?

These are the last points I consider worth expanding before the paper is ready

Hi Mathieu, thanks for the detailed review, I'll address the code issues shortly. As for your questions:

  • The motivation is not for data storage or computational efficiency in numerical linear algebra, since we only deal with problems with maybe a few thousand DVs. Obviously there would be benefits if you are using hundreds of thousands of DVs, but this is not typically done in our work. However, the benefits of using a sparse Jacobian is two-fold:

    • First, it tells the optimizer which entries of the Jacobian will always be zero. Some optimizers may leverage this fact---for all function evaluations these gradient terms are going to be zero---during optimization. Certain optimizers may also internally benefit from such sparse formats in computation/storage as you mentioned, but this would be optimizer-specific. If an optimizer is able to accept sparse Jacobians, we try to provide it.

    • Second, the block-sparse format in pyOptSparse is very useful in engineering settings. pyOptSparse allows for the Jacobian to be computed at a sub-block level, and those not computed are automatically assumed to be zero. This means different engineering tools can separately compute different parts of the Jacobian, and pyOptSparse will assemble everything together automatically, assuming the rest of the entries are all zero. This naturally motivates the use of a sparse format for the Jacobian.

  • The history file is a database that contains the iteration history for a previous optimization. It stores the design points queried, the function outputs (objective and constraint values), along with some metadata about the optimization such as the optimizer options. This can be used for optimization hotstart or visualization. The file is stored using the storeHistory= keyword argument when starting an optimization, for example opt(optProb, sens='FD', storeHistory='my_history.hst').

Please let me know if this was not clear from the paper, and how I can improve it further.

Thanks again,
Neil

Thanks for your answer. For the motivation, I feel the first point (telling the optimizer which entries of the Jacobian will always be zero), this is a performance reason, hence my question of comparing it to a dense formulation or modelling library.
In any case, the motivation could be expanded a bit in the statement of need section.

The use case for the history (and the way it works) could also be more detailed in the paper, otherwise the reader might not understand what this implies for them as users

  • Right, I agree. However I just want to point out that we do not implement anything in the optimizer -- all the optimizers here are developed by others. We merely provide sparse Jacobians for optimizers that support them, so the discussion on performance would be specific to each optimizer, and IMO outside the scope of this work. The main contribution here is related to the second point, where the construction of the sparse Jacobian at a sub-block level is tailored for engineering applications.
  • Yes I agree.

I'll update the paper, as well as address the opened issues. Thanks again!

@matbesancon the issues you opened have been addressed, and I also pushed a minor update to the paper.

@poulson does JOSS require three reviewers? As far as I can tell @jgoldfar has not started his review yet.

@whedon generate pdf from branch paper

Attempting PDF compilation from custom branch paper. Reticulating splines etc...

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

@poulson I finished my review. This is a great paper covering a very interesting software package. The article highlights the interest optimization practitionners can have using it compared to other modelling libraries. I recommend its acceptation for JOSS

Hi @nwu63 -- with respect to your three reviewer question, given that there are two very positive reviews I think that is sufficient.

I will procede by giving it a proofread and then walk through the checklist for the final approval.

Thank you all for your patience, as I fell into a bit of a spiral of knowing I was behind on checking in and avoiding circling back.

@whedon check references

@whedon commands

Here are some things you can ask me to do:

# List all of Whedon's capabilities
@whedon commands

# Assign a GitHub user as the sole reviewer of this submission
@whedon assign @username as reviewer

# Add a GitHub user to the reviewers of this submission
@whedon add @username as reviewer

# Re-invite a reviewer (if they can't update checklists)
@whedon re-invite @username as reviewer

# Remove a GitHub user from the reviewers of this submission
@whedon remove @username as reviewer

# List of editor GitHub usernames
@whedon list editors

# List of reviewers together with programming language preferences and domain expertise
@whedon list reviewers

# Change editorial assignment
@whedon assign @username as editor

# Set the software archive DOI at the top of the issue e.g.
@whedon set 10.0000/zenodo.00000 as archive

# Set the software version at the top of the issue e.g.
@whedon set v1.0.1 as version

# Open the review issue
@whedon start review

EDITORIAL TASKS

# All commands can be run on a non-default branch, to do this pass a custom 
# branch name by following the command with `from branch custom-branch-name`.
# For example:

# Compile the paper
@whedon generate pdf

# Compile the paper from alternative branch
@whedon generate pdf from branch custom-branch-name

# Remind an author or reviewer to return to a review after a
# certain period of time (supported units days and weeks)
@whedon remind @reviewer in 2 weeks

# Ask Whedon to do a dry run of accepting the paper and depositing with Crossref
@whedon accept

# Ask Whedon to check the references for missing DOIs
@whedon check references

# Ask Whedon to check repository statistics for the submitted software
@whedon check repository

EiC TASKS

# Invite an editor to edit a submission (sending them an email)
@whedon invite @editor as editor

# Reject a paper
@whedon reject

# Withdraw a paper
@whedon withdraw

# Ask Whedon to actually accept the paper and deposit with Crossref
@whedon accept deposit=true

@whedon check references

@whedon generate pdf

PDF failed to compile for issue #2564 with the following error:

Can't find any papers to compile :-(

@whedon check references from branch paper

Attempting to check references... from custom branch paper
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):

OK DOIs

- 10.1007/s00158-011-0666-3 is OK
- 10.2514/1.J056603 is OK
- 10.2514/1.C034934 is OK
- 10.5194/wes-4-163-2019 is OK
- 10.1007/s00158-019-02211-z is OK
- 10.1007/978-3-319-97773-7_38 is OK
- 10.1017/aer.2018.120 is OK
- 10.1145/838250.838251 is OK

MISSING DOIs

- None

INVALID DOIs

- https://doi.org/10.1038/s41592-019-0686-2 is INVALID because of 'https://doi.org/' prefix

@nwu63 -- I just reread the paper, and I have to say, this is one of my favorite JOSS submissions.

Would you mind fixing the trivial DOI issue mentioned above and then providing a DOI for your source code archive (e.g., from Zenodo)?

@poulson: Thanks! This has been a really good experience and I appreciate all the work you guys do.

I am planning to make a new code release so that the updated code is archived by zenodo. I just wanted to clarify if the code release should contain the paper? i.e. should I merge the content of the paper branch into master before that release. I saw from some other JOSS reviews that you prefer having the zenodo metadata match the paper, so I will add the json metadata file to remedy that as well.

@poulson I have just made a new release which also merged the contents of the paper. The zenodo archive is also there now with the correct author list, the DOI is 10.5281/zenodo.4110792.

@whedon generate pdf

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

@whedon set 10.5281/zenodo.4110792 as archive

OK. 10.5281/zenodo.4110792 is the archive.

@whedon set v2.2.1 as version

OK. v2.2.1 is the version.

@whedon accept

Attempting dry run of processing paper acceptance...
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):

OK DOIs

- 10.1007/s00158-011-0666-3 is OK
- 10.2514/1.J056603 is OK
- 10.2514/1.C034934 is OK
- 10.5194/wes-4-163-2019 is OK
- 10.1007/s00158-019-02211-z is OK
- 10.1007/978-3-319-97773-7_38 is OK
- 10.1017/aer.2018.120 is OK
- 10.1038/s41592-019-0686-2 is OK
- 10.1145/838250.838251 is OK

MISSING DOIs

- None

INVALID DOIs

- None

:wave: @openjournals/joss-eics, this paper is ready to be accepted and published.

Check final proof :point_right: https://github.com/openjournals/joss-papers/pull/1835

If the paper PDF and Crossref deposit XML look good in https://github.com/openjournals/joss-papers/pull/1835, then you can now move forward with accepting the submission by compiling again with the flag deposit=true e.g.
@whedon accept deposit=true

@poulson is there anything I need to do here? Or will the EiC take care of this when they get a chance?

@nwu63 yes, I will take care of this today

@whedon accept deposit=true

Doing it live! Attempting automated processing of paper acceptance...

🐦🐦🐦 πŸ‘‰ Tweet for this paper πŸ‘ˆ 🐦🐦🐦

🚨🚨🚨 THIS IS NOT A DRILL, YOU HAVE JUST ACCEPTED A PAPER INTO JOSS! 🚨🚨🚨

Here's what you must now do:

  1. Check final PDF and Crossref metadata that was deposited :point_right: https://github.com/openjournals/joss-papers/pull/1850
  2. Wait a couple of minutes to verify that the paper DOI resolves https://doi.org/10.21105/joss.02564
  3. If everything looks good, then close this review issue.
  4. Party like you just published a paper! πŸŽ‰πŸŒˆπŸ¦„πŸ’ƒπŸ‘»πŸ€˜

    Any issues? Notify your editorial technical team...

Congrats @nwu63 on your article's publication in JOSS!

Many thanks to @jgoldfar, @vissarion, and @matbesancon for reviewing this submission, and @poulson for editing.

:tada::tada::tada: Congratulations on your paper acceptance! :tada::tada::tada:

If you would like to include a link to your paper from your README use the following code snippets:

Markdown:
[![DOI](https://joss.theoj.org/papers/10.21105/joss.02564/status.svg)](https://doi.org/10.21105/joss.02564)

HTML:
<a style="border-width:0" href="https://doi.org/10.21105/joss.02564">
  <img src="https://joss.theoj.org/papers/10.21105/joss.02564/status.svg" alt="DOI badge" >
</a>

reStructuredText:
.. image:: https://joss.theoj.org/papers/10.21105/joss.02564/status.svg
   :target: https://doi.org/10.21105/joss.02564

This is how it will look in your documentation:

DOI

We need your help!

Journal of Open Source Software is a community-run journal and relies upon volunteer effort. If you'd like to support us please consider doing either one (or both) of the the following:

Hi @kyleniemeyer and everyone else involved in this, thanks so much! Just one quick question: there is an incorrect capitalization in the author list here, Joaquim R. r. a. Martins should be Joaquim R. R. A. Martins, is there a way to fix that?

@openjournals/dev can you help with this? the issue is in the author list on the landing pageβ€”the paper itself is fine

@openjournals/dev can you help with this? the issue is in the author list on the landing pageβ€”the paper itself is fine

Fixed.

Was this page helpful?
0 / 5 - 0 ratings