基于昇思MindSpore Quantum,实现量子虚时演化算法

news2025/2/4 1:04:37

01、关于昇思MindSpore项目介绍

1.项目名称

基于昇思MindSpore Quantum,实现量子虚时演化算法

2.项目链接

https://summer-ospp.ac.cn/#/org/prodetail/221cb0176

3.项目描述

在本次项目中,我们将运用MindSpore Quantum框架在量子线路上完成虚时演化算法的实现,并运用算法程序解决一些量子多体系统的基态能求解问题。

02、项目开发理论描述

1.项目名称

摘要

虚时演化方法是研究量子体系的非常强大的一个工具。不仅在含时演化问题中常常用到,并且还可以用来计算多体系统Hamiltonian的基态问题即虚时演化算法。尽管在经典计算机上实现这一算法来求解多体系统的基态能是可行的,但是由于随着体系尺寸的扩大内存和计算时间的需求会指数级增长。

而由于量子计算的特性,量子计算机可以很高效的模拟量子体系,但是如何在量子线路上模拟这种非幺正的虚时演化是一个问题。所以在本次2022开源之夏活动中,我们将聚焦这一问题,思考能否在量子计算机中,用量子线路的方式实现这种量子虚时演化算法来解决一些分子体系的基态能问题。

事实上,近些年来在这个问题上已经有一些显著的研究。比喻说,在这篇文章中[Motta, Mario, et al.Nature Physics 16.2 (2020): 205-210]【1】,作者提出一种QITE(Quantum Imaginary Time Evolution)算法,指出在量子线路中实现非幺正的演化算符是有可能的。

除此之外,在另一篇文章中[McArdle, Sam, et al.npj Quantum Information 5.1 (2019): 1-6.]【2】也提出了一种实现方式。不同于前者,McArdle et al. 指出一种基于变分算法来实现虚时演化的途径,称之为VITE(Variational Quantum Imaginary Time Evolution)算法。并且在文中向读者展示了这一算法针对分子体系的基态能求解问题的有效性。除此之外,我们还发现这一基于变分途径实现的算法非常适合在量子线路上实现。

又由于[MindSpore Quantum]【3】恰好给我们提供了简洁又高效的工具来搭建量子线路,实现文中提出来的算法。于是在本次开源之夏项目中,我们将基于MindSpore Quantum其强大的功能,在验证VITE算法有效性的基础上,思考其针对更大的分子体系的可能以及最后我们还将探究线路噪声对算法的影响。

理论详解

对于一个量子体系,我们常常可以用一个多体Hamiltonian $H$。如果给定一个任意初始态 $| \psi \rangle$,那么其虚时演化可以定义为:

$$| \psi (\tau) \rangle = A(\tau) e^{-H \tau} | \psi (0) \rangle$$

其中$A(\tau) = 1/ \sqrt{\langle \psi(0)| e^{-2H\tau}| \psi(0) \rangle}$是归一化系数。而如果初始态与基态有一个非零的overlap,那么在 $\tau \to \infty$ 时演化的末态将趋于$H$的基态。正是由于这一特性,我们可以通过选取合适的初始态,通过模拟其虚时演化的过程来求解体系的基态波函数和能量。

而在量子线路中,我们可以运用含参的量子态$| \phi (\vec{\theta}(\tau)) \rangle$来近似得到演化态,其中:

$\vec{\theta}(\tau) = ( \theta_1(\tau), \theta_2(\tau),\ldots, \theta_N(\tau) )$

而这样一来,我们就可以运用量子门在量子线路上制备这一含参态。具体做法是,我们可以将一系列的量子门:

$$ V(\vec{\theta}) = U_N(\theta_N) \ldots U_k(\theta_k) \ldots U_1(\theta_1) $$

作用在初始态零态$|\bar{0} \rangle$上即可 i.e. $|\phi(\vec{\theta}) \rangle = V(\vec{\theta}) | \bar{0} \rangle$。这里的$V(\vec{\theta})$将其称之为我们的Ansatz线路。

