Exemplo n.º 1
0
static void real_init(void) {
#ifdef VS_TARGET_OS_WINDOWS
    // portable
    const std::wstring pythonDllName = L"python37.dll";
    HMODULE module;
    GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)&real_init, &module);
    std::vector<wchar_t> pathBuf(65536);
    GetModuleFileNameW(module, pathBuf.data(), (DWORD)pathBuf.size());
    std::wstring dllPath = pathBuf.data();
    dllPath.resize(dllPath.find_last_of('\\') + 1);
    std::wstring portableFilePath = dllPath + L"portable.vs";
    FILE *portableFile = _wfopen(portableFilePath.c_str(), L"rb");
    bool isPortable = !!portableFile;
    if (portableFile)
        fclose(portableFile);

    HMODULE pythonDll = nullptr;

    if (isPortable) {
        std::wstring pyPath = dllPath + L"\\" + pythonDllName;
        pythonDll = LoadLibraryExW(pyPath.c_str(), nullptr, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
    } else {
        DWORD dwType = REG_SZ;
        HKEY hKey = 0;

        wchar_t value[1024];
        DWORD valueLength = 1000;
        if (RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\VapourSynth", &hKey) != ERROR_SUCCESS)
            return;
        LSTATUS status = RegQueryValueExW(hKey, L"PythonPath", nullptr, &dwType, (LPBYTE)&value, &valueLength);
        RegCloseKey(hKey);
        if (status != ERROR_SUCCESS)
            return;

        std::wstring pyPath = value;
        pyPath += L"\\" + pythonDllName;

        pythonDll = LoadLibraryExW(pyPath.c_str(), nullptr, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
    }
    if (!pythonDll)
        return;
#endif
    int preInitialized = Py_IsInitialized();
    if (!preInitialized)
        Py_InitializeEx(0);
    s = PyGILState_Ensure();
    if (import_vapoursynth())
        return;
    if (vpy_initVSScript())
        return;
    ts = PyEval_SaveThread();
    initialized = true;
}
void hkvExternalToolWiiUTexConv2::determineExecutablePath()
{
  wchar_t envBuf[MAX_PATH + 1];
  DWORD numChars = GetEnvironmentVariableW(L"CAFE_ROOT", envBuf, MAX_PATH + 1);
  if ((numChars == 0) || (numChars > MAX_PATH + 1))
  {
    return;
  }

  hkStringBuf pathBuf(hkUtf8::Utf8FromWide(envBuf).cString());
  pathBuf.replace('\\', '/');
  pathBuf.pathAppend("system/bin/win32/TexConv2.exe");

  m_executable = pathBuf;
}
vector<unsigned> Hypergraph::computeGraphDistMat()
{
	int nTotal = _nVertices+_edges.size();
	vector<unsigned> pathBuf (nTotal*(nTotal-1)/2);
	pathBuf.assign(nTotal*(nTotal-1)/2, 100);

	/*initialization*/
	for (int i=0; i<_edges.size(); ++i)
	{
		int edgeIdx = _nVertices+i;
		for (int j=0; j<_edges[i].size(); ++j)
		{
			for (int k=0; k<j; ++k)
			{
				int idx = _edges[i][j]*(_edges[i][j]-1)/2+_edges[i][k];
				pathBuf[idx] = 2;
			}
			pathBuf[edgeIdx*(edgeIdx-1)/2+_edges[i][j]] = 1;
		}
	}

	for (int k=0; k<nTotal; ++k)
	{
		for (int i=0; i<nTotal; ++i)
		{
			if (i==k)
			{
				continue;
			}
			for (int j=0; j<i; ++j)
			{
				if (j==k)
				{
					continue;
				}
				int idxIJ = i*(i-1)/2+j;
				int idxIK = i>k?i*(i-1)/2+k:k*(k-1)/2+i;
				int idxJK = j>k?j*(j-1)/2+k:k*(k-1)/2+j;

				pathBuf[idxIJ] = min(pathBuf[idxIJ], pathBuf[idxIK]+pathBuf[idxJK]);
			}
		}
	}

	return pathBuf;
}
vector<unsigned> Hypergraph::computeEdgeDistMat()
{
	int nEdges = _edges.size();
	vector<unsigned> pathBuf (nEdges*(nEdges-1)/2);
	pathBuf.assign(nEdges*(nEdges-1)/2, UINT_MAX);

	/*initialization*/
	for (int i=0; i<nEdges; ++i)
	{
		for (int j=0; j<i; ++j)
		{
			HyperEdge v(_edges[i].size()+_edges[j].size());
			HyperEdge::iterator vIt = set_intersection(_edges[i].begin(), _edges[i].begin(), _edges[j].begin(), _edges[j].end(), v.begin());
			if (vIt!=v.begin())
			{
				pathBuf[i*(i-1)/2+j] = 2;
			}
		}
	}

	for (int k=0; k<nEdges; ++k)
	{
		for (int i=0; i<nEdges; ++i)
		{
			if (i==k)
			{
				continue;
			}
			for (int j=0; j<i; ++j)
			{
				if (j==k)
				{
					continue;
				}
				int idxIJ = i*(i-1)/2+j;
				int idxIK = i>k?i*(i-1)/2+k:k*(k-1)/2+i;
				int idxJK = j>k?j*(j-1)/2+k:k*(k-1)/2+j;

				pathBuf[idxIJ] = min(pathBuf[idxIJ], pathBuf[idxIK]+pathBuf[idxJK]);
			}
		}
	}

	return pathBuf;
}
vector<unsigned> Hypergraph::getDistToModification(const vector<int> &modifySet)
{
	int nTotal = _nVertices+_edges.size();
	vector<unsigned> distVec (nTotal);
	distVec.assign(nTotal, 100);

	for (int i=0; i<modifySet.size(); ++i)
	{
		distVec[modifySet[i]] = 0;
	}

	int nEdges = _edges.size();
	vector<unsigned> pathBuf (nEdges*(nEdges+1)/2);
	pathBuf.assign(nEdges*(nEdges+1)/2, 100);

	/*initialization*/
	for (int i=0; i<nEdges; ++i)
	{
		for (int j=0; j<i; ++j)
		{
			HyperEdge v(_edges[i].size()+_edges[j].size());
			HyperEdge::iterator vIt = set_intersection(_edges[i].begin(), _edges[i].begin(), _edges[j].begin(), _edges[j].end(), v.begin());
			if (vIt!=v.begin())
			{
				pathBuf[i*(i-1)/2+j] = 2;
			}
		}

		for (int j=0; j<modifySet.size(); ++j)
		{
			int modifiedIdx = modifySet[j];
			HyperEdge::iterator it = find(_edges[i].begin(), _edges[i].end(), modifiedIdx);
			if (it!=_edges[i].end())
			{
				pathBuf[nEdges*(nEdges-1)/2+i] = 1;
				break;
			}
		}
	}

	for (int k=0; k<nEdges+1; ++k)
	{
		for (int i=0; i<nEdges+1; ++i)
		{
			if (i==k)
			{
				continue;
			}
			for (int j=0; j<i; ++j)
			{
				if (j==k)
				{
					continue;
				}
				int idxIJ = i*(i-1)/2+j;
				int idxIK = i>k?i*(i-1)/2+k:k*(k-1)/2+i;
				int idxJK = j>k?j*(j-1)/2+k:k*(k-1)/2+j;

				pathBuf[idxIJ] = min(pathBuf[idxIJ], pathBuf[idxIK]+pathBuf[idxJK]);
			}
		}
	}

	for (int i=0; i<nEdges; ++i)
	{
		distVec[i+_nVertices] = pathBuf[nEdges*(nEdges-1)/2+i];
		for (int j=0; j<_edges[i].size(); ++j)
		{
			distVec[_edges[i][j]] = min(distVec[i+_nVertices]+1, distVec[_edges[i][j]]);
		}
	}

	return distVec;
}