{"action":"created","comment":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/comments/241859759","pull_request_review_id":185222606,"id":241859759,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MTg1OTc1OQ==","diff_hunk":"@@ -0,0 +1,540 @@\n+//! This module implements [`TVMArgValue`] and [`TVMRetValue`] types and their conversions\n+//! to other support TVMValue.\n+//!\n+//! # Example\n+//!\n+//! ```\n+//! let a = 42i8;\n+//! let b = TVMArgValue::from(&a);\n+//! assert_eq!(b.to_int() as i8, a);\n+//! ```\n+\n+use std::ffi::{CStr, CString};\n+use std::fmt::{self, Debug, Formatter};\n+use std::marker::PhantomData;\n+use std::mem;\n+use std::ops::{Deref, DerefMut};\n+use std::os::raw::{c_char, c_void};\n+\n+use ts;\n+\n+use ty::TypeCode;\n+use Function;\n+use Module;\n+use NDArray;\n+use TVMByteArray;\n+use TVMContext;\n+use TVMDeviceType;\n+use TVMType;\n+\n+#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq)]\n+pub(crate) enum ValueKind {\n+    Int,\n+    Float,\n+    Handle,\n+    Str,\n+    Bytes,\n+    Type,\n+    Context,\n+    Return,\n+}\n+\n+/// Wrapper around underlying TVMValue.\n+#[derive(Clone)]\n+pub struct TVMValue {\n+    pub(crate) kind: ValueKind,\n+    pub(crate) inner: ts::TVMValue,\n+}\n+\n+impl TVMValue {\n+    pub(crate) fn new(kind: ValueKind, inner: ts::TVMValue) -> Self {\n+        TVMValue { kind, inner }\n+    }\n+\n+    pub fn to_int(&self) -> i64 {\n+        unsafe { self.inner.v_int64 }\n+    }\n+}\n+\n+macro_rules! impl_prim_val {\n+    ($type:ty, $kind:expr, $field:ident, $cast:ty) => {\n+        impl<'a> From<&'a $type> for TVMValue {\n+            fn from(arg: &$type) -> Self {\n+                let inner = ts::TVMValue {\n+                    $field: *arg as $cast,\n+                };\n+                Self::new($kind, inner)\n+            }\n+        }\n+\n+        impl<'a> From<&'a mut $type> for TVMValue {\n+            fn from(arg: &mut $type) -> Self {\n+                let inner = ts::TVMValue {\n+                    $field: *arg as $cast,\n+                };\n+                Self::new($kind, inner)\n+            }\n+        }\n+    };\n+}\n+\n+impl_prim_val!(usize, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(i64, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(i32, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(i16, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(i8, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(u64, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(u32, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(u16, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(u8, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(bool, ValueKind::Int, v_int64, i64);\n+impl_prim_val!(f64, ValueKind::Float, v_float64, f64);\n+impl_prim_val!(f32, ValueKind::Float, v_float64, f64);\n+\n+impl<'a> From<&'a [u8]> for TVMValue {\n+    fn from(arg: &[u8]) -> TVMValue {\n+        let len = arg.len();\n+        let arg = CString::new(arg).unwrap();\n+        let arr = ts::TVMByteArray {\n+            data: arg.as_ptr() as *mut c_char,\n+            size: len,\n+        };\n+        let inner = ts::TVMValue {\n+            v_handle: &arr as *const _ as *mut c_void,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut [u8]> for TVMValue {\n+    fn from(arg: &mut [u8]) -> TVMValue {\n+        let len = arg.len();\n+        let arg = CString::new(arg).unwrap();\n+        let arr = ts::TVMByteArray {\n+            data: arg.as_ptr() as *mut c_char,\n+            size: len as usize,\n+        };\n+        let inner = ts::TVMValue {\n+            v_handle: &arg as *const _ as *mut c_void,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a str> for TVMValue {\n+    fn from(arg: &str) -> TVMValue {\n+        let arg = CString::new(arg).unwrap();\n+        let inner = ts::TVMValue {\n+            v_str: arg.as_ptr() as *const c_char,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Str, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a String> for TVMValue {\n+    fn from(arg: &String) -> TVMValue {\n+        let arg = CString::new(arg.as_bytes()).unwrap();\n+        let inner = ts::TVMValue {\n+            v_str: arg.as_ptr() as *const c_char,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Str, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut String> for TVMValue {\n+    fn from(arg: &mut String) -> TVMValue {\n+        let arg = CString::new(arg.as_bytes()).unwrap();\n+        let inner = ts::TVMValue {\n+            v_str: arg.as_ptr() as *const c_char,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Str, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a CString> for TVMValue {\n+    fn from(arg: &CString) -> TVMValue {\n+        let arg = arg.clone();\n+        let inner = ts::TVMValue {\n+            v_str: arg.as_ptr() as *const c_char,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Str, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut CString> for TVMValue {\n+    fn from(arg: &mut CString) -> TVMValue {\n+        let inner = ts::TVMValue {\n+            v_str: arg.as_ptr() as *const c_char,\n+        };\n+        Self::new(ValueKind::Str, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a CStr> for TVMValue {\n+    fn from(arg: &CStr) -> TVMValue {\n+        let arg = arg.clone();\n+        let inner = ts::TVMValue {\n+            v_str: arg.as_ptr() as *const c_char,\n+        };\n+        mem::forget(arg);\n+        Self::new(ValueKind::Str, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a Module> for TVMValue {\n+    fn from(arg: &Module) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: arg.handle as *mut _ as *mut c_void,\n+        };\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut Module> for TVMValue {\n+    fn from(arg: &mut Module) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: arg.handle as *mut _ as *mut c_void,\n+        };\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a Function> for TVMValue {\n+    fn from(arg: &Function) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: arg as *const _ as *mut c_void,\n+        };\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut Function> for TVMValue {\n+    fn from(arg: &mut Function) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: arg as *mut _ as *mut c_void,\n+        };\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a NDArray> for TVMValue {\n+    fn from(arr: &NDArray) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: arr.handle as *const _ as *mut ts::TVMArray as *mut c_void,\n+        };\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut NDArray> for TVMValue {\n+    fn from(arr: &mut NDArray) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: arr.handle as *mut _ as *mut c_void,\n+        };\n+        Self::new(ValueKind::Handle, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a TVMType> for TVMValue {\n+    fn from(ty: &TVMType) -> Self {\n+        let inner = ts::TVMValue { v_type: ty.inner };\n+        Self::new(ValueKind::Type, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut TVMType> for TVMValue {\n+    fn from(ty: &mut TVMType) -> Self {\n+        let inner = ts::TVMValue { v_type: ty.inner };\n+        Self::new(ValueKind::Type, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a TVMContext> for TVMValue {\n+    fn from(ctx: &TVMContext) -> Self {\n+        let inner = ts::TVMValue {\n+            v_ctx: ctx.clone().into(),\n+        };\n+        Self::new(ValueKind::Context, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut TVMContext> for TVMValue {\n+    fn from(ctx: &mut TVMContext) -> Self {\n+        let inner = ts::TVMValue {\n+            v_ctx: ctx.clone().into(),\n+        };\n+        Self::new(ValueKind::Context, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a TVMDeviceType> for TVMValue {\n+    fn from(dev: &TVMDeviceType) -> Self {\n+        let inner = ts::TVMValue {\n+            v_int64: dev.0 as i64,\n+        };\n+        Self::new(ValueKind::Int, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut TVMDeviceType> for TVMValue {\n+    fn from(dev: &mut TVMDeviceType) -> Self {\n+        let inner = ts::TVMValue {\n+            v_int64: dev.0 as i64,\n+        };\n+        Self::new(ValueKind::Int, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a TVMByteArray> for TVMValue {\n+    fn from(barr: &TVMByteArray) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: &barr.inner as *const ts::TVMByteArray as *mut c_void,\n+        };\n+        Self::new(ValueKind::Bytes, inner)\n+    }\n+}\n+\n+impl<'a> From<&'a mut TVMByteArray> for TVMValue {\n+    fn from(barr: &mut TVMByteArray) -> Self {\n+        let inner = ts::TVMValue {\n+            v_handle: &barr.inner as *const ts::TVMByteArray as *mut c_void,\n+        };\n+        Self::new(ValueKind::Bytes, inner)\n+    }\n+}\n+\n+impl Debug for TVMValue {\n+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {\n+        unsafe {\n+            write!(\n+                f,\n+                \"TVMValue: [v_int64: {:?}], [v_float64: {:?}], [v_handle: {:?}],\\\n+                 [v_str: {:?}]\",\n+                self.inner.v_int64, self.inner.v_float64, self.inner.v_handle, self.inner.v_str\n+            )\n+        }\n+    }\n+}\n+\n+impl Deref for TVMValue {\n+    type Target = ts::TVMValue;\n+    fn deref(&self) -> &Self::Target {\n+        &self.inner\n+    }\n+}\n+\n+impl DerefMut for TVMValue {\n+    fn deref_mut(&mut self) -> &mut Self::Target {\n+        &mut self.inner\n+    }\n+}\n+\n+/// This type is needed for passing supported values as arguments to\n+/// a [`function::Builder`]. Checkout the methods and from conversions.\n+///\n+/// ## Example\n+///\n+/// ```\n+/// let ctx = TVMContext::gpu(0);\n+/// let arg = TVMArgValue::from(&ctx);\n+/// assert_eq!(arg.to_ctx(), ctx);\n+/// ```\n+///\n+/// [`function::Builder`]:../function/struct.Builder.html\n+#[derive(Debug, Clone)]\n+pub struct TVMArgValue<'a> {\n+    pub value: TVMValue,\n+    pub type_code: TypeCode,\n+    _lifetime: PhantomData<&'a ()>,\n+}\n+\n+impl<'a> TVMArgValue<'a> {","path":"rust/frontend/src/value.rs","position":357,"original_position":357,"commit_id":"f38114afcf22351cdacbf866ce45a805a3ec3b03","original_commit_id":"f38114afcf22351cdacbf866ce45a805a3ec3b03","user":{"login":"nhynes","id":2353785,"node_id":"MDQ6VXNlcjIzNTM3ODU=","avatar_url":"https://avatars2.githubusercontent.com/u/2353785?v=4","gravatar_id":"","url":"https://api.github.com/users/nhynes","html_url":"https://github.com/nhynes","followers_url":"https://api.github.com/users/nhynes/followers","following_url":"https://api.github.com/users/nhynes/following{/other_user}","gists_url":"https://api.github.com/users/nhynes/gists{/gist_id}","starred_url":"https://api.github.com/users/nhynes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nhynes/subscriptions","organizations_url":"https://api.github.com/users/nhynes/orgs","repos_url":"https://api.github.com/users/nhynes/repos","events_url":"https://api.github.com/users/nhynes/events{/privacy}","received_events_url":"https://api.github.com/users/nhynes/received_events","type":"User","site_admin":false},"body":"I suggest making a `common` crate and use the [runtime implementation of `TVMArgValue`](https://github.com/dmlc/tvm/blob/master/rust/src/runtime/packed_func.rs#L31)","created_at":"2018-12-14T19:11:15Z","updated_at":"2018-12-14T19:15:07Z","html_url":"https://github.com/dmlc/tvm/pull/2292#discussion_r241859759","pull_request_url":"https://api.github.com/repos/dmlc/tvm/pulls/2292","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments/241859759"},"html":{"href":"https://github.com/dmlc/tvm/pull/2292#discussion_r241859759"},"pull_request":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/2292"}}},"pull_request":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/2292","id":238792250,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM4NzkyMjUw","html_url":"https://github.com/dmlc/tvm/pull/2292","diff_url":"https://github.com/dmlc/tvm/pull/2292.diff","patch_url":"https://github.com/dmlc/tvm/pull/2292.patch","issue_url":"https://api.github.com/repos/dmlc/tvm/issues/2292","number":2292,"state":"open","locked":false,"title":"[RUST][FRONTEND] Add rust frontend v0.1","user":{"login":"ehsanmok","id":6980212,"node_id":"MDQ6VXNlcjY5ODAyMTI=","avatar_url":"https://avatars2.githubusercontent.com/u/6980212?v=4","gravatar_id":"","url":"https://api.github.com/users/ehsanmok","html_url":"https://github.com/ehsanmok","followers_url":"https://api.github.com/users/ehsanmok/followers","following_url":"https://api.github.com/users/ehsanmok/following{/other_user}","gists_url":"https://api.github.com/users/ehsanmok/gists{/gist_id}","starred_url":"https://api.github.com/users/ehsanmok/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehsanmok/subscriptions","organizations_url":"https://api.github.com/users/ehsanmok/orgs","repos_url":"https://api.github.com/users/ehsanmok/repos","events_url":"https://api.github.com/users/ehsanmok/events{/privacy}","received_events_url":"https://api.github.com/users/ehsanmok/received_events","type":"User","site_admin":false},"body":"Finally after almost 6 months of work, I'm delighted to submit this PR which adds Rust runtime frontend support as part of [RFC 1601](https://github.com/dmlc/tvm/issues/1601).\r\n\r\nYou can see the dev [here](https://github.com/ehsanmok/tvm-rust).","created_at":"2018-12-14T17:32:54Z","updated_at":"2018-12-14T19:15:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e0f206c3badca1ea313089329c34448dc265da9f","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/dmlc/tvm/pulls/2292/commits","review_comments_url":"https://api.github.com/repos/dmlc/tvm/pulls/2292/comments","review_comment_url":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dmlc/tvm/issues/2292/comments","statuses_url":"https://api.github.com/repos/dmlc/tvm/statuses/f38114afcf22351cdacbf866ce45a805a3ec3b03","head":{"label":"ehsanmok:rust_frontend","ref":"rust_frontend","sha":"f38114afcf22351cdacbf866ce45a805a3ec3b03","user":{"login":"ehsanmok","id":6980212,"node_id":"MDQ6VXNlcjY5ODAyMTI=","avatar_url":"https://avatars2.githubusercontent.com/u/6980212?v=4","gravatar_id":"","url":"https://api.github.com/users/ehsanmok","html_url":"https://github.com/ehsanmok","followers_url":"https://api.github.com/users/ehsanmok/followers","following_url":"https://api.github.com/users/ehsanmok/following{/other_user}","gists_url":"https://api.github.com/users/ehsanmok/gists{/gist_id}","starred_url":"https://api.github.com/users/ehsanmok/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehsanmok/subscriptions","organizations_url":"https://api.github.com/users/ehsanmok/orgs","repos_url":"https://api.github.com/users/ehsanmok/repos","events_url":"https://api.github.com/users/ehsanmok/events{/privacy}","received_events_url":"https://api.github.com/users/ehsanmok/received_events","type":"User","site_admin":false},"repo":{"id":161713865,"node_id":"MDEwOlJlcG9zaXRvcnkxNjE3MTM4NjU=","name":"tvm","full_name":"ehsanmok/tvm","private":false,"owner":{"login":"ehsanmok","id":6980212,"node_id":"MDQ6VXNlcjY5ODAyMTI=","avatar_url":"https://avatars2.githubusercontent.com/u/6980212?v=4","gravatar_id":"","url":"https://api.github.com/users/ehsanmok","html_url":"https://github.com/ehsanmok","followers_url":"https://api.github.com/users/ehsanmok/followers","following_url":"https://api.github.com/users/ehsanmok/following{/other_user}","gists_url":"https://api.github.com/users/ehsanmok/gists{/gist_id}","starred_url":"https://api.github.com/users/ehsanmok/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehsanmok/subscriptions","organizations_url":"https://api.github.com/users/ehsanmok/orgs","repos_url":"https://api.github.com/users/ehsanmok/repos","events_url":"https://api.github.com/users/ehsanmok/events{/privacy}","received_events_url":"https://api.github.com/users/ehsanmok/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ehsanmok/tvm","description":"Open deep learning compiler stack for cpu, gpu and specialized accelerators","fork":true,"url":"https://api.github.com/repos/ehsanmok/tvm","forks_url":"https://api.github.com/repos/ehsanmok/tvm/forks","keys_url":"https://api.github.com/repos/ehsanmok/tvm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ehsanmok/tvm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ehsanmok/tvm/teams","hooks_url":"https://api.github.com/repos/ehsanmok/tvm/hooks","issue_events_url":"https://api.github.com/repos/ehsanmok/tvm/issues/events{/number}","events_url":"https://api.github.com/repos/ehsanmok/tvm/events","assignees_url":"https://api.github.com/repos/ehsanmok/tvm/assignees{/user}","branches_url":"https://api.github.com/repos/ehsanmok/tvm/branches{/branch}","tags_url":"https://api.github.com/repos/ehsanmok/tvm/tags","blobs_url":"https://api.github.com/repos/ehsanmok/tvm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ehsanmok/tvm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ehsanmok/tvm/git/refs{/sha}","trees_url":"https://api.github.com/repos/ehsanmok/tvm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ehsanmok/tvm/statuses/{sha}","languages_url":"https://api.github.com/repos/ehsanmok/tvm/languages","stargazers_url":"https://api.github.com/repos/ehsanmok/tvm/stargazers","contributors_url":"https://api.github.com/repos/ehsanmok/tvm/contributors","subscribers_url":"https://api.github.com/repos/ehsanmok/tvm/subscribers","subscription_url":"https://api.github.com/repos/ehsanmok/tvm/subscription","commits_url":"https://api.github.com/repos/ehsanmok/tvm/commits{/sha}","git_commits_url":"https://api.github.com/repos/ehsanmok/tvm/git/commits{/sha}","comments_url":"https://api.github.com/repos/ehsanmok/tvm/comments{/number}","issue_comment_url":"https://api.github.com/repos/ehsanmok/tvm/issues/comments{/number}","contents_url":"https://api.github.com/repos/ehsanmok/tvm/contents/{+path}","compare_url":"https://api.github.com/repos/ehsanmok/tvm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ehsanmok/tvm/merges","archive_url":"https://api.github.com/repos/ehsanmok/tvm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ehsanmok/tvm/downloads","issues_url":"https://api.github.com/repos/ehsanmok/tvm/issues{/number}","pulls_url":"https://api.github.com/repos/ehsanmok/tvm/pulls{/number}","milestones_url":"https://api.github.com/repos/ehsanmok/tvm/milestones{/number}","notifications_url":"https://api.github.com/repos/ehsanmok/tvm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ehsanmok/tvm/labels{/name}","releases_url":"https://api.github.com/repos/ehsanmok/tvm/releases{/id}","deployments_url":"https://api.github.com/repos/ehsanmok/tvm/deployments","created_at":"2018-12-14T01:11:18Z","updated_at":"2018-12-14T01:11:24Z","pushed_at":"2018-12-14T19:08:23Z","git_url":"git://github.com/ehsanmok/tvm.git","ssh_url":"git@github.com:ehsanmok/tvm.git","clone_url":"https://github.com/ehsanmok/tvm.git","svn_url":"https://github.com/ehsanmok/tvm","homepage":"https://tvm.ai","size":9187,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dmlc:master","ref":"master","sha":"43433fa10921e778137663a08b0dbb418adbcc99","user":{"login":"dmlc","id":11508361,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTA4MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/11508361?v=4","gravatar_id":"","url":"https://api.github.com/users/dmlc","html_url":"https://github.com/dmlc","followers_url":"https://api.github.com/users/dmlc/followers","following_url":"https://api.github.com/users/dmlc/following{/other_user}","gists_url":"https://api.github.com/users/dmlc/gists{/gist_id}","starred_url":"https://api.github.com/users/dmlc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmlc/subscriptions","organizations_url":"https://api.github.com/users/dmlc/orgs","repos_url":"https://api.github.com/users/dmlc/repos","events_url":"https://api.github.com/users/dmlc/events{/privacy}","received_events_url":"https://api.github.com/users/dmlc/received_events","type":"Organization","site_admin":false},"repo":{"id":70746484,"node_id":"MDEwOlJlcG9zaXRvcnk3MDc0NjQ4NA==","name":"tvm","full_name":"dmlc/tvm","private":false,"owner":{"login":"dmlc","id":11508361,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTA4MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/11508361?v=4","gravatar_id":"","url":"https://api.github.com/users/dmlc","html_url":"https://github.com/dmlc","followers_url":"https://api.github.com/users/dmlc/followers","following_url":"https://api.github.com/users/dmlc/following{/other_user}","gists_url":"https://api.github.com/users/dmlc/gists{/gist_id}","starred_url":"https://api.github.com/users/dmlc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmlc/subscriptions","organizations_url":"https://api.github.com/users/dmlc/orgs","repos_url":"https://api.github.com/users/dmlc/repos","events_url":"https://api.github.com/users/dmlc/events{/privacy}","received_events_url":"https://api.github.com/users/dmlc/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/dmlc/tvm","description":"Open deep learning compiler stack for cpu, gpu and specialized accelerators","fork":false,"url":"https://api.github.com/repos/dmlc/tvm","forks_url":"https://api.github.com/repos/dmlc/tvm/forks","keys_url":"https://api.github.com/repos/dmlc/tvm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dmlc/tvm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dmlc/tvm/teams","hooks_url":"https://api.github.com/repos/dmlc/tvm/hooks","issue_events_url":"https://api.github.com/repos/dmlc/tvm/issues/events{/number}","events_url":"https://api.github.com/repos/dmlc/tvm/events","assignees_url":"https://api.github.com/repos/dmlc/tvm/assignees{/user}","branches_url":"https://api.github.com/repos/dmlc/tvm/branches{/branch}","tags_url":"https://api.github.com/repos/dmlc/tvm/tags","blobs_url":"https://api.github.com/repos/dmlc/tvm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dmlc/tvm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dmlc/tvm/git/refs{/sha}","trees_url":"https://api.github.com/repos/dmlc/tvm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dmlc/tvm/statuses/{sha}","languages_url":"https://api.github.com/repos/dmlc/tvm/languages","stargazers_url":"https://api.github.com/repos/dmlc/tvm/stargazers","contributors_url":"https://api.github.com/repos/dmlc/tvm/contributors","subscribers_url":"https://api.github.com/repos/dmlc/tvm/subscribers","subscription_url":"https://api.github.com/repos/dmlc/tvm/subscription","commits_url":"https://api.github.com/repos/dmlc/tvm/commits{/sha}","git_commits_url":"https://api.github.com/repos/dmlc/tvm/git/commits{/sha}","comments_url":"https://api.github.com/repos/dmlc/tvm/comments{/number}","issue_comment_url":"https://api.github.com/repos/dmlc/tvm/issues/comments{/number}","contents_url":"https://api.github.com/repos/dmlc/tvm/contents/{+path}","compare_url":"https://api.github.com/repos/dmlc/tvm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dmlc/tvm/merges","archive_url":"https://api.github.com/repos/dmlc/tvm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dmlc/tvm/downloads","issues_url":"https://api.github.com/repos/dmlc/tvm/issues{/number}","pulls_url":"https://api.github.com/repos/dmlc/tvm/pulls{/number}","milestones_url":"https://api.github.com/repos/dmlc/tvm/milestones{/number}","notifications_url":"https://api.github.com/repos/dmlc/tvm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dmlc/tvm/labels{/name}","releases_url":"https://api.github.com/repos/dmlc/tvm/releases{/id}","deployments_url":"https://api.github.com/repos/dmlc/tvm/deployments","created_at":"2016-10-12T22:20:28Z","updated_at":"2018-12-14T18:00:58Z","pushed_at":"2018-12-14T19:14:35Z","git_url":"git://github.com/dmlc/tvm.git","ssh_url":"git@github.com:dmlc/tvm.git","clone_url":"https://github.com/dmlc/tvm.git","svn_url":"https://github.com/dmlc/tvm","homepage":"https://tvm.ai","size":9150,"stargazers_count":2495,"watchers_count":2495,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":595,"mirror_url":null,"archived":false,"open_issues_count":75,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":595,"open_issues":75,"watchers":2495,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/2292"},"html":{"href":"https://github.com/dmlc/tvm/pull/2292"},"issue":{"href":"https://api.github.com/repos/dmlc/tvm/issues/2292"},"comments":{"href":"https://api.github.com/repos/dmlc/tvm/issues/2292/comments"},"review_comments":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/2292/comments"},"review_comment":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/2292/commits"},"statuses":{"href":"https://api.github.com/repos/dmlc/tvm/statuses/f38114afcf22351cdacbf866ce45a805a3ec3b03"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"nhynes"}}