JWFDv0.96开源工作流引擎设计---XMLTO-数据库解析过程说明

ACTIVITY 工作流的流程设计器 自带转XML文件 ACTIVITY 工作流的流程设计器 自带转XML文件 在这里插入图片描述 Process Diagram <link href="js/designer/designer.css" type="text/css" rel="stylesheet"/> <!-- comm... 阅读详情

     

        JWFDv0.96开源工作流引擎设计

                       

                        ---XMLTO数据库解析过程说明

 

 

 

  

 

 


注:这篇文章中所使用的“函数”就是指JAVA语言中的方法

 


 

作者 comsci   2011.4.25    四川。成都

 

 

 

 

 

 

简要说明:


 

  实际上用户通过JWFD 流程设计器设计出的流程图的结构一般是保存在 XML 格式的文件中的 (XML 文件结构请参考” JWFDv0.96 开源工作流引擎设计 - 流程图 XML 结构说明 .doc “) ,而流程引擎的运行和控制却是建立在对后台数据库的基本表结构的 SQL 操作基础上面的 ( 数据库结构请参考” JWFDv0.96 开源工作流引擎设计 - 数据库结构明 .doc “) ,因此从前端设计器 XML 到后台数据库基本表的数据解析和转换过程对于整个 JWFD 工作流系统的设计就显得尤为重要,所以我在初步完成了 JWFD 工作流系统设计文档的编写之后,发现这个环节必须补上,因此我将在这篇文档中,详细介绍 JWFD 工作流系统的 XML- 数据库解析过程 ( 包括代码实现 )


我尽量把整个设计思想和实现代码的结构都用很通俗的语言来讲述清楚,方便大家理解,如果经过自己的思考之后,还有不理解的地方,可以给我发邮件或者在JWFD 的论坛上面提问题,非常感谢 fireflow 的非也和 openjweb 的阿宝同志的大力支持,JWFD 也有自己的论坛板块 http://www.fireflow.org/forum-33-1.html ,如果大家对JWFD 有什么意见和建议,可以再这个论坛上面发帖,包括提交 BUG 报告,另外这篇文章中介绍的JWFD代码和程序均在这个地址下载 http://www.cnblogs.com/comsci/favorite/260690.html

 

 

 

 

 

 

 

设计与实现方法:

 

  采用基于JGRAPH 开源软件的流程图数据结构 XML 模型,通过调用 JGraphGXLCodec 类的流程图编码和解码方法,将设计器设计出来的流程图转换为GXL(XML)- 文件格式存储在本地硬盘 ( 服务器 ) 上面 ( 解释 :gxl 文件格式就是一种简单的图形 xml 文件存储格式 ), 然后通过调用 ParserGxl 类和 GxlToDatabase 类实现将XML 文件中存储的流程图数据转换到数据库中进行存储,以便实现下一步 JWFD 流程引擎对流程图数据的处理。

 


 

  JWFD 流程图 - 数据库转换的实现过程

 

上面的图例是JWFD 开源工作流系统里面的流程图 XML- 数据库转换的实现流程,而具体负责实现上述功能的代码是在 JWFD 的代码包里面的  org.jwfd.workflowDesigner.FLCLs.Gxl  的package 里面的下面三个类,如下


 

   org.jwfd.workflowDesigner.FLCLs.Gxl .GxlToDatabase.java

   org.jwfd.workflowDesigner.FLCLs.Gxl .JgraphGxlCodec.java

   org.jwfd.workflowDesigner.FLCLs.Gxl .ParserGxl.java

 

 

主要的实现方法用简单的语言来描述就是: 通过调用DOM( 一种 XML 解析工具包) 类中的函数对流程图文件的 XML 结构进行解析,对存储在 XML 文件里面的流程图的拓扑结构( 节点和连接线 ) 进行提取操作,然后把提取出来的流程图拓扑结构据通过数据库的 SQL 操作 insert , update 等方式插入到已经建立好的 MYSQL 数据库的 JWFD 流程基本表中( JWFD 的流程基本表的表结构请参考  JWFDv0.96  开源工作流引擎设计 - 数据库结构说明 .doc   一文)

 


 

