Engee函数中的掩码和字符串
在Engee中,您可以向块添加简单的用户界面。 这称为块掩蔽。 掩模可用于对用户隐藏单元的内部结构。 这是一个很棒的技术,让我们从[最后一篇文章](https://engee.com/community/ru/catalogs/projects/prodvinutaia-razrabotka-blokov-engee )。
我们使用的EF_pdist2函数有一个可选参数,即计算模式(度量)。 在项目期间,我们将让用户有机会通过掩码进行控制。
include("PDIST2.jl");
让我们记住模块代码的样子。:
;cat PDIST2.jl
如何将字符串从掩码传递给Engee函数?
在屏蔽Engee函数之前,有必要考虑一个功能限制-Engee函数不能使用类型参数。 String. 但计算方法是由字符串设置的。 因此,我们需要用一定的数字对选定的方法进行编码,将这个数字作为参数传递给Engee函数,然后对其进行解码。 换句话说,掩码将不需要一个参数,而是两个。 然后你可以实现这样的方案:
我们将使用字典解码计算模式,因为Dict数据类型实现了键值对的集合。 在这种情况下,密钥可以是任何基本类型。 因此,甚至可以制作这样的字典。:
``'茱莉亚
mode_dict_t=Dict(1=>"欧几里德",2=>"平方",3=>"曼哈顿",4=>"余弦")
可以看出这里的key是一个整数,value是一个字符串。 这使我们能够执行以下操作:
EF_mode = PDIST2.mode_dict_t[1]
现在让我们来看看Engee功能块方法的代码。:
``'茱莉亚
include("/user/start/examples/base_simulation/advanced_block_masking/PDIST2.jl")
可变结构块<:AbstractCausalComponent
缓存:矩阵{Float64};
modeC::Int64
功能块()
c=零(Float64,INPUT_SIGNAL_ATTRIBUTES[1]。尺寸);
信息("已分配 $(Base.summarysize(c)) bytes for pdist2")
info("Selected $(PDIST2.mode_dict_t[mode])")
新(c,模式)
结束
结束
函数(c::块)(t::实,in1,in2)
试试
c.缓存=PDIST2。EF_pdist2(in1,in2;metric=PDIST2.mode_dict_t[c.modeC]);
渔获
错误("矩阵维度应该相等!")
停止模拟()
结束
返回c.缓存
结束
##modeC##是一个从掩码中获取数字变量值的参数(请参阅)。 因此,我们可以将计算方法传递给我们的PDIST2函数为
``'朱莉娅-repl
PDIST2。mode_dict_t[c.modeC]
我们将通过从下拉列表中回调"真实"参数来获取数字。:
``'茱莉亚
如果掩码。参数。mask_mode。值=="欧几里德"
面具。参数。mask_mode_int。值=1;
elseif面具。参数。mask_mode。值=="平方核素"
面具。参数。mask_mode_int。值=2;
elseif面具。参数。mask_mode。价值=="曼哈顿"
面具。参数。mask_mode_int。值=3;
elseif面具。参数。mask_mode。值=="余弦"
面具。参数。mask_mode_int。值=4;
结束
所以面具会是这样的:
请注意,mask_mode_int参数必须是可计算的。 它是隐藏的,因为我们不想让用户破坏任何东西。
最后,我们将在所有模式下打开并运行最终模型。:
demoroot = @__DIR__
mdl = engee.open(joinpath(demoroot,"EF_DF.engee"))
for k in keys(PDIST2.mode_dict_t)
println("Запускаем модель с режимом $(PDIST2.mode_dict_t[k])")
engee.set_param!("EF_DF/PDIST2", "mask_mode"=>PDIST2.mode_dict_t[k])
engee.run(mdl;verbose=true);
end
结论
在项目期间,我们学习了如何将字符串参数放入Engee函数中,并且还以标准的方式使用字典,尽管不显眼。