//推論する
        public bool Predict(float[] output_data, float[] input_data)
        {
            if (ailia == IntPtr.Zero)
            {
                return(false);
            }

            //バッファの固定
            GCHandle input_buf_handle = GCHandle.Alloc(input_data, GCHandleType.Pinned);
            IntPtr   input_buf_ptr    = input_buf_handle.AddrOfPinnedObject();

            GCHandle output_buf_handle = GCHandle.Alloc(output_data, GCHandleType.Pinned);
            IntPtr   output_buf_ptr    = output_buf_handle.AddrOfPinnedObject();

            //推論
            int status = Ailia.ailiaPredict(ailia, output_buf_ptr, (uint)(output_data.Length * 4), input_buf_ptr, (uint)(input_data.Length * 4));

            //バッファの開放
            input_buf_handle.Free();
            output_buf_handle.Free();

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaPredict failed" + status);
                }
                return(false);
            }
            return(true);
        }
        public Ailia.AILIAShape GetBlobShape(string layer_name)
        {
            if (ailia == IntPtr.Zero)
            {
                return(null);
            }
            Ailia.AILIAShape shape = new Ailia.AILIAShape();
            uint             id    = 0;
            int status             = Ailia.ailiaFindBlobIndexByName(ailia, ref id, layer_name);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaFindBlobIndexByName failed" + status);
                }
                return(null);
            }
            status = Ailia.ailiaGetBlobShape(ailia, shape, id, Ailia.AILIA_SHAPE_VERSION);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaGetBlobShape failed" + status);
                }
                return(null);
            }
            return(shape);
        }
        //AndroidのRenderScriptのパス設定
        private bool SetTemporaryCachePath()
        {
#if (UNITY_ANDROID && !UNITY_EDITOR)
            using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
                using (AndroidJavaObject currentActivity = unityPlayer.GetStatic <AndroidJavaObject>("currentActivity"))
                {
                    using (AndroidJavaObject cacheDir = currentActivity.Call <AndroidJavaObject>("getCacheDir"))
                    {
                        string _CacheDir = cacheDir.Call <string>("getCanonicalPath");
                        int    status    = Ailia.ailiaSetTemporaryCachePath(_CacheDir);
                        if (status != Ailia.AILIA_STATUS_SUCCESS)
                        {
                            if (logging)
                            {
                                Debug.Log("ailiaSetTemporaryCachePath failed " + status);
                            }
                            return(false);
                        }
                    }
                }
            }
