Extractor.app学习

本文介绍了LLVM和Z3相关知识。LLVM中有PHINode、BinaryOperator、CastInst、Value等类型,PHINode用于多输入值选择,BinaryOperator表示二元运算指令等;Z3中有z3::expr类型变量用于约束操作,还有Sort context控制算子变量类型,此外还介绍了转移函数和dyn_cast安全类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是PHINode 类型?

  1. PHINode是LLVM中的一种类型,它表示一个在多个输入值之间进行选择的节点。它通常用于描述控制块中的值的变化。

  2. 在LLVM中,当一个指令需要从多个块中进入时,需要使用PHI节点。这些节点可以描述在不同路径上的值。每个PHI节点都有一个入口,对应着一个输入值和一个块。这些入口组成了一个键值对,其中键是块,值是输入值。

  3. 例如,在一个简单的if语句中,如果条件为真,那么执行真并且假分支执行另一个块。在这种情况下,在真分支中会赋值给一个变量,但假分支中不会。如果在假分支之后再使用这个变量,那么就需要一个PHI节点来选择正确的值。

  4. 总而言之,PHINode是LLVM中一种特殊的指令,用于在多个输入值之间进行选择。这些输入值可能是来自不同块中的值,并且可能由于分支语句或循环等原因而不同

什么是转移函数?

  1. 转移函数是指一种将状态或变量从一个状态或块转移到另一个状态或块的函数。在程序分析和验证中经常使用转移函数来描述程序运行时状态的变化。
  2. 比如在这段代码中,transition(BB, Succ) 或者 transition(BB, TrueBranch) 或者 transition(BB, FalseBranch) 就是转移函数。它可能会接受两个参数:当前块和下一个块。并返回一个 z3::expr_vector 或 z3::expr 类型的变量,表示当前块到下一个块的转移.

z3::expr 类型的变量

  1. z3::expr是Z3类库中的一个类型,表示一个布尔,整数或者实数类型的约束条件或者表达式。它是Z3中的一个核心类型,用于在约束条件、公式和解中进行操作。

  2. z3::expr类型的变量可以表示一个公式,可以是布尔值,整数或者实数类型。它可以进行各种类型的运算,如与,或,非等。可以使用z3::expr类型的变量来进行公式推导,求解约束问题,等等。

  3. 总的来说, z3::expr 是Z3库中的一个类型, 表示一个布尔,整数或实数类型的约束条件或表达式,用来在约束条件、公式和解中进行操作.

dyn_cast

 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(I))

dyn_cast是一种安全的类型转换,它检查转换是否有效,如果有效,它将返回一个指向目标类型的指针,否则返回nullptr。如果I是一个指向BinaryOperator类型的指针,那么dyn_cast(I)将返回一个指向BinaryOperator类型的指针,并将这个指针赋值给变量BO. 这样BO就会指向I指向的那个BinaryOperator类型的指针.

BinaryOperator类型

BinaryOperator是LLVM中的一种类型,它表示一个二元运算指令,如加法,减法,乘法等。它是一个抽象基类,具体有很多不同的实现。
BinaryOperator是一个抽象类,它描述了二元运算符的基本特征,如操作符、左右操作数、结果等。它派生出了很多具体的子类,如AddOperator,SubOperator,MulOperator等,这些子类都是BinaryOperator的一种具体实现。

BinaryOperator类型是LLVM中一种特殊的指令类型,用于表示二元运算符,如加法,减法,乘法等.

CastInst类型

CastInst是LLVM中的一种类型,表示一个类型转换指令。它是LLVM中的一个抽象基类,具体有很多不同的实现。

CastInst是LLVM中一种特殊的指令类型,用于表示类型转换。类型转换指令可以将一种类型的值转换为另一种类型的值。CastInst类型描述了类型转换指令的基本特征,如输入值、结果类型、转换类型等。它派生出了很多具体的子类,如TruncInst,ZExtInst,SExtInst等。这些子类都是CastInst的一种具体实现。

Value

Value是LLVM中的一个重要的基类,它是LLVM中所有值的基类。在LLVM中,变量,常量,指令都是Value类型。Value类型描述了一个值的基本特征,如值的类型、名称、所属的函数等。

Value是LLVM中的一个抽象基类,它定义了LLVM中所有值的基本特征。它派生出了很多具体的子类,如Constant,Instruction,Argument等。这些子类都是Value的具体实现。

在LLVM中, 所有的值都是Value类型, 这些值可以是常量, 变量, 指令等, 这些类型都是Value的一种具体实现.

Value类型是LLVM中一个重要的抽象基类,它定义了LLVM中所有值的基本特征,如类型、名称、所属的函数等. 这些特征可以被Value的具体实现类继承并进行扩展. 比如变量和常量有自己的特殊特征需要维护,而指令有自己的特殊特征需要维护.