而如果我们对含参的演化态运用麦克阿兰变分原理(McLachlan's variational principle),可以得到:

$$\delta || \left( \partial/\partial \tau + H - E_{\tau} \right) | \psi(\tau) \rangle || = 0$$

其中:

$|| \rho || = Tr \left[ \sqrt{\rho \rho^{\dagger}} \right]$,$E_{\tau} = \langle \psi{\tau} | H | \psi{\tau} \rangle$

所以我们可以基于变分原理,将$| \psi (\tau) \rangle$ 替换为 $| \phi (\tau) \rangle = | \phi (\vec{\theta}(\tau))$。这样一来,我们就有了:

$$\begin{align}|| \partial/ \partial \tau + H - E_{\tau} | \psi(\tau) \rangle ||& =\left( (\partial/\partial \tau + H - E_{\tau}) | \psi(\tau) \rangle \right)^{\dagger}\left( (\partial/\partial \tau + H - E_{\tau}) | \psi(\tau) \rangle \right) \\& =\sum_{i,j} \frac{\partial \langle \phi (\tau) |}{\partial \theta_i} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_j} \dot{\theta_i} \dot{\theta_j} + \sum_{i} \frac{\partial \langle \phi(\tau)|}{\partial \theta_i} \left( H - E_{\tau} \right) | \phi(\tau)\rangle \dot{\theta_i} \\& =\sum_{i} \langle \phi(\tau)| (H - E_\tau) \frac{\partial | \phi (\tau)\rangle}{\partial \theta_i} \dot{\theta_i}+ \langle \phi(\tau)| \left( H - E_\tau \right)^2 | \phi(\tau)\rangle.\end{align}$$

对于 $\dot{\theta_i}$,我们有:

$$\begin{align}\frac{(\partial || \partial / \partial \tau + H - E_\tau ) | \phi(\tau) \rangle||}{\partial \dot{\theta_i}}& = \sum_{j} \left( \frac{\partial \langle \phi(\tau)|}{\partial \theta_i} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_j} + \frac{\partial \langle \phi (\tau)|}{\partial \theta_j} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_i} \right) \dot{\theta_j} \\& + \frac{\partial \langle \phi (\tau)|}{\partial \theta_i} (H - E_\tau)|\phi(\tau) \rangle + \langle \phi (\tau) | (H - E_\tau) \frac{\partial \phi (\tau) \rangle}{\partial \theta_i}\end{align}$$

考虑到演化态 $| \phi (\tau) \rangle$的归一化条件:

$$ \langle \phi(\tau)| \phi(\tau) \rangle = 1,$$

于是我们有:

$$E_\tau \frac{\partial \langle \phi(\tau)|\phi(\tau)\rangle}{\partial \theta_i}= E_\tau \left( \frac{\partial \langle \phi (\tau) |}{\partial \theta_i} | \phi(\tau) \rangle+ \langle \phi(\tau)| \frac{\partial | \phi (\tau) \rangle}{\partial \theta_i} \right) = 0$$

我们将其带回到偏导式中,可以化简为:

$$\frac{\partial || (\partial / \partial \tau + H - E_\tau) | \phi (\tau) \rangle ||}{\partial \dot{\theta_i}}= \sum_{j} A_{ij} \dot{\theta}_j - C_i.$$

其中:

$$A_{ij} = \Re \left( \frac{\partial \phi(\tau)|}{\partial \theta_i} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_j}\right),$$
$$C_i = - \Re \left( \frac{\partial \langle \phi (\tau)|}{\partial \theta_i} H | \phi (\tau) \rangle \right).$$

而麦克阿兰变分原理要求:

$$\frac{\partial || (\partial / \partial \tau + H - E_\tau)| \phi(\tau) \rangle||}{\partial \dot{\theta}_j} = 0,$$

那这就等价于:

$$\sum_j A_{ij} \dot{\theta}_j = C_i$$

至此,我们运用参数化的Ansatz线路来得到含参的演化态,借助麦克阿兰变分原理将虚时演化的过程转化为一个在量子线路上实现的一个演化过程,并且其给出了我们Ansatz线路的参数更新的要满足的要求。

算法初步实现-基于MindSpore Quantum

通过以上理论推导,不难发现若对于一个给定的量子多体体系,我们要实现VITE算法,可以将其分解成三个问题:

(1)量子体系的Hamiltonian的表达