需要说明的是, XML 解析模块在JWFD 中主要是依靠 JGRAPH 开源软件的 XML 处理模块来实现的,JWFD 通过调用这个 XML 处理模块,然后加上 XML 数据整理和数据库操作方法来共同完成这一过程


在这篇文章中,我主要介绍ParserGxl类的实现过程和代码结构,因为只要理解这个类的结构,其它两个相关类的结构就可以很容易的理解了,这个ParserGxl类是主体结构,而其它两个类是附属功能模块

 

public   ParserGxl (String fe, String gid)  throws  Exception {}


 

这个类中的主函数  ParserGxl() 是一个DOM 类的变形函数,主要用于从流程图的 XML 文档中把流程图的节点,连接线,坐标等数据提取出来,如果大家需要改造流程图的定义 XML 文件格式,那么就需要对这个函数中的某些代码有所了解


 

 

现在我们来对具体的实现代码进行分析


 

File f =  new  File(fe) ;  这句代码的意义是通过参数 fe传递过来的文件名称建立一个文件类型的变量 f ,这个变量 f 就是后面 DOM 类用来读取 xml 文件的文件名称

 

 

DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance ();

这句代码的意义是建立一个 XML文档数据处理模型的实例  .newInstance 的意思就是在内存中创建一个 XML 数据模型的实例


 

DocumentBuilder db = dbf.newDocumentBuilder();

这句代码的意思是 实例化一个XML文档解析类

 

 

Document doc = db.parse(f);

这句代码的意思是 装载前面导入的XML文件


 

Element gxl = (Element) doc.getDocumentElement(); 

NodeList graph_list = gxl.getChildNodes();

 

 

这两句代码的作用是初始化需要解析的XML 文件,并获取该 XML 文件的第一个元素,并从第一个元素列表 list 开始解析这个 XML 数据

 

实际上,前面几句代码联合在一起就是一个初始化 XML数据处理类的代码段,这些代码段是统一在一起的,不能够分开使用,这点需要注意,特别是大家在复制这段代码的时候要注意 它们是一个整体,作用是初始化一个XML 数据模型实例,并为下面的提取 XML 数据元做准备

 

 

if  (graph_list.getLength() == 0) {   return ;}

这段代码的意思通过判断xml 数据列表的长度是否为 0 ,并执行返回命令

 

 