Value类型在LLVM中非常重要, 它是所有值的基类,所以几乎所有的LLVM指令都是Value类型或者它的子类型.

Sort context

Sort context是Z3中用来控制算子变量类型的上下文。它定义了每个变量应该具有的类型,比如,它可以定义一个变量只能被分配到某一种类型的值,比如整数或者布尔值。Sort context还可以定义操作符的参数类型,以及定义操作符的返回值类型。

``` if __name__ == &#39;__main__&#39;: # 载入训练集和验证集的数据 x_train, y_train = load_dataset(&#39;./划分后的数据/训练集&#39;) x_val, _ = load_dataset(&#39;./划分后的数据/验证集&#39;) input_dim = x_train.shape[1] # 创建共享特征提取器 feature_extractor = Sequential([ Dense(128, activation=&#39;relu&#39;, input_shape=(input_dim,)), Dropout(0.5), Dense(64, activation=&#39;relu&#39;) ]) # 创建分类器 classifier_inputs = Input(shape=(64,)) classification_output = Dense(1, activation=&#39;sigmoid&#39;)(classifier_inputs) classifier_model = Model(inputs=classifier_inputs, outputs=classification_output) classifier_model.compile(optimizer=Adam(), loss=&#39;binary_crossentropy&#39;, metrics=[&#39;accuracy&#39;]) # 创建域判别器 discriminator_inputs = Input(shape=(64,)) domain_output = Dense(1, activation=&#39;sigmoid&#39;)(discriminator_inputs) discriminator_model = Model(inputs=discriminator_inputs, outputs=domain_output) discriminator_model.compile(optimizer=Adam(), loss=&#39;binary_crossentropy&#39;, metrics=[&#39;accuracy&#39;]) # 封装整体网络结构用于反向传播 combined_input = feature_extractor.output classification_output_combined = classifier_model(combined_input) domain_output_combined = discriminator_model(combined_input) combined_model = Model(feature_extractor.input, [classification_output_combined, domain_output_combined]) # 冻结判别器权重以仅更新分类器权重 discriminator_model.trainable = False combined_model.compile( optimizer=Adam(), loss=[&#39;binary_crossentropy&#39;, &#39;binary_crossentropy&#39;], metrics=[&#39;accuracy&#39;] ) # 准备域标签 (源域 vs 目标域) batch_size = 32 num_batches = len(x_train) // batch_size for epoch in range(10): # 设置迭代次数 indices = np.arange(len(x_train)) np.random.shuffle(indices) for i in range(num_batches): idx = indices[i * batch_size:(i + 1) * batch_size] source_batch = x_train[idx] # 源域样本 target_batch = x_val[np.random.choice(len(x_val), size=batch_size)] # 随机采样目标域样本 X_combined = np.vstack([source_batch, target_batch]) Y_domain_labels = np.array([1] * batch_size + [0] * batch_size) # 源域标记为1,目标域标记为0 Y_class_labels = y_train[idx].astype(float) # 只有源域才有类别标签 # 更新特征提取器+分类器 combined_loss = combined_model.train_on_batch(X_combined, [Y_class_labels, Y_domain_labels]) # 解冻判别器并单独训练它 discriminator_model.trainable = True disc_loss = discriminator_model.train_on_batch(feature_extractor.predict(source_batch), np.ones(batch_size)) # 判别器区分真实分布 disc_loss += discriminator_model.train_on_batch(feature_extractor.predict(target_batch), np.zeros(batch_size)) discriminator_model.trainable = False print(f"Epoch {epoch + 1}: Combined Loss={combined_loss}, Discriminator Loss={disc_loss}") print("Domain adaptation training completed.") # 测试阶段 - 使用验证集评估分类精度 extracted_features = feature_extractor.predict(x_val) predictions = classifier_model.predict(extracted_features) accuracy = np.mean((predictions > 0.5).flatten() == _) # 替换_为目标验证集的真实标签 print(f"Validation Accuracy: {accuracy:.4f}") validation_accuracy = combined_model.evaluate(x_val, [y_val, ...], verbose=0)[1] # 获取第二个输出的acc指标 print(f"Final Validation Classification Accuracy: {validation_accuracy:.4f}")```运行结果:2025-03-29 15:32:12.506410: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2 To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. Traceback (most recent call last): File "C:/Users/Lenovo/AppData/Roaming/JetBrains/PyCharmCE2020.2/scratches/scratch_19.py", line 104, in <module> Y_class_labels = y_train[idx].astype(float) # 只有源域才有类别标签 IndexError: index 121655 is out of bounds for axis 0 with size 288
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值