Giter Club home page Giter Club logo

gadget2's Introduction

Gadget is the Globally applicable Area Disaggregated General Ecosystem Toolbox.

Welcome to the Gadget development repository. This will eventually contain all the information you ever wanted to know about Gadget, but were afraid to ask. For the time being, however, the information is a bit sparse but we hope that it will grow quickly.

Gadget is a statistical model of marine ecosystems. Gadget models can be both very data- and computationally- intensive. Various scripts have been written to extract data from data warehouses using mfdb, a specialised R-package, that can handle the complexities of the disparate datasets that can be used by Gadget when estimating model parameters. To speed up processing time, a parallel processing optimiser (called Paramin) has been developed. In addition to these a specialised R-package, Rgadget, has been developed to aid in the development of Gadget models by providing tools to estimate likelihood weights, defining model skeletons, and model diagnostics and prognosis.

Travis build status

Features

Gadget is a software tool that can run complicated statistical ecosystem models, which take many features of the ecosystem into account. Gadget works by running an internal model based on many parameters, and then comparing the data from the output of this model to ''real'' data to get a goodness-of-fit likelihood score. These parameters can then be adjusted, and the model re-run, until an optimum is found, which corresponds to the model with the lowest likelihood score.

Gadget allows you to include a number of features into your model: One or more species, each of which may be split into multiple stocks; multiple areas with migration between areas; predation between and within species; maturation; reproduction and recruitment; multiple commercial and survey fleets taking catches from the populations.

An indication of the features that Gadget can model can be given by looking at the data input files required shown in the diagram below:

Features

These input data files are in a column-based format, which means that they can easily be generated using simple extraction routines from databases. This means that the construction of a Gadget model can be done reasonably quickly, and the models will be free of any formatting errors in the Gadget input files that could prevent Gadget models from running. The data format is explained in more detail in the Gadget User Guide. There is also a tutorial available here

Installing as an R package

Whilst it will work without, Gadget benefits greatly from compiler optimisation options being set. Create a ~/.R/Makevars (Linux/MacOS) or ~/.R/Makevars.win (Windows) file and add the following:

CFLAGS += -O3 -march=native
CXXFLAGS += -O3 -march=native

Assuming R and remotes is installed you can install gadget with:

remotes::install_github("gadget-framework/gadget2")

You can find where gadget is installed using the gadget_binary command:

> gadget::gadget_binary()
[1] "/usr/local/lib/R/site-library/gadget/bin/gadget"

If you'd like gadget to be available on the system path, create a symlink as follows:

sudo ln -s "/usr/local/lib/R/site-library/gadget/bin/gadget" /usr/local/bin/gadget

Installing as a standalone executable

Prerequisites

To compile Gadget one needs a working C++ compiler and a version of Make installed on the computer:

Linux

This should be install automatically on most distributions but on ubuntu one needs to install build-essentials:

sudo apt-get install build-essential

If using paramin, you will also need mpic:

sudo apt install mpich libmpich-dev

MacOsX

It should be sufficient to install XCode through the Appstore and through XCode's preferences install commandline tools

Windows

Easiest way is to install Rtools . During the install process allow the installer to append to the system path.

Compile and install

To install Gadget you can either download as a zip file (or clone the repository using git). Unzip this file and within command prompt/terminal application make your way to the resulting folder, typically called gadget-master, and simply type:

make

For convenience you may want to install the resulting gadget executable to a location in the system path, thus allowing the gadget executable to called in any directory. On *nix based system you can simply type:

sudo make install

Development

Testing compilation under FreeBSD Make

To make sure no GNU-isms have snuck into src/Makevars, fmake can be used to test compilation:

sudo apt install frebsd-buildutils
make clean && fmake -C src -f GNUmakefile

Developing under qtcreator

qtcreator is a C++ IDE that, whilst intended for Qt projects, can be used with gadget2.

Installation under Debian/Ubuntu can be done with:

