Giter Club home page Giter Club logo

emergent's Introduction

emergent reboot in Go

Go Report Card Go Reference CI Codecov

This is the new home of the emergent neural network simulation software, developed primarily by the CCN lab, originally at CU Boulder, and now at UC Davis: https://ccnlab.org. We have decided to completely reboot the entire enterprise from the ground up, with a much more open, general-purpose design and approach.

See Wiki Install for installation instructions (note: Go 1.18 required), and the Wiki Rationale and History pages for a more detailed rationale for the new version of emergent, and a history of emergent (and its predecessors).

The single clearest motivation for using Go vs. the ubiquitous Python, is that Python is too slow to implement the full computational model: it can only serve as a wrapper around backend code which is often written in C or C++. By contrast, Go can implement the entire model in one coherent language. This, along with the advantages of the strongly typed, rapidly compiled Go language vs. duck typed Python for developing large scale frameworks, and the many other benefits of the Go language environment for reproducible, reliable builds across platforms, results in a satisfying and productive programming experience. Note also that we are not able to leverage existing Python backends such as PyTorch or TensorFlow due to the unique demands of biologically based neural models.

See the ra25 example in the leabra package for a complete working example (intended to be a good starting point for creating your own models), and any of the 26 models in the Comp Cog Neuro sims repository which also provide good starting points. See the etable wiki for docs and example code for the widely used etable data table structure, and the family_trees example in the CCN textbook sims which has good examples of many standard network representation analysis techniques (PCA, cluster plots, RSA).

See python README and Python Wiki for info on using Python to run models. See eTorch for how to get an interactive 3D NetView for PyTorch models.

Current Status / News

  • Nov 2020: Full Python conversions of CCN sims complete, and eTorch for viewing and interacting with PyTorch models.

  • April 2020: Version 1.0 of GoGi GUI is now released, and we have updated all module dependencies accordingly. We now recommend using the go modules instead of GOPATH -- the Wiki Install instructions have been updated accordingly.

  • 12/30/2019: Version 1.0.0 released! The Comp Cog Neuro sims that accompany the CCN Textbook are now complete and have driven extensive testing and bugfixing.

  • 3/2019: Python interface is up and running! See the python directory in leabra for the README status and how to give it a try. You can run the full leabra/examples/ra25 code using Python, including the GUI etc.

  • 2/2019: Initial implementation and benchmarking (see examples/bench for details -- shows that the Go version is comparable in speed to C++).

Key Features

  • Currently focused exclusively on implementing the biologically based Leabra algorithm, which is not at all suited to implementation in current popular neural network frameworks such as PyTorch. Leabra uses point-neurons and competitive inhibition, and has sparse activity levels and ubiquitous fully recurrent bidirectional processing, which enable / require novel optimizations for how simulated neurons communicate, etc.

  • Go-based code can be compiled to run entire models. Instead of creating and running everything in the emergent GUI, the process is much more similar to how e.g., PyTorch and other current frameworks work. You write code to configure your model, and directly call functions that run your model, etc. This gives you full, direct, transparent control over everything that happens in your model, as opposed to the previous highly opaque nature of C++ emergent.

  • Although we will be updating our core library (package in Go) code with bug fixes, performance improvements, and new algorithms, we encourage users who have invested in developing a particular model to fork their own copy of the codebase and use that to maintain control over everything. Once we make our official release of the code, the raw algorithm code is essentially guaranteed to remain fairly stable and encapsulated, so further changes should be relatively minimal, but nevertheless, it would be good to have an insurance policy! The code is very compact and having your own fork should be easily manageable.

  • The emergent repository will host additional Go packages that provide support for models. These are all designed to be usable as independently and optionally as possible. An overview of some of those packages is provided below.

  • The system is fully usable from within Python -- see the Python Wiki. This includes interoperating with PyTorch via eTorch, and PsyNeuLink to make Leabra models accessible in that framework, and vice-versa. Furthermore, interactive, IDE-level tools such as Jupyter and nteract can be used to interactively develop and analyze the models, etc.

  • We are leveraging the Cogent Core GUI to provide interactive 2D and 3D GUI interfaces to models, capturing the essential functionality of the original C++ emergent interface, but in a much more a-la-carte fashion. We also use and support the GoNum framework for analyzing and plotting results within Go.