(2)合适的Ansatz线路的选择

(3)$A_{ij}$ 矩阵和 $C_i$ 向量的计算以及参数的更新。

前两个问题和具体要处理的量子体系有关,虽也有很多细节但并不是本次开源之夏项目重点,如若有疑问可以观看我之前关于这部分内容的线上分享[2022量子计算Hackthon大赛分享]【4】。而本节我将针对第三个问题,简单解释如何基于MindSpore Quantum解决这一问题。幸运的是在0.7.0及以上版本的MindSpore Quantum库里,更新了Quantum Fisher Information板块,其中的函数`mindquantum.core.circuit.partial_psi_partial_psi(circuit, backend)`给了一种很好的方式去计算$A_{ij}$ 矩阵。其具体原理是:对于一个初始态$|\bar{0} \rangle$,如果我们对其演化一系列的幺正量子门。

$$ V(\vec{\theta}) = U_N(\theta_N) \ldots U_k(\theta_k) \ldots U_1(\theta_1) $$

得到末态:

$|\psi(\vec{\theta}) \rangle = V(\vec{\theta}) | \bar{0} \rangle$

那么有:

$$A_{ij} = \partial \langle \psi | \partial \psi \rangle =\begin{pmatrix}\langle \bar{0} | \partial U_1^{\dagger} \partial U_1 | \bar{0} \rangle &\langle \bar{0} | \partial U_1^{\dagger} U_2^{\dagger} \partial U_2 U_1 | \bar{0} \rangle &\cdots &\langle \bar{0} | \partial U_1^{\dagger} \ldots U_k^{\dagger} \partial U_k \ldots U_1| \bar{0} \rangle \\\vdots & \vdots & \ddots & \vdots \\\langle \bar{0} | U_1^{\dagger} \ldots \partial U_k^{\dagger} U_k \ldots \partial U_1| \bar{0} \rangle &\langle \bar{0} | U_1^{\dagger} \ldots \partial U_k^{\dagger} U_k \ldots \partial U_2 U_1| \bar{0} \rangle &\cdots &\langle \bar{0} | U_1^{\dagger} \ldots \partial U_k^{\dagger} \partial U_k \ldots U_2 U_1| \bar{0} \rangle\\\end{pmatrix}$$

然而在真实的MindSpore Quantum含参的量子线路中,其情况将更加复杂,这时每个量子门有可能为$U_i(y(\vec{\theta_i}))$。我们运用链式法则,可以将末态表达为:

$|\psi(\vec{y}) \rangle = V(\vec{y}) | \bar{0} \rangle$

而这时有:

$$A_{\theta_i, \theta_j} = \left( \sum_k \partial_{\theta_i} y_k \partial_{y_k} \langle \psi | \right)\left( \sum_l \partial_{\theta_j} y_l \partial_{y_l} | \psi \rangle \right)= \sum_{k,l} \frac{\partial y_k}{\partial x_i} \frac{\partial y_l}{\partial x_j} A_{y_k, y_l}$$

其中:

$A_{\theta_i, \theta_j} = \partial_{x_i} \langle \psi | \partial_{x_j} | \psi \rangle$

若引入雅可比矩阵:

$$J = \frac{\partial (y_1, y_2, \ldots y_m)}{\partial (\theta_1, \theta_2, \ldots \theta_n)} =\begin{pmatrix}\frac{\partial y_1}{\partial \theta_1} & \cdots & \frac{\partial y_1}{\partial \theta_n}\\\vdots & \ddots & \vdots \\\frac{\partial y_m}{\partial \theta_1} & \cdots & \frac{\partial y_m}{\partial \theta_n}\end{pmatrix}$$

则有:

$A_{\theta} =J^{\dagger} A_y J$

有了以上理论推导,借助`mindspore.simulator.apply_gate(gate, pr=None, diff=False)`端口即可完成$A_{ij}$ 矩阵的计算。而用同样的思想也可以得到$C_i$,对应在项目内的`get_ci_matrix(circuit, backend='projectq')`函数。

这样借助`partial_psi_partial_psi(circuit, backend)`和`get_ci_matrix(circuit, backend='projectq')`我们就可以得到$A_{ij}$ 矩阵和 $C_i$ 向量。然而由第二节的算法推导告诉我们,还需要计算参数所满足的线性方程。然而由于$A_{ij}$ 矩阵的特性,其不一定是可逆矩阵,所以这里可以采取SVD分解来近似求解线性方程组的解。

初步验证算法有效性

首先我们在简单分子体系中来验证算法实现的正确性和有效性。我们选取了氢分子来完成这项工作。在做了一些近似之后,可以将氢分子的Hamiltonian表达为:

$$H = g_0 I + g_1 Z_0 + g_2 Z_1 + g_3 Z_0Z_1 + g_4 Y_0Y_1 + g_5X_0X_1$$

在这里我们选取所谓的universal ansatz,调用前面完成的端口来实现VITE算法。

这里给出算法的结果:

从结果中我们算法每一步变分迭代得到的能量和精确能量的对比中可以看到,我们的算法实现确实验证的VITE这一算法。并且从结果分析,对于氢分子这样简单的量子体系我们基于MindSpore Quantum的算法实现可以非常高效的得到其基态能量,在经过几步的迭代就可以快速收敛到精确能量。

进一步运用在更复杂的分子体系上

在验证得到算法的有效性之后,我们思考能否将VITE算法运用到更加复杂的分子体系中呢?这里我们进一步将算法运用到LiH分子体系的基态能求解问题上。下图是我们的结果:

可以看到在经过20次左右的迭代之后,其能量依然可以很好的收敛到FCI能量。但是我们也可以发现其收敛结果比起氢分子体系要差一些,并且收敛时间也要长很多。这里由于计算资源的限制,我们无法将VITE算法拓展到更大的分子体系之中,但是我们将算法封装成`VQEoptimizer`类,其中包含着丰富的端口,其算法的实现并不需要随着分子的改变而改变。如读者需要,以及计算资源足够,可以很快的借助`VQEoptimizer`类的`imag_time_evolution(operator=None, circuit=None)`函数即可完成VITE的算法实现。

进一步分析噪声对算法带来的影响

到此,我们已经完成了VITE算法的初步实现和扩展,完成了项目的基本需求。但是我们并没有止步于此,我们进一步思考针对这样一种算法,是否可以探究量子线路噪声对算法带来的影响。因为在现阶段NISQ时代的量子线路的实际实验实现,将不可避免的引入噪声。那么探究噪声的影响将对于这一算法的实际实现至关重要。

而要探究这一课题,我们首先面临的问题即如何在MindSpore Quantum的框架下来引入量子噪声。量子噪声分为两种类型:相干噪声和非相干噪声。相干噪声一般来源于门操作中参数的噪声化,因此是幺正演化并且易于模拟;非相干噪声则来源于系统与环境的相互作用,因此通常是非幺正演化,会使量子系统从纯态变为混态,这个过程也被称为量子信道(Quantum channel)。比喻说最典型的泡利信道(Pauli Channel)即当进行了某种量子操作后,线路有概率额外受到一个泡利门的影响。泡利信道中有一类$X,Y,Z$三个门平分概率的情况,称为去极化信道,其数学表达为:

$$\epsilon_{DF}(\rho) = (1-p)\rho + \frac{p}{3}(X\rho X + Y\rho Y + Z\rho Z)$$

这里的$p$即线路收到噪声影响的概率。

在MindSpore Quantum已经有一些量子信道的噪声模拟端口,比如说`mindquantum.core.gates.DepolarizingChannel`。但是我们发现,这些已有的端口只能运用在没有梯度计算的线路上,也就是说在我们的算法不可以直接调用MindSpore Quantum的函数来模拟这一过程。这就需要我们在实现的VITE算法Ansatz线路上设计算法,来模拟量子信道的噪声影响。在程序中我们运用蒙特卡洛方法,其中每一个量子门会以一定概率引入去极化信道,通过对线路的多次采样,可以得到含噪声量子线路的模拟运行结果。其算法实现在`sampling_aij(circ, param, shots, p)`,`noise_VITE(circ, shots, p)`,`noise_circ(circ, p)`1函数中。而后我们运用之前的`VQEoptimizer`类和我们的noise板块函数在前面我们模拟过的氢分子和LiH体系重新运用含噪声的VITE算法,以下是结果:

