2022 Concurso Nacional de Modelado Matemático para Graduados Copa Huawei Pregunta D Arquitectura PISA Chip Disposición de recursos Proceso de resolución de problemas Documentos y procedimientos

Concurso Nacional de Modelado Matemático para Graduados 2022 Copa Huawei

Pregunta D: Problema de disposición de recursos del chip de la arquitectura PISA

Título original reproducido:

  1. Introducción a los antecedentes
Los chips son la base de la industria electrónica. En la actual situación internacional cada vez más compleja, los chips se han convertido en una tecnología de alta tecnología por la que todos los países importantes deben competir. Este tema se centra en los chips de conmutación en el campo de las comunicaciones de red. Los chips de conmutación tradicionales tienen funciones fijas. Cuando aparecen nuevos protocolos de red, los chips deben rediseñarse. A menudo pasan varios años desde el diseño del chip hasta su uso. Por lo tanto, los chips de conmutación de función fija Esto reduce en gran medida la eficiencia de la investigación y el desarrollo. Para resolver este problema, nacieron los chips de conmutación programables. PISA (Arquitectura de conmutador independiente de protocolo) es una de las principales arquitecturas de chips de conmutadores programables actuales. Tiene una velocidad de procesamiento comparable a la de los chips de conmutadores de función fija, a la vez que es programable. Tiene amplios escenarios de aplicación en redes futuras [1 -2 ].
Antes de seguir explicando la arquitectura PISA, primero aclaramos algunos conceptos básicos:
  1. Mensaje: el mensaje es el paquete de datos transmitido en la comunicación de red. En la comunicación de red, los datos transmitidos por el usuario se encapsulan en paquetes de datos uno por uno.
  2. Bloque básico: un bloque básico es un fragmento de programa del programa fuente. Dividir el programa fuente en bloques básicos dividirá el programa fuente en bloques básicos. También vale la pena discutir cómo dividir los bloques básicos, pero está más allá del alcance de esta pregunta y no se desarrollará aquí.
  3. Canalización: la canalización se compone de una serie de unidades de procesamiento conectadas en serie. El mensaje pasa a través de cada unidad de procesamiento en secuencia en la canalización y finalmente se procesa. Cada etapa del proceso se refiere a cada unidad de procesamiento en el proceso.
  La arquitectura PISA se muestra en la Figura 1, que incluye tres componentes: análisis de mensajes (analizador), canalización de procesamiento de mensajes de varios niveles (Pipeline Pocket Process) y reensamblaje de mensajes (Deparser). El análisis de mensajes se utiliza para identificar tipos de mensajes; los canales de procesamiento de mensajes de varios niveles se utilizan para modificar los datos del mensaje. En los chips de arquitectura PISA reales, los diferentes niveles de canalización de chips pueden ser diferentes; el reensamblaje de mensajes se utiliza para volver a ensamblar. Este tema solo se centra en la parte de la canalización de procesamiento de mensajes de varias etapas. En el modelo de programación de la arquitectura PISA, el usuario utiliza el lenguaje P4 para describir el comportamiento de procesamiento de mensajes para obtener el programa P4, y luego el compilador compila el programa P4 para generar código de máquina que se puede ejecutar en el chip. Cuando el compilador compila un programa P4, primero dividirá el programa P4 en una serie de bloques básicos y luego organizará cada bloque básico en varios niveles de la canalización. Dado que cada bloque básico ocupa una cierta cantidad de recursos de chip, organizar los bloques básicos en todos los niveles de la tubería significa organizar los recursos de cada bloque básico en cada nivel de la tubería (es decir, es necesario determinar qué parte de la tubería cada bloque básico está dispuesto a un nivel), por lo que llamamos al problema de disposición de bloques básicos problema de disposición de recursos de chips de arquitectura PISA. En el diseño real de los chips de arquitectura PISA, para reducir la complejidad del cableado, a menudo existen varias restricciones en los recursos en cada nivel de la tubería y en los recursos entre los niveles de la tubería. Esta serie de restricciones de recursos complejas hacen que el El problema de la asignación de recursos es particularmente difícil. Sin embargo, todos los tipos de recursos del chip son limitados. Una mayor utilización de recursos significa que el chip puede utilizar mejor las capacidades del chip y soportar más servicios. Por lo tanto, los algoritmos de disposición de recursos con alta utilización de recursos son importantes para el diseño del compilador.
