简化代码 Sk11_Add = (Int16) (((Int16) ((((Int32) (Int16) (((UInt16) (((UInt16) Sk11_Switch2) * ((UInt16) C_s_BLDC_SampleTime))) / 100)) * ((Int32) DletaPosn)) / 10000)) + Curr_I_out);
时间: 2023-08-05 12:08:53 浏览: 41
这段代码的作用是将一些变量进行计算后赋值给 Sk11_Add,简化后的代码如下:
```
Sk11_Add = (Int16)(((Int32)Sk11_Switch2 * C_s_BLDC_SampleTime * DletaPosn) / 1000000 + Curr_I_out);
```
其中使用了强制类型转换将变量类型转换成需要的类型。
相关问题
mmsegmentation框架下给mobilenetv2主干加入SKNet
在`mmsegmentation`框架中,可以通过修改`mmseg/models/backbones/mobilenet_v2.py`文件来给`MobileNetV2`主干加入`SKNet`。下面是实现的步骤:
1. 首先需要导入`SKNet`的相关模块,可以在文件最上面添加以下代码:
```python
from mmcv.cnn import build_conv_layer, build_norm_layer, build_plugin_layer
from ..builder import BACKBONES
```
2. 接着在`MobileNetV2`类中定义`SKNet`的结构,可以在`_make_stem_layer`函数中加入以下代码:
```python
def _make_stem_layer(self, in_channels, stem_channels):
layers = []
layers.append(ConvModule(
in_channels,
stem_channels,
3,
stride=2,
padding=1,
bias=False,
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
activation='relu',
inplace=True))
in_channels = stem_channels
layers.append(ConvModule(
in_channels,
in_channels,
3,
stride=1,
padding=1,
bias=False,
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
activation='relu',
inplace=True))
# add SKNet module
channels = in_channels
mid_channels = channels // 2
squeeze_channels = max(1, mid_channels // 8)
layers.append(
build_plugin_layer(dict(
type='SKConv',
channels=channels,
squeeze_channels=squeeze_channels,
kernel_size=3,
stride=1,
padding=1,
dilation=1,
groups=32,
sk_mode='two',
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
act_cfg=dict(type='ReLU', inplace=True),
),
[build_conv_layer(
dict(type='Conv2d'),
channels,
channels,
kernel_size=3,
stride=1,
padding=1,
bias=False),
build_norm_layer(dict(type='BN', momentum=0.1, eps=1e-5), channels)[1]]))
return nn.Sequential(*layers)
```
3. 最后在`BACKBONES`中注册`MobileNetV2`主干即可。完整代码如下:
```python
import torch.nn as nn
from mmcv.cnn import ConvModule
from mmcv.cnn import build_conv_layer, build_norm_layer, build_plugin_layer
from ..builder import BACKBONES
@BACKBONES.register_module()
class MobileNetV2(nn.Module):
def __init__(self,
widen_factor=1.0,
output_stride=32,
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
with_cp=False,
):
super(MobileNetV2, self).__init__()
assert output_stride in [8, 16, 32]
self.output_stride = output_stride
self.with_cp = with_cp
self.norm_cfg = norm_cfg
input_channel = int(32 * widen_factor)
self.stem = self._make_stem_layer(3, input_channel)
self.layer1 = self._make_layer(
input_channel, int(16 * widen_factor), 1, 1, 16, 2)
self.layer2 = self._make_layer(
int(16 * widen_factor), int(24 * widen_factor), 2, 6, 16, 2)
self.layer3 = self._make_layer(
int(24 * widen_factor), int(32 * widen_factor), 3, 6, 24, 2)
self.layer4 = self._make_layer(
int(32 * widen_factor), int(64 * widen_factor), 4, 6, 32, 2)
self.layer5 = self._make_layer(
int(64 * widen_factor), int(96 * widen_factor), 3, 6, 64, 1)
self.layer6 = self._make_layer(
int(96 * widen_factor), int(160 * widen_factor), 3, 6, 96, 1)
self.layer7 = self._make_layer(
int(160 * widen_factor), int(320 * widen_factor), 1, 6, 160, 1)
if self.output_stride == 8:
self.layer2[0].conv2.stride = (1, 1)
self.layer2[0].downsample[0].stride = (1, 1)
self.layer3[0].conv2.stride = (1, 1)
self.layer3[0].downsample[0].stride = (1, 1)
elif self.output_stride == 16:
self.layer3[0].conv2.stride = (1, 1)
self.layer3[0].downsample[0].stride = (1, 1)
self._freeze_stages()
def _make_stem_layer(self, in_channels, stem_channels):
layers = []
layers.append(ConvModule(
in_channels,
stem_channels,
3,
stride=2,
padding=1,
bias=False,
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
activation='relu',
inplace=True))
in_channels = stem_channels
layers.append(ConvModule(
in_channels,
in_channels,
3,
stride=1,
padding=1,
bias=False,
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
activation='relu',
inplace=True))
# add SKNet module
channels = in_channels
mid_channels = channels // 2
squeeze_channels = max(1, mid_channels // 8)
layers.append(
build_plugin_layer(dict(
type='SKConv',
channels=channels,
squeeze_channels=squeeze_channels,
kernel_size=3,
stride=1,
padding=1,
dilation=1,
groups=32,
sk_mode='two',
norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
act_cfg=dict(type='ReLU', inplace=True),
),
[build_conv_layer(
dict(type='Conv2d'),
channels,
channels,
kernel_size=3,
stride=1,
padding=1,
bias=False),
build_norm_layer(dict(type='BN', momentum=0.1, eps=1e-5), channels)[1]]))
return nn.Sequential(*layers)
def _make_layer(self,
in_channels,
out_channels,
num_blocks,
stride,
t,
dilation=1):
layers = []
layers.append(InvertedResidual(
in_channels,
out_channels,
stride,
expand_ratio=t,
dilation=dilation,
norm_cfg=self.norm_cfg,
with_cp=self.with_cp))
for i in range(1, num_blocks):
layers.append(InvertedResidual(
out_channels,
out_channels,
1,
expand_ratio=t,
dilation=dilation,
norm_cfg=self.norm_cfg,
with_cp=self.with_cp))
return nn.Sequential(*layers)
def _freeze_stages(self):
if self.output_stride == 8:
self.stem.eval()
for param in self.stem.parameters():
param.requires_grad = False
elif self.output_stride == 16:
self.stem[0].eval()
self.stem[1].eval()
for param in self.stem[0].parameters():
param.requires_grad = False
for param in self.stem[1].parameters():
param.requires_grad = False
```
这样就给`MobileNetV2`主干加入了`SKNet`结构。
在openssl库和pbc库下用c++生成两个p阶乘法循环群G1、G2,并生成一个双线性映射e:G1×G1→G2,生成G1的两个生成元g,u,两个哈希函数H1、H2。生成公私钥sk1和pk1=g^sk1,并利用sk1对消息m进行签名。
好的,我会尽力回答你的问题。首先,您需要下载安装 OpenSSL 和 PBC 库,并且需要在 C++ 中调用这些库。
下面是一个简单的代码示例,展示了如何使用 OpenSSL 和 PBC 库生成两个 p 阶循环群 G1 和 G2,以及一个双线性映射 e:G1×G1→G2:
```c++
#include <iostream>
#include <openssl/bn.h>
#include <pbc/pbc.h>
int main() {
// 初始化 OpenSSL 库
OpenSSL_add_all_algorithms();
// 初始化 PBC 库
pairing_t pairing;
char *params = "type a\n\
p 1125899906842679\n\
r 6277101735386680763835789423207666416083908700390324961279\n\
b 64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1\n\
h 2\n\
G 04 188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012\n\
07192b95ffc8da78631011ed6b24cdd573f977a11e794811\n\
n 1125899906842597\n\
";
pbc_param_t param;
if (pbc_param_init_set_str(param, params) == -1) {
std::cerr << "Error initializing PBC library" << std::endl;
return 1;
}
// 初始化 Pairing
if (pairing_init_pbc_param(pairing, param) == -1) {
std::cerr << "Error initializing pairing" << std::endl;
return 1;
}
// 生成 G1 和 G2
element_t g1, g2;
element_init_G1(g1, pairing);
element_init_G2(g2, pairing);
element_random(g1);
element_random(g2);
// 生成双线性映射 e:G1×G1→G2
element_t result;
element_init_GT(result, pairing);
pairing_apply(result, g1, g1, pairing);
// 清理内存
element_clear(g1);
element_clear(g2);
element_clear(result);
pairing_clear(pairing);
pbc_param_clear(param);
return 0;
}
```
接下来,您需要生成 G1 的两个生成元 g 和 u,以及两个哈希函数 H1 和 H2,可以使用 OpenSSL 库中的 SHA256 算法实现哈希函数。这里我们假设您已经实现了哈希函数,生成了生成元 g 和 u,以及哈希函数 H1 和 H2。
接下来,您需要生成公私钥 sk1 和 pk1=g^sk1,并利用 sk1 对消息 m 进行签名。可以使用 OpenSSL 库中的 DSA 算法实现签名。下面是一个简单的代码示例:
```c++
#include <iostream>
#include <openssl/bn.h>
#include <openssl/dsa.h>
#include <pbc/pbc.h>
int main() {
// 初始化 OpenSSL 库
OpenSSL_add_all_algorithms();
// 初始化 PBC 库
pairing_t pairing;
char *params = "type a\n\
p 1125899906842679\n\
r 6277101735386680763835789423207666416083908700390324961279\n\
b 64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1\n\
h 2\n\
G 04 188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012\n\
07192b95ffc8da78631011ed6b24cdd573f977a11e794811\n\
n 1125899906842597\n\
";
pbc_param_t param;
if (pbc_param_init_set_str(param, params) == -1) {
std::cerr << "Error initializing PBC library" << std::endl;
return 1;
}
// 初始化 Pairing
if (pairing_init_pbc_param(pairing, param) == -1) {
std::cerr << "Error initializing pairing" << std::endl;
return 1;
}
// 生成 G1 的两个生成元 g 和 u
element_t g, u;
element_init_G1(g, pairing);
element_init_G1(u, pairing);
element_random(g);
element_random(u);
// 生成哈希函数 H1 和 H2
// ...
// 生成公私钥 sk1 和 pk1=g^sk1
DSA *dsa = DSA_new();
DSA_generate_parameters_ex(dsa, 1024, NULL, 0, NULL, NULL, NULL);
DSA_generate_key(dsa);
// 利用 sk1 对消息 m 进行签名
unsigned char m[] = "Hello, world!";
unsigned char sig[1024];
unsigned int siglen;
DSA_sign(0, m, sizeof(m), sig, &siglen, dsa);
// 验证签名
int ret = DSA_verify(0, m, sizeof(m), sig, siglen, dsa);
// 清理内存
element_clear(g);
element_clear(u);
pairing_clear(pairing);
pbc_param_clear(param);
DSA_free(dsa);
return 0;
}
```
这只是一个简单的示例,您需要根据您的需求进行修改和完善。希望这能对您有所帮助!
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)