Design / Organization

  • The emergent repository contains a collection of packages supporting the implementation of biologically based neural networks. The main package is emer which specifies a minimal abstract interface for a neural network. The etable etable.Table data structure (DataTable in C++) is in a separate repository under the overall emer project umbrella, as are specific algorithms such as leabra which implement the emer interface.

  • Go uses interfaces to represent abstract collections of functionality (i.e., sets of methods). The emer package provides a set of interfaces for each structural level (e.g., emer.Layer etc) -- any given specific layer must implement all of these methods, and the structural containers (e.g., the list of layers in a network) are lists of these interfaces. An interface is implicitly a pointer to an actual concrete object that implements the interface.

  • To allow for specialized algorithms to extend the basic Leabra algorithm functionality, we have additional algorithm-specific interfaces in leabra/leabra/leabra.go, called LeabraNetwork, LeabraLayer, and LeabraPath -- all functions should go through this interface so that the final actual function called can be either the default version defined on leabra.Layer or a more specialized type (e.g., for simulating the PFC, hippocampus, BG etc). This is what it looks like for example:

func (nt *Network) InitActs() {
	for _, ly := range nt.Layers {
		if ly.IsOff() {
			continue
		}
		ly.(LeabraLayer).InitActs() // ly is the emer.Layer interface -- convert to (LeabraLayer) interface
	}
}
  • The emer interfaces are designed to support generic access to network state, e.g., for the 3D network viewer, but specifically avoid anything algorithmic. Thus, they allow viewing of any kind of network, including PyTorch backprop nets in the eTorch package.

  • There are 3 main levels of structure: Network, Layer and Path (pathway). The Network calls methods on its Layers, and Layers iterate over both Neuron data structures (which have only a minimal set of methods) and the Paths, to implement the relevant computations. The Path fully manages everything about a pathway of connectivity between two layers, including the full list of Syanpse elements in the connection. There is no "ConGroup" or "ConState" level as was used in C++, which greatly simplifies many things. The Layer also has a set of Pool elements, one for each level at which inhibition is computed (there is always one for the Layer, and then optionally one for each Sub-Pool of units (Pool is the new simpler term for "Unit Group" from C++ emergent).

  • Layers have a Shape property, using the tensor.Shape type (see table package), which specifies their n-dimensional (tensor) shape. Standard layers are expected to use a 2D Y*X shape (note: dimension order is now outer-to-inner or RowMajor now), and a 4D shape then enables Pools ("unit groups") as hypercolumn-like structures within a layer that can have their own local level of inihbition, and are also used extensively for organizing patterns of connectivity.

Packages

Here are some of the additional supporting packages, organized by overall functionality:

Core Network

  • emer only has the primary abstract Network interfaces.

  • params has the parameter-styling infrastructure (e.g., params.Set, params.Sheet, params.Sel), which implement a powerful, flexible, and efficient CSS style-sheet approach to parameters. See the Wiki Params page for more info.

  • netview provides the NetView interactive 3D network viewer, implemented in the GoGi 3D framework.

  • path is a separate package for defining patterns of connectivity between layers (i.e., the ProjectionSpecs from C++ emergent). This is done using a fully independent structure that only knows about the shapes of the two layers, and it returns a fully general bitmap representation of the pattern of connectivity between them. The leabra.Path code then uses these patterns to do all the nitty-gritty of connecting up neurons. This makes the pathway code much simpler compared to the ProjectionSpec in C++ emergent, which was involved in both creating the pattern and also all the complexity of setting up the actual connections themselves. This should be the last time any of those pathway patterns need to be written (having re-written this code too many times in the C++ version as the details of memory allocations changed).

  • relpos provides relative positioning of layers (right of, above, etc).

  • weights provides weight-file parsing / loading routines: much easier to read into a temporary structure and then apply to the network.

Environment: input / output patterns

  • env has an interface for environments, which encapsulates all the counters and timing information for patterns that are presented to the network, and enables more of a mix-and-match ability for using different environments with different networks. See Wiki Env page for more info, and the envs repository for various specialized environments that can be a good starting point.

  • patgen supports various general-purpose pattern-generation algorithms, as implemented in taDataGen in C++ emergent (e.g., PermutedBinary and FlipBits).

Running, Logging, Stats, GUI toolkit

The following all work together to provide a convenient layer of abstraction for running, logging & statistics, and the GUI interface:

  • etime provides the core time scales and training / testing etc modes used in the rest of the packages.

  • looper provides a fully step-able hierarchical looping control framework (e.g., Run / Epoch / Trial / Cycle) where you can insert functions to run at different points (start, end, or specific counter value). Axon uses this natively and has support functions for configuring standard looper functions.

  • estats manages statistics as maps of name, value for various types, along with network-relevant statistics such as ClosestPat, PCA stats, Cluster plots, decoders, raster plots, etc.

  • elog has comprehensive support for logging data at different time scales and evaluation modes -- saves a lot of boilerplate code for configuring, updating.

  • egui implements a standard simulation GUI, with a toolbar, tabs of different views, and a Sim struct view on the left.

  • ecmd manages command-line args and standard defaults / methdods around these.

Other Misc

  • actrf provides activation-based receptive field stats (reverse correlation, spike-triggered averaging) for decoding internal representations.

  • chem provides basic chemistry simulation mechanisms for chemical reactions characterized by rate constants and concentrations, including diffusion. This can be used for detailed biochemical models of neural function, as in the Urakubo et al (2008) model of synaptic plasticity.

  • confusion provides confusion matricies for model output vs. target output.

  • decoder provides simple linear, sigmoid, and softmax decoders for interpreting network activity states according to hypothesized variables of interest.

  • efuns has misc special functions such as Gaussian and Sigmoid.

  • esg is the emergent stochastic / sentence generator -- parses simple grammars that generate random events (sentences) -- can be a good starting point for generating more complex environments.

  • popcode supports the encoding and decoding of population codes -- distributed representations of numeric quantities across a population of neurons. This is the ScalarVal functionality from C++ emergent, but now completely independent of any specific algorithm so it can be used anywhere.

  • ringidx provides a wrap-around ring index for efficient use of a fixed buffer that overwrites the oldest items without any copying.

  • stepper provides dynamic stepping control at multiple levels -- used in pvlv model (contributed by Randy Gobbel). This functionality is now available in looper in a more robust and integrated form.

Repositories

Here are the other repositories within emer that provide additional, optional elements for simulations:

  • table repository holds all of the more general-purpose "DataTable" or DataFrame (table.Table) related code, which is our version of something like pandas or xarray in Python. This includes the tensor n-dimensional array, plotview for interactive plotting of data, and basic utility packages like minmax and bitslice, and lots of data analysis tools like similarity / distance matricies, PCA, cluster plots, etc.

  • eMPI provides an MPI (message passing interface) distributed memory implementation -- see MPI Wiki page

  • envs has misc standalone environments that can be good starting points, including managing files, visual images, etc.

  • etail is the emergent tail program -- a separate command-line tool for looking at tabular (csv, tsv, etc) log files from simulations -- very useful! go get github.com/emer/etail from anywhere to install (in go modules mode).

  • eTorch is the emergent interface to PyTorch models, providing emergent GUI NetView etc for these models.

  • eve is the emergent virtual environment -- provides a physics engine and collision detection that interfaces with the GoGi 3D for visualization. For constructing more realistic environments for your models.

  • grunt is the git-based run tool -- it handles the grunt work for running simulations on a cluster, by pushing to git repositories hosted on the cluster, which has a daemon running on it monitoring for these git updates. It pushes back updates and results from the cluster. There is a GUI for controlling and managing a potentially large history of jobs -- invaluable for any significant simulation to keep track of various parameter searches, changes over time etc.

  • vision and auditory provide low-level filtering on sensory inputs reflecting corresponding biological mechanisms.

  • vgpu is a GPU library using Vulkan for both graphics and compute functionality. Used now in Axon, via gosl which is a Go shader language that converts Go -> HLSL shader code that can then be compiled and run in the VGPU framework.

emergent's People

Contributors

andrewecarlson avatar christiangnrd avatar etuleu avatar garymm avatar jameswardantony avatar jedmccaleb avatar kkoreilly avatar qemqemqem avatar rcoreilly avatar rgobbel avatar rohrlich avatar siboehm avatar snishiyama avatar testwill avatar wumpusman avatar zycyc 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  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  avatar  avatar  avatar  avatar  avatar

emergent's Issues

Netview window continually expands in width

If I leave a project open for several days, it will gradually get wider and wider to the point where it is several multiples wider. Both the Control panel window on the left and the Neview panel on the right continue to get wider. The height does not change much, if at all during the same time frame.

Netview history mechanism out of sync

These 2 images show input changing from cycle 50 to cycle 75. At this point not sure if it is a problem with history getting out of sync when going back and forth or a problem in my application re-init. I'll take a look and determine.
Screen Shot 2020-02-11 at 2 00 55 PM
Screen Shot 2020-02-11 at 2 01 14 PM

Blockupdates is blocking updates! Netview not updating.

Commenting out Blockupdates in this code gets my simulation running again.

func (nv *NetView) GoUpdate() {
if !nv.IsVisible() || !nv.HasLayers() {
return
}
if nv.Viewport.IsUpdatingNode() {
return
}
//nv.Viewport.BlockUpdates()
vs := nv.Scene()
updt := vs.UpdateStart()
nv.UpdateImpl()
//nv.Viewport.UnblockUpdates()
vs.UpdateEnd(updt)
}

Save buttons erratic in EpcPlot window

After running a training session if I click on the various buttons in the EpcPlot window to Save weights, Save SVG, etc. I get erratic responses. Sometimes it gives me the dialog box, but other times it gives me an entirely black panel or it totally freezes the simulator, or it crashes.

when viewUpdt is Cycle, isn't saving ActP

The fix is to use this logic in the standard AlphaCyc method for updating after QuarterFinal (when ActP is updated) -- this updates for anything <= Quarter:

		ss.Net.QuarterFinal(&ss.Time)
		ss.Time.QuarterInc()
		if ss.ViewOn {
			switch {
			case viewUpdt <= leabra.Quarter:
				ss.UpdateView(train)
			case viewUpdt == leabra.Phase:
				if qtr >= 2 {
					ss.UpdateView(train)
				}
			}
		}

I will update fixes for ra25 and hip examples, and also textbook sims, later.

Viewing unit specific information, like r.wt, s.wt, etc?

Is there anything in the works to get it so you can view unit specific information in the gui, like before? In the old emergent, as well as viewing activity, input, etc, you could view a unit's receiving weights (r.wt) or sending weights (s.wt). Wondering if that will be possible here. Thanks!

Windows stay black if ra25 is left open for a while

This may be a gi bug or an emergent bug. Not sure.

I had the ra25 example open today since this morning on my Mac under Mojave. When I went back to it just now the windows were totally black and stayed black, unless I went full screen. But then when I left full screen mode, it gave me really distorted text.

I am using an LG large screen monitor with new MacBook Pro.

Maybe related, I noticed that sometimes on the large screen monitor the window will rescale to be several times wider than the screen. I have to drag the right edge back to get it scaled to the proper size

Mouse location registered by emergent does not correspond with screen location

In my copy of emergent (updated just now with go get -u ./...) the mouse location is not registered properly. This screenshot illustrates the problem:

Bad pointer

The "All parameters" button is highlighted even though the mouse is upwards and to the left of the button. Maybe this is also related to the poor default resolution on my machine? In case it's relevant information, my display is set to 1920:1080, but the default resolution seems to be poor regardless of my settings. Using ctrl - to change the emergent zoom doesn't resolve the pointer issue.

Netview network display

When I ran the ra25 example I had two problems. First, the display of the network layers, fragmented when I zoomed in at a high magnification. Second, after moving the layers around and manipulating them, the example crashed.

showing s.wt and r.wt not working properly

I was trying out the new functionality for looking at s.wt and r.wt and its not working properly.

  1. one initial point is that I had to download the changes and rebuild gi for it to recognize the selections.
  2. Once I did that, I was playing around with ra25 and it was not behaving properly. If I set it to show s.wt then when I click on the nodes in the Input layer, I get a single green highlighted node in Hidden1 and then a bunch of red highlighted nodes in Hidden2.(note that not all nodes in the input layer respond to a click) But if I click on a node in Hidden1 nothing happens. Then if I click on nodes in Hidden2, I get a response for some of them, but not all of them. When it works, I get a green highlighted node in the Output layer and the red highlighted nodes in Hidden2 change, but nothing happens in any of the other layers.
  3. r.wt has similar problems

No projection lines in network view

Maybe this hasn't been implemented yet, but when I ran the ra25 example it displayed the layers and nodes, but no projections. Is there a switch for this, or is this not implemented yet or a bug?

Window keeps growing when project left open

I have noticed that when I leave a project open for a while, such as over night, the window gets very wide, many multiple screen widths wide. to resize it I need to move the window over and then from the right side keep manually shrinking the width.

When training, buttons for different graphic views largely unresponsive

When you start training with ra25, if you click the TrnEpcPlot button to look at that plot, the other buttons, such as NetView and TstTrlPlot are largely unresponsive. That is you can click on them multiple times and only rarely will they switch you to the relevant plot. For example, the NetView button is largely unresponsive, once you have switched to TrnEpcPlot. Once you stop training, then the buttons respond normally.

cannot open app with macos catalina

cannot open app with macos catalina

dyld: Library not loaded: /usr/local/opt/gsl/lib/libgsl.23.dylib
Referenced from: /usr/local/bin/emergent
Reason: image not found
[1] 24695 abort emergent

Font size change is glitchy

I tried the command - and + keys in GoGi preferences, but there are a couple of issues currently.

  1. As you said, you can use the command and + or - to zoom in or out, but there are two glitches: a) you can save the change with the Save Zoom button, but if you go back to the program window and hit the Init button it crashes the program. It only works if you quit the program and then restart, b) when you do the command key thing, it is frequently the case that the first command goes in the wrong direction, that is the first command + will zoom out and a command - will zoom in. Any command after that does in the right direction.

  2. DPI selection. Although you can change the DPI values in the text box, the Save Zoom button does not save the changes and it just goes back to the previous value

  3. Is this documented anywhere?