可以从图中看到,对于不管是对于氢分子还是LiH分子,当引入量子噪声之后其算法的收敛性将会受到影响,而且会随着噪声的增大其收敛性会越来越差。其次在两个分子体系中的对比也可以看出随着分子体系的复杂度提升,其算法的对于噪声鲁棒性也会降低。可以看到这些结论都符合我们之前的猜想以及物理的直觉。这也说明我们噪声模拟算法的实现是有效的。

我们还可以看到,从我们的结果可以看到,在一定范围的噪声影响下,我们实现的VITE算法依然可以收敛到可接受的能量值,并且更重要的是可以从我们的程序中得到具体的算法失效对应的噪声值,这将给算法的实际实现提供一个参考区间,而这也是我们探究这一问题之余带来的收获。同样由于计算资源和项目时间的限制,我们并未探究更多种量子噪声带来的影响,但是我们考虑到这些需求,读者只需要自行设计改动`noise_circ(circ, p)`到需要的不同噪声种类,依然可以完成这一问题的探究。

2.遇到的问题及解决方案

如何在量子线路完成虚时演化算法?

解决方案:阅读文献,对比不同算法的原理。并最终确定关注于variational imaginary time evolution(VITE)算法。

如何基于MindSpore Quantum程序库去实现VITE算法所需的核心函数?

解决方案:首先基于线路自己实现求梯度方案,但发现效率并不高。无法支持算法的验证工作。于是借助MindSpore Quantum已有的quantum fisher information板块,基于其实现原理,自己优化并搭建其他所需函数。

如何基于算法完成复杂分子体系的基态能求解?

解决方案:借助量子化学相关知识简化分子体系的Hamiltonian,使其能够在有限计算资源情况下仍然能够运用算法程序完成所需计算。

如何在MindSpore Quantum实现的噪声量子线路上实现梯度计算?

解决方案:因为MindSpore Quantum尚未包含含噪声线路的梯度计算。于是借助Monte Carlo思想,构建算法来模拟含噪声线路的梯度计算,并验证噪声对于VITE算法的影响。

3.更多思考

基于本次开源之夏项目的开发,思考能否将VITE算法运用到更多的量子多体体系上并探究其效果差异;思考VITE算法与传统的GD等梯度算法在对于分子体系基态能求解上表现的不同;思考其他类型噪声对于算法的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Django】第一课 银行账户管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。 项目的搭建 1.打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径,并使用创建djang…

算法刷题日志——dp

