Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/torch/distro.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSoumith Chintala <soumith@gmail.com>2016-11-13 08:25:43 +0300
committerGitHub <noreply@github.com>2016-11-13 08:25:43 +0300
commit2c4a219fe116e9015b44ecef4687f2b0f8debe16 (patch)
tree80c75443631e908a3773993d84da924a98fcc347
parent89d92a5925eac6df9dc9489d40c44451da187e5f (diff)
parentd7012d2302a4f943385716d73975d67f8eccaa41 (diff)
Merge pull request #175 from BTNC/master
Torch installation in a self-contained folder for windows with msvc
-rw-r--r--.gitignore1
-rw-r--r--README.md3
-rw-r--r--clean.bat24
-rw-r--r--install-deps.bat419
-rw-r--r--install.bat69
-rw-r--r--test.bat88
-rw-r--r--uninstall.bat31
-rw-r--r--win-files/README.md92
-rw-r--r--win-files/patch/cudnn.patch21
-rw-r--r--win-files/patch/cunn.patch85
-rw-r--r--win-files/patch/lua-cjson.patch67
-rw-r--r--win-files/patch/luaffifb.patch189
-rw-r--r--win-files/patch/torch.patch26
-rw-r--r--win-files/test/ffifb_perf_ffi.lua37
-rw-r--r--win-files/test/ffifb_perf_purelua.lua33
15 files changed, 1184 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 36940d6..ca18bb0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ build/
install/
*/*/build
extra/luafilesystem/lfs.so
+win-files/3rd/
diff --git a/README.md b/README.md
index c93bf4c..9f5d1b5 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,8 @@
Self-contained Torch installation
============
-#### Please refer to the [Torch installation guide](http://torch.ch/docs/getting-started.html#_) for details on how to make a fresh install of Torch.
+#### Please refer to the [Torch installation guide](http://torch.ch/docs/getting-started.html#_) for details on how to make a fresh install of Torch on Linux or MacOS.
+#### If on windows with msvc, please refer to this [guide](win-files/README.md) for details on installation and usage.
## Repo content
diff --git a/clean.bat b/clean.bat
new file mode 100644
index 0000000..8e67be4
--- /dev/null
+++ b/clean.bat
@@ -0,0 +1,24 @@
+@setlocal enableextensions
+@echo off
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:::: This script cleans temporary compilation file ::::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+
+set TORCH_DISTRO=%~dp0.
+
+for /d %%G in ("%TORCH_DISTRO%\win-files\3rd\wineditline-*") do rmdir /s /q "%%~G"\build
+cd %TORCH_DISTRO%\win-files\3rd\dlfcn-win32 && git clean -fdx
+
+cd %TORCH_DISTRO%\exe\lua-5.1.5 && del /q *.obj *.o *.lib *.dll *.exp *.exe
+cd %TORCH_DISTRO%\exe\lua-5.2.4 && del /q *.obj *.o *.lib *.dll *.exp *.exe
+cd %TORCH_DISTRO%\exe\lua-5.3.3 && del /q *.obj *.o *.lib *.dll *.exp *.exe
+cd %TORCH_DISTRO%\exe\luajit-2.0 && git clean -fdx
+cd %TORCH_DISTRO%\exe\luajit-2.1 && git clean -fdx
+cd %TORCH_DISTRO%\exe\luarocks && git clean -fdx
+
+cd %TORCH_DISTRO% && git submodule foreach --recursive git clean -fdx
+
+echo Cleaning is finished
+@endlocal
diff --git a/install-deps.bat b/install-deps.bat
new file mode 100644
index 0000000..244272a
--- /dev/null
+++ b/install-deps.bat
@@ -0,0 +1,419 @@
+@echo off
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:::: This script setup directories, dependencies for Torch7 ::::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+
+:::: Customizable variables ::::
+
+
+:: which lua version will be installed for Torch7, default to LUAJIT21
+:: accepted lua versions: LUAJIT21, LUAJIT20, LUA53, LUA52, LUA51
+REM set TORCH_LUA_VERSION=LUAJIT21
+
+:: where to install Torch7, default to install\ under distro\
+REM set TORCH_INSTALL_DIR=D:\Torch
+
+:: conda environment name for Torch7, default to torch-vcversion
+REM set TORCH_CONDA_ENV=mytorch7
+
+:: which blas/lapack libraries will be used, default to openblas installed by conda
+:: [1] mkl: download from https://software.intel.com/intel-mkl, install and set following two variables
+REM set INTEL_MKL_DIR=D:\\Intel\\SWTools\\compilers_and_libraries\\windows\\mkl\\
+REM set INTEL_COMPILER_DIR=D:\\Intel\\SWTools\\compilers_and_libraries\\windows\\compiler\\
+:: [2] other: set path to the blas library and path to the laback library
+:: both BLAS and LAPACK should be set even if they refer to the same library
+:: take openblas for example: download latest release from https://github.com/xianyi/OpenBLAS/releases/latest
+:: use mingw cross compiler tools in cygwin, since mingw windows native gfortrain is available in cygwin but not in msys2
+:: compilation command in cygwin: make CC=x86_64-w64-mingw32-gcc FC=x86_64-w64-mingw32-gfortran CROSS_SUFFIX=x86_64-w64-mingw32-
+:: please refer to openblas's README for detailed installation instructions
+REM set BLAS_LIBRARIES=D:\\Libraries\\lib\libopenblas.dll.a
+REM set LAPACK_LIBRARIES=D:\\Libraries\\lib\libopenblas.dll.a
+
+:: where to find cudnn library
+REM set CUDNN_PATH=D:\NVIDIA\CUDNN\v5.1\bin\cudnn64_5.dll
+
+:: whether update dependencies if already setup, default to not update
+REM set TORCH_UPDATE_DEPS=
+
+:::: End of customization ::::
+
+
+set ECHO_PREFIX=+++++++
+set TORCH_SETUP_FAIL=1
+
+:::: validate msvc version ::::
+
+if "%VisualStudioVersion%" == "" (
+ if not "%VS140COMNTOOLS%" == "" ( call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP)
+ if not "%VS120COMNTOOLS%" == "" ( call "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP)
+ if not "%VS110COMNTOOLS%" == "" ( call "%VS110COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP)
+ if not "%VS100COMNTOOLS%" == "" ( call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP)
+ if not "%VS90COMNTOOLS%" == "" ( call "%VS90COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP)
+)
+:VS_SETUP
+
+if "%VisualStudioVersion%" == "" (
+ echo %ECHO_PREFIX% Can not find environment variable VisualStudioVersion, msvc is not setup porperly
+ goto :FAIL
+)
+
+set TORCH_VS_VERSION=%VisualStudioVersion:.0=%
+
+if "%PreferredToolArchitecture%" == "x64" (
+ if "%CommandPromptType%" == "Cross" (
+ if "%Platform%" == "ARM" set TORCH_VS_PLATFORM=amd64_arm
+ if "%Platform%" == "X86" set TORCH_VS_PLATFORM=amd64_x86
+ )
+) else (
+ if "%CommandPromptType%" == "Cross" (
+ if "%Platform%" == "ARM" set TORCH_VS_PLATFORM=x86_arm
+ if "%Platform%" == "x64" set TORCH_VS_PLATFORM=x86_amd64
+ )
+ if "%CommandPromptType%" == "Native" (
+ if "%Platform%" == "X64" set TORCH_VS_PLATFORM=x64
+ )
+ if "%Platform%" == "" set TORCH_VS_PLATFORM=x86
+)
+
+if "%TORCH_VS_PLATFORM%" == "x86" set TORCH_VS_TARGET=x86
+if not "%TORCH_VS_PLATFORM%" == "%TORCH_VS_PLATFORM:_x86=%" set TORCH_VS_TARGET=x86
+if not "%TORCH_VS_PLATFORM%" == "%TORCH_VS_PLATFORM:_arm=%" set TORCH_VS_TARGET=arm
+if "%TORCH_VS_TARGET%" == "" set TORCH_VS_TARGET=x64
+
+:::: validate lua version ::::
+
+:: [TODO] currently luajit lua luarocks are installed from source. they can be changed to use luajit-rocks when
+:: luajit-rocks is ready for windows
+
+if "%TORCH_LUA_VERSION%" == "" set TORCH_LUA_VERSION=LUAJIT21
+if "%TORCH_LUA_VERSION%" == "LUAJIT21" (
+ set TORCH_LUAJIT_BRANCH=v2.1
+ set TORCH_LUA_SOURCE=luajit-2.1
+ set TORCH_LUAROCKS_LUA=5.1
+)
+if "%TORCH_LUA_VERSION%" == "LUAJIT20" (
+ set TORCH_LUAJIT_BRANCH=master
+ set TORCH_LUA_SOURCE=luajit-2.0
+ set TORCH_LUAROCKS_LUA=5.1
+)
+if "%TORCH_LUA_VERSION%" == "LUA53" (
+ set TORCH_LUA_SOURCE=lua-5.3.3
+ set TORCH_LUAROCKS_LUA=5.3
+)
+if "%TORCH_LUA_VERSION%" == "LUA52" (
+ set TORCH_LUA_SOURCE=lua-5.2.4
+ set TORCH_LUAROCKS_LUA=5.2
+)
+if "%TORCH_LUA_VERSION%" == "LUA51" (
+ set TORCH_LUA_SOURCE=lua-5.1.5
+ set TORCH_LUAROCKS_LUA=5.1
+)
+if "%TORCH_LUA_SOURCE%" == "" (
+ echo %ECHO_PREFIX% Bad lua version: %TORCH_LUA_VERSION%, only support LUAJIT21, LUAJIT20, LUA53, LUA52, LUA51
+ goto :FAIL
+)
+
+:::: Setup directories ::::
+
+set TORCH_DISTRO=%~dp0.
+if "%TORCH_INSTALL_DIR%" == "" set TORCH_INSTALL_DIR=%TORCH_DISTRO%\install
+set TORCH_INSTALL_BIN=%TORCH_INSTALL_DIR%\bin
+set TORCH_INSTALL_LIB=%TORCH_INSTALL_DIR%\lib
+set TORCH_INSTALL_INC=%TORCH_INSTALL_DIR%\include
+set TORCH_INSTALL_ROC=%TORCH_INSTALL_DIR%\luarocks
+if not exist %TORCH_INSTALL_BIN% md %TORCH_INSTALL_BIN%
+if not exist %TORCH_INSTALL_LIB% md %TORCH_INSTALL_LIB%
+if not exist %TORCH_INSTALL_INC% md %TORCH_INSTALL_INC%
+if not %TORCH_LUAJIT_BRANCH% == "" if not exist %TORCH_INSTALL_BIN%\lua\jit md %TORCH_INSTALL_BIN%\lua\jit
+if not exist %TORCH_DISTRO%\win-files\3rd md %TORCH_DISTRO%\win-files\3rd
+
+echo %ECHO_PREFIX% Torch7 will be installed under %TORCH_INSTALL_DIR% with %TORCH_LUA_SOURCE%, vs%TORCH_VS_VERSION% %TORCH_VS_PLATFORM%
+echo %ECHO_PREFIX% Bin: %TORCH_INSTALL_BIN%
+echo %ECHO_PREFIX% Lib: %TORCH_INSTALL_LIB%
+echo %ECHO_PREFIX% Inc: %TORCH_INSTALL_INC%
+
+:::: Setup dependencies ::::
+
+:: has blas/lapack?
+if not "%INTEL_MKL_DIR%" == "" if exist %INTEL_MKL_DIR% ( set "TORCH_SETUP_HAS_MKL=1" && set "TORCH_SETUP_HAS_BLAS=1" && set "TORCH_SETUP_HAS_LAPACK=1" )
+if not "%BLAS_LIBRARIES%" == "" if exist %BLAS_LIBRARIES% set TORCH_SETUP_HAS_BLAS=1
+if not "%LAPACK_LIBRARIES%" == "" if exist %LAPACK_LIBRARIES% set TORCH_SETUP_HAS_LAPACK=1
+
+:: has cuda?
+for /f "delims=" %%i in ('where nvcc') do (
+ set NVCC_CMD=%%i
+ goto :AFTER_NVCC
+)
+:AFTER_NVCC
+if not "%NVCC_CMD%" == "" set TORCH_SETUP_HAS_CUDA=1
+
+:: has conda?
+for /f "delims=" %%i in ('where conda') do (
+ set CONDA_CMD=%%i
+ goto :AFTER_CONDA
+)
+:AFTER_CONDA
+
+if "%CONDA_CMD%" == "" (
+ echo %ECHO_PREFIX% Can not find conda, some dependencies can not be resolved
+ if not "%TORCH_SETUP_HAS_BLAS%" == "1" (
+ echo %ECHO_PREFIX% Can not install torch, please either specify the blas library or install conda
+ goto :FAIL
+ )
+ goto :NO_CONDA
+)
+
+set TORCH_CONDA_INFO=%TORCH_DISTRO%\win-files\check_conda_info_for_torch.txt
+conda info > %TORCH_CONDA_INFO%
+if "%TORCH_VS_TARGET%" == "x64" set TORCH_CONDA_PLATFORM=win-64
+if "%TORCH_VS_TARGET%" == "arm" set TORCH_CONDA_PLATFORM=win-64
+if "%TORCH_VS_TARGET%" == "x86" set TORCH_CONDA_PLATFORM=win-32
+
+findstr "%TORCH_CONDA_PLATFORM%" "%TORCH_CONDA_INFO%" >nul
+if errorlevel 1 (
+ echo %ECHO_PREFIX% %TORCH_VS_TARGET% Torch7 requires %TORCH_CONDA_PLATFORM% conda, installation will continue without conda
+ goto :NO_CONDA
+)
+
+if %TORCH_VS_VERSION% GEQ 14 ( set CONDA_VS_VERSION=14&& goto :CONDA_SETUP )
+if %TORCH_VS_VERSION% GEQ 10 ( set CONDA_VS_VERSION=10&& goto :CONDA_SETUP )
+set CONDA_VS_VERSION=9
+
+:CONDA_SETUP
+
+if "%TORCH_CONDA_ENV%" == "" set TORCH_CONDA_ENV=torch-vc%CONDA_VS_VERSION%
+
+echo %ECHO_PREFIX% Createing conda environment '%TORCH_CONDA_ENV%' for Torch7 dependencies
+conda create -n %TORCH_CONDA_ENV% -c conda-forge vc=%CONDA_VS_VERSION% --yes
+
+set CONDA_DIR=%CONDA_CMD:\Scripts\conda.exe=%
+set TORCH_CONDA_LIBRARY=%CONDA_DIR%\envs\%TORCH_CONDA_ENV%\Library
+set TORCH_CONDA_LIBRARY=%TORCH_CONDA_LIBRARY:\=\\%
+set PATH=%TORCH_CONDA_LIBRARY%\bin;%PATH%;
+set NEW_PATH=%CONDA_DIR%\Scripts;%TORCH_CONDA_LIBRARY%\bin;%NEW_PATH%
+
+set TORCH_CONDA_PKGS=%TORCH_DISTRO%\win-files\check_conda_packages_for_torch.txt
+conda list -n %TORCH_CONDA_ENV% > %TORCH_CONDA_PKGS%
+
+:: has cmake?
+:: cmake should be installed before qt since its on qt5 while qtlua is on qt4
+for /f "delims=" %%i in ('where cmake') do (
+ set CMAKE_CMD=%%i
+ goto :AFTER_CMAKE
+)
+if "%CMAKE_CMD%" == "" (
+ echo %ECHO_PREFIX% Installing cmake by conda
+ conda install -n %TORCH_CONDA_ENV% -c conda-forge cmake --yes
+)
+:AFTER_CMAKE
+
+:: need openblas?
+findstr "openblas" "%TORCH_CONDA_PKGS%" >nul
+if not errorlevel 1 ( set "TORCH_SETUP_HAS_BLAS=1" && set "TORCH_SETUP_HAS_LAPACK=1" )
+
+if not "%TORCH_SETUP_HAS_BLAS%" == "1" goto :CONDA_INSTALL_OPENBLAS
+if not "%TORCH_SETUP_HAS_LAPACK%" == "1" goto :CONDA_INSTALL_OPENBLAS
+goto :AFTER_OPENBLAS
+
+:CONDA_INSTALL_OPENBLAS
+echo %ECHO_PREFIX% Installing openblas by conda, since there is no blas library specified
+if not "%TORCH_VS_TARGET%" == "x86" conda install -n %TORCH_CONDA_ENV% -c ukoethe openblas --yes || goto :Fail
+if "%TORCH_VS_TARGET%" == "x86" conda install -n %TORCH_CONDA_ENV% -c omnia openblas --yes || goto :Fail
+
+:AFTER_OPENBLAS
+if not "%TORCH_VS_TARGET%" == "x86" (
+ if "%BLAS_LIBRARIES%" == "" set BLAS_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblas.lib
+ if "%LAPACK_LIBRARIES%" == "" set LAPACK_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblas.lib
+)
+if "%TORCH_VS_TARGET%" == "x86" (
+ if "%BLAS_LIBRARIES%" == "" set BLAS_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblaspy.dll.a
+ if "%LAPACK_LIBRARIES%" == "" set LAPACK_LIBRARIES=%TORCH_CONDA_LIBRARY%\\lib\\libopenblaspy.dll.a
+)
+
+:: other dependencies
+findstr "jpeg" "%TORCH_CONDA_PKGS%" >nul
+if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% jpeg
+findstr "libpng" "%TORCH_CONDA_PKGS%" >nul
+if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% libpng
+findstr "zlib" "%TORCH_CONDA_PKGS%" >nul
+if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% zlib
+findstr "libxml2" "%TORCH_CONDA_PKGS%" >nul
+if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% libxml2
+findstr "qt" "%TORCH_CONDA_PKGS%" >nul
+if errorlevel 1 set TORCH_DEPENDENCIES=%TORCH_DEPENDENCIES% qt=4.8.7
+
+if not "%TORCH_DEPENDENCIES%" == "" (
+ echo %ECHO_PREFIX% Installing %TORCH_DEPENDENCIES% by conda for Torch7
+ conda install -n %TORCH_CONDA_ENV% -c conda-forge %TORCH_DEPENDENCIES% --yes
+)
+
+:NO_CONDA
+if exist "%TORCH_CONDA_INFO%" del /q %TORCH_CONDA_INFO%
+if exist "%TORCH_CONDA_PKGS%" del /q %TORCH_CONDA_PKGS%
+
+:::: git clone luarocks ::::
+
+echo %ECHO_PREFIX% Git clone luarocks for its tools
+cd %TORCH_DISTRO%\exe\
+if not exist luarocks\.git git clone https://github.com/keplerproject/luarocks.git luarocks
+set PATH=%TORCH_DISTRO%\exe\luarocks\win32\tools\;%PATH%;
+
+:::: install lua ::::
+
+echo %ECHO_PREFIX% Installing %TORCH_LUA_SOURCE%
+cd %TORCH_DISTRO%\exe\
+if not "%TORCH_LUAJIT_BRANCH%" == "" (
+if not exist %TORCH_LUA_SOURCE%\.git git clone -b %TORCH_LUAJIT_BRANCH% http://luajit.org/git/luajit-2.0.git %TORCH_LUA_SOURCE% || goto :Fail
+ cd %TORCH_LUA_SOURCE% && ( if "%TORCH_UPDATE_DEPS%" == "1" git pull ) & cd src
+) else (
+ wget -nc https://www.lua.org/ftp/%TORCH_LUA_SOURCE%.tar.gz --no-check-certificate || goto :Fail
+ 7z x %TORCH_LUA_SOURCE%.tar.gz -y >NUL && 7z x %TORCH_LUA_SOURCE%.tar -y >NUL && cd %TORCH_LUA_SOURCE%\src
+)
+if not "%TORCH_LUAJIT_BRANCH%"=="" (
+ call msvcbuild.bat || goto :FAIL
+ copy /y jit\* %TORCH_INSTALL_BIN%\lua\jit\
+ copy /y luajit.h %TORCH_INSTALL_INC%\luajit.h
+ set LUAJIT_CMD=%TORCH_INSTALL_DIR%\luajit.cmd
+) else (
+ del /q *.obj *.o *.lib *.dll *.exp *.exe
+ cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /MD /DLUA_BUILD_AS_DLL *.c || goto :FAIL
+ ren lua.obj lua.o || goto :FAIL
+ ren luac.obj luac.o || goto :FAIL
+ link /nologo /DLL /IMPLIB:%TORCH_LUA_VERSION%.lib /OUT:%TORCH_LUA_VERSION%.dll *.obj || goto :FAIL
+ link /nologo /OUT:lua.exe lua.o %TORCH_LUA_VERSION%.lib || goto :FAIL
+ lib /nologo /OUT:%TORCH_LUA_VERSION%-static.lib *.obj || goto :FAIL
+ link /nologo /OUT:luac.exe luac.o %TORCH_LUA_VERSION%-static.lib || goto :FAIL
+ copy /y lua.hpp %TORCH_INSTALL_INC%\lua.hpp
+ set LUA_CMD=%TORCH_INSTALL_DIR%\lua.cmd
+ set LUAC_CMD=%TORCH_INSTALL_DIR%\luac.cmd
+)
+copy /y *.exe %TORCH_INSTALL_BIN%\
+copy /y *.dll %TORCH_INSTALL_BIN%\
+copy /y *.lib %TORCH_INSTALL_LIB%\
+for %%g in (lua.h,luaconf.h,lualib.h,lauxlib.h) do copy /y %%g %TORCH_INSTALL_INC%\%%g
+
+:::: install luarocks ::::
+
+echo %ECHO_PREFIX% Installing luarocks
+cd %TORCH_DISTRO%\exe\
+if not exist luarocks\.git git clone https://github.com/keplerproject/luarocks.git luarocks
+cd luarocks && ( if "%TORCH_UPDATE_DEPS%" == "1" git pull ) & call install.bat /F /Q /P %TORCH_INSTALL_ROC% /SELFCONTAINED /FORCECONFIG /NOREG /NOADMIN /LUA %TORCH_INSTALL_DIR% || goto :FAIL
+for /f %%a in ('dir %TORCH_INSTALL_ROC%\config*.lua /b') do set LUAROCKS_CONFIG=%%a
+set LUAROCKS_CONFIG=%TORCH_INSTALL_ROC%\%LUAROCKS_CONFIG%
+echo rocks_servers = { >> %LUAROCKS_CONFIG%
+echo [[https://raw.githubusercontent.com/torch/rocks/master]], >> %LUAROCKS_CONFIG%
+echo [[https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master]] >> %LUAROCKS_CONFIG%
+echo } >> %LUAROCKS_CONFIG%
+
+set LUAROCKS_CMD=%TORCH_INSTALL_DIR%\luarocks.cmd
+
+:::: install wineditline ::::
+
+echo %ECHO_PREFIX% Installing wineditline for trepl package
+cd %TORCH_DISTRO%\win-files\3rd\
+wget -nc https://sourceforge.net/projects/mingweditline/files/latest --no-check-certificate -O wineditline.zip
+7z x wineditline.zip -y >NUL
+cd wineditline*
+cmake -E make_directory build && cd build && cmake .. -G "NMake Makefiles" -DLIB_SUFFIX="64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\ && nmake install
+
+:::: install dlfcn-win32 ::::
+
+echo %ECHO_PREFIX% Installing dlfcn-win32 for thread package
+cd %TORCH_DISTRO%\win-files\3rd\
+if not exist dlfcn-win32\.git git clone https://github.com/dlfcn-win32/dlfcn-win32.git
+cd dlfcn-win32 && ( if "%TORCH_UPDATE_DEPS%" == "1" git pull )
+cmake -E make_directory build && cd build && cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\ && nmake install
+set WIN_DLFCN_INCDIR=%TORCH_DISTRO:\=\\%\\win-files\\3rd\\dlfcn-win32\\include
+set WIN_DLFCN_LIBDIR=%TORCH_DISTRO:\=\\%\\win-files\\3rd\\dlfcn-win32\\lib
+copy /y %TORCH_DISTRO%\win-files\3rd\dlfcn-win32\bin\*.dll %TORCH_INSTALL_BIN%\
+
+:::: download graphviz ::::
+
+echo %ECHO_PREFIX% Downloading graphviz for graph package
+cd %TORCH_DISTRO%\win-files\3rd\
+wget -nc https://github.com/mahkoCosmo/GraphViz_x64/raw/master/graphviz-2.38_x64.tar.gz --no-check-certificate -O graphviz-2.38_x64.tar.gz
+7z x graphviz-2.38_x64.tar.gz -y && 7z x graphviz-2.38_x64.tar -ographviz-2.38_x64 -y >NUL
+if not exist %TORCH_INSTALL_BIN%\graphviz md %TORCH_INSTALL_BIN%\graphviz
+copy /y %TORCH_DISTRO%\win-files\3rd\graphviz-2.38_x64\bin\ %TORCH_INSTALL_BIN%\graphviz\
+
+set NEW_PATH=%NEW_PATH%;%TORCH_INSTALL_BIN%\graphviz
+
+:::: create cmd utils ::::
+
+if not "%LUAJIT_CMD%" == "" (
+ echo %ECHO_PREFIX% Creating torch-activate.cmd luajit.cmd luarocks.cmd cmake.cmd
+) else (
+ echo %ECHO_PREFIX% Creating torch-activate.cmd lua.cmd luac.cmd luarocks.cmd cmake.cmd
+)
+
+set NEW_PATH=%TORCH_INSTALL_DIR%;%TORCH_INSTALL_BIN%;%TORCH_INSTALL_ROC%;%TORCH_INSTALL_ROC%\tools;%TORCH_INSTALL_ROC%\systree\bin;%NEW_PATH%;%%PATH%%;;
+set NEW_LUA_PATH=%TORCH_INSTALL_ROC%\lua\?.lua;%TORCH_INSTALL_ROC%\lua\?\init.lua;%TORCH_INSTALL_ROC%\systree\share\lua\%TORCH_LUAROCKS_LUA%\?.lua;%TORCH_INSTALL_ROC%\systree\share\lua\%TORCH_LUAROCKS_LUA%\?\init.lua;;
+set NEW_LUA_CPATH=%TORCH_INSTALL_ROC%\systree\lib\lua\%TORCH_LUAROCKS_LUA%\?.dll;;
+
+set TORCHACTIVATE_CMD=%TORCH_INSTALL_DIR%\torch-activate.cmd
+if exist %TORCHACTIVATE_CMD% del %TORCHACTIVATE_CMD%
+echo @echo off>> %TORCHACTIVATE_CMD%
+echo set TORCH_INSTALL_DIR=%TORCH_INSTALL_DIR%>> %TORCHACTIVATE_CMD%
+echo set TORCH_CONDA_ENV=%TORCH_CONDA_ENV%>> %TORCHACTIVATE_CMD%
+echo set TORCH_VS_VERSION=%TORCH_VS_VERSION%>> %TORCHACTIVATE_CMD%
+echo set TORCH_VS_PLATFORM=%TORCH_VS_PLATFORM%>> %TORCHACTIVATE_CMD%
+echo for /f "delims=" %%%%i in ('call echo %%%%VS%TORCH_VS_VERSION%0COMNTOOLS%%%%') do call "%%%%i..\..\VC\vcvarsall.bat" %TORCH_VS_PLATFORM%>> %TORCHACTIVATE_CMD%
+echo set PATH=%NEW_PATH%>> %TORCHACTIVATE_CMD%
+echo set LUA_PATH=%NEW_LUA_PATH%>> %TORCHACTIVATE_CMD%
+echo set LUA_CPATH=%NEW_LUA_CPATH%>> %TORCHACTIVATE_CMD%
+if not "%CUDNN_PATH%" == "" echo set CUDNN_PATH=%CUDNN_PATH%>> %TORCHACTIVATE_CMD%
+
+if not "%LUAJIT_CMD%" == "" (
+ if exist "%LUAJIT_CMD%" del %LUAJIT_CMD%
+ echo @echo off>> "%LUAJIT_CMD%"
+ echo setlocal>> "%LUAJIT_CMD%"
+ echo call %TORCHACTIVATE_CMD%>> "%LUAJIT_CMD%"
+ echo %TORCH_INSTALL_DIR%\bin\luajit.exe %%*>> "%LUAJIT_CMD%"
+ echo endlocal>> "%LUAJIT_CMD%"
+)
+
+if not "%LUA_CMD%" == "" (
+ if exist "%LUA_CMD%" del %LUA_CMD%
+ echo @echo off>> "%LUA_CMD%"
+ echo setlocal>> "%LUA_CMD%"
+ echo call %TORCHACTIVATE_CMD%>> "%LUA_CMD%"
+ echo %TORCH_INSTALL_DIR%\bin\lua.exe %%*>> "%LUA_CMD%"
+ echo endlocal>> "%LUA_CMD%"
+)
+
+if not "%LUAC_CMD%" == "" (
+ if exist "%LUAC_CMD%" del %LUAC_CMD%
+ echo @echo off>> "%LUAC_CMD%"
+ echo setlocal>> "%LUAC_CMD%"
+ echo call %TORCHACTIVATE_CMD%>> "%LUAC_CMD%"
+ echo %TORCH_INSTALL_DIR%\bin\luac.exe %%*>> "%LUAC_CMD%"
+ echo endlocal>> "%LUAC_CMD%"
+)
+
+if exist %LUAROCKS_CMD% del %LUAROCKS_CMD%
+echo @echo off>> %LUAROCKS_CMD%
+echo setlocal>> %LUAROCKS_CMD%
+echo call %TORCHACTIVATE_CMD%>> %LUAROCKS_CMD%
+echo call %TORCH_INSTALL_DIR%\luarocks\luarocks.bat %%*>> %LUAROCKS_CMD%
+echo endlocal>> %LUAROCKS_CMD%
+
+set CMAKE_CMD=%TORCH_INSTALL_DIR%\cmake.cmd
+if exist %CMAKE_CMD% del %CMAKE_CMD%
+echo @echo off>> %CMAKE_CMD%
+echo if "%%1" == ".." if not "%%2" == "-G" goto :G_NMake>> %CMAKE_CMD%
+echo cmake.exe %%*>> %CMAKE_CMD%
+echo goto :EOF>> %CMAKE_CMD%
+echo :G_NMake>> %CMAKE_CMD%
+echo shift>> %CMAKE_CMD%
+echo cmake.exe .. -G "NMake Makefiles" %%*>> %CMAKE_CMD%
+
+set TORCH_SETUP_FAIL=0
+echo %ECHO_PREFIX% Setup succeed!
+goto :END
+
+:FAIL
+echo %ECHO_PREFIX% Setup fail!
+
+:END
diff --git a/install.bat b/install.bat
new file mode 100644
index 0000000..a399322
--- /dev/null
+++ b/install.bat
@@ -0,0 +1,69 @@
+@setlocal enableextensions
+@echo off
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:::: This script instals Torch7 on windows with msvc ::::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+
+if not "%TORCH_SETUP_FAIL%" == "0" call install-deps.bat
+if not "%TORCH_SETUP_FAIL%" == "0" goto :FAIL
+
+echo %ECHO_PREFIX% Updating submodules
+git submodule update --init --recursive
+
+set PATCH_DIR=%TORCH_DISTRO%\win-files\patch
+
+echo %ECHO_PREFIX% Installing common lua packages
+cd %TORCH_DISTRO%\extra\luafilesystem && call %LUAROCKS_CMD% make rockspecs\luafilesystem-1.6.3-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\extra\penlight && call %LUAROCKS_CMD% make penlight-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\extra\lua-cjson && git apply %PATCH_DIR%\lua-cjson.patch --whitespace=fix & ( call %LUAROCKS_CMD% make lua-cjson-2.1devel-1.rockspec || goto :FAIL ) & git apply %PATCH_DIR%\lua-cjson.patch --reverse --whitespace=fix
+
+echo %ECHO_PREFIX% Installing core Torch7 packages
+cd %TORCH_DISTRO%\extra\luaffifb && git apply %PATCH_DIR%\luaffifb.patch --whitespace=fix & ( call %LUAROCKS_CMD% make luaffi-scm-1.rockspec || goto :FAIL ) & git apply %PATCH_DIR%\luaffifb.patch --reverse --whitespace=fix
+cd %TORCH_DISTRO%\pkg\sundown && call %LUAROCKS_CMD% make rocks\sundown-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\pkg\cwrap && call %LUAROCKS_CMD% make rocks\cwrap-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\pkg\paths && call %LUAROCKS_CMD% make rocks\paths-scm-1.rockspec || goto :FAIL
+if "%TORCH_SETUP_HAS_MKL%" == "1" (
+ cd %TORCH_DISTRO%\pkg\torch && git apply %PATCH_DIR%\torch.patch --whitespace=fix & ( call %LUAROCKS_CMD% make rocks\torch-scm-1.rockspec INTEL_MKL_DIR="%INTEL_MKL_DIR%" INTEL_COMPILER_DIR="%INTEL_COMPILER_DIR%" || goto :FAIL ) & git apply %PATCH_DIR%\torch.patch --reverse --whitespace=fix
+) else (
+ cd %TORCH_DISTRO%\pkg\torch && git apply %PATCH_DIR%\torch.patch --whitespace=fix & ( call %LUAROCKS_CMD% make rocks\torch-scm-1.rockspec BLAS_LIBRARIES="%BLAS_LIBRARIES%" LAPACK_LIBRARIES="%LAPACK_LIBRARIES%" LAPACK_FOUND=TRUE || goto :FAIL ) & git apply %PATCH_DIR%\torch.patch --reverse --whitespace=fix
+)
+cd %TORCH_DISTRO%\pkg\dok && call %LUAROCKS_CMD% make rocks\dok-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\exe\trepl && call %LUAROCKS_CMD% make trepl-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\pkg\sys && call %LUAROCKS_CMD% make sys-1.1-0.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\pkg\xlua && call %LUAROCKS_CMD% make xlua-1.0-0.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\extra\nn && call %LUAROCKS_CMD% make rocks\nn-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\extra\graph && call %LUAROCKS_CMD% make rocks\graph-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\extra\nngraph && call %LUAROCKS_CMD% make nngraph-scm-1.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\pkg\image && call %LUAROCKS_CMD% make image-1.1.alpha-0.rockspec || goto :FAIL
+cd %TORCH_DISTRO%\pkg\optim && call %LUAROCKS_CMD% make optim-1.0.5-0.rockspec || goto :FAIL
+
+if not "%TORCH_SETUP_HAS_CUDA%" == "" if not "%TORCH_VS_TARGET%" == "x86" (
+ echo %ECHO_PREFIX% Found CUDA on your machine. Installing CUDA packages
+ cd %TORCH_DISTRO%\extra\cutorch && call %LUAROCKS_CMD% make rocks\cutorch-scm-1.rockspec || goto :FAIL
+ cd %TORCH_DISTRO%\extra\cunn && git apply %TORCH_DISTRO%\win-files\patch\cunn.patch --whitespace=fix & ( call %LUAROCKS_CMD% make rocks\cunn-scm-1.rockspec || goto :FAIL ) & git apply %TORCH_DISTRO%\win-files\patch\cunn.patch --reverse --whitespace=fix
+)
+
+echo %ECHO_PREFIX% Installing optional Torch7 packages
+cd %TORCH_DISTRO%\pkg\gnuplot && call %LUAROCKS_CMD% make rocks\gnuplot-scm-1.rockspec
+cd %TORCH_DISTRO%\exe\env && call %LUAROCKS_CMD% make env-scm-1.rockspec
+cd %TORCH_DISTRO%\extra\nnx && call %LUAROCKS_CMD% make nnx-0.1-1.rockspec
+cd %TORCH_DISTRO%\exe\qtlua && call %LUAROCKS_CMD% make rocks\qtlua-scm-1.rockspec
+cd %TORCH_DISTRO%\pkg\qttorch && call %LUAROCKS_CMD% make rocks\qttorch-scm-1.rockspec
+cd %TORCH_DISTRO%\extra\threads && call %LUAROCKS_CMD% make rocks\threads-scm-1.rockspec WIN_DLFCN_INCDIR=%WIN_DLFCN_INCDIR% WIN_DLFCN_LIBDIR=%WIN_DLFCN_LIBDIR%
+cd %TORCH_DISTRO%\extra\argcheck && call %LUAROCKS_CMD% make rocks\argcheck-scm-1.rockspec
+
+if not "%TORCH_SETUP_HAS_CUDA%" == "" if not "%TORCH_VS_TARGET%" == "x86" (
+ echo %ECHO_PREFIX% Found CUDA on your machine. Installing optional CUDA packages
+ cd %TORCH_DISTRO%\extra\cudnn && git apply %TORCH_DISTRO%\win-files\patch\cudnn.patch --whitespace=fix & call %LUAROCKS_CMD% make cudnn-scm-1.rockspec & git apply %TORCH_DISTRO%\win-files\patch\cudnn.patch --reverse --whitespace=fix
+)
+
+echo %ECHO_PREFIX% Installation succeed!
+goto :END
+
+:FAIL
+echo %ECHO_PREFIX% Installation error!
+
+:END
+@endlocal
diff --git a/test.bat b/test.bat
new file mode 100644
index 0000000..a100e67
--- /dev/null
+++ b/test.bat
@@ -0,0 +1,88 @@
+@setlocal enableextensions
+@echo off
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:::: This script tests if Torch7 is installed properly ::::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+
+if "%TORCH_INSTALL_DIR%" == "" goto :HELP
+
+for /f "delims=" %%i in ('where luajit.cmd') do (
+ set LUA=%%i
+ goto :AFTER_LUAJIT
+)
+
+:AFTER_LUAJIT
+if exist "%LUA%" (
+ set TORCH_USE_LUAJIT=1
+) else (
+ for /f "delims=" %%i in ('where lua.cmd') do (
+ set LUA=%%i
+ goto :AFTER_LUA
+ )
+)
+
+:AFTER_LUA
+if not exist "%LUA%" (
+ echo Neither luajit nor lua found in Torch7 environment
+ goto :FAIL
+)
+
+set LUA_SAFE_PATH=%LUA:\=\\%
+echo Using Lua at: %LUA%
+
+:: smoke tests
+call %LUA% -lpaths -e "print('paths loaded succesfully')" || goto :FAIL
+call %LUA% -ltorch -e "print('torch loaded succesfully')" || goto :FAIL
+call %LUA% -lenv -e "print('env loaded succesfully')" || goto :FAIL
+call %LUA% -ltrepl -e "print('trepl loaded succesfully')" || goto :FAIL
+call %LUA% -ldok -e "print('dok loaded succesfully')" || goto :FAIL
+call %LUA% -limage -e "print('image loaded succesfully')" || goto :FAIL
+call %LUA% -lcwrap -e "print('cwrap loaded succesfully')" || goto :FAIL
+call %LUA% -lgnuplot -e "print('gnuplot loaded succesfully')" || goto :FAIL
+call %LUA% -loptim -e "print('optim loaded succesfully')" || goto :FAIL
+call %LUA% -lsys -e "print('sys loaded succesfully')" || goto :FAIL
+for /f "delims=" %%i in ('where basename') do set BASENAME=%%i
+if "%BASENAME%" == "" (
+ call %LUA% -lxlua -e "print('xlua loaded succesfully')" || goto :FAIL
+) else (
+ call %LUA% -lxlua -e "print('x$(basename %LUA_SAFE_PATH%) loaded succesfully')" || goto :FAIL
+)
+call %LUA% -largcheck -e "print('argcheck loaded succesfully')" || goto :FAIL
+call %LUA% -lgraph -e "print('graph loaded succesfully')" || goto :FAIL
+call %LUA% -lnn -e "print('nn loaded succesfully')" || goto :FAIL
+call %LUA% -lnngraph -e "print('nngraph loaded succesfully')" || goto :FAIL
+call %LUA% -lnnx -e "print('nnx loaded succesfully')" || goto :FAIL
+call %LUA% -lthreads -e "print('threads loaded succesfully')" || goto :FAIL
+
+call th -ltorch -e "torch.test()"
+call th -lnn -e "nn.test()"
+
+if "%TORCH_USE_LUAJIT%" == "1" (
+ call %LUA% -lsundown -e "print('sundown loaded succesfully')"
+)
+
+call %LUA% -lcutorch -e ""
+if "%ERRORLEVEL%" == "0" (
+ call %LUA% -lcutorch -e "print('cutorch loaded succesfully')"
+ call %LUA% -lcunn -e "print('cunn loaded succesfully')"
+ if "%TORCH_USE_LUAJIT%" == "1" %LUA% -lcudnn -e "print('cudnn loaded succesfully')"
+ call th -lcutorch -e "cutorch.test()"
+ call th -lcunn -e "nn.testcuda()"
+) else (
+ echo "CUDA not found"
+)
+
+echo Test succeed
+goto :END
+
+:HELP
+echo Please run torch-activate.cmd before run test.bat so that test knows where to find Torch7.
+goto :END
+
+:FAIL
+echo Test fail
+
+:END
+@endlocal
diff --git a/uninstall.bat b/uninstall.bat
new file mode 100644
index 0000000..ed6425a
--- /dev/null
+++ b/uninstall.bat
@@ -0,0 +1,31 @@
+@setlocal enableextensions
+@echo off
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:::: This script [1] cleans temporary compilation file ::::
+:::: [2] deletes Torch7 installation directory ::::
+:::: [3] deletes Torch7 conda environment ::::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+
+if "%TORCH_INSTALL_DIR%" == "" goto :HELP
+
+set ECHO_PREFIX=+++++++
+
+echo %ECHO_PREFIX% cleaning temporary compilation files
+call clean.bat
+
+echo %ECHO_PREFIX% deleting Torch7 installation directory
+rmdir /s /q %TORCH_INSTALL_DIR%
+
+echo %ECHO_PREFIX% deleting Torch7 conda environment (even if env is removed, packages will stil be kept in conda/pkgs)
+conda env remove -n %TORCH_CONDA_ENV% --yes
+
+echo %ECHO_PREFIX% Torch7 has been uninstalled
+goto :END
+
+:HELP
+echo Please run torch-activate.cmd before run uninstall.bat so that uninstall knows where to find Torch7.
+
+:END
+@endlocal
diff --git a/win-files/README.md b/win-files/README.md
new file mode 100644
index 0000000..fd46a2c
--- /dev/null
+++ b/win-files/README.md
@@ -0,0 +1,92 @@
+Self-contained Torch installation for windows
+============
+
+## Prerequisites
+
+#### Must have
+- MSVC, anyone of the following choices is sufficient
+ - [Visual C++ Build Tools](http://landinghub.visualstudio.com/visual-cpp-build-tools)
+ - [Visual Studio Express](https://www.visualstudio.com/vs/visual-studio-express/)
+ - [Visual Studio Community](https://www.visualstudio.com/vs/community/)
+- [Git](https://git-scm.com/download/win)
+- [CMake](https://cmake.org/download/#latest)
+- [Conda](http://conda.pydata.org/docs/download.html), manage dependencies like openblas, jpeg, qt, etc
+
+#### If use CUDA
+
+- [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)
+- [CUDNN](https://developer.nvidia.com/cudnn), if use dnn
+
+#### Optional
+
+- [MKL](https://software.intel.com/intel-mkl), better performance blas/lapack library
+- [Gnuplot](https://sourceforge.net/projects/gnuplot/files/latest), required by gnuplot package for plotting
+- [GraphicsMagick](https://sourceforge.net/projects/graphicsmagick/files/latest), optional for image package
+
+## Install
+Open "Windows Command Prompt" and run:
+```bat
+install.bat
+```
+By default x64 Torch will be installed under install\ with LuaJIT 2.1 and openlblas from conda environment 'torch-vcversion'.
+Run install.bat in a specific "VS\* \* Tools Command Prompt" to compile for a different target. Please choose x64 conda
+for x64 Torch and x86 conda for x86 Torch. X86 Torch does not contain cuda packages and has 2G memory limitation.
+There are a few customizable environment variables listed on top of install-deps.bat. There is no need to run
+install-deps.bat before run install.bat, it sets variables in global and it will be called directly by install.bat.
+**Do not** use lua instead of luajit because currently lua version Torch will use luaffifb for ffi which has bugs on windows
+and has poor performance.
+
+It is easy to intall multiple Torch by customizing TORCH\_INSTALL\_DIR, TORCH\_LUA\_VERSION, and by making sure
+clean.bat is run before running install.bat.
+
+## Use
+In order to use Torch in a Self-contained way, a few helper cmd will be installed under the installation directory:
+- torch-activate.cmd: setup Torch environment including TORCH\_INSTALL\_DIR, TORCH\_CONDA\_ENV, TORCH\_VS\_VERSION, TORCH\_VS\_PLATFORM, PATH, LUA\_PATH, LUA\_CPATH, CUDNN\_PATH,
+- luajit.cmd: a wrapper of luajit.exe with Torch environment
+- luarocks.cmd: a wrapper of luarocks.bat with Torch environment
+- cmake.cmd: a wrapper of cmake.exe which helps package installation with MSVC
+
+#### Use luajit.cmd and luarocks.cmd directly
+```bat
+path_to_Torch\luajit -ltorch -e "torch.test()"
+```
+The installation will remember which MSVC to use for what platform, so luarocks install can be run in a general "Windows
+Command Prompt".
+```bat
+path_to_Torch\luarocks install rnn
+```
+It will automatically install not installed dependencies.
+
+#### Run torch-activate.cmd, then use availabe Torch executables
+```bat
+path_to_Torch\torch-activate
+th
+qlua
+```
+Trepl on windows should work similarly as on linux or macos. qlua should be used to run qt related lua codes.
+
+#### Packages
+
+## Clean or Uninstall
+To remove all the temporary compilation files:
+```bat
+clean.bat
+```
+
+To remove the installation:
+```bat
+path_to_Torch\torch-activate
+uninstall.bat
+```
+torch-activate.cmd is called before uninstall.bat so that uninstall knows which Torch7 to uninstall.
+In addition to clean.bat, this will remove the directory pointed to by TORCH\_INSTALL\_DIR and TORCH\_CONDA\_ENV from conda.
+
+## Test
+You can test that all libraries are installed properly by running:
+```bat
+path_to_Torch\torch-activate
+test.bat
+```
+torch-activate.cmd is called before test.bat so that test knows which Torch7 to test.
+
+Tested x64 Torch7 on Windows 10 x64, Visual Studio Community 2015, Anaconda4, Cuda Toolkit8.0, MKL2017
diff --git a/win-files/patch/cudnn.patch b/win-files/patch/cudnn.patch
new file mode 100644
index 0000000..b4783d4
--- /dev/null
+++ b/win-files/patch/cudnn.patch
@@ -0,0 +1,21 @@
+diff --git a/init.lua b/init.lua
+index 6c8abd7..322a21d 100644
+--- a/init.lua
++++ b/init.lua
+@@ -4,6 +4,7 @@ cudnn = require 'cudnn.env'
+ require('cudnn.ffi')
+ local C = cudnn.C
+ local ffi = require 'ffi'
++local THC = ffi.os == 'Windows' and ffi.load('THC') or ffi.C
+
+ --------------------------------------------------------------------
+ -- defaults, each should be overrideable via env var:
+@@ -151,7 +152,7 @@ end
+
+ function cudnn.call(f, ...)
+ C.cudnnSetStream(cudnn.getHandle(),
+- ffi.C.THCState_getCurrentStream(cutorch.getState()))
++ THC.THCState_getCurrentStream(cutorch.getState()))
+ return C[f](...)
+ end
+
diff --git a/win-files/patch/cunn.patch b/win-files/patch/cunn.patch
new file mode 100644
index 0000000..d143c9b
--- /dev/null
+++ b/win-files/patch/cunn.patch
@@ -0,0 +1,85 @@
+diff --git a/THCUNN.lua b/THCUNN.lua
+index 490cd5c..9924944 100644
+--- a/THCUNN.lua
++++ b/THCUNN.lua
+@@ -6,6 +6,9 @@ local THCUNN = {}
+ -- load libTHCUNN
+ THCUNN.C = ffi.load(package.searchpath('libTHCUNN', package.cpath))
+
++-- load THC
++local THC = ffi.os == 'Windows' and ffi.load('THC') or ffi.C
++
+ local THCState_ptr = ffi.typeof('THCState*')
+
+ function THCUNN.getState()
+@@ -139,7 +142,7 @@ local transform_reals_to_half = function(func_name, real_args, ...)
+ end
+ for k,v in ipairs(real_args[func_name]) do
+ -- first argument (THCState) is added implicitly by bind
+- t[v-1] = ffi.C.THC_float2half(t[v-1])
++ t[v-1] = THC.THC_float2half(t[v-1])
+ end
+ return t
+ end
+diff --git a/test.lua b/test.lua
+index 7cb2854..ea214c3 100644
+--- a/test.lua
++++ b/test.lua
+@@ -5,6 +5,9 @@ local precision_backward = 1e-2
+ local nloop = 1
+ local times = {}
+
++-- load THC
++local THC = ffi.os == 'Windows' and ffi.load('THC') or ffi.C
++
+ --e.g.: th -lcunn -e "nn.testcuda{'Sigmoid_forward'}"
+
+ local typenames = {
+@@ -348,17 +351,17 @@ function cunntest.Square_transposed()
+ end
+
+ function cunntest.SoftShrink_forward()
+- local r = ffi.C.THC_half2float(ffi.C.THC_float2half(math.random()))
++ local r = THC.THC_half2float(THC.THC_float2half(math.random()))
+ pointwise_forward(nn.SoftShrink(r), 'SoftShrink', precision_forward)
+ end
+
+ function cunntest.SoftShrink_backward()
+- local r = ffi.C.THC_half2float(ffi.C.THC_float2half(math.random()))
++ local r = THC.THC_half2float(THC.THC_float2half(math.random()))
+ pointwise_backward(nn.SoftShrink(r), 'SoftShrink', precision_backward)
+ end
+
+ function cunntest.SoftShrink_transposed()
+- local r = ffi.C.THC_half2float(ffi.C.THC_float2half(math.random()))
++ local r = THC.THC_half2float(THC.THC_float2half(math.random()))
+ pointwise_transposed(nn.SoftShrink(r), 'SoftShrink', precision_backward)
+ end
+
+@@ -3377,7 +3380,7 @@ function cunntest.mse()
+ local cgin = cmod:backward(cinput,ctarget)
+
+ if (typename == 'torch.CudaHalfTensor') then
+- fout = ffi.C.THC_half2float(ffi.C.THC_float2half(fout))
++ fout = THC.THC_half2float(THC.THC_float2half(fout))
+ end
+ mytester:assertlt(math.abs(fout-cout), precision_forward_type(0.02, typename),
+ string.format('error on output with %s', typename))
+@@ -3411,7 +3414,7 @@ function cunntest.SmoothL1()
+ local cgin = cmod:backward(cinput,ctarget)
+
+ if (typename == 'torch.CudaHalfTensor') then
+- fout = ffi.C.THC_half2float(ffi.C.THC_float2half(fout))
++ fout = THC.THC_half2float(THC.THC_float2half(fout))
+ end
+ mytester:assertlt(math.abs(fout-cout), 0.01, string.format('error on output with %s', typename))
+ local gerr = cgin:double() - fgin:double()
+@@ -3976,7 +3979,7 @@ function cunntest.l1cost()
+ local cgin = cmod:backward(cinput)
+
+ if (typename == 'torch.CudaHalfTensor') then
+- fout = ffi.C.THC_half2float(ffi.C.THC_float2half(fout))
++ fout = THC.THC_half2float(THC.THC_float2half(fout))
+ end
+ mytester:assertlt(math.abs(fout-cout), precision_forward_type(precision_forward, typename),
+ string.format('error on output with %s', typename))
diff --git a/win-files/patch/lua-cjson.patch b/win-files/patch/lua-cjson.patch
new file mode 100644
index 0000000..47cd370
--- /dev/null
+++ b/win-files/patch/lua-cjson.patch
@@ -0,0 +1,67 @@
+diff --git a/fpconv.h b/fpconv.h
+index 7b0d0ee..f674e41 100644
+--- a/fpconv.h
++++ b/fpconv.h
+@@ -4,6 +4,10 @@
+ *
+ * Longest double printed with %.14g is 21 characters long:
+ * -1.7976931348623e+308 */
++#ifdef _MSC_VER
++#define inline __inline
++#define snprintf _snprintf
++#endif
+ # define FPCONV_G_FMT_BUFSIZE 32
+
+ #ifdef USE_INTERNAL_FPCONV
+diff --git a/lua-cjson-2.1devel-1.rockspec b/lua-cjson-2.1devel-1.rockspec
+index 154e333..0f7652e 100644
+--- a/lua-cjson-2.1devel-1.rockspec
++++ b/lua-cjson-2.1devel-1.rockspec
+@@ -47,6 +47,7 @@ build = {
+ -- Override default build options (per platform)
+ platforms = {
+ win32 = { modules = { cjson = { defines = {
++ "strncasecmp=_strnicmp",
+ "DISABLE_INVALID_NUMBERS"
+ } } } }
+ },
+diff --git a/strbuf.c b/strbuf.c
+index ac779e4..c3272f0 100644
+--- a/strbuf.c
++++ b/strbuf.c
+@@ -94,8 +94,8 @@ void strbuf_set_increment(strbuf_t *s, int increment)
+ static inline void debug_stats(strbuf_t *s)
+ {
+ if (s->debug) {
+- fprintf(stderr, "strbuf(%lx) reallocs: %d, length: %d, size: %d\n",
+- (long)s, s->reallocs, s->length, s->size);
++ fprintf(stderr, "strbuf(%p) reallocs: %d, length: %d, size: %d\n",
++ s, s->reallocs, s->length, s->size);
+ }
+ }
+
+@@ -168,8 +168,8 @@ void strbuf_resize(strbuf_t *s, int len)
+ newsize = calculate_new_size(s, len);
+
+ if (s->debug > 1) {
+- fprintf(stderr, "strbuf(%lx) resize: %d => %d\n",
+- (long)s, s->size, newsize);
++ fprintf(stderr, "strbuf(%p) resize: %d => %d\n",
++ s, s->size, newsize);
+ }
+
+ s->size = newsize;
+diff --git a/strbuf.h b/strbuf.h
+index d861108..b135560 100644
+--- a/strbuf.h
++++ b/strbuf.h
+@@ -24,6 +24,9 @@
+
+ #include <stdlib.h>
+ #include <stdarg.h>
++#ifdef _MSC_VER
++#define inline __inline
++#endif
+
+ /* Size: Total bytes allocated to *buf
+ * Length: String length, excluding optional NULL terminator.
diff --git a/win-files/patch/luaffifb.patch b/win-files/patch/luaffifb.patch
new file mode 100644
index 0000000..988883f
--- /dev/null
+++ b/win-files/patch/luaffifb.patch
@@ -0,0 +1,189 @@
+diff --git a/ffi.h b/ffi.h
+index dabdc9b..d457fd7 100644
+--- a/ffi.h
++++ b/ffi.h
+@@ -42,8 +42,10 @@ extern "C" {
+ #include <sys/mman.h>
+ #endif
+
++#ifndef _MSC_VER
+ #include <complex.h>
+ #define HAVE_COMPLEX
++#endif
+ #define HAVE_LONG_DOUBLE
+
+ #ifndef NDEBUG
+diff --git a/test.c b/test.c
+index 20f5d13..c9acb27 100644
+--- a/test.c
++++ b/test.c
+@@ -19,8 +19,12 @@
+ #include <errno.h>
+ #endif
+
++#ifndef _MSC_VER
+ #include <complex.h>
+ #define HAVE_COMPLEX
++#else
++#include <lua.h>
++#endif
+
+ #ifdef __cplusplus
+ # define EXTERN_C extern "C"
+@@ -718,3 +722,9 @@ void test_call_pppppiiifii(void* p1, void* p2, void* p3, void* p4, void* p5, int
+ sprintf(buf, "%p %p %p %p %p %d %d %d %0.1f %d %d", p1, p2, p3, p4, p5, i1, i2, i3, f4, i5, i6);
+ }
+
++#ifdef _MSC_VER
++int luaopen_ffi_libtest(lua_State* L)
++{
++ return 1;
++}
++#endif
+diff --git a/test.lua b/test.lua
+index 8a9b718..af05ea7 100644
+--- a/test.lua
++++ b/test.lua
+@@ -7,6 +7,15 @@
+ -- of patent rights can be found in the PATENTS file in the same directory.
+ --
+ io.stdout:setvbuf('no')
++
++local is_luajit = false
++if type(jit) == 'table' then
++ is_luajit = string.find(jit.version, 'LuaJIT')
++ if is_luajit then
++ package.preload['ffi'] = nil -- enable run test in luajit
++ end
++end
++
+ local ffi = require 'ffi'
+ local dlls = {}
+
+@@ -322,17 +331,29 @@ local types = {
+ e32 = 'enum e32',
+ }
+
++-- different compilers may printf(%p) in different format,
++-- for example 000000003A0A9848, 0x3a0a9848
++-- tostring(cdata) may return address with '0x' prefix
++local addrbuf = ffi.new('char[256]')
++local function unifyaddr(ttype, addr)
++ if ttype == 'void*' then
++ dlls.__cdecl.print_p(addrbuf, tonumber(addr, 16))
++ return ffi.string(addrbuf)
++ end
++ return addr
++end
++
+ local buf = ffi.new('char[256]')
+
+ local function checkbuf(type, ret, msg)
+- local str = tostring(test_values[type]):gsub('^cdata%b<>: ', '')
++ local str = unifyaddr(type, tostring(test_values[type]):gsub('^cdata%b<>: ', ''))
+ check(ffi.string(buf), str, msg)
+ check(ret, #str, msg)
+ end
+
+ local function checkalign(type, v, ret)
+ --print(v)
+- local str = tostring(test_values[type]):gsub('^cdata%b<>: ', '')
++ local str = unifyaddr(type, tostring(test_values[type]):gsub('^cdata%b<>: ', ''))
+ check(ffi.string(buf), ('size %d offset %d align %d value %s'):format(ffi.sizeof(v), ffi.offsetof(v, 'v'), ffi.alignof(v, 'v'), str))
+ check(ret, #str)
+ end
+@@ -593,9 +614,13 @@ for convention,c in pairs(dlls) do
+
+ check(c.call_fptr({function(a) return 3*a end}, 5), 15)
+
++ if is_luajit then
++ print('luajit+ffifb failure : pcall error test')
++ else
+ local suc, err = pcall(c.call_s, function(s) error(ffi.string(s), 0) end, 'my error')
+ check(suc, false)
+ check(err, 'my error')
++ end
+
+ check(ffi.errno(), c.get_errno())
+ c.set_errno(3)
+@@ -628,7 +653,7 @@ for convention,c in pairs(dlls) do
+ first = false
+ end
+
+-local c = ffi.C
++local c = ffi.os=='Windows' and ffi.load('msvcrt') or ffi.C
+
+ assert(c.sprintf(buf, "%g", 5.3) == 3 and ffi.string(buf) == '5.3')
+ assert(c.sprintf(buf, "%d", false) == 1 and ffi.string(buf) == '0')
+@@ -927,31 +952,40 @@ void test_call_pppppiifiii(void* p1, void* p2, void* p3, void* p4, void* p5, int
+ void test_call_pppppiiifii(void* p1, void* p2, void* p3, void* p4, void* p5, int i1, int i2, int i3, float i4, int i5, int i6);
+ ]]
+
+-ffi.C.test_call_echo("input")
+-assert(ffi.C.buf == "input")
++local ffiC = ffi.os=='Windows' and dlls.__cdecl or ffi.C
++ffiC.test_call_echo("input")
++assert(ffiC.buf == "input")
+
+ local function ptr(x) return ffi.new('void*', x) end
++local prefix = ""
++for i=1,5 do prefix = prefix .. unifyaddr('void*', tostring(i)) .. " " end
+
+-ffi.C.test_call_pppppii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7)
+-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7")
++ffiC.test_call_pppppii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7)
++assert(ffiC.buf == prefix .. "6 7")
+
+-ffi.C.test_call_pppppiiiiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9, 10, 11)
+-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7 8 9 10 11")
++ffiC.test_call_pppppiiiiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9, 10, 11)
++assert(ffiC.buf == prefix .. "6 7 8 9 10 11")
+
+-ffi.C.test_call_pppppffffff(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6.5, 7.5, 8.5, 9.5, 10.5, 11.5)
+-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6.5 7.5 8.5 9.5 10.5 11.5")
++if is_luajit then
++ print("luajit+ffifb failure : function call with float parameters test")
++else
++ffiC.test_call_pppppffffff(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6.5, 7.5, 8.5, 9.5, 10.5, 11.5)
++assert(ffiC.buf == prefix .. "6.5 7.5 8.5 9.5 10.5 11.5")
+
+-ffi.C.test_call_pppppiifiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8.5, 9, 10, 11)
+-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7 8.5 9 10 11")
++ffiC.test_call_pppppiifiii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8.5, 9, 10, 11)
++assert(ffiC.buf == prefix .. "6 7 8.5 9 10 11")
+
+-ffi.C.test_call_pppppiiifii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9.5, 10, 11)
+-assert(ffi.C.buf == "0x1 0x2 0x3 0x4 0x5 6 7 8 9.5 10 11")
++ffiC.test_call_pppppiiifii(ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), 6, 7, 8, 9.5, 10, 11)
++assert(ffiC.buf == prefix .. "6 7 8 9.5 10 11")
++end
+
+-local sum = ffi.C.add_dc(ffi.new('complex', 1, 2), ffi.new('complex', 3, 5))
++if not ffiC.is_msvc then
++local sum = ffiC.add_dc(ffi.new('complex', 1, 2), ffi.new('complex', 3, 5))
+ assert(ffi.istype('complex', sum))
+
+-sum = ffi.C.add_fc(ffi.new('complex float', 1, 2), ffi.new('complex float', 3, 5))
++sum = ffiC.add_fc(ffi.new('complex float', 1, 2), ffi.new('complex float', 3, 5))
+ assert(ffi.istype('complex float', sum))
++end
+
+ ffi.cdef [[
+ struct Arrays {
+@@ -988,6 +1022,9 @@ assert(ffi.string(buf, 0) == '')
+ assert(ffi.string(buf, ffi.new('long long', 2)) == 'aa')
+ assert(ffi.string(buf, ffi.new('int', 2)) == 'aa')
+
++if is_luajit then
++ print("luajit+ffifb failure : tmpfile test")
++else
+ -- Test io.tmpfile()
+ ffi.cdef [[
+ int fprintf ( FILE * stream, const char * format, ... );
+@@ -999,5 +1036,6 @@ f:seek("set", 0)
+ local str = f:read('*l')
+ assert(str == 'test: foo', str)
+ f:close()
++end
+
+ print('Test PASSED')
diff --git a/win-files/patch/torch.patch b/win-files/patch/torch.patch
new file mode 100644
index 0000000..63e7868
--- /dev/null
+++ b/win-files/patch/torch.patch
@@ -0,0 +1,26 @@
+diff --git a/lib/luaT/luaT.c b/lib/luaT/luaT.c
+index 95166ed..2dc307a 100644
+--- a/lib/luaT/luaT.c
++++ b/lib/luaT/luaT.c
+@@ -151,7 +151,7 @@ const char* luaT_newlocalmetatable(lua_State *L, const char *tname, const char *
+ {
+ lua_pushcfunction(L, luaT_lua_newmetatable);
+ lua_pushstring(L, tname);
+- (parent_tname ? lua_pushstring(L, parent_tname) : lua_pushnil(L));
++ (parent_tname ? (void)lua_pushstring(L, parent_tname) : lua_pushnil(L));
+ (constructor ? lua_pushcfunction(L, constructor) : lua_pushnil(L));
+ (destructor ? lua_pushcfunction(L, destructor) : lua_pushnil(L));
+ (factory ? lua_pushcfunction(L, factory) : lua_pushnil(L));
+diff --git a/rocks/torch-scm-1.rockspec b/rocks/torch-scm-1.rockspec
+index 2228726..30df777 100644
+--- a/rocks/torch-scm-1.rockspec
++++ b/rocks/torch-scm-1.rockspec
+@@ -27,7 +27,7 @@ cmake -E make_directory build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release
+ platforms = {
+ windows = {
+ build_command = [[
+-cmake -E make_directory build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release -DLUA=$(LUA) -DLUALIB=$(LUALIB) -DLUA_BINDIR="$(LUA_BINDIR)" -DLUA_INCDIR="$(LUA_INCDIR)" -DLUA_LIBDIR="$(LUA_LIBDIR)" -DLUADIR="$(LUADIR)" -DLIBDIR="$(LIBDIR)" -DCMAKE_INSTALL_PREFIX="$(PREFIX)" && $(MAKE)
++cmake -E make_directory build && cd build && cmake .. -DINTEL_MKL_DIR=$(INTEL_MKL_DIR) -DINTEL_COMPILER_DIR=$(INTEL_COMPILER_DIR) -DBLAS_LIBRARIES=$(BLAS_LIBRARIES) -DLAPACK_LIBRARIES=$(LAPACK_LIBRARIES) -DLAPACK_FOUND=$(LAPACK_FOUND) -DCMAKE_BUILD_TYPE=Release -DLUA=$(LUA) -DLUALIB=$(LUALIB) -DLUA_BINDIR="$(LUA_BINDIR)" -DLUA_INCDIR="$(LUA_INCDIR)" -DLUA_LIBDIR="$(LUA_LIBDIR)" -DLUADIR="$(LUADIR)" -DLIBDIR="$(LIBDIR)" -DCMAKE_INSTALL_PREFIX="$(PREFIX)" && $(MAKE)
+ ]]
+ }
+ },
diff --git a/win-files/test/ffifb_perf_ffi.lua b/win-files/test/ffifb_perf_ffi.lua
new file mode 100644
index 0000000..9056f27
--- /dev/null
+++ b/win-files/test/ffifb_perf_ffi.lua
@@ -0,0 +1,37 @@
+-- code from http://luajit.org/ext_ffi.html
+
+require 'torch'
+
+local t = torch.Timer()
+t:reset()
+
+local ffi = require("ffi")
+ffi.cdef[[
+typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
+]]
+
+local function image_ramp_green(n)
+ local img = ffi.new("rgba_pixel[?]", n)
+ local f = 255/(n-1)
+ for i=0,n-1 do
+ img[i].green = i*f
+ img[i].alpha = 255
+ end
+ return img
+end
+
+local function image_to_grey(img, n)
+ for i=0,n-1 do
+ local y = 0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue
+ img[i].red = y; img[i].green = y; img[i].blue = y
+ end
+end
+
+local N = 400*400
+local img = image_ramp_green(N)
+for i=1,1000 do
+ image_to_grey(img, N)
+end
+
+t:stop()
+print(t:time().real)
diff --git a/win-files/test/ffifb_perf_purelua.lua b/win-files/test/ffifb_perf_purelua.lua
new file mode 100644
index 0000000..238aa65
--- /dev/null
+++ b/win-files/test/ffifb_perf_purelua.lua
@@ -0,0 +1,33 @@
+-- code from http://luajit.org/ext_ffi.html
+
+require 'torch'
+
+local t = torch.Timer()
+t:reset()
+
+local floor = math.floor
+
+local function image_ramp_green(n)
+ local img = {}
+ local f = 255/(n-1)
+ for i=1,n do
+ img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 }
+ end
+ return img
+end
+
+local function image_to_grey(img, n)
+ for i=1,n do
+ local y = floor(0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue)
+ img[i].red = y; img[i].green = y; img[i].blue = y
+ end
+end
+
+local N = 400*400
+local img = image_ramp_green(N)
+for i=1,1000 do
+ image_to_grey(img, N)
+end
+
+t:stop()
+print(t:time().real)