AddCol may have a bug

In developing my model I found that when calling AddCol() the first dimension was not being set. I added dtable_test.go with an AddCol4D test function which also failed.

NetView: add filter for prjn type to show for recv / send prjns

  • add emer.Prjn.TypeName() that does string conversion on Prjn.Type() -- must be done in derived packages to get updated list of names

  • use that to filter -- just have a string field in Netview view toolbar -- user types in something and use "contains" to filter prjns.

  • test once deep is up and running with test project -- first case where needed.

Netview: using scroll bars removes network from display

If you use either the bottom or right side scroll bars the network disappears. But immediately comes back if you click on one of the right side buttons for the different values to display. Also comes back if you click the movement controls on the bottom (pan, rotate, etc.).

Hovering for node values should respond to 3D top surfaces of neurons

This isn't really an issue, but I did notice that the active area for hovering over a node to get values is the outline on the 2 D layer surface and not the bar that graphically shows the value. This makes sense and I don't see what would make more sense, but this does have the effect that when the network is tilted, as is the default, this can make it difficult to get values for back rows when there are large values (bars) on the nodes in front. I don't think it effects the readout, but it does make it hard to see where one has to click to get a value.
I also think that the naive thing for a user to do is to think that clicking on the column will always work, when it's the node outline at the base of any column that is actually active.

