Giter VIP home page Giter VIP logo

eye-js's People

Contributors

dependabot[bot] avatar github-actions[bot] avatar jeswr avatar josd avatar phochste avatar smessie avatar woutslabbinck 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

Watchers

 avatar  avatar  avatar

eye-js's Issues

Fix memory issues in firefox

Have been told there are still memory leaks in firefox. This is an issue to investigate.

Please supply details / repros here if you've experienced this issue.

log:collectAllIn error

Apparently, log:collectAllIn works only when the scope is the current document. The following example:

@prefix log: <http://www.w3.org/2000/10/swap/log#> .
@prefix : <http://example.org/> .

{ 
  (?x { ?x a :Test } ?xs) log:collectAllIn { :x a :Test } 
} 
=> 
{
  ?xs a :Result
}.

gives the error:

Error: Error while executing query: Foreign predicate shell/2 did not clear exception: error(system_error,context(shell/2,Function not implemented))
** ERROR ** eam ** error(existence_error(source_sink,/tmp/swipl_eye_42_4),context(system:open/4,No such file or directory))

The native eye returns (:x) a :Result.

Rule chaining not working when data and rules graphs are separated

When passing data graph and query graph as two arguments, rule chaining doe not work. The example from n3 spec works fine but when passed to the reasoner as two arguments, only the first rule produces derivations. The same when inputs are RDF/JS quads

const { n3reasoner } = require('eyereasoner')

await n3reasoner(`
    @prefix foaf: <http://xmlns.com/foaf/0.1/> .
    @prefix : <http://example.org/#>.

    :spiderman a :WebSlinger .
    :44th :traffic :heavy .
`, `
    @prefix foaf: <http://xmlns.com/foaf/0.1/> .
    @prefix : <http://example.org/#>.

    { ?slinger a :WebSlinger } => { ?slinger :locomotion :flying } .

    { ?heli a :Helicopter } => { ?heli :locomotion :flying  } .

    { ?flyer :locomotion :flying . ?street :traffic :heavy } 
      =>  { ?street :suitable-observer ?flyer } . 
`)

https://runkit.com/embed/nqr3titrn3qk

Using --strings flag?

I tried the following as per the README (great job btw :-) to pass any flag to eye-js:
https://notation3.org/eyejs/test-strings.html

But the "--strings" flag does not seem to work. As a sanity check I also tried with "--pass-only-new" which outputs the expected inferences. Also checked the N3 code with the command-line eye (using strings flag) and it works there.

flaky workflows

Since 0375315 our workflows have become quite flakey because one of the GitHub urls we are requesting seems to be 404ing at a high rate. If this keeps happening we may need to change the method we use to retrieve the eye.pl asset.

possible serialization issue

the following rule works fine in the browser but gives no result using node.

@prefix : <http://ex.org/> .
@prefix log: <http://www.w3.org/2000/10/swap/log#> .

:a :b :c, :d .

{
    (?x
     {:a :b ?x }
     ?list) log:collectAllIn _:x .
}
=>
{
  :result :is ?list
} .

Apparently, its serialization in the temporary file is missing {:a :b ?x }

<http://ex.org/a> <http://ex.org/b> <http://ex.org/c> . 
<http://ex.org/a> <http://ex.org/b> <http://ex.org/d> . 