for  ( int  graph_index = 0; graph_index < graph_list.getLength(); graph_index++) {      

这个for循环的循环控制变量 graph_index 是 XML 文件的数据段长度,从这个循环开始程序开始自动的提取 xml 文件的数据


Node graph_node = graph_list.item(graph_index);

定义一个Node 类型变量  并从 graph_list 数组 item 中提取 graph_node 元数据

 

 

if  (graph_node.getNodeName().equals( "graph" )) {}

这个IF 判断的用处是通过判断 xml 数据段的初始名称是否为 "graph" ,如果是则决定执行下面的操作 , getNodeName() 方法是用来程序读取XML 数据段节点名称的操作

 

 

Element graph_elem = (Element) graph_node;

定义一个 Element元素变量,并将 graph_node 变量类型强行转化为 Element 类型


 

NodeList list = graph_elem. getChildNodes ();

定义一个NodeList 变量 list  并将前面定义的 graph_elem 里面的子元素提取出来


 

for  ( int  i = 0; i < list.getLength(); i++) { }

这个FOR 循环把前面获得 xml 流程图的 LIST 数据列表的长度作为循环控制条件,循环体内部是读取 XML 流程节点和连接线数据的操作函数,读取这些数据并同步写入数据库的表中

 

 

注意,这个for 循环和前面另外一个 for 循环共同发挥作用,一起来做这个 XML 数据提取工作,因为 XML 数据结构是嵌套的,因此需要两个 FOR 循环来一起使用

 

 

 

 ================================================================= =====================


  if  (node.getAttributes() !=  null  && node.getNodeName() !=  null )  {

        String    type = node.getNodeName().toString().toLowerCase(); 

 

            if  (type.equals( "node" ))  {

    

            Node edgeid = node.getAttributes().getNamedItem( "id" );

           String id = edgeid.getNodeValue();

 

 

 

 这两个嵌套的if 判断语句是用来过滤需要提取的 XML 数据的标志头的,第一个 if 判断语句是过滤空数据的操作 , 就是属性和名称都为空 null 的数据就不进入下一步的提取操作,而非空的数据则需要进行 tostring()- 字符串转换操作并转化为小写 lowerCase()

 

 

第二个if 语句是判断 type 数据名称是否为 node- 节点 如果数据段标志为 node ,则我们就可以对这个 XML 数据段中包含的数据进行提取,这里主要提取两个标志中的数据,一个是节点的 id ,一个是连接边 edge 的 id ,并在下面的 wis.into_node() 方法中把这两个关键 id 值写入到数据库的表结构中去

 


 

================================================================= =========================      

 

wis.into_node( getLabel (node),id,gid,getcondition(node) );


 

这句代码是这个类中所有代码的一个核心语句,意义就是把提取出来的XML 文件中的流程图节点的 id 和节点包含的条件控制参数数据一起写入数据库中,当然这个方法是引用另外一个类 GxlToDatabase 中的操作,该操作实际上是一个SQL 操作,具体的代码如下

 

 

  "insert into step_main(step_name,graph_id,step_id,cond) values

 ('"  +step_name + "','"  + gid +  "','"  + step_id +  "','"  + condition +  "')"

 

 

Insert语句中使用的数据库表名称  step_main 是 JWFD 数据结构的节点主表,其表结构的详细说明请参考文档  JWFDv0.96 开源工作流引擎设计 - 数据库结构说明 .doc  


 

这个语句中的insert 插入操作仅仅涉及 step_main 表中的 step_name( 节点名称 ) 字段, graph_id (流程图 id )字段 ,step_id( 节点 id) 字段 ,cond (节点嵌入条件控制参数)字段,而这些字段中的具体数据就是用前面所描述的那些 JAVA 语句从 XML 数据文件中提取出来的,所以按照 insert 操作的顺序我们可以了解  getLabel(node) 是取节点名称的操作 ,id 是流程节点的 id , gid 是流程图的 id,getcondition(node) 是取节点嵌入的条件控制参数的操作,这样的说明是否让大家对本语句所执行的操作和涉及到数据结构有比较清晰的理解了呢? 如果还有不清楚地地方,请给我 发邮件 或者在论坛上面发帖或者加我的QQ(784092877) ,我会尽量回答大家的问题 

 

 

接下来的这个IF 判断语句是继续前面的工作,不过这次是提取 XML 中的节点之间的连接线 edge 的数据,如果类型为 edge  则进行下面的提取操作

 


 

if  (type.equals( "edge" ))

 

 

================================================================= ======= =====================

 


 

  String from =  null ;

  String to =  null ;

  String edge =  null ;

  String prop =  null ;

  

  Node edgeid =  node.getAttributes().getNamedItem ( "id" );

  Node tmp =  node.getAttributes().getNamedItem ( "from" );

    Node tmp1 =  node.getAttributes().getNamedItem ( "to" );

  

  edge = edgeid. getNodeValue ();

  from = tmp. getNodeValue ();

  to = tmp1. getNodeValue ();

 


 

这段代码完成几个工作,前面四行定义四个字符串 (from,to,edge,prop) 变量,用于存储接下来要提取的 XML文件中的连接线数据 , 其中 from 用于存储节点连接线的起始端点, to 变量用于存储节点连接线的终止端点,两个节点之间的连接线就是通过起始端点和终止端点来定义的,另外加上一个 Edgeid 变量,这个变量作为连接边的唯一标志 id


 

而接下来的代码段中的粗体字所表示的代码就是本程序用于提取xml 文档中的数据的操作函数,这些操作代码来源于 JAVA 的 XML 处理模块 dom 类 , 大家可以找找专门介绍 DOM 数据处理的文章来看看,我在这里就不做详细介绍了

本段最后的三行代码就是利用getNodeValue() 函数把 XML 数据段中的流程图的边,边起始点,边终止点的具体数据提取出来,并存放在前面定义的字符串变量 edge,from,to 中,以便下一步的处理

 


 

================================================================= ======= =====================

 

  try  {

      wis.into_edge(edge, from, to, gid, getcondition(node));

 } catch  (Exception ex) {

    System. out .println( "创建edge异常:"  +ex);

  }


 

在理解前面一段的代码的意义之后,我们再来看看这段代码,这是一个 try-catch异常处理语句包围的功能执行语句 , 前面我们已经介绍过这种 wis 类中的一个函数  wis.into_node ,而这里的 wis.into_edge 的功能和这个 wis.into_node 的功能是对应的, into_node() 函数是系统在提取了xml 数据段中的节点相关数据之后,往数据库中写入这些数据的功能代码函数,而 into_edge() 函数却是系统在提取了XML 数据段中的节点连接边的相关数据之后,往数据库中写入这些节点连接边数据的功能代码函数,这个功能函数其实和前面介绍过的 into_node() 函数一样,是一个SQL 语句,具体代码如下

 

"insert into edge_control(edge_id,from_step,to_step,graph_id,prop) values 

('"  +edgeid +  "','"  + from + "','"  + to +  "','"  + gid +  "','"  + prop +  "')"

 

前面介绍过这种类似的SQL 操作,这里就再简略介绍下   

 

edge_control  是 JWFD 流程数据库结构中的一个基础表,这个基础表是系统用于存储流程图中连接边 edge 的一张表,其详细的数据结构请参考  JWFDv0.96 开源工作流引擎设计 - 数据库结构说明 .doc  

 

 

向 edge_control 数据表中写入的数据参数分别如下


 

Edge_id    两个节点间连接线段的唯一标识id 

From_step   连接线段的起始节点id

To_step     连接线段的终止节点id

Graph_id    该连接线段所在的流程图的id

Prop         该连接线所包含的嵌入式参数( 未使用 ) ,这里通过 getcondition(node) 函数来获得这个参数,实际上并未使用,这个参数是节点的嵌入数据,而不是连接边的嵌入数据


 

所有这些参数都已经通过前面的 XML数据提取操作保存在本类定义的字符串变量中了,这个 sql 操作就用这些字符串变量作为写入数据库中的实际数据变量

 

 

================================================================= =======================


 

到这里为止,系统提取XML 数据的功能代码  和写入数据库的操作代码 就基本介绍完了,这个类的剩下的函数的代码  都是同一结构的函数,其主要功能是提取 xml 数据段中的详细参数,比如说 getlabel 是提取 xml 数据段中的节点的名称 , 注意是名称而不是 id ,而 getcondition 是提取节点中嵌入的条件表达式参数, getBound 是提取节点在整个流程图的二维坐标的数据,这些功能代码的结构均来自 jgraph 的一个子项目  jgraphpad 的代码包中,我仅仅是做了下修改,具体的代码结构我就不做详细的介绍了

 

 

 

protected  String getcondition(Node node) {}

protected  String getLabel(Node node) { }

protected  Vector getBound(Node node) { }

 

 

 

只有一个地方需要注意下,如果大家要自定义这些函数,比如说根据系统的需要修改了XML 文件的自定义的变量,现在需要提取这些新的定义变量,仅仅需要修改这些函数的一行,就可以实现代码复用

 

 

if  (attr.getNodeName().equals( "attr" )

            && attr

            .getAttributes()

            .getNamedItem( "name" )

            .getNodeValue()

            .equals(

             "Condition" )) 

 


 

如果大家需要复用这段代码,只需要修改这段代码的最后一行的参数  这里是Condition ,而仅仅需要把这个 Condition 修改为你定义的 XML 的参数即可,而整个函数都可以立即复用,并不需要修改其他的部分,当然需要修改下函数的名称

 

 

================================================================= ======================


 

实际上,到目前为止,通过这里所介绍的代码,我们就完成了将通过流程设计器设计好的流程图的XML 文件转换并保存在后台的数据库中这一过程了,在实现这一个过程之后,我们就可以通过对数据库中的这些流程图数据进行 SQL 操作,来实现一个流程引擎的一系列功能了,流程引擎的底层操作 API 的结构和说明请参考下面的文档和代码

 

 

 

JWFDv0.96 开源工作流系统 - 二次开发 API 简易说明 .doc

JWFDv0.96 开源工作流引擎设计 - 流程图 XML 结构说明 .doc

JWFDv0.96 开源工作流引擎设计 - 自动运行控制器结构说明 .doc


 

 

 


SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

[JWFD开源工作流]最新版实时编译器(支持三角函数)

NULL 博文链接:https://comsci.iteye.com/blog/2275204

Java调用XML的方法:DocumentBuilderFactory

首先得到:得到 DOM 解析器的工厂实例      DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); 然后从 DOM 工厂获得 DOM 解析器  DocumentBuilder dombuilder=domfac.newDocumentBuilder();   3 )把要解析的 XML 文

何成俭的博客 6018

[JWFD开源工作流]JWFD开源工作流-设计器界面二次开发说明(添加工具栏图标)

NULL 博文链接:https://comsci.iteye.com/blog/2145362

[原创]JWFDv0.96开源工作流引擎设计---XMLTO数据库解析过程说明

JWFDv0.96开源工作流引擎设计 ---XML to 数据库解析过程说明 注:这篇文章中所使用的“函数”就是指JAVA语言中的方法 作者 comsci 2011.4...

chenglan8953的博客 241

ULN2003驱动28BYJ-48步进电机详解(附:51 32代码讲解)

本文介绍了28BYJ-48步进电机的驱动原理以及注意事项,并展示了极简 32 51驱动代码

qq_41818650的博客 1万+

保姆级教程:在Ubuntu 22.04上用Python3.10和pysoem搞定EtherCAT电机回零与位置控制

本文提供在Ubuntu 22.04上使用Python3.10和pysoem实现EtherCAT电机回零与位置控制的详细指南。涵盖环境搭建、权限配置、EtherCAT主站架构解析、CiA402协议核心机制及工业级精度控制实现,帮助开发者快速掌握Python在工业自动化中的应用。

weixin_30952535的博客 330

[] [原创]JWFDv0.96开源工作流引擎设计---XMLTO数据库解析过程说明

[size=large] [b] jwfdv0.96开源工作流引擎设计[/b][/size] ---xml to 数据库解析过程说明 [img]http://dl.iteye.com/upload/attachment/473615/7776fcd4-122b-3773-b367-d9...

我的技术博客 241

离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制

在进行深度学习算法的环境部署时,由于生产服务器被彻底隔离外网,只能把conda中env文件夹中的虚拟环境文件夹从开发机直接拷到Windows 服务器,但在运行labelimg等工具时可能报错,因此用conda-pack来解决。

weixin_44115575的博客 1428

XXE外部实体注入漏洞的测试和修复——Java

测试过程: 代码检测时发现存在XXE问题,可通过自行改造的xml内容,请求存在XXE问题的接口,测试该漏洞。 比如使用如下xml,通过读取document中 testText这个Element,即可获取到test.json中的文件内容: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE entity [ <!ENTITY file SYSTEM "file:///C:/Users/xxx/Desktop/test.json".

逆水行舟 7426

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。 本篇文章将演示怎样在Unity中接入百度翻译,实现文本自动翻译的功能。

努力前行,总会成为自己心中的那道光 9060

网络速度的极致:800G & 1.6T 以太网的突破!

你好,这里是网络技术联盟站。在我们进入数据驱动的世界时,以太网的重要性日益突出。从根本上说,以太网是一种连接计算机的技术,旨在形成一个本地网,通过它,设备可以与其他设备进行通信。然而,随着时间的推移,以太网已经发展成为一种全球的数据通信系统,其速度从初始的10Mbit/s发展到现在的800G,甚至1.6T。这种巨大的进步并不是没有挑战的,但每一次的突破都代表了技术的巨大飞跃。本文将探讨800G和1.6T以太网的创新与挑战。

网络技术联盟站 1773

[原创]JWFDv0.96 开源工作流发布前的一些问题说明

                随着工作流技术的发展,工作流产品的应用范围也不断的在扩展,开始进入了像金融行业(我已经看到国有四大商业银行的工作流产品招标公告了),实时生产控制和其它比较重要的工程领域,而这些领域对数据的准确性和实时性要求都比类似文件管理,办公系统这些高得多,那么如果工作流技术要进入这些领域,我们该做些什么准备呢?       我在这里需要结合工作流系统设计的一些具

comsci的专栏 847

Go语言Gin框架项目:从零到一搭建一个用户管理系统

本文介绍了一个基于Go语言Gin框架开发的用户管理系统。系统采用MySQL数据库存储数据,使用Bootstrap 5构建现代化UI界面,实现了完整的CRUD功能。主要特点包括:RESTful API设计、前后端双重表单验证、实时搜索功能、SQL防注入措施以及响应式布局。项目结构清晰,包含数据库配置、用户模型、处理器和前端模板等模块。系统提供用户列表展示、新增/编辑表单、删除确认等功能,通过参数化查询确保安全性,并支持按姓名或邮箱搜索用户。

数据知道的博客 3995

dbf解析_DOM解析以及SAX解析流程

1、什么是DOM?DOM:Document Object Model,文档对象模型,DOM解析形成了树结构,有助于更好的理解、且代码容易编写。解析过程中,树结构保存在内存中,方便修改。2、DOM解析XML的步骤?1、创建一个DocumentBuilderFactory的对象2、创建一个DocumentBuilder对象3、通过DocumentBuilder的parse(...)方法得到Docume...

weixin_31764905的博客 218

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 838

RK3588开发板NPU加速YOLO目标检测完整实战教程

🚀 RK3588开发板NPU加速YOLO目标检测实战 本文详细介绍了如何在瑞芯微RK3588开发板上利用内置NPU加速YOLO目标检测的全流程: 1️⃣ 环境准备:配置RKNPU2 SDK和aarch64交叉编译器,搭建Ubuntu开发环境 2️⃣ 模型转换:从ONNX格式转换为专用RKNN模型,适配NPU硬件特性 3️⃣ 性能对比:NPU推理将处理时间从833ms降至50ms以下,帧率提升16倍 4️⃣ 实战应用:支持图像/视频流/摄像头实时检测,提供完整编译和运行命令 关键优势:专为边缘AI设计的6T

FJN110的博客 931

[JWFD开源工作流]最新的工程

博客分类:       暂时先放在ITEYE上面。。。博客园过段时间再放出来。。。。        说明一下这个版本,主要是把时频发生器与主引擎结合起来了,在自动运行控制器的运行过程中,我们就可以通过修改参数,对运行过程的时序进行调控了,当然还有很多问题,各位朋友。。请看看注释和说明吧。。。。  伦理片 http://www.dotdy.com/       我释放

dotedy的博客 380

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JWFD 开源工作流 v0.97.000的新特性

JWFD 开源工作流 v0.97.000版本的新特性 流程图XML的每一个节点增加一个节点属性 NodeType 可以让用户在节点中定义这个节点的使用属性,比如说可以是 普通节点 或者 数据处理节点,人工处理节点,自动控制节点,智能路由节点,系统节...

chenglan8953的博客 240

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

177.Agent-LangGraph-MCP的构成说明

MCP架构通过MCP主机、客户端与服务器的协同,实现工具、资源与提示词的统一管理。MCP服务器提供Tools、Resources、Prompts能力,MCP客户端则负责发现、调用与读取,使Agent可按需获取上下文。其核心在于将工具从Agent中抽离,封装为可复用的服务,提升灵活性与可维护性,推动AI应用高效协作。

计算机王的博客 295

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 477

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 436

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 251

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 314
上一篇: jwfd工作流引擎设计-流程数据同步控制器的设计思路及其矛盾
下一篇: [原创]JWFD工作流-流程-数据同步控制的简明设计思路
comsci
博客等级 码龄22年 412粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值