Does it save changes made in the gui?

I'm a bit confused about something. The gui interface would seem to indicate that there are various things that can be changed in the interface, but they don't seem to actually change. And I don't see a way to save the changes.

First, I clicked on RA25 in the Net field and got a dialog box that has Add Layer.. and Connect Layer...I added a Layer and then hit Build, but nothing happened in the gui (although it did create a dialog box with relevant info in it). ra25 crashed while I was trying to edit fields here. I also tried to use the gui to add Parameter sets, but that crashed when I was playing with it.

My assumption was that because everything must be defined in the text file and then the network built, that one could not dynamically change or add things in the gui. But if it is true that these kinds of things can't be changed in the gui, why does the gui have Add buttons that make make it look possible. And if it is true that one can modify these things in the gui, where (or how) do the changes get saved for use later?

Glitchiness of emergent exe windows in Windows 10

I installed the new Go version of Emergent by following the instructions on (https://github.com/emer/emergent/wiki/Install) and while Go and Gogi are installed correctly on my Windows 10 PC, when I build the ra25 example exe in emer/leabra/examlples/ra25 and try to run it via the command line, it doesn't open up the exe window. The window actually remains glitched out and minimized (screenshot attached below) and clicking on the window icon in the toolbar doesn't seem to do anything.

The only way to then force the window open reliably is to go into window's split-screen mode (by, for example, dragging a window to the edge of the screen) and then selecting the 'Leabra Random Associator' window via the split-screen menu which pops up. The exe window then opens up on half the screen and there's no problems after that in rescaling it to fullscreen. I think perhaps the glitchiness has something to go with the initial scaling of the window and how the initial values may not work on all screen resolutions?(mine is 1080p) I wasn't sure if this was just an issue on my computer so I thought to report it. It's possible that if this happens on other people's computers as well, they might think (as I thought) that their emergent/Go/Gogi is not set up correctly when in fact it might be.

image

Ubuntu installation failure, leabra/examples/ra25, ext.Floats() used as value

Hi all, I'm having trouble installing Emergent on my XPS-13 running Ubuntu 16 LTS. I had no issues with GoKi or GoGi, and the widgets built without errors. Go getting leabra (go get -u github.com/emer/leabra) did not complain. The error I get is:

dan@dan-XPS-13:~/go/src/github.com/emer/leabra/examples/ra25$ go get -u ./...
# github.com/emer/leabra/leabra
../../leabra/layer.go:575:37: not enough arguments in call to ext.Floats
	have ()
	want (*[]float64)
../../leabra/layer.go:575:37: ext.Floats() used as value

Additional system info:

dan@dan-XPS-13:~/go/src/github.com/emer/leabra/examples/ra25$ lsb_release -a
LSB Version:	core-9.20160110ubuntu0.2-amd64:core-9.20160110ubuntu0.2-noarch:security-9.20160110ubuntu0.2-amd64:security-9.20160110ubuntu0.2-noarch
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.6 LTS
Release:	16.04
Codename:	xenial

and go version is go1.13 linux/amd64.

Does anyone have suggestions about how to troubleshoot this? From my perspective (knowing nothing about Go) it just looks like it's just a usage issue in the layer.go code, per the error message, but maybe someone who was involved in writing this code can weigh in.

Font size in interface

This may be a GoGi issue, but it would be nice if one could change not just the font, but the font size for the interface.

command to execute ra25 after build doesn't work

Following the Wiki Install instructions I successfully installed and built the ra25 example, but when I used the command
./ra25 it told me file not found.
However, if I used the full pathname it worked. The path to the executable is somehow not being set. How to set it should probably be part of the Install instructions.

netview.NetData.Record could be optimized

Currently is reading each variable and unit value separately..

  • change UnitVals* to take the []float32 slice / tensor so it doesn't alloc mem if not needed
  • use unsafe offsets instead of reflect to access unit vars
  • double-check about extra unit vals in deep.

see what can be done for prjn-level along same lines.

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.