{
 _:n3-1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> ?x . 
 _:n3-1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:n3-3 . 
 _:n3-1 <http://www.w3.org/2000/10/swap/log#collectAllIn> _:n3-0.x . 
 _:n3-3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> ?list . 
 _:n3-3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . 
 } => {<http://ex.org/result> <http://ex.org/is> ?list . } . 

Listening for errors

How can one catch errors thrown by eye-js? It seems they are directly logged using console.warn but I'd like to show them to the user.

eyereasoner.n3reasoner(
    "abc",
    undefined,
    { output: 'derivations' }
)
.then((success) => console.log(success))
.catch((error) => console.log(error)); // not catching anything

Investigate: Silent failure on large N3 files

Discovered by @josd

On the extended deep taxonomy benchmark with --turtle we get

$ time eye --quiet --nope test-facts.ttl test-dl.ttl test-rules.n3 --query test-query.n3
@prefix : <http://eulersharp.sourceforge.net/2009/12dtb/test#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.

:i100000 a :N100000.


real    0m14.959s
user    0m16.278s
sys     0m0.431s

With eye-js this doesn't produce the answer after running 10 times longer:

$ time eyereasoner --quiet --nope test-facts.ttl test-dl.ttl test-rules.n3 --query test-query.n3
@prefix : <http://eulersharp.sourceforge.net/2009/12dtb/test#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.



real    0m51.283s
user    0m51.695s
sys     0m0.211s

Investigate missing results

See this failed job https://github.com/eyereasoner/eye-js/actions/runs/6789188761/job/18455853680?pr=703 on a branch that doesn't modfiy anything but workflow configs.

In particular the result is

Run npm test

> [email protected] test
> npm run test:unit && npm run test:memory

npm WARN cli npm v10.2.3 does not support Node.js v16.20.2. This version of npm supports the following node versions: `^18.17.0 || >=20.5.0`. You can find the latest version at [https://nodejs.org/.](https://nodejs.org/)

> [email protected] test:unit
> npm run bundle:webpack && jest

npm WARN cli npm v10.2.3 does not support Node.js v16.20.2. This version of npm supports the following node versions: `^18.17.0 || >=20.5.0`. You can find the latest version at [https://nodejs.org/.](https://nodejs.org/)

> [email protected] bundle:webpack
> webpack --config webpack.config.js

asset index.js 3.35 MiB [emitted] [minimized] [big] (name: main) 1 related asset
orphan modules 120 KiB [orphan] 9 modules
runtime modules 1.25 KiB 6 modules
modules by path ./node_modules/ 3.16 MiB
  modules by path ./node_modules/readable-stream/lib/ 191 KiB 24 modules
  modules by path ./node_modules/swipl-wasm/dist/ 2.77 MiB 2 modules
  + 10 modules
modules by path ./dist/*.js 474 KiB
  ./dist/index.js 1.17 KiB [built] [code generated]
  ./dist/query.js 741 bytes [built] [code generated]
  ./dist/transformers.js 4.11 KiB [built] [code generated]
  + 2 modules
fs (ignored) 15 bytes [built] [code generated]
path (ignored) 15 bytes [built] [code generated]
crypto (ignored) 15 bytes [optional] [built] [code generated]

WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
This can impact web performance.
Assets: 
  index.js (3.35 MiB)

WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
Entrypoints:
  main (3.35 MiB)
      index.js


WARNING in webpack performance recommendations: 
You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.
For more info visit https://webpack.js.org/guides/code-splitting/

webpack 5.89.0 compiled with 3 warnings in 8043 ms
PASS __tests__/cli-test.ts (21.065 s)
PASS __tests__/browser-test.ts (48.916 s)
FAIL __tests__/e2e-test.ts (50.308 s)
  ● Testing browsers › should be able to call the execute function in firefox

    expect(received).resolves.toEqual(expected) // deep equality

    Expected: "@prefix : .:Socrates a :Mortal."
    Received: ""

      36 |
      37 |         await expect(page.textContent('textarea[id=data]').then((r) => r?.trim())).resolves.toEqual(data.trim());
    > 38 |         await expect(page.textContent('div[id=result]').then((r) => r?.trim())).resolves.toEqual('@prefix : .:Socrates a :Mortal.');
         |                                                                                          ^
      39 |
      40 |         await page.click('button[id=clear]');
      41 |         // Time for new result to be inserted in the DOM

      at Object.toEqual (node_modules/expect/build/index.js:174:22)
      at Object.<anonymous> (__tests__/e2e-test.ts:38:90)

PASS __tests__/node-test.ts (31.2 s)
A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks. Active timers can also cause this, ensure that .unref() was called on them.
---------------------|---------|----------|---------|---------|-------------------
File                 | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------------|---------|----------|---------|---------|-------------------
All files            |     100 |    98.21 |     100 |     100 |                   
 dist                |     100 |      100 |     100 |     100 |                   
  eye.d.ts           |       0 |        0 |       0 |       0 |                   
  eye.js             |     100 |      100 |     100 |     100 |                   
  index.d.ts         |       0 |        0 |       0 |       0 |                   
  n3Writer.temp.d.ts |       0 |        0 |       0 |       0 |                   
  n3Writer.temp.js   |     100 |      100 |     100 |     100 |                   
  query.d.ts         |       0 |        0 |       0 |       0 |                   
  query.js           |     100 |      100 |     100 |     100 |                   
  transformers.d.ts  |       0 |        0 |       0 |       0 |                   
  transformers.js    |     100 |      100 |     100 |     100 |                   
 dist/bin            |     100 |    88.88 |     100 |     100 |                   
  index.d.ts         |       0 |        0 |       0 |       0 |                   
  main.d.ts          |       0 |        0 |       0 |       0 |                   
  main.js            |     100 |    88.88 |     100 |     100 | 3                 
---------------------|---------|----------|---------|---------|-------------------

Test Suites: 1 failed, 3 passed, 4 total
Tests:       1 failed, 73 passed, 74 total
Snapshots:   0 total
Time:        61.82 s
Ran all test suites.

Might be a result of the bump in swipl-wasm?

EmscriptenModule missing

I can't seem to be able to compile Koreografeye anymore that has an eyereasoner dependency. It keeps asking for EmscriptenModule any ideas? I'm on node 16.20.0

yarn run v1.22.19
$ npm run build:ts && npm run build:components

> [email protected] build:ts
> tsc ; chmod 755 dist/*js

node_modules/eyereasoner/dist/transformers.d.ts:1:23 - error TS2688: Cannot find type definition file for 'emscripten'.

1 /// <reference types="emscripten" />
                        ~~~~~~~~~~

node_modules/eyereasoner/dist/transformers.d.ts:15:79 - error TS2304: Cannot find name 'EmscriptenModule'.

15 export declare function loadEyeImage(swipl: typeof SWIPL): (options?: Partial<EmscriptenModule> | undefined) => Promise<SWIPL.SWIPLModule>;
                                                                                 ~~~~~~~~~~~~~~~~

node_modules/eyereasoner/dist/transformers.d.ts:19:52 - error TS2304: Cannot find name 'EmscriptenModule'.

19 export declare function SwiplEye(options?: Partial<EmscriptenModule> | undefined): Promise<SWIPL.SWIPLModule>;
                                                      ~~~~~~~~~~~~~~~~

node_modules/swipl-wasm/dist/common.d.ts:1:23 - error TS2688: Cannot find type definition file for 'emscripten'.

1 /// <reference types="emscripten" />
                        ~~~~~~~~~~

node_modules/swipl-wasm/dist/common.d.ts:70:14 - error TS2304: Cannot find name 'FS'.

70   FS: typeof FS;
                ~~

node_modules/swipl-wasm/dist/common.d.ts:85:21 - error TS2304: Cannot find name 'EmscriptenModule'.

85   options?: Partial<EmscriptenModule>
                       ~~~~~~~~~~~~~~~~


Found 6 errors in 2 files.

Errors  Files
     3  node_modules/eyereasoner/dist/transformers.d.ts:1
     3  node_modules/swipl-wasm/dist/common.d.ts:1

> [email protected] build:components
> componentsjs-generator -s dist

2023-05-10T17:11:47.905Z [Components.js] info: Generating components for 1 package
✨  Done in 5.62s

Raised by @phochste

leverage `--turtle` flag

Since the --turtle flag allows files to be parsed in a time that is an order of magnitude faster, we should split our data inputs into a turtle and an n3 and use the --turtle flag for parsing in the former case.

testing

We need to add tests for the following matrixes

  • Node / Browser
  • Query over local and remote urls (i.e. testing fetch is being used correctly across environments). See #5.
  • [ ] Include separate tests for instantiation with eye.pl and eye.pvm

Fix update-eye script

Semantic release requires "BREAKING CHANGE" to be in the footer which we currently do not do

should we remove the `eye.pl` APIs entirely

In #21 I have marked all APIs that instantiate eye via eye.pl as deprecated; favoring initialization with eye.pvm. I have also updated the docs accordingly.

I would like to know if there is any value in keeping these APIs or whether we can just remove them entirely; and make this library easier to maintain.

// cc @josd

Manually update to eye v4.4.5

In this commit the format of the output was changed. This broke some of our tests which do exact string matches so we need to manually do an update and adjust these tests at the same time.

Auto merge `swipl-wasm` bumps

Should look something like

name: Enable automerge on dependabot PRs

on:
  pull_request_target:

jobs:
  automerge:
    name: Enable automerge on dependabot PRs
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
      repository-projects: write
    if: github.actor == 'dependabot[bot]' && !contains(github.head_ref, 'dependabot/npm_and_yarn/swipl-wasm-')
    steps:
      - uses: actions/checkout@v4
      - run: gh pr merge ${{ github.event.pull_request.html_url }} --auto --squash
    env:
      GH_TOKEN: ${{ github.token }}
    if: github.actor == 'dependabot[bot]' && contains(github.head_ref, 'dependabot/npm_and_yarn/swipl-wasm-')
    steps:
      - uses: actions/checkout@v4
      - run: |
          PR_TITLE="${{ github.event.pull_request.title }}"
          before=$(echo $PR_TITLE | grep -oP '(?<=from )\d+\.\d+\.\d+')
          after=$(echo $PR_TITLE | grep -oP '(?<=to )\d+\.\d+\.\d+')
          
          readarray -d . -t before <<<"${before:2:-1}"
          readarray -d . -t after <<<"${current:2:-1}"

          if   [ ! ${before[0]} == ${after[0]} ]; then
            version="BREAKING CHANGE"
            branchHead="breaking"
          elif [ ! ${before[1]} == ${after[1]} ]; then
            version="feat"
            branchHead="feat"
          elif [ ! ${before[2]} == ${after[2]} ]; then
            version="fix"
            branchHead="fix"
          fi

          PR_TITLE="${PR_TITLE//build/$version}"

      - run: gh pr merge ${{ github.event.pull_request.html_url }} --auto --squash --body "$PR_TITLE"
    env:
      GH_TOKEN: ${{ github.token }}

`npm ci` broken on node 14

Errors with

npm WARN prepare removing existing node_modules/ before installation
npm ERR! Cannot read property 'n3' of undefined

const instead of let in swipl-bundled.temp.js

Hi, thanks for making this package :)

When trying to use it, I'm getting following error

✘ [ERROR] Cannot assign to "size" because it is a constant

    ../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js:2711:20:
      2711 │                     size = -1;
           ╵                     ~~~~

  The symbol "size" was declared a constant here:

    ../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js:2707:22:
      2707 │                 const size = parseInt(r.headers.get("content-length"));
           ╵                       ~~~~

/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1566
  let error = new Error(`${text}${summary}`);
              ^

Error: Build failed with 1 error:
../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js:2711:20: ERROR: Cannot assign to "size" because it is a constant
    at failureErrorWithLog (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1566:15)
    at /Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1024:28
    at runOnEndCallbacks (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1438:61)
    at buildResponseToResult (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1022:7)
    at /Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1134:14
    at responseCallbacks.<computed> (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:671:9)
    at handleIncomingPacket (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:726:9)
    at Socket.readFromStdout (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:647:7)
    at Socket.emit (node:events:513:28)
    at addChunk (node:internal/streams/readable:324:12) {
  errors: [
    {
      detail: undefined,
      id: '',
      location: {
        column: 20,
        file: '../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js',
        length: 4,
        line: 2711,
        lineText: '                    size = -1;',
        namespace: '',
        suggestion: ''
      },
      notes: [
        {
          location: {
            column: 22,
            file: '../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js',
            length: 4,
            line: 2707,
            lineText: '                const size = parseInt(r.headers.get("content-length"));',
            namespace: '',
            suggestion: ''
          },
          text: 'The symbol "size" was declared a constant here:'
        }
      ],
      pluginName: '',
      text: 'Cannot assign to "size" because it is a constant'
    }
  ],
  warnings: []
}

Node.js v18.12.1

When I looked at that location, the error is correct, in swipl-bundled.temp.js the following code is included (formatted):

url_properties(url) {
    return fetch(url, {method: "HEAD"}).then(r => {
        if (r.status == 200) {
            const size = parseInt(r.headers.get("content-length"));
            const mods = r.headers.get("last-modified");
            const time = Date.parse(mods) || 0;
            if (!size instanceof Number) size = -1;
            return {url: r.url, status: r.status, size: size, last_modified: time / 1e3}
        } else {
            return {url: url, status: r.status}
        }
    })
}

As you can see, size is declared using a const and later on being reassigned.

I'm not sure where to report this issue, but as I'm getting this error using this package, I'm reporting it here and then we'll see where the fix should happen in the end :)

Multi-query support

Wondering whether eye-js has multi-query support, i.e., a query-answer loop (@josd had graciously re-added this to the regular eye a while back)?

I'm aware of the queryOnce method - perhaps it could be as easy as invoking a multi() method on the module? :-) (or, perhaps this is wishful thinking and I misinterpreted that method call!)

broken links and fragments in https://github.com/eyereasoner/eye-js

error Lines: 1229, 1271 https://github.com/eyereasoner/eye-js/tree/%7B%7B%20urlEncodedRefName%20%7D%7D
Status: 404 Not Found
The link is broken. Double-check that you have not made any typo, or mistake in copy-pasting. If the link points to a resource that no longer exists, you may want to remove or fix the link.

error Line: 2319 https://eyereasoner.github.io/eye-js/example/index.html
Status: 404 Not Found
The link is broken. Double-check that you have not made any typo, or mistake in copy-pasting. If the link points to a resource that no longer exists, you may want to remove or fix the link.

error Lines: 145, 585, 598, 632, 645, 670, 683, 708, 721, 859, 974, 1067, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2064, 2071, 2198, 2261, 2302, 2315, 2321, 2679, 2680 https://github.com/eyereasoner/eye-js
Status: 200 OK
Some of the links to this resource point to broken URI fragments (such as index.html#fragment).

Broken fragments:
https://github.com/eyereasoner/eye-js#usage (lines 2046, 2071)
https://github.com/eyereasoner/eye-js#license (lines 2051, 2321)
https://github.com/eyereasoner/eye-js#advanced-usage (lines 2047, 2198)
https://github.com/eyereasoner/eye-js#examples (lines 2050, 2315)
https://github.com/eyereasoner/eye-js#cli-usage (lines 2049, 2302)
https://github.com/eyereasoner/eye-js#eye-js (lines 2045, 2064)
https://github.com/eyereasoner/eye-js#selecting-the-swipl-module (lines 2048, 2261)

Feature Request: make built in log:uuid work

With eye, I can use the log:uuid build in to create a uuid string.

E.g.

@prefix : <urn:example:> .
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
@prefix string: <http://www.w3.org/2000/10/swap/string#> .

{
    # Generates UUID Y using IRI X
    #    X an iri
    #    Y a string

    :test log:uuid ?Y .
    ( "urn:uuid:" ?Y ) string:concatenation ?YT .
        ?Z log:uri ?YT .
}
=> 
{ 
    :Result :uuid ?Z .
} .

Will result in

@prefix : <urn:example:> .
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
@prefix string: <http://www.w3.org/2000/10/swap/string#>.

:Result :uuid <urn:uuid:e85be12a-ea7b-11ed-ad97-8f98520311e0>.

However, when I execute the following code with the eyereasoner, I get no uuid uri:

import { n3reasoner,SwiplEye,queryOnce  } from 'eyereasoner';

async function main() {
    const queryString = `
    @prefix : <http://example.org/socrates#>.
    @prefix log: <http://www.w3.org/2000/10/swap/log#> .
    @prefix string: <http://www.w3.org/2000/10/swap/string#> .
    {:Socrates a ?WHAT} => {:Socrates a ?WHAT}.

{
    
        :test log:uuid ?Y .
        ( "urn:uuid:" ?Y ) string:concatenation ?YT .
         ?Z log:uri ?YT .
    }
    => 
    { 
        :Result :uuid ?Z .
    } .
`;

    const dataString = `
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix : <http://example.org/socrates#>.

:Socrates a :Human.
:Human rdfs:subClassOf :Mortal.

{?A rdfs:subClassOf ?B. ?S a ?A} => {?S a ?B}.
`;

    // The result of the query (as a string)

        // Instantiate a new SWIPL module and log any results it produces to the console
        const Module = await SwiplEye({ print: (str: string) => { console.log(str) }, arguments: ['-q'] });
      
        // Load the the strings data and query as files data.n3 and query.n3 into the module
        Module.FS.writeFile('data.n3', dataString);
        Module.FS.writeFile('query.n3', queryString);
      
        // Execute main(['--nope', '--quiet', './data.n3', '--query', './query.n3']).
        queryOnce(Module, 'main', ['--nope', '--quiet', './data.n3', '--query', './query.n3']);
      
    
}
main()

So my question is, can the log:uuid built-in also be part of the wasm eye reasoner?

re-enable `surfaceRelabelling` tests

There is something going wrong in the pipeline of parsing and re-serialising the document (I would imagine that N3.js is already doing the re-labelling). b6a67f0 should be re-enabled at some point.

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.