Insertar descripción de la imagen aquí

Figura 1 Diagrama de arquitectura de PISA
   2. Descripción del problema De la definición del bloque básico, se puede ver que el bloque básico es un fragmento del programa fuente. Las instrucciones se ejecutarán en el bloque básico para completar el cálculo. Cuando se ejecuta la instrucción, el operando fuente de la instrucción ( (es decir, la variable correspondiente al operando de origen leído) se leerá para el cálculo y luego asignará el resultado del cálculo al operando de destino (es decir, escribirá la variable correspondiente al operando de destino). Para los bloques básicos divididos, las instrucciones en cada bloque básico se ejecutan en paralelo. Durante la ejecución, la orden se lee primero y luego se escribe (determinada por la implementación subyacente del chip). Es decir, todos los operandos de destino se leen primero en el al mismo tiempo, y luego todos se ejecutan en paralelo, se calcula la instrucción y finalmente el resultado del cálculo se asigna al operando de destino. Debido a conflictos al escribir varias veces en la misma variable en paralelo, cada bloque básico solo escribirá la misma variable una vez (es decir, no hay múltiples instrucciones en el bloque básico que asigne valores a la misma variable).   Un bloque básico se puede abstraer en un nodo. Después de la abstracción, las instrucciones específicas ejecutadas en el bloque básico se protegen y solo se retiene la información variable de lectura y escritura. Cuando se ejecuta el bloque básico A y puede saltar al bloque básico B para su ejecución, se agrega un borde dirigido entre A y B, de modo que el programa P4 se puede expresar como un gráfico acíclico dirigido (el programa P4 no tiene ciclo), que se llama Haga el diagrama de flujo del programa P4, como se muestra en la imagen izquierda de la Figura 2. La disposición de recursos de la arquitectura PISA consiste en organizar cada nodo (es decir, cada bloque básico) en el diagrama de flujo del programa P4 en todos los niveles del proceso bajo la condición de que se cumplan las restricciones. Las restricciones provienen de dos aspectos, por un lado, provienen del propio programa P4. Cada bloque básico del programa P4 escribirá algunas variables (es decir, asignará valores a las variables) y leerá algunas variables. La escritura de variables provoca dependencia de datos entre bloques básicos. Al mismo tiempo, después de ejecutar un bloque básico, puede saltar a múltiples bloques básicos para su ejecución, de modo que existen dependencias de control entre bloques básicos. La dependencia de datos y la dependencia de control limitan el tamaño relación de las etapas de la tubería organizadas por bloques básicos. En cuanto a los datos, para obtener descripciones detalladas de las dependencias y las dependencias de control, consulte el Apéndice A; por otro lado, las restricciones provienen de las limitaciones de recursos del chip. Los recursos en el chip incluyen cuatro categorías: TCAM , HASH, ALU y QUALIFY (El Apéndice B explica las funciones de las cuatro categorías de recursos y Para que los estudiantes interesados ​​aprendan más, la falta de comprensión no afecta la respuesta a la pregunta). Existen restricciones estrictas sobre estos cuatro tipos de recursos en proceso (las restricciones de recursos específicas se explican en las preguntas de la competencia) y las restricciones de recursos del chip no se pueden violar al organizar los recursos.   En esta pregunta, los datos de entrada dan la relación de adyacencia de cada bloque básico en el diagrama de flujo del programa P4, el número de cuatro tipos de recursos ocupados por cada bloque básico y la información variable leída y escrita por cada bloque básico. de esta pregunta incluyen Los dos subproblemas requieren que los estudiantes organicen los recursos mientras satisfacen las dependencias de datos, las dependencias de control y las restricciones de recursos mencionadas anteriormente de cada subproblema específico, y consideren completamente los objetivos de optimización de cada subproblema para poder maximizar la utilización de recursos del chip.   Para ayudarlo a comprender mejor este problema, en el Apéndice C se proporciona un ejemplo simple de disposición de recursos.

Insertar descripción de la imagen aquí

Figura 2 Diagrama esquemático de la disposición de los recursos de arquitectura de PISA

  3. Descripción de los datos de entrada
  Los datos de entrada contienen tres archivos adjuntos, que proporcionan respectivamente el uso de recursos de cada bloque básico, la información variable leída y escrita por cada bloque básico y los bloques básicos adyacentes de cada bloque básico en el diagrama de flujo. de cada archivo adjunto es el siguiente: (1) adjunto1.csv: La primera columna en la
   tabla de información de recursos utilizada por cada bloque básico es el número de bloque básico, y las columnas segunda a quinta son los números de los cuatro tipos de recursos utilizados por cada bloque básico. Los recursos se dividen en cuatro tipos en
Insertar descripción de la imagen aquí
  total (TCAM, HASH, ALU, QUALIFY). Por ejemplo, como se puede ver en la tabla anterior, el bloque básico No. 0 necesita ocupar 2 recursos ALU y el bloque básico El No. 4 necesita ocupar 10 recursos de ALU y 3 recursos de Calificación.
  (2) adjunto2.csv: la primera columna en la tabla de información variable para lectura y escritura de cada bloque básico
Insertar descripción de la imagen aquí
  indica el número de bloque básico, "W" en la segunda columna indica escritura, "R" indica lectura y las columnas siguientes indican escritura o lectura de este bloque básico variables, cuando una fila no tiene ningún elemento de la tercera columna y columnas posteriores, significa que el bloque básico con este número no escribe (ni lee) ninguna variable (en este momento, el bloque básico El bloque se utiliza simplemente como un bloque básico intermedio que conecta otros bloques básicos, sin realizar ningún cálculo). Por ejemplo: el bloque básico 0 escribe las variables X0 y X1, pero no lee ninguna variable, el bloque básico 1 no escribe ni lee ninguna variable.
  (3) adjunto3.csv: la primera columna de cada bloque básico en la tabla de información del bloque básico adyacente en el diagrama de flujo
Insertar descripción de la imagen aquí
  es el número de bloque básico, y las columnas siguientes son los números de bloque básico adyacentes al bloque básico actual en el diagrama de flujo , es decir, en el diagrama de flujo (como se muestra en la imagen izquierda de la Figura 2), hay una conexión de borde dirigida entre este bloque básico y los bloques básicos en las columnas siguientes. Por ejemplo, en la primera fila de la tabla anterior, podemos ver que hay conexiones de borde dirigidas entre el bloque básico No. 0, el bloque básico No. 1 y el bloque básico No. 2 (es decir, después de la ejecución del bloque básico No. 0, puede saltar al bloque básico No. 1 o al bloque básico No. 2. Se ejecuta el bloque básico No. 2). Desde la tercera línea, podemos ver que no hay ningún borde a partir del bloque básico No. 2 ( es decir, el programa finaliza después de ejecutar el bloque básico 2 y no saltará a otros bloques básicos para su ejecución). A través de este archivo, puede determinar el orden de ejecución de los bloques básicos en el programa fuente, determinar el bloque básico de destino al que saltar después de ejecutar cada bloque básico y luego crear un diagrama de flujo de los bloques básicos.

  4. Problemas
  Este tema necesita establecer un modelo matemático para problemas de disposición de recursos y, sobre esta base, abordar los dos problemas siguientes.
  Pregunta 1: Las restricciones de recursos dadas son las siguientes:
  (1) La cantidad máxima de recursos TCAM en cada nivel de la canalización es 1; (
  2) La cantidad máxima de recursos HASH en cada nivel de la canalización es 2;
  (3) El número máximo de recursos ALU en cada nivel del ducto es 56;
  ( 4) El número máximo de recursos CALIFICADOS para cada nivel del ducto es 64;
  (5) Se acuerda que los niveles 0 y 16, nivel 1 y 17, ..., el nivel 15 y el nivel 31 de la canalización son niveles plegados, y los dos plegados El número total máximo de recursos TCAM de nivel es 1 y el número total máximo de recursos HASH es 3. Nota: Si el número requerido de etapas de canalización excede 32, las etapas que comienzan desde el día 32 no tendrán en cuenta el límite de recursos de plegado; (6)
  El número de etapas pares con recursos TCAM no excede 5;
  (7) Cada El bloque básico solo se puede clasificar como Distribuido al nivel uno.
  Los recursos se organizan según las limitaciones de recursos anteriores y el objetivo de optimización es acortar el número de etapas de tubería ocupadas tanto como sea posible. Proporcione el algoritmo de disposición de recursos y genere el resultado de disposición de bloque básico. El formato del resultado de salida es el siguiente:

Insertar descripción de la imagen aquí
  Pregunta 2: Considere el gráfico de flujo como se muestra en la Figura 3. El bloque básico 2 y el bloque básico 3 no están en el mismo flujo de ejecución (porque después de ejecutar el bloque básico 1, se ejecuta el bloque básico 2 o el bloque básico 3, y el bloque básico Se ejecutan el bloque 2 y el bloque básico 3. No se pueden ejecutar todos los bloques 3). Para ser precisos, en el diagrama de flujo del programa P4, si un bloque básico puede llegar a otro bloque básico, los dos bloques básicos están en el mismo flujo de ejecución y viceversa, no están en el mismo flujo de ejecución. Para este tipo de bloque básico que no está en el mismo proceso de ejecución, se pueden compartir recursos HASH y recursos ALU. Los recursos HASH y recursos ALU de cualquiera de los bloques básicos 2 y 3 no exceden el límite de recursos de cada nivel. Los bloques 2 y 3 se pueden disponer al mismo nivel. Con base en esto, se realizan los siguientes cambios a las restricciones (2), (3) y (5) de la pregunta 1:
  (2) La suma de los recursos HASH de los bloques básicos en el mismo proceso de ejecución en cada etapa de la tubería es como máximo 2;
  (3) La suma máxima de recursos ALU de los bloques básicos en el mismo proceso de ejecución en cada nivel de la tubería es 56; (5)
  Para los dos niveles plegados, las restricciones de recursos TCAM permanecen sin cambios, y para los recursos HASH, cada nivel calcula el mismo proceso de ejecución por separado. Los recursos HASH ocupados por los bloques básicos anteriores se suman a los resultados del cálculo de los dos niveles y el resultado no supera 3.
  Otras restricciones son las mismas que las de la pregunta 1. Después de cambiar las restricciones de recursos, reconsidere la pregunta 1, proporcione el algoritmo de disposición y genere los resultados básicos de la disposición de bloques. El formato de salida es el mismo que el de la pregunta 1.
Insertar descripción de la imagen aquí

Figura 3 Ejemplo de gráfico de flujo

Descripción general del proceso de solución general (resumen)

  A medida que la escasez global de "básicos" continúa fermentando, la tecnología de chips como "alimentos industriales" se ha convertido en una de las industrias en mi país que necesita un avance urgente. Como arquitectura de chip de conmutación con buena velocidad de procesamiento y programabilidad, PISA alivia eficazmente el problema de la baja eficiencia de I+D de los chips de conmutación de función fija tradicionales. Para aprovechar al máximo las capacidades del chip, es particularmente importante la selección de algoritmos de disposición de recursos del chip con una alta utilización de recursos. En vista de esto, este artículo descompone el complejo problema básico de disposición de recursos en bloques en múltiples subproblemas, combina varias restricciones y lo resuelve gradualmente estableciendo un modelo de programación de objetivos y un modelo básico de disposición de bloques, y luego diseña reglas heurísticas para evaluar el resultados de la solución, optimizar y finalmente utilizar las etapas de canalización más cortas posibles como solución al problema.
  Con respecto al problema uno, este artículo lo divide en dos subproblemas: análisis de dependencia y disposición básica de recursos en bloques. Para el subproblema 1, los datos adjuntos adjuntos3.csv se analizan y procesan para obtener el gráfico de flujo de control CFG y el árbol dominante hacia adelante FDT del gráfico de flujo de control. La diferencia entre CFG y FDT es la dependencia de control del bloque básico. En segundo lugar, lea la relación de lectura y escritura de los bloques básicos en adjunto2.csv y utilice el algoritmo de búsqueda en amplitud BFS para determinar la conectividad entre los bloques básicos para determinar la dependencia de los datos. La relación de dependencia completa se obtiene mediante la unión de la relación de dependencia de control y la relación de dependencia de datos. Para el subproblema 2, la relación de dependencia completa se abstrae en un gráfico acíclico dirigido ponderado y se determina inicialmente la relación jerárquica de los bloques básicos dispuestos en la tubería. Luego, con el objetivo principal de ocupar el menor número posible de etapas del proceso, se estableció un modelo de planificación de objetivos basado en los requisitos básicos de recursos del bloque en el archivo adjunto1.csv y las restricciones de recursos dadas. Para resolver el modelo, se diseña un modelo de disposición de bloques básicos. Basado en el principio de disposición en serie, los bloques básicos se seleccionan de bloques básicos sin dependencias de pedidos anticipados de acuerdo con reglas aleatorias y se colocan en la etapa más temprana de la tubería que se puede colocar hasta que todos Los bloques básicos están completos. La pregunta 1 muestra que el número de etapas ocupadas del oleoducto es 40.
  Con respecto a la pregunta dos, dado que los bloques básicos que no están en un proceso de ejecución pueden compartir recursos HASH y recursos ALU, introducimos el concepto de bloques básicos que no están en un proceso de ejecución según la pregunta uno, lo que alivia el problema de HASH y ALU en Pregunta uno: Problemas de ocupación. Este artículo descompone el problema 2 en dos subproblemas: determinar si dos bloques básicos están en el mismo proceso de ejecución y organizar los recursos del bloque básico. Para el subproblema 1, de acuerdo con el diagrama de flujo del programa, el algoritmo de búsqueda en amplitud se utiliza para determinar si dos bloques básicos están en el mismo proceso de ejecución, es decir, si comenzando desde un bloque básico se puede llegar a otro bloque básico, y Obtenga la matriz de simetría de relación del proceso de ejecución de bloque básico. Para la pregunta dos, el objetivo principal es ocupar el menor número posible de etapas de canalización, combinado con la condición de que los bloques básicos que no están en el mismo proceso de ejecución puedan compartir recursos HASH y ALU y las tres restricciones modificadas, un objetivo similar a la pregunta. Se establece un modelo de planificación. Al resolver, para tuberías con nuevas disposiciones de bloques básicos, se combinan los requisitos de recursos para HASH y ALU de bloques básicos en diferentes flujos de control en este nivel de tubería. La pregunta 2 muestra que el número de etapas ocupadas por el gasoducto es 34.
  La optimización de la solución tiene en cuenta la inestabilidad de la selección de reglas aleatorias y optimiza las reglas básicas de selección de bloques. Este artículo construye 6 heurísticas, incluida la hora de inicio más temprana EST, el bloque de recursos más siguiente MST, la hora de inicio más temprana y el bloque de recursos más siguiente EST_MST Formule reglas y seleccione los bloques básicos que se agregarán al canal en función de reglas heurísticas. Este artículo combina los resultados óptimos de resolver 10 reglas aleatorias y 6 reglas heurísticas como el plan de diseño final de la tubería. Después de la optimización, el número de etapas de tubería ocupadas en la pregunta 1 es 40. La pregunta 2 muestra que el número de etapas ocupadas por el gasoducto es 34. Finalmente, este artículo encontró que el cuello de botella de rendimiento del problema 1 radica en los recursos HASH, y el cuello de botella de rendimiento del problema 2 radica en los recursos TCAM. Al considerar de manera integral las dependencias de control, las dependencias de datos y las limitaciones de recursos de todos los niveles de las tuberías, se demuestra la efectividad y universalidad de la solución propuesta. Se resumen las ventajas y desventajas del algoritmo y modelo propuestos y se prospectan futuros trabajos de investigación.

Supuestos del modelo:

  [1] Se supone que todos los escenarios experimentales se encuentran en un estado ideal y no se ven afectados por factores como la temperatura y el electromagnetismo.
  [2] Se supone que no hay errores causados ​​por fallas del chip durante el experimento.
  [3] Supongamos que solo nos centramos en la parte del canal de procesamiento de mensajes de múltiples etapas del chip de arquitectura PISA.
  [4] Suponga que las condiciones para cada nivel del oleoducto son las mismas excepto por las limitaciones de recursos dadas en la pregunta.
  [5] Supongamos que no existe un límite superior en el número de etapas de la tubería que se pueden organizar.
  [6] Se supone que el proceso de siembra de números aleatorios en un modelo aleatorio es completamente aleatorio.

análisis del problema:

Análisis del problema uno:

  La pregunta 1 requiere considerar las dependencias de datos y de control entre bloques básicos, y combinar las restricciones de recursos dadas para realizar la disposición y optimización de los recursos de bloques básicos para hacer que el número de etapas de tubería ocupadas sea lo más corto posible para maximizar los recursos del chip. .
La pregunta proporciona adjunto1.csv, adjunto2.csv y adjunto3.csv. Los tres archivos adjuntos son la información de recursos utilizada por cada bloque básico, la información variable leída y escrita por cada bloque básico y la información del bloque básico adyacente de cada bloque básico. en el diagrama de flujo.
  A través del análisis de la pregunta, llegamos a la conclusión de que esta pregunta se puede dividir en los siguientes tres subproblemas:
  Subproblema 1: Al diseñar algoritmos y modelos, procesar y analizar los datos en el Apéndice 2 y el Apéndice 3 para determinar las dependencias de control. entre los bloques básicos y las dependencias de datos para determinar inicialmente la relación jerárquica entre los bloques básicos dispuestos en la tubería.
  Subpregunta 2: Combine las restricciones de recursos dadas en la pregunta y los datos de uso de recursos en el Apéndice 1 para establecer un modelo y determinar la disposición en serie de los bloques básicos en la tubería.
  Subproblema tres: Optimice la disposición de los bloques básicos para que el número de etapas de la tubería ocupadas por los bloques básicos sea lo más corto posible.

Análisis de la pregunta dos:

  La pregunta 2 introduce el concepto de bloques básicos que no están en un proceso de ejecución según la pregunta 1. Para los bloques básicos que no están en un proceso de ejecución, los recursos HASH y los recursos ALU se pueden compartir. Por lo tanto, el problema dos alivia la ocupación de HASH y ALU para el problema uno. La pregunta también requiere dar el algoritmo y los resultados de la disposición de los bloques básicos en la tubería, pero las restricciones cambian.
  Combinado con el análisis, el problema dos se puede dividir en los dos subproblemas siguientes:
  Subproblema uno: con base en el diagrama de flujo del programa, establezca un modelo para determinar si un bloque básico puede alcanzar otro bloque básico, es decir, si Los dos bloques básicos están en el mismo flujo de ejecución.
  Subproblema 2: Combinar la condición de que los bloques básicos que no están en el mismo proceso de ejecución puedan compartir recursos HASH y ALU y las restricciones modificadas, establecer un modelo para determinar la disposición de etapas de los bloques básicos en la tubería y crear la tubería ocupada. etapas Mantenga el número lo más corto posible.

Miniatura general del documento sobre establecimiento y solución del modelo

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Para ver todos los artículos, consulte "Solo modelado de tarjetas de presentación QQ" a continuación. Simplemente haga clic en la tarjeta de presentación QQ.

código:

Algunos programas de Python son los siguientes:

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import csv
import scipy as sp
# 入度
inGF = []
# 第一步:dfs
dfn = []
rak = []
fa = []
search_path = []
# 第二步:sdom
val = []
bel = []
sdom = []
# 第三步:idom
idom = []
# 比较获取 CDG
cdg = []
idomGF = nx.DiGraph()
def read_csv3(file_name):
f = open(file_name, encoding='UTF8')
csv_reader = csv.reader(f)
control_edges = []
for line in csv_reader:
adj_num = len(line)
if adj_num > 1:
for i in range(1, adj_num):
control_edges.append((int(line[0]), int(line[i])))
f.close()
# print(control_edges)
return control_edges
def subgraph(pointList, linkList):
G = nx.DiGraph()
GF = nx.DiGraph()
# 转化为图结构
for node in pointList:
G.add_node(node)
GF.add_node(node)
for link in linkList:
G.add_edge(link[0], link[1])
GF.add_edge(link[1], link[0])
return G, GF
def dfs(GF):
# GF 的 root 为人为添加的序号最大的根
root = len(GF.nodes) - 1
T = nx.dfs_tree(GF, root)
for n in GF.nodes():
fa.append(0)
dfn.append(n)
global rak
rak = list(T) # 所有节点
for i in range(0, len(fa)):
dfn[rak[i]] = i
for i in list(T.edges): # 所有边
fa[i[1]] = i[0]
# print(dfn)
# print(rak)
# print(fa)
def find(v):
# 还未被遍历
if v == bel[v]:
return v
tmp = find(bel[v])
if (dfn[sdom[val[bel[v]]]] < dfn[sdom[val[v]]]):
val[v] = val[bel[v]]
bel[v] = tmp
return bel[v]
def tarjanFDT():
# 初始化 val 和 sdom
for i in range(0, len(dfn)):
val.append(i)
sdom.append(i)
bel.append(i)
idom.append(i)
# 从大到小遍历 dfs 树
for i in range(len(dfn) - 1, 0, -1):
# dfs 序最大的点 u
u = rak[i]
# 获取 GF 原图中所有 u 的前驱
neighbors = G.neighbors(u)
for v in neighbors:
find(v)
if (dfn[sdom[val[v]]] < dfn[sdom[u]]):
sdom[u] = sdom[val[v]]
# print(sdom)
sdomGF = nx.DiGraph()
for i in range(0, len(sdom)):
sdomGF.add_node(i)
sdomGF.add_edge(sdom[i], i)
bel[u] = fa[u]
u = fa[u]
neighbors = sdomGF.neighbors(u)
for v in neighbors:
find(v)
if sdom[val[v]] == u:
idom[v] = u
else:
idom[v] = val[v]
for i in range(0, len(dfn)):
u = rak[i]
if idom[u] != sdom[u]:
idom[u] = idom[idom[u]]
global idomGF
for i in range(0, len(idom)):
idomGF.add_node(i)
idomGF.add_edge(idom[i], i)
# nx.draw_networkx(sdomGF, with_labels=True)
# plt.show()
# nx.draw_networkx(idomGF, with_labels=True)
# plt.show()
def getInGF():
# 遍历 GF 所有点
for i in range(0, len(GF.nodes)):
# 初始化:0 标识入度为 0
inGF.append(0)
for edge in GF.edges:
inGF[edge[1]] = 1
def addGFRoot():
# print(len(GF.nodes))
GF.add_node(len(GF.nodes))
for i in range(0, len(inGF)):
if inGF[i] == 0:
GF.add_edge(len(GF.nodes) - 1, i

# nx.draw_networkx(GF, with_labels=True)
# plt.show()
if __name__ == '__main__':
# 读 attachment3.cvs
linkList = read_csv3("./data/attachment3.csv")
pointList = []
for i in range(0, 607):
pointList.append(i)
# 原始有向无环图 G,反向图 GF
G, GF = subgraph(pointList, linkList)
# 获取 GF 入度为 0 的所有点
getInGF()
# 为 GF 添加根节点
addGFRoot()
# 获取 G 的前向支配树,也就是 GF 的支配树,存储在 idomGF 中(即
FDT)
dfs(GF)
tarjanFDT()
# 对比 G 原图和 FDT 图,寻找在 G 但不在 FDT 中的边,得到 CDG
for edgeG in G.edges:
edgeGf = (edgeG[1], edgeG[0])
# 标识是都存在相同,初始化为 0
flag = 0
for edgefdt in idomGF.edges:
if edgeGf == edgefdt:
flag = 1
break
else:
continue
if flag == 0:
cdg.append(edgeG)
f = open("./data/control_dependance_less_equal.txt", "w")
f.writelines(str(cdg))
f.close()
print(len(cdg))
print(cdg)
Para ver todos los artículos, consulte "Solo modelado de tarjetas de presentación QQ" a continuación. Simplemente haga clic en la tarjeta de presentación QQ.

Supongo que te gusta

Origin blog.csdn.net/weixin_43292788/article/details/132836811
Recomendado
Clasificación