GithubHelp home page GithubHelp logo

allometric's Introduction

allometric Isometric logo of a tree

R-CMD-check codecov

allometric is an R package for predicting tree attributes with allometric models. Thousands of allometric models exist in the scientific and technical forestry literature, and allometric is a platform for archiving and using this vast array of models in a robust and structured format. Get started by going to the Installation section or the documentation website.

allometric also provides a structured language for adding models to the package. If you are interested in helping the developer in this process please refer to the Contributing a Model vignette.

In total allometric contains 2789 models across 70 publications, refer to the Current Status for a more complete view of available models.

Installation

Currently allometric can be installed via CRAN:

install.packages("allometric")

For the latest release version, please install directly from GitHub using devtools:

devtools::install_github("allometric/allometric")

Before beginning, make sure to install the models locally by running

library(allometric)
install_models()

This installs all available models from the public models repository.

Finally, load the models using the load_models() function into a variable:

allometric_models <- load_models()
head(allometric_models)
#> # A tibble: 6 × 10
#>   id    model_type country region taxa   pub_id model      family_name covt_name
#>   <chr> <chr>      <list>  <list> <list> <chr>  <list>     <list>      <list>   
#> 1 cc20… site index <chr>   <chr>  <Taxa> barre… <FxdEffcM> <chr [1]>   <chr [2]>
#> 2 3955… stem heig… <chr>   <chr>  <Taxa> barre… <FxdEffcM> <chr [1]>   <chr [1]>
#> 3 48b4… stem heig… <chr>   <chr>  <Taxa> barre… <FxdEffcM> <chr [1]>   <chr [1]>
#> 4 2fa0… stem heig… <chr>   <chr>  <Taxa> barre… <FxdEffcM> <chr [1]>   <chr [1]>
#> 5 7a58… stem heig… <chr>   <chr>  <Taxa> barre… <FxdEffcM> <chr [1]>   <chr [1]>
#> 6 4998… stem heig… <chr>   <chr>  <Taxa> barre… <FxdEffcM> <chr [1]>   <chr [1]>
#> # ℹ 1 more variable: pub_year <dbl>

Finding a Model

allometric_models is a tibble dataframe. Each row represents one allometric model with various attributes. Users interact with this table the way they would with any other tibble.

For example, we can use dplyr to filter this table to find models for analysis. Let’s say I am interested in finding stem volume models for Tsuga heterophylla. First, let us filter the model_type to include only stem volume models

stemvol_models <- allometric_models %>%
  filter(model_type == "stem volume")

stemvol_models
#> # A tibble: 570 × 10
#>    id       model_type  country   region    taxa   pub_id model      family_name
#>    <chr>    <chr>       <list>    <list>    <list> <chr>  <list>     <list>     
#>  1 f50865ee stem volume <chr [1]> <chr [1]> <Taxa> bell_… <FxdEffcM> <chr [3]>  
#>  2 8d35a7b6 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  3 8682a321 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  4 7cfc15b2 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  5 573c8c1b stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  6 191eaa47 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  7 ecd1277b stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  8 83b38fb4 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#>  9 a69c8b91 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#> 10 34575125 stem volume <chr [1]> <chr [1]> <Taxa> brack… <FxdEffcM> <chr [1]>  
#> # ℹ 560 more rows
#> # ℹ 2 more variables: covt_name <list>, pub_year <dbl>

Next, we can filter to include only Tsuga heterophylla using a special specifier called Taxon that enables rigorous searching of species:

tsuga_het_taxon <- Taxon(
  family = "Pinaceae", genus = "Tsuga", species = "heterophylla"
)

tsuga_vol_models <- stemvol_models %>%
  filter(purrr::map_lgl(taxa, ~ tsuga_het_taxon %in% .))

tsuga_vol_models
#> # A tibble: 4 × 10
#>   id    model_type country region taxa   pub_id model      family_name covt_name
#>   <chr> <chr>      <list>  <list> <list> <chr>  <list>     <list>      <list>   
#> 1 573c… stem volu… <chr>   <chr>  <Taxa> brack… <FxdEffcM> <chr [1]>   <chr [2]>
#> 2 191e… stem volu… <chr>   <chr>  <Taxa> brack… <FxdEffcM> <chr [1]>   <chr [2]>
#> 3 ecd1… stem volu… <chr>   <chr>  <Taxa> brack… <FxdEffcM> <chr [1]>   <chr [2]>
#> 4 9caa… stem volu… <chr>   <chr>  <Taxa> poude… <FxdEffcM> <chr [4]>   <chr [2]>
#> # ℹ 1 more variable: pub_year <dbl>

We can see that we have 4 models to choose from. Let’s select the model from the publication poudel_2019

tsuga_poudel <- tsuga_vol_models %>% select_model("9caa80f2")

This example is very basic, and more complex search examples can be found in the load_models() documentation. Models can be searched not only by their taxonomic information, but also the types of measurements the models require, their geographic region, and other attributes. We highly encourage users review the linked examples for production use of allometric.

Using the Model

tsuga_poudel now represents an allometric model that can be used for prediction. We must next figure out how to use the model.

Using the standard output of tsuga_poudel we obtain a summary of the model form, the response variable, the needed covariates and their units, a summary of the model descriptors (i.e., what makes the model unique within the publication), and estimates of the parameters.

tsuga_poudel
#> Model Call: 
#> vsia = f(dsob, hst) 
#>  
#> vsia [m3]: volume of the entire stem inside bark, including top and stump
#> dsob [cm]: diameter of the stem, outside bark at breast height
#> hst [m]: total height of the stem 
#> 
#> Parameter Estimates: 
#> # A tibble: 1 × 3
#>       a     b     c
#>   <dbl> <dbl> <dbl>
#> 1 -9.98  1.96 0.925
#> 
#> Model Descriptors: 
#> # A tibble: 1 × 3
#>   country   region     taxa  
#>   <list>    <list>     <list>
#> 1 <chr [2]> <chr [10]> <Taxa>

We can see from the Model Call section that tsuga_poudel will require two covariates called dsob, which refers to diameter outside bark at breast height, and hst, the height of the main stem. allometric uses a variable naming system to determine the names of response variables and covariates (refer to the Variable Naming System vignette).

Using the predict() method we can easily use the function as defined by providing values of these two covariates.

predict(tsuga_poudel, 12, 65)
#> 0.2868491 [m^3]

or we can use the prediction function with a data frame of values

my_trees <- data.frame(dias = c(12, 15, 20), heights = c(65, 75, 100))
predict(tsuga_poudel, my_trees$dias, my_trees$heights)
#> Units: [m^3]
#> [1] 0.2868491 0.5068963 1.1618632

or even using the convenience of dplyr

my_trees %>%
  mutate(vols = predict(tsuga_poudel, dias, heights))
#>   dias heights            vols
#> 1   12      65 0.2868491 [m^3]
#> 2   15      75 0.5068963 [m^3]
#> 3   20     100 1.1618632 [m^3]

The above example is a very basic use case for allometric. Please refer to the Common Inventory Use Cases vignette for more complex examples.

Current Status

In total allometric contains 2789 models across 70 publications.

category AS EU NA SA AF OC
biomass component 543 653 442 0 0 0
crown diameter 0 12 36 0 0 0
crown height 0 12 0 0 0 0
shrub biomass 0 19 0 0 0 0
shrub biomass increment 0 28 0 0 0 0
shrub diameter 0 39 0 0 0 0
shrub height 0 28 0 0 0 0
site index 0 0 54 0 0 0
stem height 4 0 385 7 5 2
stem volume 4 0 545 21 0 0
stump volume 0 0 64 0 0 0
taper 2 0 16 0 0 0
tree biomass 61 95 66 17 0 21
other 0 0 164 35 0 0