#endif
            return(true);
        }
 //開放する
 public virtual void Close()
 {
     if (ailia != IntPtr.Zero)
     {
         Ailia.ailiaDestroy(ailia);
         ailia = IntPtr.Zero;
     }
 }
        //内部データのインデックスを名前で探し取得
        public int FindBlobIndexByName(string name)
        {
            uint idx    = 0;
            int  status = Ailia.ailiaFindBlobIndexByName(ailia, ref idx, name);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("FindBlobIndexByName failed" + status);
                }
                return(-1);
            }
            return((int)idx);
        }
        //入力形式の取得
        public Ailia.AILIAShape GetInputShape()
        {
            Ailia.AILIAShape shape = new Ailia.AILIAShape();
            int status             = Ailia.ailiaGetInputShape(ailia, shape, Ailia.AILIA_SHAPE_VERSION);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaGetInputShape failed" + status);
                }
                return(null);
            }
            return(shape);
        }
        //ファイルを開く(メモリ)
        public virtual bool OpenMem(byte[] prototxt_buf, byte[] model_buf)
        {
            Close();

            if (prototxt_buf == null || model_buf == null || prototxt_buf.Length == 0 || model_buf.Length == 0)
            {
                if (logging)
                {
                    Debug.Log("input buffer is empty");
                }
                return(false);
            }

            int status = Ailia.ailiaCreate(ref ailia, env_id, Ailia.AILIA_MULTITHREAD_AUTO);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaCreate failed " + status);
                }
                return(false);
            }

            status = Ailia.ailiaOpenStreamMem(ailia, prototxt_buf, (uint)prototxt_buf.Length);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaOpenStreamMem failed " + status);
                }
                Close();
                return(false);
            }

            status = Ailia.ailiaOpenWeightMem(ailia, model_buf, (uint)model_buf.Length);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaOpenWeightMem filed " + status);
                }
                Close();
                return(false);
            }

            return(true);
        }
        //環境選択(詳細)
        public int GetEnvironmentCount()
        {
            SetTemporaryCachePath();
            int count  = 0;
            int status = Ailia.ailiaGetEnvironmentCount(ref count);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaGetEnvironmentCount failed " + status);
                }
                return(-1);
            }
            return(count);
        }
        //推論する
        public bool Update()
        {
            if (ailia == IntPtr.Zero)
            {
                return(false);
            }
            int status = Ailia.ailiaUpdate(ailia);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaUpdate failed" + status);
                }
                return(false);
            }
            return(true);
        }
        //Blobの形式を設定
        public bool SetInputBlobShape(Ailia.AILIAShape shape, int idx)
        {
            if (ailia == IntPtr.Zero || idx < 0)
            {
                return(false);
            }

            int status = Ailia.ailiaSetInputBlobShape(ailia, shape, (uint)idx, Ailia.AILIA_SHAPE_VERSION);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaSetInputBlobShape failed" + status);
                }
                return(false);
            }
            return(true);
        }
        public Ailia.AILIAEnvironment GetEnvironment(int idx)
        {
            IntPtr env_ptr = IntPtr.Zero;
            int    status  = Ailia.ailiaGetEnvironment(ref env_ptr, (uint)idx, Ailia.AILIA_ENVIRONMENT_VERSION);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaGetEnvironment failed " + status);
                }
                return(null);
            }
            Ailia.AILIAEnvironment env = (Ailia.AILIAEnvironment)Marshal.PtrToStructure(env_ptr, typeof(Ailia.AILIAEnvironment));
            if (logging)
            {
                //Debug.Log("ENV id:"+env.id+", name:"+Marshal.PtrToStringAnsi(env.name)+", type:"+env.type);
            }
            return(env);
        }
        //Blobの形状を取得
        public Ailia.AILIAShape GetBlobShape(int idx)
        {
            if (ailia == IntPtr.Zero || idx < 0)
            {
                return(null);
            }

            Ailia.AILIAShape shape = new Ailia.AILIAShape();
            int status             = Ailia.ailiaGetBlobShape(ailia, shape, (uint)idx, Ailia.AILIA_SHAPE_VERSION);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaGetBlobShape failed" + status);
                }
                return(null);
            }
            return(shape);
        }
        //ファイルを開く(コールバック)
        public virtual bool OpenEx(Ailia.ailiaFileCallback callback, IntPtr arg1, IntPtr arg2)
        {
            Close();

            int status = Ailia.ailiaCreate(ref ailia, env_id, Ailia.AILIA_MULTITHREAD_AUTO);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaCreate failed" + status);
                }
                return(false);
            }

            status = Ailia.ailiaOpenStreamEx(ailia, arg1, callback, Ailia.AILIA_FILE_CALLBACK_VERSION);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaOpenStreamFileEx failed" + status);
                }
                Close();
                return(false);
            }

            status = Ailia.ailiaOpenWeightEx(ailia, arg2, callback, Ailia.AILIA_FILE_CALLBACK_VERSION);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaOpenWeightFileEx failed" + status);
                }
                Close();
                return(false);
            }

            return(true);
        }
        //ファイルを開く(ファイル)
        public virtual bool OpenFile(string prototxt_path, string model_path)
        {
            Close();

            int status = Ailia.ailiaCreate(ref ailia, env_id, Ailia.AILIA_MULTITHREAD_AUTO);

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaCreate failed " + status);
                }
                return(false);
            }

            status = Ailia.ailiaOpenStreamFile(ailia, prototxt_path);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaOpenStreamFile failed" + status);
                }
                Close();
                return(false);
            }

            status = Ailia.ailiaOpenWeightFile(ailia, model_path);
            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaOpenWeightFile failed" + status);
                }
                Close();
                return(false);
            }

            return(true);
        }
        //Blobのデータを設定
        public bool SetInputBlobData(float[] input_data, int idx)
        {
            if (ailia == IntPtr.Zero || idx < 0)
            {
                return(false);
            }

            GCHandle input_buf_handle = GCHandle.Alloc(input_data, GCHandleType.Pinned);
            IntPtr   input_buf_ptr    = input_buf_handle.AddrOfPinnedObject();
            int      status           = Ailia.ailiaSetInputBlobData(ailia, input_buf_ptr, (uint)(input_data.Length * 4), (uint)idx);

            input_buf_handle.Free();

            if (status != Ailia.AILIA_STATUS_SUCCESS)
            {
                if (logging)
                {
                    Debug.Log("ailiaSetInputBlobData failed" + status);
                }
                return(false);
            }
            return(true);
        }