1.AI与PDE(七):AFNO模型的源代码解析
2.Struts 2çResult Type
3.forwardJSP 语法
4.C++右值引用
AI与PDE(七):AFNO模型的源代码解析
本文旨在解析AFNO模型的源代码,帮助读者理解模型细节与主干结构。首先,AFNO模型的主干框架在afnonet.py文件中定义,通过类AFNONet实现。模型的星球漩涡源码核心功能封装在多个类与函数中,依据代码注释逐步解析。
在代码中,forward_features函数负责模型的核心逻辑,包括patch切割与mixing过程。这些操作由PatchEmbed类实现。位置编码self.pos_embed通过高斯初始化得到,增加模型的表示能力。
关键模块AFNO2d位于代码中,class源码代码它基于FNO的原理,负责处理输入数据。AFNO2d模块在forward_features函数中通过循环调用,实现数据的转换与混合。
经过数个L layer处理后,模型进入类似解码器的结构,用于将中间结果映射为目标结果。这一过程通过self.head(x)实现,以解决特定分类问题。
本文通过梳理代码流程与结构图,直观展示了AFNO模型的工作原理。读者可参考AFNO的GitHub源代码与论文,深入理解细节。量能专家源码后续文章将继续探讨基于AFNO模型框架的其他应用,如FourCastNet。
Struts 2çResult Type
å¨é»è®¤æ¶ï¼<result>æ ç¾çtypeå±æ§å¼æ¯âdispatcherâï¼å®é ä¸å°±æ¯è½¬åï¼forwardï¼ãå¼å人åå¯ä»¥æ ¹æ®èªå·±çéè¦æå®ä¸åçç±»åï¼å¦redirectãstreamçãå¦ä¸é¢ä»£ç æ示ï¼<result name=save type=redirect>
/result.jsp
</result>
è¿æ¤result-typeå¯ä»¥å¨struts2-core-2.0..1.jarå æstruts2æºä»£ç ä¸çstruts-default.xmlæ件ä¸æ¾å°ï¼å¨è¿ä¸ªæ件ä¸æ¾å°<result-types>æ ç¾ï¼ææçresult-typeé½å¨éé¢å®ä¹äºã代ç å¦ä¸ï¼ <result-types><result-type name=chain class=com.opensymphony.xwork2.ActionChainResult/><result-type name=dispatcher class=org.apache.struts2.dispatcher.ServletDispatcherResult default=true/><result-type name=freemarker class=org.apache.struts2.views.freemarker.FreemarkerResult/><result-type name=.opensymphony.xwork2.ActionChainResultchainå ¶å®åªæ¯å¨ä¸ä¸ªactionæ§è¡å®æ¯ä¹åï¼forwardå°å¦å¤ä¸ä¸ªactionï¼æ以ä»ä»¬ä¹é´æ¯å ±äº«HttpServletRequestçãå¨ä½¿ç¨chainä½ä¸ºResultæ¶ï¼å¾å¾ä¼é å使ç¨ChainingInterceptorãChainingInterceptorçä½ç¨æ¯å¨Actionç´æ¥ä¼ éæ°æ®ãäºå®ä¸ï¼æºActionä¸ValueStackçæ°æ®ä¼è¢«åä¸æ¬¡Copyï¼è¿æ ·ï¼2个Actionä¸çæ°æ®é½å¨ValueStackä¸ï¼ä½¿å¾å¯¹äºåå°æ¥è¯´ï¼éè¿ValueStackæ¥åæ°æ®ï¼æ¯éæèå ±äº«çãæ¯å¦è¯´ï¼ä¸å¼ 页é¢ä¸ï¼ä½ å¯è½æ许å¤æ°æ®è¦æ¾ç¤ºï¼èæäºæ°æ®çè·åæ¹å¼å¯è½è¢«å¾å¤ä¸åç页é¢å ±äº«ï¼å ¸åæ¥è¯´ï¼âæ¨èæç« âè¿ä¸ªå°æ ç®çæ°æ®è·åï¼å¯è½ä¼è¢«å¾å¤é¡µé¢æå ±äº«ï¼ãè¿ç§æ åµä¸ï¼å¯ä»¥æè¿é¨åé»è¾æ½åå°ä¸ä¸ªç¬ç«Actionä¸ï¼å¹¶ä½¿ç¨chainï¼å°è¿ä¸ªActionä¸ä¸»Action串èèµ·æ¥ãè¿æ ·ï¼æåå°è¾¾é¡µé¢çæ¶åï¼é¡µé¢å§ç»å¯ä»¥å¾å°æ¯ä¸ªActionä¸çæ°æ®ã
ä»å®æä¸è®²ï¼ä½¿ç¨chainä½ä¸ºResultä¹çç¡®åå¨çä¸é¢æ说ç许å¤é®é¢ï¼æ个人ä¹æ¯é常ä¸æ¨å´æ»¥ç¨è¿ç§Resultãå°¤å ¶æ¯ï¼å¯¹äºä½¿ç¨SpringåHibernateçæåæ¥è¯´ï¼å¦æä½ å¼å¯OpenSessionInView模å¼ï¼é£ä¹Hibernateçsessionæ¯è·éHttpServletRequestçï¼æ以sessionå¨æ´ä¸ªactioné¾ä¸å ±äº«ãè¿ä¼ä¸ºæ们çç¼ç¨å¸¦æ¥æ大ç麻ç¦ãå 为æ们ç¥éHibernateçsessionä¼ä¿çä¸ä»½ä¸çº§ç¼åï¼å¨actioné¾ä¸ï¼å ±äº«ä¸çº§ç¼åæ çä¼ä¸ºä½ çè°è¯å·¥ä½å¸¦æ¥å¾å¤§çä¸æ¹ä¾¿ã
æ以ï¼è°¨æ 使ç¨chainä½ä¸ºä½ çResultï¼åºè¯¥æ为ä¸æ¡æä½³å®è·µã éå®åå°ä¸ä¸ªURL org.apache.struts2.dispatcher.ServletRedirectResultå¦æä½ å¨Actionæ§è¡å®æ¯åï¼å¸ææ§è¡å¦ä¸ä¸ªActionï¼æ2ç§æ¹å¼å¯ä¾éæ©ãä¸ç§æ¯forwardï¼å¦å¤ä¸ç§æ¯redirectãæå ³forwardåredirectçåºå«ï¼è¿éæå°±ä¸åå±å¼ï¼è¿åºè¯¥å±äºJavaç¨åºåçåºæ¬ç¥è¯ãå¨Struts2ä¸ï¼åå«å¯¹åºè¿ä¸¤ç§æ¹å¼çResultï¼å°±æ¯chainåredirectã
å æ¥è°è°redirectï¼æ¢ç¶æ¯éå®åï¼é£ä¹æºå°åä¸ç®æ å°åä¹é´æ¯2个ä¸åçHttpServletRequestãæ以ç®æ å°åå°æ æ³éè¿ValueStackçStruts2çç¹æ§æ¥è·åæºActionä¸çæ°æ®ã
åæ¶ï¼RedirectçResultæ¯æå¨é ç½®æ件ä¸ï¼è¯»å并解ææºActionä¸ValueStackçå¼ï¼å¹¶æ为åæ°ä¼ éå°Redirectçå°åä¸ã éå®åå°ä¸ä¸ªAction org.apache.struts2.dispatcher.ServletActionRedirectResult
forwardJSP 语法
在Java Server Pages(JSP)中, 标签用于将请求转发到指定的页面。这个标签有两个基本用法,具体如下: 第一种形式,<jsp:forward page="relativeURL | "/>。这里的 "relativeURL" 是相对于当前 JSP 页面的 URL。而 "" 是一个表达式,它可以在 JSP 页面的 Java 源代码中执行,然后将表达式的结果作为 URL 的一部分。 第二种形式,<jsp:forward page="relativeURL | ">。netty 源码架构与第一种形式相似,这里同样使用 "" 执行表达式,将结果添加到 URL 中。 此外, 标签还可以结合 标签使用,以传递参数到目标页面。例如: <jsp:forward page="relativeURL | "><jsp:param name="parameterName" value="{ parameterValue | }" />。在这里,"parameterName" 是参数的名称,"{ parameterValue | }" 是参数的值,同样执行表达式得到结果,然后将结果作为参数值传递给目标页面。 使用 标签可以实现页面间的交易公式源码动态转发,这对于实现前后端分离的 Web 应用程序来说,是一个非常有用的功能。通过使用表达式,可以根据用户操作或其他动态条件,改变转发到的目标页面,从而提供更丰富的用户体验。扩展资料
forward,用法格式为,用于重定向一个HTML文件,JSP文件,或者是一个程序段.C++右值引用
什么是引用?
引用可以看作是变量的一个别名,它与原变量共享同一块内存地址;这意味着对引用的修改会直接反映在原变量上。
接下来通过测试代码和反汇编去观察它的工作流程。
1. 右值引用
2.1. 概念
C++ 引入了一种新的引用类型:右值引用,它主要用于优化临时对象的资源管理。
右值是临时的,它不具有明确的内存地址,例如:字面量、临时对象或者返回值。
右值引用的声明方式:在类型后面使用两个 & 符号(type&&),例如:int&&。
概念比较抽象,我们通过测试源码,先简单地去了解它使用。
2.2. 注意
要注意某些场景,右值引用作为左值使用。
3. 万能引用
万能引用是一种特殊的引用类型,它可以同时接受左值和右值。
它的类型是 T&& 模板变量类型或 auto&&,这些须要编译器推导的类型它是万能引用;它有可能是右值引用,也可能是右值引用,取决于传递给它的实参类型。
右值引用类型是:type&&,type 都是明确的类型,例如:int&& 并不须要编译器进行推导。
4. 引用折叠
引用折叠是一种语言特性,主要用于处理模板和类型推导中的引用类型。
如果模板类型 T = A,那么 ‘T&’ 就是 ‘A&’,’T&&’ 就是 ‘A&&’ 这是正确的,然而 T = A&,那么 ‘T&&’ 就是 ‘A& &&’,显然这种类型是错误的,它需要编译器进行引用折叠,将 ‘A& &&’ 折叠成 ‘A&’ 才能正确使用。
其它引用类型折叠场景,详细请参考下面图表。
5. 移动语义
5.1. 概念
在 C++ 之前,我们通常通过复制构造函数来复制对象,但这种方式可能会导致资源浪费。
通过使用右值引用的移动语义,我们可以将资源从一个对象移动到另一个对象,无需复制,从而提高了效率。
例如下面的测试代码,创建 b 对象:
其它的移动语义使用场景可以参考: [stl 源码分析] 移动语义是如何影响程序性能的(C++)
5.2. 注意
上面移动语义测试例子,对象间的资源转移主要做了三件事:
因为资源移动涉及到对象资源重置,有一定危险性,特别是源对象被移动处理后,如果被再次使用是非常危险的(参考上述测试例程)。
5.3. std::move
std::move 是 C++ 标准库中的一个函数模板,它可以将其参数转换为右值引用,从而可以触发移动语义。
6. 完美转发
6.1. 概念
完美转发 - std::forward,正常的使用方式是结合万能引用使用,将模板函数的参数类型:万能引用转换为对应的左值引用或右值引用。
6.2. std::forward
从 std::forward 的实现源码来看,并不复杂,结合上面的引用折叠 来理解,就能推导出对应的引用返回类型。
7. 小结
8. 引用
9. 后记
最近遇到职业生涯最硬核的(C++)笔试:指定时间内完成 道选择题。
面试可以复盘知识,也帮我挑出了薄弱环节,例如 右值引用 等等,因此有了此文。
—— 既来之,则安之。感恩挑战~