How Can I Help?

allometric is a monumental undertaking, and already several people have come forward and added hundreds of models. There are several ways to help out. The following list is ranked from the least to most difficult tasks.

  1. Add missing publications as an Issue. We always need help finding publications to add. If you know of a publication that is missing, feel free to add it as an Issue and we will eventually install the models contained inside.
  2. Find source material for a publication. Some publications are missing their original source material. Usually these are very old legacy publications. If you know where a publication might be found, or who to contact, leave a note on any of these issues.
  3. Help us digitize publications. We always need help digitizing legacy reports, at this link you will find a list of reports that need manual digitization. These can be handled by anyone with Excel and a cup of coffee.
  4. Learn how to install and write models. Motivated users can learn how to install models directly using the package functions and git pull requests. Users comfortable with R and git can handle this task.

Other ideas? Contact [email protected] to help out.

Next Steps

The following vignettes available on the package website provide information to two primary audiences.

Users interested in finding models for analysis will find the following documentation most useful:

Users interested in contributing models to the package will find these vignettes the most useful:

allometric's People

Contributors

brycefrank avatar eallensworth avatar pmaurogut avatar semantic-release-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  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

allometric's Issues

Hibbs et al. (2007)

Provide a citation of the publication you want us to add.

@article{hibbs2007stem,
  title={Stem taper and volume of managed red alder},
  author={Hibbs, David and Bluhm, Andrew and Garber, Sean},
  journal={Western Journal of Applied Forestry},
  volume={22},
  number={1},
  pages={61--66},
  year={2007},
  publisher={Oxford University Press}
}

Iterate on `fit_species`

fit_species seems to be inadequate or at least unclear. Sometimes a model is fit for an entire genus, or a set of species within a genus, etc etc

We should have something more general/flexible, but I still think using the taxonomic hierarchy is a good idea. I will wait until I add a few more equations before committing to anything

Montero et al. (2020)

Provide a citation of the publication you want us to add.

