Coder Social home page Coder Social logo

Comments (1)

sweep-ai avatar sweep-ai commented on May 27, 2024

πŸš€ Here's the PR! #133

See Sweep's progress at the progress dashboard!
πŸ’Ž Sweep Pro: I'm using GPT-4. You have unlimited GPT-4 tickets. (tracking ID: 2082c086b6)

Tip

I'll email you at [email protected] when I complete this pull request!


Actions (click)

  • ↻ Restart Sweep

GitHub Actionsβœ“

Here are the GitHub Actions logs prior to making any changes:

Sandbox logs for 4e2882f
Checking src/Snps/SNPsResources.php for syntax errors... βœ… src/Snps/SNPsResources.php has no syntax errors! 1/1 βœ“
Checking src/Snps/SNPsResources.php for syntax errors...
βœ… src/Snps/SNPsResources.php has no syntax errors!

Sandbox passed on the latest main, so sandbox checks will be enabled for this issue.


Step 1: πŸ”Ž Searching

I found the following snippets in your repository. I will now analyze these snippets and come up with a plan.

Some code snippets I think are relevant in decreasing order of relevance (click to expand). If some file is missing from here, you can mention the path in the ticket description.

php-dna/README.md

Lines 1 to 49 in 4e2882f

# php-dna
## Running MatchKits from the Command Line
To run the MatchKits script from the command line, navigate to the root directory of the php-dna project.
Ensure you have PHP installed on your system. You can check this by running `php -v` in your command line. If PHP is not installed, please install it from the official PHP website.
Execute the script by running the following command: `php src/MatchKits.php`.
The script will prompt you to enter the file paths for Kit 1 and Kit 2. Please enter the full path for each file when prompted.
After entering the file paths, the script will process the data and generate a matched data visualization. The output file named 'matched_data.png' will be saved in the root directory.
## Requirements
* php-dna 1.0+ requires PHP 8.3 (or later).
## Installation
There are two ways of installing php-dna.
### Composer
To install php-dna in your project using composer, simply add the following require line to your project's `composer.json` file:
{
"require": {
"laravel-liberu/php-dna": "1.0.*"
}
}
### Download and __autoload
If you are not using composer, you can download an archive of the source from GitHub and extract it into your project. You'll need to setup an autoloader for the files, unless you go through the painstaking process if requiring all the needed files one-by-one. Something like the following should suffice:
```php
spl_autoload_register(function ($class) {
$pathToDna = __DIR__ . '/library/'; // TODO FIXME
if (!substr(ltrim($class, '\\'), 0, 7) == 'Dna\\') {
return;
}
$class = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
if (file_exists($pathToDna . $class)) {
require_once($pathToDna . $class);
}
});

php-dna/LICENSE

Lines 1 to 20 in 4e2882f

MIT License
Copyright (c) 2021 Family Tree 365
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

<?php
/**
* php-dna.
*
* tools for genetic genealogy and the analysis of consumer DNA test results
*
* @author Devmanateam <[email protected]>
* @copyright Copyright (c) 2020-2023, Devmanateam
* @license MIT
*
* @link http://github.com/familytree365/php-dna
*/
namespace Dna\Snps;
use Dna\Snps\IO\CsvReader;
use Exception;
use PharData;
use Phar;
use League\Csv\Reader;
use League\Csv\Statement;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use ZipArchive;
use GuzzleHttp\Client;
use GuzzleHttp\GuzzleException;
/**
* Class SNPsResources.
*/
class SNPsResources extends Singleton
{
/**
* The directory where the resources are located
* @var string
*/
private string $_resources_dir;
/**
* The Ensembl REST client used to retrieve resources
* @var EnsemblRestClient
*/
private EnsemblRestClient $_ensembl_rest_client;
/**
* An array of reference sequences
* @var array
*/
private array $_reference_sequences;
/**
* A map of GSA RSIDs to chromosome positions
* @var array|null
*/
private ?array $_gsa_rsid_map;
/**
* A map of GSA chromosome positions to RSIDs
* @var array|null
*/
private ?array $_gsa_chrpos_map;
/**
* A map of dbSNP 151 to GRCh37 reverse mappings
* @var array|null
*/
private ?array $_dbsnp_151_37_reverse;
/**
* An array of filenames for the OpenSNP datadump
* @var array
*/
private array $_opensnp_datadump_filenames;
/**
* A map of chip clusters
* @var array|null
*/
private ?array $_chip_clusters;
private ?array $_lowQualitySnps = null;
private $logger = null;
/**
* Constructor for the ResourceManager class
* @param string $resources_dir The directory where the resources are located
*/
public function __construct(
string $resources_dir = "resources",
private Client $httpClient = new Client()
) {
$this->_resources_dir = realpath($resources_dir);
$this->_ensembl_rest_client = new EnsemblRestClient();
$this->init_resource_attributes();
}
public function getResourcesDir(): string
{
return $this->_resources_dir;
}
public function setResourcesDir(string $resources_dir): void
{
$this->_resources_dir = $resources_dir;
}
public function getHttpClient(): Client
{
return $this->httpClient;
}
public function setHttpClient(Client $httpClient): void
{
$this->httpClient = $httpClient;
}
public function setRestClient($rest_client): void
{
$this->_ensembl_rest_client = $rest_client;
}
/**
* Initializes the resource attributes
*/
public function init_resource_attributes(): void
{
$this->_reference_sequences = [];
$this->_gsa_rsid_map = null;
$this->_gsa_chrpos_map = null;
$this->_dbsnp_151_37_reverse = null;
$this->_opensnp_datadump_filenames = [];
$this->_chip_clusters = null;
$this->_low_quality_snps = null;
}
/**
* Retrieves reference sequences for the specified assembly and chromosomes
* @param string $assembly The assembly to retrieve reference sequences for
* @param array $chroms The chromosomes to retrieve reference sequences for
* @return ReferenceSequence[] An array of reference sequences
*/
public function getReferenceSequences(
string $assembly = "GRCh37",
array $chroms = [
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "X", "Y", "MT",
]
): array {
$validAssemblies = ["NCBI36", "GRCh37", "GRCh38"];
if (!in_array($assembly, $validAssemblies)) {
error_log("Invalid assembly");
return [];
}
if (!$this->referenceChromsAvailable($assembly, $chroms)) {
[$assembly, $chroms, $urls, $paths] = $this->getPathsReferenceSequences(
assembly: $assembly,
chroms: $chroms
);
$this->_reference_sequences[$assembly] = $this->createReferenceSequences(
assembly: $assembly,
chroms: $chroms,
urls: $urls,
paths: $paths
);
}
// print_r($this->_reference_sequences);
return $this->_reference_sequences[$assembly];
}
/**
* Checks if reference chromosomes are available for the specified assembly and chromosomes
* @param string $assembly The assembly to check reference chromosomes for
* @param array $chroms The chromosomes to check reference chromosomes for
* @return bool True if reference chromosomes are available, false otherwise
*/
private function referenceChromsAvailable(string $assembly, array $chroms): bool
{
// TODO: Implement reference chromosome availability check
return false;
}
/**
* Creates reference sequences from the specified paths
* @param string $fastaPath The path to the FASTA file
* @param string $faiPath The path to the FAI file
* @param string $dictPath The path to the dictionary file
* @return array An array of reference sequences
*/
protected function createReferenceSequences($assembly, $chroms, $urls, $paths)
{
// https://samtools.github.io/hts-specs/VCFv4.2.pdf
$seqs = [];
foreach ($paths as $i => $path) {
if (!$path) {
continue;
}
$d = [
"ID" => $chroms[$i],
"url" => $urls[$i],
"path" => realpath($path),
"assembly" => $assembly,
"species" => "Homo sapiens",
"taxonomy" => "x",
];
$seqs[$chroms[$i]] = new ReferenceSequence(
$d["ID"],
$d["url"],
$d["path"],
$d["assembly"],
$d["species"],
$d["taxonomy"]
);
}
return $seqs;
}
/**
* Get assembly mapping data.
*
* @param string $sourceAssembly {'NCBI36', 'GRCh37', 'GRCh38'} assembly to remap from
* @param string $targetAssembly {'NCBI36', 'GRCh37', 'GRCh38'} assembly to remap to
*
* @return array array of json assembly mapping data if loading was successful, else []
*/
public function getAssemblyMappingData(string $sourceAssembly, string $targetAssembly): array
{
// Get assembly mapping data.
return $this->loadAssemblyMappingData(
$this->getPathAssemblyMappingData($sourceAssembly, $targetAssembly)
);
}
/**
* Downloads example datasets.
*
* @return array Array of downloaded file paths.
*/
public function download_example_datasets(): array
{
$paths = [];
// Download 23andMe example dataset.
$paths[] = $this->download_file("https://opensnp.org/data/662.23andme.340", "662.23andme.340.txt.gz", true);
// Download FTDNA Illumina example dataset.
$paths[] = $this->download_file("https://opensnp.org/data/662.ftdna-illumina.341", "662.ftdna-illumina.341.csv.gz", true);
return $paths;
}
/**
* Gets / downloads all resources used throughout snps.
*
* @return array Array of resources.
*/
public function getAllResources()
{
// Get / download all resources used throughout snps.
//
// Notes
// -----
// This function does not download reference sequences and the openSNP datadump,
// due to their large sizes.
//
// Returns
// -------
// array of resources
$resources = [];
$versions = ["NCBI36", "GRCh37", "GRCh38"];
// Loop through all possible assembly mappings and get their data.
for ($i = 0; $i < count($versions); ++$i) {
for ($j = 0; $j < count($versions); ++$j) {
if ($i === $j) {
continue;
}
$source = $versions[$i];
$target = $versions[$j];
$resources[$source . "_" . $target] = $this->getAssemblyMappingData($source, $target);
}
}
// Get GSA resources.
$resources["gsa_resources"] = $this->getGsaResources();
// Get chip clusters.
$resources["chip_clusters"] = $this->get_chip_clusters();
// Get low quality SNPs.
$resources["low_quality_snps"] = $this->getLowQualitySnps();
return $resources;
}
/**
* Gets Homo sapiens reference sequences for Builds 36, 37, and 38 from Ensembl.
*
* @param mixed ...$args Additional arguments to pass to getReferenceSequences.
*
* @return array Dictionary of ReferenceSequence, else {}.
*/
public function getAllReferenceSequences(...$args): array
{
/**
* Get Homo sapiens reference sequences for Builds 36, 37, and 38 from Ensembl.
*
* Notes
* -----
* This function can download over 2..
*
* Returns
* -------
* dict
* dict of ReferenceSequence, else {}
*/
$assemblies = ["NCBI36", "GRCh37", "GRCh38"];
// Loop through all assemblies and get their reference sequences.
foreach ($assemblies as $assembly) {
$this->getReferenceSequences($assembly, ...$args);
}
return $this->_reference_sequences;
}
/**
* Get resources for reading Global Screening Array files.
* https://support.illumina.com/downloads/infinium-global-screening-array-v2-0-product-files.html
*
* @return array An array of resources for reading Global Screening Array files.
*/
public function getGsaResources(): array
{
// Get the rsid map resource.
$rsid_map = $this->getGsaRsid();
// Get the chrpos map resource.
$chrpos_map = $this->getGsaChrpos();
// Get the dbsnp 151 37 reverse resource.
$dbsnp_151_37_reverse = $this->get_dbsnp_151_37_reverse();
// Return an array of resources.
return [
"rsid_map" => $rsid_map,
"chrpos_map" => $chrpos_map,
"dbsnp_151_37_reverse" => $dbsnp_151_37_reverse,
];
}
/**
* Get resource for identifying deduced genotype / chip array based on chip clusters.
*
* @return array
*
* @references
* - Chang Lu, Bastian Greshake Tzovaras, Julian Gough, A survey of
* direct-to-consumer genotype data, and quality control tool
* (GenomePrep) for research, Computational and Structural
* Biotechnology Journal, Volume 19, 2021, Pages 3747-3754, ISSN
* 2001-0370, https://doi.org/10.1016/j.csbj.2021.06.040.
*/
public function get_chip_clusters()
{
if ($this->_chip_clusters === null) {
$chip_clusters_path = $this->download_file(
"https://supfam.mrc-lmb.cam.ac.uk/GenomePrep/datadir/the_list.tsv.gz",
"chip_clusters.tsv.gz"
);
$csv = Reader::createFromPath($chip_clusters_path, 'r');
$csv->setDelimiter("\t");
$stmt = (new Statement())->offset(0)->limit(1);
$header = $stmt->process($csv)->getHeader();
$stmt = new Statement();
$chip_clusters = [];
foreach ($stmt->process($csv) as $row) {
$locus = $row[0] ?? ":";
$cluster = $row[1] ?? "";
[$chrom, $pos] = array_pad(explode(':', $locus), 2, '');
$pos = (int) $pos;
$chip_clusters[] = [
'chrom' => $chrom,
'pos' => $pos,
'clusters' => $cluster,
];
}
$this->_chip_clusters = $chip_clusters;
}
return $this->_chip_clusters;
}
/**
* Get the low quality SNPs data.
*
* @return array The low quality SNPs data.
*/
public function getLowQualitySNPs(): array
{
// If the low quality SNPs data has not been loaded yet, download and process it.
if ($this->_lowQualitySnps === null) {
// Download the low quality SNPs file.
$lowQualitySnpsPath = $this->download_file(
"https://supfam.mrc-lmb.cam.ac.uk/GenomePrep/datadir/badalleles.tsv.gz",
"low_quality_snps.tsv.gz"
);
// Load the low quality SNPs file into an array.
$fileContents = file_get_contents($lowQualitySnpsPath);
// Check if the file is gzipped
if (substr($fileContents, 0, 2) === "\x1f\x8b") {
$fileContents = gzdecode($fileContents);
}
$rows = explode("\n", $fileContents);
// Process the low quality SNPs data into an array of arrays.
$clusterDfs = [];
foreach ($rows as $row) {
if (empty($row)) {
continue;
}
[$cluster, $loci] = array_pad(explode("\t", $row), 2, '');
$lociSplit = explode(",", $loci);
foreach ($lociSplit as $locus) {
$clusterDfs[] = ['cluster' => $cluster, 'locus' => $locus];
}
}
// Transform the low quality SNPs data into an array of arrays with separate columns for chromosome and position.
$transformedData = [];
foreach ($clusterDfs as $clusterDf) {
[$chrom, $pos] = array_pad(explode(':', $clusterDf['locus']), 2, '');
$transformedData[] = [
'cluster' => $clusterDf['cluster'],
'chrom' => $chrom,
'pos' => intval($pos)
];
}
// Save the processed low quality SNPs data to the object.
$this->_lowQualitySnps = $transformedData;
}
// Return the low quality SNPs data.
return $this->_lowQualitySnps;
}
/**
* Get and load RSIDs that are on the reference reverse (-) strand in dbSNP 151 and lower.
*
* @return array An array of RSIDs that are on the reference reverse (-) strand in dbSNP 151 and lower.
*
* References:
* 1. Sherry ST, Ward MH, Kholodov M, Baker J, Phan L, Smigielski EM, Sirotkin K.
* dbSNP: the NCBI database of genetic variation. Nucleic Acids Res. 2001 Jan 1;
* 29(1):308-11.
* 2. Database of Single Nucleotide Polymorphisms (dbSNP). Bethesda (MD): National Center
* for Biotechnology Information, National Library of Medicine. (dbSNP Build ID: 151).
* Available from: http://www.ncbi.nlm.nih.gov/SNP/
*/
public function get_dbsnp_151_37_reverse(): ?array
{
// If the dbsnp 151 37 reverse data has not been loaded yet, download and process it.
if ($this->_dbsnp_151_37_reverse === null) {
// download the file from the cloud, if not done already
$dbsnp_rev_path = $this->download_file(
"https://sano-public.s3.eu-west-2.amazonaws.com/dbsnp151.b37.snps_reverse.txt.gz",
"dbsnp_151_37_reverse.txt.gz"
);
$fileContents = file_get_contents($dbsnp_rev_path);
// Check if the file is gzipped
if (substr($fileContents, 0, 2) === "\x1f\x8b") {
$fileContents = gzdecode($fileContents);
}
// load into pandas
$header = array(
"dbsnp151revrsid",
"dbsnp151freqa",
"dbsnp151freqt",
"dbsnp151freqc",
"dbsnp151freqg"
);
$rsids = array();
$lines = explode("\n", $fileContents);
foreach ($lines as $line) {
if (!empty($line) && $line[0] !== "#") { // skip the first row
$row = explode(" ", trim($line));
$rsid = array(
"dbsnp151revrsid" => isset($row[0]) ? $row[0] : '',
"dbsnp151freqa" => isset($row[1]) ? (float)$row[1] : 0.0,
"dbsnp151freqt" => isset($row[2]) ? (float)$row[2] : 0.0,
"dbsnp151freqc" => isset($row[3]) ? (float)$row[3] : 0.0,
"dbsnp151freqg" => isset($row[4]) ? (float)$row[4] : 0.0
);
$rsids[] = $rsid;
}
}
// store in memory so we don't have to load again
$this->_dbsnp_151_37_reverse = $rsids;
}
return $this->_dbsnp_151_37_reverse;
}
/**
* Get the filenames of the OpenSNP datadump files.
*
* @return array The filenames of the OpenSNP datadump files.
*/
public function getOpensnpDatadumpFilenames(): array
{
// If the OpenSNP datadump filenames have not been loaded yet, load them from the path.
if (!$this->_opensnp_datadump_filenames) {
$this->_opensnp_datadump_filenames = $this->_getOpenSNPDatadumpFilenames(
$this->get_path_opensnp_datadump()
);
}
// Return the OpenSNP datadump filenames.
return $this->_opensnp_datadump_filenames;
}
/**
* Write data to a gzip file.
*
* @param string $filename The name of the gzip file to write to.
* @param string $data The data to write to the gzip file.
*/
function writeDataToGzip(string $filename, string $data)
{
// Open the gzip file for writing.
$fGzip = gzopen($filename, 'wb');
// Write the data to the gzip file.
gzwrite($fGzip, $data);
// Close the gzip file.
gzclose($fGzip);
}
/**
* Load assembly mapping data from a tar file.
*
* @param string $filename The name of the tar file to load the assembly mapping data from.
* @return array The assembly mapping data.
*/
public static function loadAssemblyMappingData(string $filename): array
{
// Initialize an empty array to store the assembly mapping data.
$assembly_mapping_data = [];
// Create a new PharData object from the tar file.
$tar = new PharData($filename);
// Iterate over each file in the tar file.
foreach ($tar as $tarinfo) {
$member_name = $tarinfo->getFilename();
// If the file is a JSON file, load its contents into an array and add it to the assembly mapping data.
if (str_contains($member_name, ".json")) {
$tarfile = file_get_contents($tarinfo->getPathname());
$tar_bytes = $tarfile;
$assembly_mapping_data[explode(".", $member_name)[0]] = json_decode($tar_bytes, true);
}
}
// Return the assembly mapping data.
return $assembly_mapping_data;


Step 2: ⌨️ Coding

  • Create src/Snps/ReferenceSequenceManager.php βœ“ 822b8b7 Edit
Create src/Snps/ReferenceSequenceManager.php with contents:
β€’ Create a new class `ReferenceSequenceManager` in `ReferenceSequenceManager.php` to handle operations related to reference sequences. This includes methods for retrieving reference sequences (`getReferenceSequences`), checking availability (`referenceChromsAvailable`), and creating reference sequences (`createReferenceSequences`).
β€’ Move the relevant methods and attributes from `SNPsResources.php` to `ReferenceSequenceManager.php`. Adjust the methods to work within the new class context.
β€’ Add a constructor to initialize any necessary attributes.
β€’ Import necessary classes and interfaces, such as `League\Csv\Reader` and `League\Csv\Statement`, if they are used within the moved methods.
  • Running GitHub Actions for src/Snps/ReferenceSequenceManager.php βœ“ Edit
Check src/Snps/ReferenceSequenceManager.php with contents:

Ran GitHub Actions for 822b8b7470ef8cc5d358b11871625447abb2f57b:

  • Create src/Snps/AssemblyMappingManager.php βœ“ 129c643 Edit
Create src/Snps/AssemblyMappingManager.php with contents:
β€’ Create a new class `AssemblyMappingManager` in `AssemblyMappingManager.php` to manage assembly mapping data. This includes the method `getAssemblyMappingData` and the static method `loadAssemblyMappingData`.
β€’ Move the relevant methods from `SNPsResources.php` to `AssemblyMappingManager.php`. Ensure that the methods are properly adjusted to fit the new class structure.
β€’ Add necessary imports for handling file operations and JSON data parsing.
  • Running GitHub Actions for src/Snps/AssemblyMappingManager.php βœ“ Edit
Check src/Snps/AssemblyMappingManager.php with contents:

Ran GitHub Actions for 129c64374d4a72f0d6da17eaee30458db55a9871:

  • Create src/Snps/DatasetDownloader.php βœ“ 6f94880 Edit
Create src/Snps/DatasetDownloader.php with contents:
β€’ Create a new class `DatasetDownloader` in `DatasetDownloader.php` to encapsulate the functionality for downloading example datasets and other resources (`download_example_datasets`, `getAllResources`, `getGsaResources`, `get_chip_clusters`, `getLowQualitySNPs`, `get_dbsnp_151_37_reverse`, `getOpensnpDatadumpFilenames`).
β€’ Move the relevant methods from `SNPsResources.php` to `DatasetDownloader.php`. Make sure to adjust any references to other methods or attributes that were also moved to other classes.
β€’ Include imports for HTTP client operations and file handling utilities as needed.
  • Running GitHub Actions for src/Snps/DatasetDownloader.php βœ“ Edit
Check src/Snps/DatasetDownloader.php with contents:

Ran GitHub Actions for 6f94880c4cba4b79b97d51ad1978edd0cfb43fd1:

  • Modify src/Snps/SNPsResources.php ! No changes made Edit
Modify src/Snps/SNPsResources.php with contents:
β€’ Remove the methods and attributes that have been moved to `ReferenceSequenceManager`, `AssemblyMappingManager`, and `DatasetDownloader`.
β€’ Adjust the remaining code in `SNPsResources.php` to utilize the new classes. This includes creating instances of the new classes and calling their methods instead of the methods that were previously within `SNPsResources`.
β€’ Ensure that all necessary imports for the new classes are added to the top of the file.
β€’ Refactor any remaining methods in `SNPsResources` to improve efficiency and readability, if applicable.
  • Running GitHub Actions for src/Snps/SNPsResources.php βœ— Edit
Check src/Snps/SNPsResources.php with contents:

Step 3: πŸ” Code Review

I have finished reviewing the code for completeness. I did not find errors for sweep/improve_modularization_of_the_project_an.


πŸŽ‰ Latest improvements to Sweep:
  • New dashboard launched for real-time tracking of Sweep issues, covering all stages from search to coding.
  • Integration of OpenAI's latest Assistant API for more efficient and reliable code planning and editing, improving speed by 3x.
  • Use the GitHub issues extension for creating Sweep issues directly from your editor.

πŸ’‘ To recreate the pull request edit the issue title or description. To tweak the pull request, leave a comment on the pull request.Something wrong? Let us know.

This is an automated message generated by Sweep AI.

from php-dna.

Related Issues (20)

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.