apt install gdb qtcreator

Then open the gadget2.creator project.

Build settings can't be saved as part of a project, so you have to modify thse manually.

  • "Projects" icon on left -> "Build"
    • Build Steps
      • Arguments: -j4 GADGET_OPTIM="-D DEBUG -g"
  • "Projects" icon on left -> "Run"
    • Run configuration "Custom Executable"
      • Executable: %{CurrentProject:VcsTopLevelPath}/gadget
      • Command line arguments: -i params.in
      • Working directory: %{CurrentProject:VcsTopLevelPath}/14-new_ass (or wherever your model is stored)
      • Run in terminal: checked

Most code exploration functions, e.g. find definition or uses, can be revealed by right-clicking on any symbol.

Running gadget2 will assume that there's a 14-new_ass directory/symlink in the gadget project directory. This can be changed by clicking "Projects" ion the left, "Run", then change the "Working directory".

To debug, breakpoints can be added by clicking to the left of a line. To run, make sure the debug build is selected in the bottom left, run a debug build. Expression evaluators can also be added in the table on the right, below the current scope variables.

Acknowledgements

This project has received funding from an EU grant QLK5-CT199-01609 and the European Union’s Seventh Framework Programme for research, technological development and demonstration under grant agreement no.613571.

gadget2's People

Contributors

bthe avatar jmbegley avatar lentinj avatar nataliia-kulatska avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gadget2's Issues

Set a default aggregation for growthandeatlengths and preylengths

When defining a stock length aggregations are required for both the growth and the consumption process. This is done to speed up calculations when the aggregations are defined on coarser scale than the model. Defining these files however is typically a nuisance as the most common scenarios the are the same files and they correspond to the length groups defined in the header. I suggest that the definition of these should be made optional.

stockVariable + intercept

It is clear that a stockVariable can be used in place of a parameter approx. as follows:
#param ~ #multi * stkVar

What it is not clear to me is if and how I could implement something like this instead:
#param ~ #param1 + #multi * stkVar

I've tried without success
(+ #param1 stkVarFileName)

I have few situations where this could be rather useful.
As always thankful

gadget.fit with "spawning" stocks

I've been unable to run gadget.fit with stocks where doesspawn was specified instead of doesrenew. Perhaps it is an issue with a newer version of gadget (I'm running a version downloaded on 29th of May with updated stomachcontent.cc file), R or one of the packages?

The error:

Joining, by = c(".id", "length")
Joining, by = c("year", "area", "fleet")
Joining, by = c("year", "area")
Error in mutate_impl(.data, dots) : object 'area' not found
In addition: Warning messages:
1: In file(con, "r") : cannot open file '0': No such file or directory
2: In file(con, "r") : cannot open file '0': No such file or directory

Session info:

R version 3.4.0 (2017-04-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.2 LTS

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C               LC_TIME=en_GB.UTF-8       
 [4] LC_COLLATE=en_GB.UTF-8     LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] gridExtra_2.2.1   pander_0.6.0      Rgadget_0.5       purrr_0.2.2       stringr_1.2.0    
 [6] lubridate_1.6.0   data.table_1.10.4 dplyr_0.5.0       reshape2_1.4.2    plyr_1.8.4       
[11] ggplot2_2.2.1    

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.10     digest_0.6.12    assertthat_0.2.0 R6_2.2.0         gtable_0.2.0     DBI_0.6-1       
 [7] magrittr_1.5     scales_0.4.1     stringi_1.1.5    lazyeval_0.2.0   tools_3.4.0      munsell_0.4.3   
[13] compiler_3.4.0   colorspace_1.3-2 tibble_1.3.0

Cygwin 64 runs "gadget <options>" returns syntax error

Hi I am using Cygwin64 on windows 10 to run the gadget.

After I have successfully installed the executable file when I run "gadget " as suggested from the Userguide, it returns "-bash: syntax error near unexpected token `newline'".

Do you know what is going wrong here?

GLIBC version issues

I just git cloned and compiled the most recent version of GADGET. It works great for the example here: ftp://ftp.hafro.is/pub/reiknid/dst2/gadget/haddock2.1.05.tar.gz

but when I call gadget on my older models I get the following errors.

gadget: /lib64/libm.so.6: version `GLIBC_2.23' not found (required by gadget)
gadget: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by gadget)
gadget: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by gadget)

Any idea what the issue is?

Thanks,
Paul

Switches and functions

I was just wondering of the order of values in mathematical operations. Multiplication is easy, but what if we divide. In case (/ #a #b) would #a be divided by #b or #b divided by #a?

Turn into an installable R package

@bthe we talked at some point about turning this repo into an R package so the gadget executable can be installed via. install_github().

Not only would this be useful for rgadget users, it'd make an automated build of the gadget course documentation (and probably Rgadget) a lot easier, since we wouldn't have to have a separate build step to install Gadget before doing whatever we were going to do.

I'm assuming you'd like me to have a go at some point and see how easy it is?

Specifying stocks to receive recruits when doesspawn==1

I have a 2 stock model of a single species (immature and mature) with doesspawn==1 in the mature stock. I'd like to have the mature stock spawn recruits into the immature stock, but the model only seems to work when I specify the mature stock in spawnstocksandratios (i.e. when I specify the immature stock in spawnstocksandratios, then population goes exctinct after first 2 years of model due to receiving no recruits). Here is what my spawnfile looks like with the model that does NOT work.

  ; Generated by Rgadget 0.5
  spawnsteps      1
  spawnareas      1
  firstspawnyear  1980
  lastspawnyear   2010
  spawnstocksandratios    imm     1
  proportionfunction      exponential     #mat.spawn.alpha        #mat.spawn.l50
  mortalityfunction       constant        0
  weightlossfunction      constant        0
  recruitment     bevertonholt    #mat.bh.mu      #mat.bh.lam
  stockparameters #mat.linf       #mat.k  2.1e-06 3.3437

When I change spawnstocksandratios to spawnstocksandratios mat 1 then the population of the mature stock persists, but the immature stock crashes and remains at 0 after all individuals have entered into the mature population (i.e. there are no recruits coming into the immature stock).

How do I make the mature stock spawn, but have those recruits go into the immature population?

The Gadget User Guide is vague on how to specify this. Note that I have tried the following:

spawnstocksandratios imm 1 mat 0
spawnstocksandratios imm 1
mat 0

Error in catchstatistics - length groups for preys not compatible

I've experienced this error when the catchstatistics likelihood component is pointing to two stocks. Few tests show that the error disappears when the likelihood points to only one stock or when the two stocks have the same age and length range. It seems a bug worth a fix

Define implementation tests

There have been some discrepancies observed between the windows version of Gadget and the linux version. In light of that there is a need to define a few representative test cases and test the output.

stable estimates and uncertainty

Also in the case of well specified models supported by good data, Gadget estimates are rarely (if ever) identical from two identical runs. No surprise, as this is the nature of the optimization procedure. In fact, once we've verified that estimates are "sufficiently" stable, seeding is a common practice for certain applications (ie assessment, multispecies keyruns).

However, resolving stability is not always easy and in some cases not possible given the available data and knowledge on the stock.

If thoroughly explored (with a sufficiently large number of runs) could this instability be explicitly represented (for instance with an ensemble) in the form of an uncertainty? What's the view of the Gadget community on this?

achieve a stable parameters estimation

I'm using a Gadget model to evaluate different aspects of a sampling design.
Unfortunately, I'm having problem in achieving a sufficiently stable estimation of the model parameters to evaluate if differences are the result of the sampling design.

I've tried the following with limited success:

  • restrict the low-up bound for some of the parameters
  • increase the number of iteration of all optimisers simann, hooke, bfgs. I'm not too familiar with the several other parameters here.

Any other suggestion?
Thankful as always

quotafleet help to interpret the code

it is great to have the new ices quotafleet type which assumes a linear increase in the quota level between biomass breakpoints.
It may well be because of my limited understanding of C++, but in 3b3cdf0#diff-18472b59e896caad1e517b862b268d7d I do not find where (in the new as well as the old code) the quotalevel is set for biomass above the last breakpoint such as biomass > biomasslevel[biomasslevel.Size()]
Any help?

Predictions from the survey index likelihood component

Hello, here another question.

I am using the survey index at age as likelihood components with a loglinearfit type.

My question is about the parameters intercept and slope. As far as I know what you compare with the observed index is not the Nt directly but intercept+slope*Nt, as it is indicated in the equation to estimate the loglikelihood score.

Then, the numbers in the file are the final survey index? Do I have to use the slope and intercept to transform the numbers in the table somehow?

Thanks,
Alfonso.

maximum consumption, request clarification

I'm working with the consumption module in Gadget. The manual says "Note that the maximum consumption should be specified in kilojoules per month" (explanation for eq. 4.22).
Is it really "per month" or should it be "per timestep"?

Thanks for any clarification
\Valerio

Different naturalmortality in different years

Does anyone know the correct syntax for specifying different values of natural mortality during different years and/or timesteps in Gadget? Or if it's even possible. I feel as though this should be capable by adding a "mortality file" to the stockfile as below, but am not quite sure about the syntax. The user guide only states that a vector of mortalities may be given:

Stockfile

stockname   zebrafish
livesonareas   1
...
maxlengthgroupgrowth    15
naturalmortality    mortfile
iseaten    0
...

mortfile

timedata    stockdata
2000         0.2
2001         0.2
...

Note that I came to the above file structure through trial and (gadget) error(s).
When naturalmortality mortfile is specified, but say a vector of natural mortalities is given (a value for each age) then gadget spits an error that states Expected timedata or stockdata but found instead 0.2

"otherfood" in food dependent growth

Food availability and consumption are highly relevant for cod growth in the Baltic.
To account for this feedback in my cod-sprat-herring model I'm using the 'WeightJones" growth for cod.

In the manual under consumption I can read that "The summation over preys is over all preys that the predator consumes, including non-modelled prey, given as otherfood”

Questions:

  • In 'otherfood' I've benthic preys and all the rest for which I know very little. Does it mean that for having an effect on cod growth the 'otherfood' has to be set to "realistic" levels as well? which is rather difficult
  • Any other strategy to approach the issue so that cod growth could respond to sprat and herring fluctuations in abundance?
  • Would 'Multspec' growth have the same problem/difficulty?

Missing 'proglikelihood.*' files

I'm unable to compile gadget from the latest git revision (d610418) due to missing proglikelihood.h file (and perhaps proglikelihood.cc file as well?). Complete log follows:

$ make
g++ -D NDEBUG -D INTERRUPT_HANDLER -O3 -I headers/ -D NOT_WINDOWS   -c -o src/initialize.o src/initialize.cc
src/initialize.cc:34:28: fatal error: proglikelihood.h: No such file or directory
 #include "proglikelihood.h"
                            ^
compilation terminated.
<builtin>: recipe for target 'src/initialize.o' failed
make: *** [src/initialize.o] Error 1

add stomach LH data

I'm trying to add a stomach LH in a 2 species model (cod-sprat). I've tried 1 simulation in the terminal, I continue to get the same error and I haven't been able to figure out the reason.
Thankful for any suggestion where to look.

Finished reading model data files, starting to run simulation
Error when checking length structure for the following lengthgroups
Minimum length of length group division is 1
Maximum length of length group division is 137
Minimum length of length group division is 20
Maximum length of length group division is 100
Error in predatoraggregator - invalid predator length group structure

This is how I've set the lengths in the stockfiles and aggrfiles:

  • cod.stock minlength, maxlength, bin: 1, 137, 2
  • predator aggrfile
    len20 20 40
    len40 40 60
    len60 60 80
    len80 80 100
  • stomachData
    ;year step area predator prey ratio
    2007 4 area1 len20 sprat10 0.012820513
    2007 4 area1 len20 sprat11 0.012820513
    2007 4 area1 len20 sprat12 0.029914530
    as predator I've used the label in the predator aggrfile (and similarly for the prey)

Multi-area surveyindex fails when missing data

Gadget has a problem with incomplete survey index data when number of areas is larger than 1 and data is not consistently missing within the same likelihood component. E.g. in a three area model the following datafile would result in a likelihood score of 1*10^10 regardless of the parametervalue:

; Generated by mfdb 4.0.0
; -- data --
; year  step    area    length  number
1976    1   area3   len40   310.4467
1978    1   area1   len40   155.255333333333
1978    1   area2   len40   235.7002725
1978    1   area3   len40   1209.91449
1979    1   area1   len40   1357.965
1979    1   area2   len40   458.677632
1979    1   area3   len40   1082.82543384615
1980    1   area2   len40   350.74494
1980    1   area3   len40   1388.49823636364

A easy fix for this problem is to split the likelihood components by area but Gadget should handle this problem more elegantly.

Problem with variable growth over time

Gadget models growth by year, while we know that the growth function should be modelled by cohort. This is not a problem if growth (size at age) is constant over time. All cohorts would have the same growth curve, and hence no strong deviations (observed-estimated size at age) would be expected if growth is modeled by year instead of by cohort.

However, when the growth rate at age changes over time (changes in growth between cohorts, induced by density dependence, strong water temperature changes, food availability...) the mean size at age in the stock will be very different from the mean size at age estimated by the Beverton and Holt modeled annually in gadget. Even worse, it is common that a few consecutive cohorts experience similar factors affecting growth and hence will have similar growth curves. This will be translated in a clear patterns with consecutive years of higher or lower size at age than that predicted by the annual beverton and holt curve.

This problem can be very serious since it can produce strong deviations of the estimated population size distribution by gadget from those observed in the data (survey or catches), which, once translated to biomass can suppose strong differences in the total estimated stock biomass and spawning stock biomass (which is very affected by the growth function). A 10 cm difference in size may imply 1-2 kg of biomass per individual depending on the fish size and the species.

In XSA each age is assigned an average weight that comes from survey and commercial data. Is there any possiblity to assigned by hand an average weight by timestep (either year, season or month) by hand so the problems derived from changes in growth over time is avoided?

Thanks in advance.
Alfonso.

error with timeVariable in SR

The intention here is to include the effect of some external variable in the SR relationship.
If I replace the parameter mu of the Ricker model in the spawnfile with a timeVariable like below I get the error:
Error in timevariable - nothing specified for first timestep of the simulation

spawnfile:

spawnsteps     	      2
spawnareas	      1
firstspawnyear	      1991
lastspawnyear	      2013
spawnstocksandratios  spratimm  1
proportionfunction    constant	1
mortalityfunction     constant	0
weightlossfunction    constant	0
recruitment	      ricker	Modelfiles/sprat.mu	  5.192e-10
stockparameters	      7.7   0.9   4.363603e-05  2.611152

TimeVariable file:

spratmu	; time variable mu = multiplier * value
multiplier	4.003
timedata
; year	step	value
1991	1	16.25
1992	1	16.40
1993	1	14.99
1994	1	16.55
1995	1	16.43
...     ...     ...

catchstatistic LH and yearly aggregation

Is there a reason why CatchStatistics LH does not accept an argument 'aggregationlevel' to aggregate data over the year like for CatchDistribution LH?

Sometimes historical data on weight-at-age are only available on an annual basis in the ICES assessments and this functionality would be pretty useful.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.