@article{montero2020production,
  title={Biomass production and carbon sequestration by Spanish shrublands and by the superficial organic horizon of forest soils},
  author={Montero, G and L{\'o}pez-Leiva, C and Ruiz-Peinado, R and L{\'o}pez-Senespleda, E and Onrubia, R and Pasalodos, M},
  journal={Ministry of Agriculture, Fisheries and Food{\'o}n: Madrid, Spain},
  year={2020}
}

Paco says these may need some checking

Add a `model_call` method to `AllometricModel`

Right now, model summaries are ambiguous to the order of arguments given the predict. It should be easy to make a model_call method that can retrieve this and print it in the summary.

Add Publication: Rustagi and Loveless (1990)

Provide a citation of the publication you want us to add.

@article{rustagi1991compatible,
  title={Compatible variable-form volume and stem-profile equations for Douglas-fir},
  author={Rustagi, Krishna P and Loveless Jr, Robert S},
  journal={Canadian journal of forest research},
  volume={21},
  number={2},
  pages={143--151},
  year={1991},
  publisher={NRC Research Press Ottawa, Canada}
}

Add check for duplicated descriptor name

A Publication can be defined with a descriptor, e.g., region = "OR"

A ModelSet can be defined with a descriptor, e.g. region = "Western OR"

Likewise, a Model can be defined with a descriptor, e.g., region = "Clackamas"

This should be handled when model sets are added to a publication. An error should be thrown when this case is detected, the user should be forced to select a unique name.

500 models

We should have >= 500 models before 1.0.0 release

Vibrans et al. (2015)

Provide a citation of the publication you want us to add.

@article{vibrans2015generic,
  title={Generic and specific stem volume models for three subtropical forest types in southern Brazil},
  author={Vibrans, Alexander C and Moser, Paolo and Oliveira, Laio Z and de Ma{\c{c}}aneiro, Jo{\~a}o P},
  journal={Annals of Forest Science},
  volume={72},
  number={6},
  pages={865--874},
  year={2015},
  publisher={BioMed Central}
}

Describe where the models are in the report.
Table 3

Feldpausch et al. (2012)

Provide a citation of the publication you want us to add.

@article{feldpausch2012tree,
  title={Tree height integrated into pantropical forest biomass estimates},
  author={Feldpausch, Ted R and Lloyd, Jon and Lewis, Simon L and Brienen, Roel JW and Gloor, Manuel and Monteagudo Mendoza, Abel and Lopez-Gonzalez, Gabriela and Banin, Lindsay and Abu Salim, Kamariah and Affum-Baffoe, Kofi and others},
  journal={Biogeosciences},
  volume={9},
  number={8},
  pages={3381--3403},
  year={2012},
  publisher={Copernicus GmbH}
}

Describe where the models are in the report.
https://bg.copernicus.org/articles/9/3381/2012/bg-9-3381-2012.pdf
Table 3

Montero et al. (2005)

Provide a citation of the publication you want us to add.

@book{montero2005production,
  title={Biomass production and CO2 fixation by Spanish forests},
  author={Montero, Gregorio and Ruiz-Peinado, Ricardo and Munoz, Marta},
  volume={13},
  year={2005},
  publisher={INIA-National Institute for Agricultural and Food Research{\'\i}and Technology~…}
}

misaligned formatting of variable summary

vsa [ft3]: volume of the entire stem, including top and stump
dsob [in]: diameter of the stem, outside bark at breast height

should look like

vsa    [ft3]: volume of the entire stem, including top and stump
dsob [in]: diameter of the stem, outside bark at breast height

its the details!

Allow for unitless units

Some covariates do not have units, such as indicator variables. units::unitless may do the trick but throws an error when compiling models

Allow "intermediate" variables in `predict_fn`

The parameters of a model are determined by "subtracting" the covariates of a predict_fn from the set of all named variables. This is ok, but users may want to define intermediate parameters, such as in the case of Hann (2011) which involves many intermediate steps.

https://github.com/brycefrank/allometric/blob/274e6bb1b28bebe890eae518cc240e506bb71665/R/util.R#L3-L6

One solution may be to require users to write the final line of predict_fn as a mathematical expression (as they are required to now), but allow this expression to have intermediate variables.

Expose publications to the user

Right now, Publication objects are loaded when install_models runs. This is undesirable since it occupies memory that is not really used. Instead, we should remove these objects from memory as they are processed in update_models and optionally cache the publication objects for interested users.

nested lists in `model_specifications` are wrapped into a single list in `allometric_models`

See, e.g., montero_2005 models

[ins] r$> allometric_models %>% filter(country == "ES", genus == "Pinus", component == "foliage")
# A tibble: 3 x 13
  id       component measure country   region     family   genus species    model      pub_id       family_name covt_name pub_year
  <chr>    <chr>     <chr>   <list>    <list>     <chr>    <chr> <chr>      <list>     <chr>        <list>      <list>       <dbl>
1 d91bb101 foliage   biomass <chr [1]> <list [1]> Pinaceae Pinus pinea      <FxdEffcM> montero_2005 <chr [3]>   <chr [1]>     2005
2 cc9dca58 foliage   biomass <chr [1]> <list [1]> Pinaceae Pinus radiata    <FxdEffcM> montero_2005 <chr [3]>   <chr [1]>     2005
3 7b50b22c foliage   biomass <chr [1]> <list [1]> Pinaceae Pinus sylvestris <FxdEffcM> montero_2005 <chr [3]>   <chr [1]>     2005

[ins] r$> allometric_models %>% filter(country == "ES", genus == "Pinus", component == "foliage") %>% unnest_models("region")
# A tibble: 3 x 13
  id       component measure country   region    family   genus species    model      pub_id       family_name covt_name pub_year
  <chr>    <chr>     <chr>   <list>    <list>    <chr>    <chr> <chr>      <list>     <chr>        <list>      <list>       <dbl>
1 d91bb101 foliage   biomass <chr [1]> <chr [3]> Pinaceae Pinus pinea      <FxdEffcM> montero_2005 <chr [3]>   <chr [1]>     2005
2 cc9dca58 foliage   biomass <chr [1]> <chr [1]> Pinaceae Pinus radiata    <FxdEffcM> montero_2005 <chr [3]>   <chr [1]>     2005
3 7b50b22c foliage   biomass <chr [1]> <chr [2]> Pinaceae Pinus sylvestris <FxdEffcM> montero_2005 <chr [3]>   <chr [1]>     2005

Implement validity checks for ISO 3166-1 and 3166-2

If a region is defined, it must be matched with the corresponding country, otherwise it (ModelSet, AllometricModel) are invalid.

If a country is defined it must exist inside a database of ISO 3166-1 character codes, likewise for regions and ISO 3166-2.

Custom covariate names

It should be possible to create covariate names that are not in the set of defined variables. One motivating example is in Chojnacky (1985), which uses an indicator variable for multi-stemmed juniper trees. Its unlikely that a shared pool of covariate names will ever cover all cases.

This could be covered by optional arguments to ModelSet and AllometricModel that allow for user-defined variable names and definitions. Appropriate validity checks should also be implemented, but this is larger scope than this issue

Poudel et al. (2019)

Provide a citation of the publication you want us to add.

@article{poudel2019estimating,
  title={Estimating individual-tree aboveground biomass of tree species in the western USA},
  author={Poudel, Krishna P and Temesgen, Hailemariam and Radtke, Philip J and Gray, Andrew N},
  journal={Canadian Journal of Forest Research},
  volume={49},
  number={6},
  pages={701--714},
  year={2019},
  publisher={NRC Research Press}
}

Eleotério et al. (2019)

Provide a citation of the publication you want us to add.

@article{eleoterio2019aboveground,
  title={Aboveground biomass quantification and tree-level prediction models for the Brazilian subtropical Atlantic Forest},
  author={Eleot{\'e}rio, Jackson Roberto and Uller, Heitor Felippe and Zimermann Oliveira, Laio and Klitzke, Aline Renata and Fantini, Alfredo Celso and Vibrans, Alexander Christian},
  journal={Southern Forests: a Journal of Forest Science},
  volume={81},
  number={3},
  pages={261--271},
  year={2019},
  publisher={NISC (Pty) Ltd}
}

Trasobares et al. (2022)

Provide a citation of the publication you want us to add.

@article{trasobares2022nationwide,
  title={Nationwide climate-sensitive models for stand dynamics and forest scenario simulation},
  author={Trasobares, Antoni and Mola-Yudego, Blas and Aquilu{\'e}, N{\'u}ria and Gonz{\'a}lez-Olabarria, Jos{\'e} Ram{\'o}n and Garcia-Gonzalo, Jordi and Garc{\'\i}a-Vald{\'e}s, Ra{\'u}l and De C{\'a}ceres, Miquel},
  journal={Forest Ecology and Management},
  volume={505},
  pages={119909},
  year={2022},
  publisher={Elsevier}
}

Devise a performant structure for holding models

Ideally, the package should be performant for a very large number of models.

My initial idea of writing out functions programmatically is prohibitively slow (to document, build website and install!) at around 10000 equations. That is a super big number of equations, but we should start with something that can deal with that.

So...back to the drawing board.

My other idea is to not directly load allometric functions at all. Instead, the user calls them from a locally stored data structure. The question is, how do data structures like .RDS or .Rdata handle this. Do they need to be loaded into memory? How fast is this?

Incorrect model string in `rustagi_1991`

Model Form:
vso = k * (a * hso + b * dsob * hso + c * dsob^2 * hso + d * (hsdop67 - vso = 1.37)) + e * dsob * (hsdop67 - 1.37) + f * dsob^2 * (hsdop67 - vso = 1.37)

Note the weird vso = 1.37

Woodall et al. (2011)

Provide a citation of the publication you want us to add.

@article{woodall2011methods,
  title={Methods and equations for estimating aboveground volume, biomass, and carbon for trees in the US forest inventory, 2010},
  author={Woodall, Christopher W and Heath, Linda S and Domke, Grant M and Nichols, Michael C},
  journal={Gen. Tech. Rep. NRS-88. Newtown Square, PA: US Department of Agriculture, Forest Service, Northern Research Station. 30 p.},
  volume={88},
  pages={1--30},
  year={2011}
}

https://ww2.arb.ca.gov/sites/default/files/cap-and-trade/protocols/usforest/2014/woodall_2011.pdf

Chojnacky (1985)

Provide a citation of the publication you want us to add.

@book{chojnacky1985pinyon,
  title={Pinyon-juniper volume equations for the central Rocky Mountain States},
  author={Chojnacky, David C},
  volume={339},
  year={1985},
  publisher={US Department of Agriculture, Forest Service, Intermountain Forest and Range~…}
}

https://books.google.com/books?hl=en&lr=&id=uXhe1sdn1eMC&oi=fnd&pg=PA1&dq=Chojnacky,+D.C.+1985.+Pinyon-juniper+volume+equations+for+the+central+Rocky+Mountain+states.+Res.+Pap.+INT-339.+Ogden,+UT:+U.S.+Department+of+Agriculture,+Forest+Service,+Intermountain+Forest+and+Range+Experiment+Station.+27+p.+&ots=DvMrMFOvr5&sig=FE-Hs4YE0XaXwIxyyworNqokjDw#v=onepage&q&f=false

Make Montero branch diameters descriptors

Right now, Montero et al. (2005) branch biomass models have a special response variable name. I think it makes more sense to rework these as model descriptors, since it appears to be a very specialized case

Handle mixed effects models

Right now predict only takes a vector of parameters and a dataframe of covariates. For mixed effects models, the predict function will need a vector of y's for the target group as well.

Here is a sketch of some possibilities

# Just playing with the idea here...
setClass(
    'MixedEffectsModel',
    contains = 'ParametricModel'
)

setGeneric('predict', function(mod, covariates, ranefs) {
    # This leaves it up to the author to provide random effect estimates
    mod@predict_fn(mod@parameters, covariates, ranefs)
})

# Alternatively we just provide a ... to predict for ParametricModel, the
# structure of ranefs is not always the same, and maybe this is the most
# general way to allow for it. Ranefs are functions of the parameters, covariates
# *and* observations within the target grouping...so a user would need to 
# at least provide those observations, or predict the random effects themselves
# using the model. The ranefs can enter non-linearly

Replace `component` and `measure` in `allometric_models` with `model_type`

Referring to models with component and measure can be awkward. Instead, we can make something more general called model_type which will link certain response variable names to more typically used names.

For example, dsoh and dsih refer to diameter outside/inside bark at a specificed height. These are taper models, so the table can look something like

response_name  model_type
         dsoh  taper
         dsih  taper

There can be a set of pre-specified model types, and then the rest are just filled in with paste(component, measure) as before. Finally, we get something nice, like allometric_models %>% filter(model_type == "taper") instead of the more awkward allometric_models %>% filter(component == "stem", measure == "diameter"). Another example is hstix** which refer to site index models.

extend `tbl_df` using S3 classes

S4 classes cannot inherit tbl_df, but S3 classes can, and mixing class structures is no problem as long as it is done well. We should extend tbl_df for select_model and to prepare for "tidy" use of allometric models in larger inventories (a task for a future milestone)

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.