文章目录[打家劫舍 III](https://leetcode.cn/problems/house-robber-iii/description/)卖股票的最佳时机[买卖股票的最佳时机 II](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/)[买卖股票的最佳时机 III](https://leetcode.cn/problems/best-time-to-bu…

RK3588平台开发系列讲解(系统篇)A/B System的介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、简介二、配置2.1、uboot配置2.2、system bootctrl参考沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台的A/B System。 一、简介 A/B System指的是存在两套可以正常工作的系统,分别存…

项目实战!!! 在docker上部署Jenkins

需求:通过docker安装jenkins,并且通过Jenkins部署项目,最终效果是只要在jenkins对某个项目点击构建,jenkins就会去gitLab上拉取最新项目的最新代码,然后根据你自己项目的pom.xml文件,把项目打包成jar&#…

选择机器视觉传感器时要注意什么

在上篇文章中小编讲解了机器视觉传感器在测量中有哪些优势,看些看过文章的朋友有了个大概的了解,但是当我们在要使用机器视觉传感器时,一定要会正确的选择,这样才能保证产品在实际运用当中可以准确的检测出产品是否存在问题&#…

什么是框架?Java开发中常用的框架有哪些?

什么是框架 “框架(Framework)"一词最早出现在建筑领域,指的是在建造房屋前期构建的建筑骨架。在编程领域,框架就是应用程序的骨架,开发人员可以在这个骨架上加入自己的东西,搭建出符合自己需求的应用…

51单片机双轴太阳能追光追日系统ULN2003步进电机

实践制作DIY- GC0097-双轴太阳能追光追日系统 一、功能说明: 基于51单片机设计-双轴太阳能追光追日系统 功能介绍: STC15W48S4系列最小系统板2个ULN2003步进电机LCD1602显示器18650锂电池锂电池充电板4个光敏电阻太阳能充电 1.双轴XY追日&#xff0c…

这波无感升级有点秀——天翼云QEMU组件热升级方案来了

虚拟化技术作为云计算时代的核心技术,近年来应用越来越广泛。目前,大多数云厂商提供的云主机都是基于KVM/QEMU虚拟化技术实现的。而随着虚拟化技术的发展,QEMU组件也在不断引入新功能并进行功能优化和问题修复。 在公有云场景中,…

【解决方案】艾美捷脂肪生成测定试剂盒的功能和应用

肥胖在世界范围内日益受到关注,在美国已达到流行程度。1它是困扰我们社会的许多主要慢性疾病的危险因素,包括心血管疾病、糖尿病和癌症。近年来,许多研究集中于确定肥胖的发病机制,这是一个增加脂肪细胞数量(脂肪细胞增…

游戏开发 dictionary 源码解析

Dictionary是我们经常使用的,一起来看看它是如何构造的,及有哪些优缺点。 Dictionary是一种键值对的形式存放数据,即 key值 、value 值 一 一映射的。key的类型没有限制,可以是整数、字符串甚至是实例对象。 Dictionary的实现原…

Java项目:springboot+vue大学生健康档案管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 大学生健康档案管理系统,目前演示数据中主要包括三种角色:管理员、医生、学生;其中管理员包含最高权限&…

Metal每日分享,自然饱和度滤镜效果

本案例的目的是理解如何用Metal实现自然饱和度效果滤镜,简单讲就是调整图像整体的明亮程度,如调节到较高数值,图像会产生色彩过饱和从而引起图像失真; Demo HarbethDemo地址iDay每日分享文档地址 实操代码 // 自然饱和度滤镜 l…

攻防世界get_post

攻防世界get_post 题目描述:X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗? 查看界面,要求用GET方式提交一个名为a,值为1的变量。 打开burp suite。 设置浏览器本地代理。 抓包。 发送到重发器。 用GET方式提交一个…

点击化学试剂一种环炔烃DBCO-PEG-N3及同系列产品

中文名称:氮杂二苯并环辛炔-聚乙二醇-叠氮 英文名称:DBCO-PEG-N3 英文别名: Dibenzocycolctyne-PEG-Azide 产品纯度: ≥95% 产品用途: 应用于医学研究,药物释放,纳米技术和新材料研究&am…

代码复现之:RCNN(1)分类任务构建 + 模型训练

文章目录资源链接复现开始环境安装创建 conda 虚拟环境,python 3.6 版本安装程序运行环境1. mkdoc 相关的环境2. 程序运行需要的环境流程参考数据集创建分类任务1. 加载原数据集 VOC20072. 将所有类数据单独提取3. 对于每个 class 的数据,构造正负例样本…

AVL树详解

1.AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。 因此,两位俄罗斯的数学家发明了一种解决上述问题的方法: 当向二叉…

内网穿透软件对比——cpolar : 花生壳(下)

系列文章 内网穿透软件对比——cpolar : 花生壳(上)内网穿透软件对比——cpolar : 花生壳(中)内网穿透软件对比——cpolar : 花生壳(下) 文章目录系列文章1. 前言2. 对比内容2.1.TCP协议功能及操作对比2.1…

【JavaEE】多线程(二)Thread 类及常见方法

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaEE】 ✈️✈️本篇内容:Thread类再剖析! 🚀🚀代码存放仓库gitee:JavaEE初阶代码存放! ⛵⛵作者简…

对记录做横向分栏

【问题】 Hi i have a single list of employees. Each employee will have his name and salary. i have given the list of employees to a table but it appears as follows Employee Name Salary harish 3000 kiran 4000 Emili 6000 h…

Jenkins(2)— 配置webhook触发器

1、webhook介绍 Gitee WebHook触发器 的功能是帮助用户 push 代码后,自动回调一个您设定的 http 地址。例如我们可以通过添加webhook触发器来实现这样一个功能: 每当开发push代码到提测分支后,自动触发jenkins构建,运行自动化测…