⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connectivity.cpp

📁 一个通过矩阵运算得到图形连接关系的动态连接库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	for(i=0; i<g_netModel.nNodeSum; i++)
	{
		*(pMatrixLocal+i) = new int[g_netModel.nNodeSum+2];
		memset(*(pMatrixLocal+i),0,sizeof(int)*(g_netModel.nNodeSum+2));
		*(*(pMatrixLocal+i)+i) = 1;
	}

	return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】       AVInitNodeMatrix()
【函数功能】       由初始状态初始化节点连通性分析矩阵(After state init)
【输入参数】	   无
【输出参数】	   无
【特殊说明】	   该函数只能在进行全局初始化的时候调用,因为它只是对节点矩阵进行重新计算
				   而没有重新初始化计算过程所依赖的节点信息、元件信息等网络模型基本信息
*****************************************************************************/
AV_EXPORT USHORT AVInitNodeMatrix()
{
	if(g_netModel.nComponentSum == 0 || g_netModel.pComponentInfo == NULL) return AVERR_NOT_FOUND;
	if(g_pMatrixNodeOrigin == NULL) return AVERR_NOT_FOUND;

	//由元件状态初始化网络拓扑模型的节点矩阵(为完全对称矩阵)
	for(int i=0; i<g_netModel.nComponentSum; i++)
	{
		if((g_netModel.pComponentInfo+i)->nState != 1) continue;
		if((g_netModel.pComponentInfo+i)->nPortSum <= 1) continue;
		for(int j=0; j<(g_netModel.pComponentInfo+i)->nPortSum; j++)
		{
			if(((g_netModel.pComponentInfo+i)->pPortInfo+j)->nType == PORT_TYPE_SINGLE) continue;
			int nNodeRef = ((g_netModel.pComponentInfo+i)->pPortInfo+j)->nNode;
			if(nNodeRef < 0 || nNodeRef >= g_netModel.nNodeSum) continue;
			for(int k=j; k<(g_netModel.pComponentInfo+i)->nPortSum; k++)
			{
				if(((g_netModel.pComponentInfo+i)->pPortInfo+k)->nType == PORT_TYPE_SINGLE) continue;
				int nNodeTag = ((g_netModel.pComponentInfo+i)->pPortInfo+k)->nNode;
				if(nNodeTag < 0 || nNodeTag >= g_netModel.nNodeSum) continue;
				*(*(g_pMatrixNodeOrigin+nNodeRef)+nNodeTag) = 1;
				*(*(g_pMatrixNodeOrigin+nNodeTag)+nNodeRef) = 1;
			}
		}
	}
	CopyNodeMatrix(g_pMatrixNodeCurrent,g_pMatrixNodeOrigin);
	CalcNodeMatrix(g_pMatrixNodeCurrent);
	CopyNodeMatrix(g_pMatrixNodePrev,g_pMatrixNodeCurrent);

	return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】       AVRefreshPrevNodeMatrix()
【函数功能】       由后一状态更新前一状态节点联通性分析矩阵
【输入参数】	   无
【输出参数】	   无
*****************************************************************************/
AV_EXPORT USHORT AVRefreshPrevNodeMatrix()
{
	if(g_pMatrixNodePrev == NULL) return AVERR_OVER;
	CopyNodeMatrix(g_pMatrixNodePrev,g_pMatrixNodeCurrent);
	return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】       AVGetPrevConnectiveSubsetSum(int* nSum,int** pNodeRef)
【函数功能】       获取当前分析模型下的连通子集数目
【输入参数】	   无
【输出参数】	   连通子集数目
*****************************************************************************/
AV_EXPORT USHORT AVGetPrevConnectiveSubsetSum(int* nSum,int** pNodeRef)
{
	if(g_pMatrixNodePrev == NULL) return AVERR_OVER;

	CIntArray flagArray;
	CIntArray nodeArray;
	int nCount = g_netModel.nNodeSum;
	for(int i=0; i<nCount; i++)
	{
		BOOL bFind = FALSE;
		for(int j=0; j<flagArray.GetSize(); j++)
		{
			if(*(*(g_pMatrixNodePrev+i)+nCount) == flagArray[j])
			{
				bFind = TRUE;
				break;
			}
		}
		if(!bFind)
		{
			//独立节点认为是子集(2003.05.19 By Luo kaiming for AutoTicket) 
			flagArray.Add(*(*(g_pMatrixNodePrev+i)+nCount));
			nodeArray.Add(i);
/*			int nNodeCount = 0;
			for(j=0; j<nCount; j++)
			{
				if(*(*(g_pMatrixNodePrev+i)+j) == 1) nNodeCount ++;
				if(nNodeCount >= 2)
				{
					flagArray.Add(*(*(g_pMatrixNodePrev+i)+nCount));
					nodeArray.Add(i);
					break;
				}
			}*/
		}
	}
	*nSum = nodeArray.GetSize();
	if(*nSum >= 1 && pNodeRef != NULL)
	{
		*pNodeRef = new int[*nSum];
		for(i=0; i<*nSum; i++)
			*(*pNodeRef+i) = nodeArray[i];
	}

	return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】       AVGetPrevConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
【函数功能】       由节点ID获取当前分析模型该节点所在的连通子集
【输入参数】	   指定节点nNodeID
【输出参数】	   指定节点所在的连通子集pSubset
*****************************************************************************/
AV_EXPORT USHORT AVGetPrevConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
{
	if(nNodeID < 0 || nNodeID >= g_netModel.nNodeSum) return AVERR_OVER;
	if(g_pMatrixNodePrev == NULL) return AVERR_OVER;

	//收集并填充节点序列、元件(必须所有节点均在子集内的)序列
	CIntArray intArray;
	typedef CTypedPtrList<CPtrList,AV_COMPONENT_INFO*>CComponentInfoList;
	CComponentInfoList componentInfoList;
	for(int i=0; i<g_netModel.nNodeSum; i++)
	{
		if(*(*(g_pMatrixNodePrev+nNodeID)+i) != 1) continue;

		intArray.Add(i);
		AV_NODE_INFO* pNodeInfo = g_netModel.pNodeInfo + i;
		for(int j=0; j<pNodeInfo->nComponentSum; j++)
		{
			//此处元件的由于需要考虑状态,因此必须到元件集中查找
			AV_COMPONENT_INFO* pComponent = NULL;
			pComponent = GetComponentInfoByID(pNodeInfo->pKeyInfo+j);
			if(!pComponent) continue;
			//状态为1的元件必然在此子集内
			if(pComponent->nState == 1)
			{
				//如果某个元件只有中性点端子在此子集内则应该排除(2003.11.24 for not process single port function)
				BOOL bNodeOnlySinglePort = TRUE;
				for(int k=0; k<pComponent->nPortSum; k++)
				{
					int nPortNode = (pComponent->pPortInfo+k)->nNode;
					if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum) break;
					if(*(*(g_pMatrixNodePrev+nNodeID)+nPortNode) == 1)
					{
						if((pComponent->pPortInfo+k)->nType != PORT_TYPE_SINGLE)
						{
							bNodeOnlySinglePort = FALSE;
							break;
						}
					}
				}
				if(!bNodeOnlySinglePort)
				{
					if(!componentInfoList.Find(pComponent))
						componentInfoList.AddTail(pComponent);
				}
			}
			else
			{
				BOOL bAllNodeInSubset = TRUE;
				for(int k=0; k<pComponent->nPortSum; k++)
				{
					int nPortNode = (pComponent->pPortInfo+k)->nNode;
					if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum) 
					{
						bAllNodeInSubset = FALSE;
						break;
					}
					if(*(*(g_pMatrixNodePrev+nNodeID)+nPortNode) == 0)
					{
						bAllNodeInSubset = FALSE;
						break;
					}
				}
				//如果状态不为1,但是其上所有节点均在子集内,则该元件也在子集内
				if(bAllNodeInSubset)
				{
					if(!componentInfoList.Find(pComponent))
						componentInfoList.AddTail(pComponent);
				}
			}
		}
	}
	pSubset->nNodeSum = intArray.GetSize();
	if(pSubset->nNodeSum >= 1)
	{
		pSubset->pNodeInfo = new int[pSubset->nNodeSum];
		for(i=0; i<pSubset->nNodeSum; i++)
			*(pSubset->pNodeInfo+i) = intArray[i];
	}
	pSubset->nComponentSum = componentInfoList.GetCount();
	if(pSubset->nComponentSum >= 1)
	{
		pSubset->pKeyInfo = new AV_KEY_INFO[pSubset->nComponentSum];
		int i = 0;
		POSITION pos = componentInfoList.GetHeadPosition();
		while(pos)
		{
			AV_COMPONENT_INFO* pComponent = (AV_COMPONENT_INFO*)componentInfoList.GetNext(pos);
			*(pSubset->pKeyInfo+i) = pComponent->keyInfo;
			i++;
		}
	}

	return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】       AVGetCurrentConnectiveSubsetSum(int* nSum,int** pNodeRef)
【函数功能】       获取当前分析模型下的连通子集数目
【输入参数】	   无
【输出参数】	   连通子集数目
*****************************************************************************/
AV_EXPORT USHORT AVGetCurrentConnectiveSubsetSum(int* nSum,int** pNodeRef)
{
	if(g_pMatrixNodeCurrent == NULL) return AVERR_OVER;

	CIntArray flagArray;
	CIntArray nodeArray;
	//对矩阵进行行扫描
	int nCount = g_netModel.nNodeSum;
	for(int i=0; i<nCount; i++)
	{
		//一旦i行的连通子集标志已经被计数则继续下一行
		BOOL bFind = FALSE;
		for(int j=0; j<flagArray.GetSize(); j++)
		{
			if(*(*(g_pMatrixNodeCurrent+i)+nCount) == flagArray[j])
			{
				bFind = TRUE;
				break;
			}
		}
		if(!bFind)
		{
			//独立节点认为是子集(2003.05.19 By Luo kaiming for AutoTicket) 
			flagArray.Add(*(*(g_pMatrixNodeCurrent+i)+nCount));
			nodeArray.Add(i);
/*			int nNodeCount = 0;
			for(j=0; j<nCount; j++)
			{
				if(*(*(g_pMatrixNodeCurrent+i)+j) == 1) nNodeCount ++;
				if(nNodeCount >= 2)
				{
					flagArray.Add(*(*(g_pMatrixNodeCurrent+i)+nCount));
					nodeArray.Add(i);
					break;
				}
			}*/
		}
	}
	*nSum = nodeArray.GetSize();
	if(*nSum >= 1 && pNodeRef != NULL)
	{
		*pNodeRef = new int[*nSum];
		for(i=0; i<*nSum; i++)
			*(*pNodeRef+i) = nodeArray[i];
	}

	return AV_NO_ERR;
}
/*****************************************************************************
【函数名称】       AVGetCurrentConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
【函数功能】       由节点ID获取当前分析模型该节点所在的连通子集
【输入参数】	   指定节点nNodeID
【输出参数】	   指定节点所在的连通子集pSubset
*****************************************************************************/
AV_EXPORT USHORT AVGetCurrentConnectiveSubsetByNode(AV_NET_SUBSET* pSubset,int nNodeID)
{
	if(nNodeID < 0 || nNodeID >= g_netModel.nNodeSum) return AVERR_OVER;
	if(g_pMatrixNodeCurrent == NULL) return AVERR_OVER;


	//收集并填充节点序列、元件(必须所有节点均在子集内的)序列
	CIntArray intArray;
	typedef CTypedPtrList<CPtrList,AV_COMPONENT_INFO*>CComponentInfoList;
	CComponentInfoList componentInfoList;
	for(int i=0; i<g_netModel.nNodeSum; i++)
	{
		if(*(*(g_pMatrixNodeCurrent+nNodeID)+i) != 1) continue;

		intArray.Add(i);
		AV_NODE_INFO* pNodeInfo = NULL;
		AVGetNetNodeInfo(i,&pNodeInfo);
		if(!pNodeInfo) continue;
		for(int j=0; j<pNodeInfo->nComponentSum; j++)
		{
			//此处元件的由于需要考虑状态,因此必须到元件集中查找
			AV_COMPONENT_INFO* pComponent = NULL;
			pComponent = GetComponentInfoByID(pNodeInfo->pKeyInfo+j);
			if(!pComponent) continue;
			//状态为1的元件不一定必然在此子集内
			if(pComponent->nState == 1)
			{
				//如果某个元件只有中性点端子在此子集内则应该排除(2003.11.24 for not process single port function)
				BOOL bNodeOnlySinglePort = TRUE;
				for(int k=0; k<pComponent->nPortSum; k++)
				{
					int nPortNode = (pComponent->pPortInfo+k)->nNode;
					if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum) break;
					if(*(*(g_pMatrixNodeCurrent+nNodeID)+nPortNode) == 1)
					{
						if((pComponent->pPortInfo+k)->nType != PORT_TYPE_SINGLE)
						{
							bNodeOnlySinglePort = FALSE;
							break;
						}
					}
				}
				if(!bNodeOnlySinglePort)
				{
					if(!componentInfoList.Find(pComponent))
						componentInfoList.AddTail(pComponent);
				}
			}
			else
			{
				BOOL bAllNodeInSubset = TRUE;
				for(int k=0; k<pComponent->nPortSum; k++)
				{
					int nPortNode = (pComponent->pPortInfo+k)->nNode;
					if(nPortNode < 0 || nPortNode >= g_netModel.nNodeSum) 
					{
						bAllNodeInSubset = FALSE;
						break;
					}
					if(*(*(g_pMatrixNodeCurrent+nNodeID)+nPortNode) == 0)
					{
						bAllNodeInSubset = FALSE;
						break;
					}
				}
				//如果状态不为1,但是其上所有节点均在子集内,则该元件也在子集内
				if(bAllNodeInSubset)
				{
					if(!componentInfoList.Find(pComponent))
						componentInfoList.AddTail(pComponent);
				}
			}
		}
	}
	pSubset->nNodeSum = intArray.GetSize();
	if(pSubset->nNodeSum >= 1)
	{
		pSubset->pNodeInfo = new int[pSubset->nNodeSum];
		for(i=0; i<pSubset->nNodeSum; i++)
			*(pSubset->pNodeInfo+i) = intArray[i];
	}
	pSubset->nComponentSum = componentInfoList.GetCount();
	if(pSubset->nComponentSum >= 1)
	{	
		pSubset->pKeyInfo = new AV_KEY_INFO[pSubset->nComponentSum];
		int i = 0;
		POSITION pos = componentInfoList.GetHeadPosition();
		while(pos)
		{
			AV_COMPONENT_INFO* pComponent = (AV_COMPONENT_INFO*)componentInfoList.GetNext(pos);
			*(pSubset->pKeyInfo+i) = pComponent->keyInfo;
			i++;
		}
	}

	return AV_NO_ERR;
}

#ifdef __cplusplus
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -