GCN项目实战1-SimGNN
文章目录
- SimGNN:快速图相似度计算的神经网络方法
- 1. 数据
- 2. 模型
- 2.1 python文件功能介绍
- 2.2 重要函数和类的实现
SimGNN:快速图相似度计算的神经网络方法
原论文名称:SimGNN: A Neural Network Approach to Fast Graph Similarity Computation
代码链接:https://github.com/benedekrozemberczki/SimGNN
1. 数据
例子:
{"graph_1": [[0, 8], [0, 9], [0, 2], [0, 3], [0, 11], [1, 2], [1, 3], [1, 5], [1, 6], [1, 7], [2, 3], [2, 5], [2, 6], [2, 7], [2, 8], [2, 10], [2, 11], [3, 5], [3, 7], [3, 8], [3, 10], [3, 11], [4, 9], [4, 10], [4, 5], [4, 6], [4, 7], [5, 7], [5, 8], [5, 11], [6, 7], [6, 8], [6, 11], [7, 8], [7, 10], [7, 11], [8, 9], [10, 11]], "ged": 32, "graph_2": [[0, 1], [0, 2], [0, 4], [1, 8], [1, 10], [1, 2], [1, 7], [2, 4], [2, 7], [2, 9], [2, 11], [3, 10], [3, 11], [3, 5], [3, 6], [3, 7], [4, 9], [4, 11], [5, 8], [5, 9], [5, 6], [6, 9], [7, 9], [7, 10], [7, 11], [8, 9], [8, 10], [9, 10], [9, 11], [10, 11]], "labels_2": ["3", "5", "6", "5", "4", "4", "3", "6", "4", "8", "6", "6"], "labels_1": ["5", "5", "9", "8", "5", "7", "6", "9", "7", "3", "5", "7"]}
一个样本包含五个属性:
graph_1:graph1的邻接矩阵
graph_2:graph2的邻接矩阵
labels_1:graph1的特征矩阵
labels_2:graph2的特征矩阵
ged:图相似度
2. 模型

2.1 python文件功能介绍
layers.py -- 包含注意力机制层和Neural Tensor Network层的实现
simgnn.py -- 模型实现
utils.py -- 一些辅助函数的实现
param_parser.py -- 参数
main.py -- 主函数--filters-1 INT Number of filter in 1st GCN layer. Default is 128.
--filters-2 INT Number of filter in 2nd GCN layer. Default is 64.
--filters-3 INT Number of filter in 3rd GCN layer. Default is 32.
--tensor-neurons INT Neurons in tensor network layer. Default is 16.
--bottle-neck-neurons INT Bottle neck layer neurons. Default is 16.
--bins INT Number of histogram bins. Default is 16.
--batch-size INT Number of pairs processed per batch. Default is 128.
--epochs INT Number of SimGNN training epochs. Default is 5.
--dropout FLOAT Dropout rate. Default is 0.5.
--learning-rate FLOAT Learning rate. Default is 0.001.
--weight-decay FLOAT Weight decay. Default is 10^-5.
--histogram BOOL Include histogram features. Default is False.
2.2 重要函数和类的实现
- 注意力机制层
- __init__初始化函数
功能:
导入需要的参数:args;
设置参数矩阵,形状为[self.args.filters_3,self.args.filters_3]:调用setup_weights(),
初始化参数矩阵的值:调用init_parameters()
def __init__(self, args):""":param args: Arguments object."""super(AttentionModule, self).__init__()self.args = argsself.setup_weights()self.init_parameters()
- setup_weights函数
def setup_weights(self):"""Defining weights."""self.weight_matrix = torch.nn.Parameter(torch.Tensor(self.args.filters_3,self.args.filters_3))
- init_parameters函数
def init_parameters(self):"""Initializing weights."""torch.nn.init.xavier_uniform_(self.weight_matrix)
- forward函数
'''
key: embedding
value: embedding
query: embedding_i
'''
def forward(self, embedding): # embedding形状:[graph_node_num, self.args.filters_3]"""Making a forward propagation pass to create a graph level representation.:param embedding: Result of the GCN.:return representation: A graph level representation vector."""global_context = torch.mean(torch.matmul(embedding, self.weight_matrix), dim=0) # [1,self.args.filters_3]transformed_global = torch.tanh(global_context) # [1, self.args.filters_3]sigmoid_scores = torch.sigmoid(torch.mm(embedding, transformed_global.view(-1, 1))) # [graph_node_num, 1]representation = torch.mm(torch.t(embedding), sigmoid_scores) # [self.args.filters_3, 1]return representation
整体代码:
class AttentionModule(torch.nn.Module):"""SimGNN Attention Module to make a pass on graph."""def __init__(self, args):""":param args: Arguments object."""super(AttentionModule, self).__init__()self.args = argsself.setup_weights()self.init_parameters()def setup_weights(self):"""Defining weights."""self.weight_matrix = torch.nn.Parameter(torch.Tensor(self.args.filters_3,self.args.filters_3))def init_parameters(self):"""Initializing weights."""torch.nn.init.xavier_uniform_(self.weight_matrix)def forward(self, embedding): """Making a forward propagation pass to create a graph level representation.:param embedding: Result of the GCN.:return representation: A graph level representation vector."""global_context = torch.mean(torch.matmul(embedding, self.weight_matrix), dim=0)transformed_global = torch.tanh(global_context)sigmoid_scores = torch.sigmoid(torch.mm(embedding, transformed_global.view(-1, 1)))representation = torch.mm(torch.t(embedding), sigmoid_scores)return representation
- Neural Tensor Network层
class TenorNetworkModule(torch.nn.Module):"""SimGNN Tensor Network module to calculate similarity vector."""def __init__(self, args):""":param args: Arguments object."""super(TenorNetworkModule, self).__init__()self.args = argsself.setup_weights()self.init_parameters()def setup_weights(self):"""Defining weights."""self.weight_matrix = torch.nn.Parameter(torch.Tensor(self.args.filters_3,self.args.filters_3,self.args.tensor_neurons))self.weight_matrix_block = torch.nn.Parameter(torch.Tensor(self.args.tensor_neurons,2*self.args.filters_3))self.bias = torch.nn.Parameter(torch.Tensor(self.args.tensor_neurons, 1))def init_parameters(self):"""Initializing weights."""torch.nn.init.xavier_uniform_(self.weight_matrix)torch.nn.init.xavier_uniform_(self.weight_matrix_block)torch.nn.init.xavier_uniform_(self.bias)def forward(self, embedding_1, embedding_2):# embedding_1:[self.args.filters_3, 1]# embedding_2:[self.args.filters_3, 1]"""Making a forward propagation pass to create a similarity vector.:param embedding_1: Result of the 1st embedding after attention.:param embedding_2: Result of the 2nd embedding after attention.:return scores: A similarity score vector."""scoring = torch.mm(torch.t(embedding_1), self.weight_matrix.view(self.args.filters_3, -1)) # [1, self.args.filters_3*self.args.tensor_neurons]scoring = scoring.view(self.args.filters_3, self.args.tensor_neurons) # [self.args.filters_3, self.args.tensor_neurons]scoring = torch.mm(torch.t(scoring), embedding_2) # [self.args.tensor_neurons, 1]combined_representation = torch.cat((embedding_1, embedding_2)) # [2*self.args.filters_3, 1]block_scoring = torch.mm(self.weight_matrix_block, combined_representation) # [self.args.tensor_neurons, 1]scores = torch.nn.functional.relu(scoring + block_scoring + self.bias) # [self.args.tensor_neurons, 1]return scores
- SimGNN模型
- __init__初始化函数:
功能:导入需要用到的参数:args,label数量:number_of_labels,构建模型:调用setup_layers函数
def __init__(self, args, number_of_labels):""":param args: Arguments object.:param number_of_labels: Number of node labels."""super(SimGNN, self).__init__()self.args = argsself.number_labels = number_of_labels # 存放label种类数量self.setup_layers()
- calculate_bottleneck_features函数:
功能:是否要加上histogram层(下半部分)提取的embedding
def calculate_bottleneck_features(self):"""Deciding the shape of the bottleneck layer."""if self.args.histogram == True:self.feature_count = self.args.tensor_neurons + self.args.binselse:self.feature_count = self.args.tensor_neurons
- setup_layers函数:
功能:构建模型,包括三个图卷积层,自注意力机制层,Neural Tensor Network层,两个线性层,最后输出一个预测的值。
def setup_layers(self):"""Creating the layers."""self.calculate_bottleneck_features()self.convolution_1 = GCNConv(self.number_labels, self.args.filters_1)self.convolution_2 = GCNConv(self.args.filters_1, self.args.filters_2)self.convolution_3 = GCNConv(self.args.filters_2, self.args.filters_3)self.attention = AttentionModule(self.args)self.tensor_network = TenorNetworkModule(self.args)self.fully_connected_first = torch.nn.Linear(self.feature_count,self.args.bottle_neck_neurons)self.scoring_layer = torch.nn.Linear(self.args.bottle_neck_neurons, 1)
- calculate_histogram函数:
def calculate_histogram(self, abstract_features_1, abstract_features_2):"""Calculate histogram from similarity matrix.:param abstract_features_1: Feature matrix for graph 1.:param abstract_features_2: Feature matrix for graph 2.:return hist: Histsogram of similarity scores."""scores = torch.mm(abstract_features_1, abstract_features_2).detach()scores = scores.view(-1, 1)hist = torch.histc(scores, bins=self.args.bins)hist = hist/torch.sum(hist)hist = hist.view(1, -1)return hist
- convolutional_pass函数:
def convolutional_pass(self, edge_index, features):"""Making convolutional pass.:param edge_index: Edge indices.:param features: Feature matrix.:return features: Absstract feature matrix."""features = self.convolution_1(features, edge_index)features = torch.nn.functional.relu(features)features = torch.nn.functional.dropout(features,p=self.args.dropout,training=self.training)features = self.convolution_2(features, edge_index)features = torch.nn.functional.relu(features)features = torch.nn.functional.dropout(features,p=self.args.dropout,training=self.training)features = self.convolution_3(features, edge_index)return features
- forward函数:
功能:运行神经网络,预测结果
def forward(self, data):"""Forward pass with graphs.:param data: Data dictiyonary.:return score: Similarity score."""edge_index_1 = data["edge_index_1"]edge_index_2 = data["edge_index_2"]features_1 = data["features_1"]features_2 = data["features_2"]# 图卷积的计算abstract_features_1 = self.convolutional_pass(edge_index_1, features_1) # [graph1_num_node,self.args.filters_3]abstract_features_2 = self.convolutional_pass(edge_index_2, features_2) # [graph2_num_node,self.args.filters_3]# 计算histogramif self.args.histogram == True:hist = self.calculate_histogram(abstract_features_1,torch.t(abstract_features_2))# 使用注意力机制层pooled_features_1 = self.attention(abstract_features_1)pooled_features_2 = self.attention(abstract_features_2)scores = self.tensor_network(pooled_features_1, pooled_features_2) # [self.args.tensor_neurons, 1]scores = torch.t(scores) # [1,self.args.tensor_neurons]# 合并注意力机制层和Neural Tensor Network层提取的特征if self.args.histogram == True:scores = torch.cat((scores, hist), dim=1).view(1, -1) # [1, self.feature_count]# 获得预测分数,由于标准答案使用了归一化,所以最后要过一下sigmoid层scores = torch.nn.functional.relu(self.fully_connected_first(scores)) # [1, self.args.bottle_neck_neurons]score = torch.sigmoid(self.scoring_layer(scores)) # self.scoring_layer(scores): [1,1]return score
整体代码:
class SimGNN(torch.nn.Module):"""SimGNN: A Neural Network Approach to Fast Graph Similarity Computationhttps://arxiv.org/abs/1808.05689"""def __init__(self, args, number_of_labels):""":param args: Arguments object.:param number_of_labels: Number of node labels."""super(SimGNN, self).__init__()self.args = argsself.number_labels = number_of_labelsself.setup_layers()def calculate_bottleneck_features(self):"""Deciding the shape of the bottleneck layer."""if self.args.histogram == True:self.feature_count = self.args.tensor_neurons + self.args.binselse:self.feature_count = self.args.tensor_neuronsdef setup_layers(self):"""Creating the layers."""self.calculate_bottleneck_features()self.convolution_1 = GCNConv(self.number_labels, self.args.filters_1)self.convolution_2 = GCNConv(self.args.filters_1, self.args.filters_2)self.convolution_3 = GCNConv(self.args.filters_2, self.args.filters_3)self.attention = AttentionModule(self.args)self.tensor_network = TenorNetworkModule(self.args)self.fully_connected_first = torch.nn.Linear(self.feature_count,self.args.bottle_neck_neurons)self.scoring_layer = torch.nn.Linear(self.args.bottle_neck_neurons, 1)def calculate_histogram(self, abstract_features_1, abstract_features_2):"""Calculate histogram from similarity matrix.:param abstract_features_1: Feature matrix for graph 1.:param abstract_features_2: Feature matrix for graph 2.:return hist: Histsogram of similarity scores."""scores = torch.mm(abstract_features_1, abstract_features_2).detach()scores = scores.view(-1, 1)hist = torch.histc(scores, bins=self.args.bins)hist = hist/torch.sum(hist)hist = hist.view(1, -1)return histdef convolutional_pass(self, edge_index, features):"""Making convolutional pass.:param edge_index: Edge indices.:param features: Feature matrix.:return features: Absstract feature matrix."""features = self.convolution_1(features, edge_index)features = torch.nn.functional.relu(features)features = torch.nn.functional.dropout(features,p=self.args.dropout,training=self.training)features = self.convolution_2(features, edge_index)features = torch.nn.functional.relu(features)features = torch.nn.functional.dropout(features,p=self.args.dropout,training=self.training)features = self.convolution_3(features, edge_index)return featuresdef forward(self, data):"""Forward pass with graphs.:param data: Data dictiyonary.:return score: Similarity score."""edge_index_1 = data["edge_index_1"]edge_index_2 = data["edge_index_2"]features_1 = data["features_1"]features_2 = data["features_2"]# 图卷积的计算abstract_features_1 = self.convolutional_pass(edge_index_1, features_1) # [graph1_num_node,self.args.filters_3]abstract_features_2 = self.convolutional_pass(edge_index_2, features_2) # [graph2_num_node,self.args.filters_3]# 计算histogramif self.args.histogram == True:hist = self.calculate_histogram(abstract_features_1,torch.t(abstract_features_2))# 使用注意力机制层pooled_features_1 = self.attention(abstract_features_1)pooled_features_2 = self.attention(abstract_features_2)scores = self.tensor_network(pooled_features_1, pooled_features_2) # [self.args.tensor_neurons, 1]scores = torch.t(scores) # [1,self.args.tensor_neurons]# 合并注意力机制层和Neural Tensor Network层提取的特征if self.args.histogram == True:scores = torch.cat((scores, hist), dim=1).view(1, -1) # [1, self.feature_count]# 获得预测分数,由于标准答案使用了归一化,所以最后要过一下sigmoid层scores = torch.nn.functional.relu(self.fully_connected_first(scores)) # [1, self.args.bottle_neck_neurons]score = torch.sigmoid(self.scoring_layer(scores)) # self.scoring_layer(scores): [1,1]return score
相关文章:
GCN项目实战1-SimGNN
文章目录SimGNN:快速图相似度计算的神经网络方法1. 数据2. 模型2.1 python文件功能介绍2.2 重要函数和类的实现SimGNN:快速图相似度计算的神经网络方法 原论文名称:SimGNN: A Neural Network Approach to Fast Graph Similarity Computation…...
经过深思熟虑后的接口测试自动化的总结与思考
序近期看到阿里云性能测试 PTS 接口测试开启免费公测,本着以和大家交流如何实现高效的接口测试为出发点,本文包含了我在接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容包括但不仅限于:服务端接口测试介绍接…...
电脑自带的录屏放在哪里了?轻松弄懂,看这篇文章就明白了
有很多小伙伴有这个疑问,电脑自带的录屏放在哪里了?其实,电脑自带的录屏工具并不是所有电脑都要,具体要看你的电脑品牌和操作系统,Windows系统和Mac系统的电脑都自带了录屏工具,下面跟着小编一起来看看吧。…...
华为OD机试真题Java实现【字符串分割】真题+解题思路+代码(20222023)
字符串分割 给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含…...
【数据库】Apache Doris : 一个开源 MPP 数据库的架构与实践
文章目录Doris 背景介绍一、Doris二、Doris 定位适用场景 & 案例介绍一、适用场景二、具体案例Doris 整体架构一、Doris 整体架构二、Doris 数据分布三、Doris 的使用方式Doris 关键技术一、数据可靠性二、易运维三、MySQL 兼容性四、支持 MPPDoris 数据模型一、Doris 数据…...
day49【代码随想录】动态规划之最长公共子序列、不相交的线、最大子序和、判断子序列
文章目录前言一、最长公共子序列(力扣1143)二、不相交的线(力扣1035)三、最大子序和(力扣53)四、判断子序列(力扣392)前言 1、最长公共子序列 2、不相交的线 3、最大子序和 4、判断…...
华为OD机试真题Python实现【字母消消乐】真题+解题思路+代码(20222023)
字母消消乐 题目 游戏规则: 输入一个只包含英文字母的字符串, 字符串中的两个字母如果相邻且相同,就可以消除。 在字符串上反复执行消除的动作, 直到无法继续消除为止,此时游戏结束。 输出最终得到的字符串长度。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试…...
程序中的日期使用问题-格式转化:SimpleDateFormat、org.apache.commons.lang3.time.DateUtils
前言 日期使用问题主要是格式转换的问题 场景:通过excel导入数据,其中一个字段为出生日期,需要对字段值进行合法性校验 博客地址:芒果橙的个人博客 【http://mangocheng.com】 一、个人浅谈日期 时间日期作为一个基础的标识和维度…...
C++——map和set的应用总结
目录1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用3.2 multiset3.2.1 multiset的介绍3.2.2 multiset的使用3.3 map3.3.1 map的介绍3.3.2 map的使用operator[]3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用3.5 map和set在OJ中的…...
学习Python可以做什么工作?
一: 1、web开发:Python拥有非常完善与web服务器交互的库,大量的免费网页模板,相对于更具有优势,同时还具有非常优秀的Django框架,功能齐全。目前国内的豆瓣网、果壳网等,国外的Google、YouTube等…...
AWS攻略——Peering连接VPC
文章目录创建IP/CIDR不覆盖的VPC创建VPC创建子网创建密钥对创建EC2创建Peering接受Peering邀请修改各个VPC的路由表修改美东us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由测试知识点我们回顾下《AWS攻略——VPC初识》中的知识: 一个VPC只能设置在一个Re…...
程序员遇到人生低谷期怎么做?
每个人的一生都是起起伏伏的,你不会天天高潮,总会经历一段又一段的不如意,你怎么把握这一段段时间,如何掌控人生节奏,都源于对人生低谷期的回答。 尤其是2022年,程序员受到的冲击并不小,从年初…...
理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨
试想如果一个IM连发出的消息都不知道对方到底能不能收到、发出的聊天内容对方看到的到底是不是“胡言乱语”(严重乱序问题),这样的APP用户肯定不会让他在手机上过夜(肯定第一时间卸载了),因为最基本的聊天逻…...
2021-08-29
服务器 主:172.17.0.2 master 备:172.17.0.3 slave1 lvs虚拟IP:172.17.0.100 #nginx下载地址 http://nginx.org/download/ 本地文件路径 1.dockerfile构建nginx FROM centos:7 ADD nginx-1.6.0.tar.gz /usr/local COPY nginx_install.sh /usr/local RUN sh …...
第八题、哈夫曼编码大全
题目: 哈夫曼编码大全 描述: 关于哈夫曼树的建立,编码,解码。 输入 第一行输入数字N,代表总共有多少个字符以及权值 第二第三行分别是一行字符串,以及每个字符对应的权值 接下来输入一个数M,表…...
linux集群技术(二)--keepalived(高可用集群)(二)
案例1--keepalived案例2--keepalived Lvs集群1.案例1--keepalived 1.1 环境 初识keepalived,实现web服务器的高可用集群。 Server1: 192.168.26.144 Server2: 192.168.26.169 VIP: 192.168.26.190 1.2 server1 创建etc下的…...
C# 控制台程序的开发和打包为一个exe文件
目录前言一、我的第一个C#控制台程序二、发布为一个exe文件前言 本文通过C#编写一个简单的示例计算器,来演示C#的使用和使用 Visual Studio 打包为一个 exe 文件。 一、我的第一个C#控制台程序 所谓控制台程序,就是没有界面,运行程序后只有…...
Redis实战案例
文章目录1、SpringBoot整合Redis1.1、新建项目1.2、接口编写1.3、集成Redis1.3、测试1.4、序列化问题2、Redis实现分布式缓存2.1、背景介绍2.2、代码编写2.3、缓存改造2.4、小结3、RedisAOP自定义注解,优雅实现分布式缓存3.1、自定义注解3.2、AOP切面类3.3、测试3.4…...
slice和splice区别
slice和splice区别 splice和slice是数组中的两个重要的方法。 slicesplice不会改变原数组改变原数组返回原数组中的部分元素返回原数组中被删除的元素组成的新数组用来选择数组中的元素用于在数组中插入或者删除元素 1.splice的语法 array.splice(index,howmany,item1,…,ite…...
动态规划从入门到精通-蓝桥杯
一、了解动态规划1.简单来说动态规划是一种状态转移与递推2.例题引入——最少硬币问题有多个不同面值的硬币(任意面值); 数量不限; 输入金额S,输出最少硬币组合。 (回顾用贪心求解硬币问题。)贪心法硬币面值1、2、5。支…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
