diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..d898ce4f --- /dev/null +++ b/404.html @@ -0,0 +1,4493 @@ + + + + + + + + + + + + + + + + + + + + + JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Final/Final.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Final/Final.pdf" new file mode 100644 index 00000000..7ce215e8 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Final/Final.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Final/Final/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Final/Final/index.html" new file mode 100644 index 00000000..cef03fae --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Final/Final/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab Final - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab Final

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/Lab1 \345\270\270\347\224\250\344\273\252\345\231\250\344\275\277\347\224\250\347\273\203\344\271\240\345\256\236\351\252\214/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/Lab1 \345\270\270\347\224\250\344\273\252\345\231\250\344\275\277\347\224\250\347\273\203\344\271\240\345\256\236\351\252\214/index.html" new file mode 100644 index 00000000..efb2861b --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/Lab1 \345\270\270\347\224\250\344\273\252\345\231\250\344\275\277\347\224\250\347\273\203\344\271\240\345\256\236\351\252\214/index.html" @@ -0,0 +1,5608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 1 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

常用仪器使用练习实验

+

实验日期:2023/9/18

+

地点:东3-406

+

实验目的

+
    +
  1. 认识和学会选择常用无源电子器件(主要是电阻与电容)
  2. +
  3. 掌握常用电子仪器的使用(万用表、直流稳压电源、示波器、信号源、ADCL-I模拟数字电子技术实验箱)
  4. +
+

基本实验内容

+

实验1:万用表使用

+

实验器材

+
    +
  1. 万用表(HY63)
  2. +
  3. ADCL-I模拟数字电子技术实验箱中的点解电容、电阻、电位器
  4. +
  5. 直流稳压电源
  6. +
  7. 连接线
  8. +
+

实验方案

+
    +
  1. 用万用表测出任意二个电阻(R)的阻值,并与其色环所指示的电阻值进行比较。
  2. +
  3. 检查并验证电位器(M) 中心头的功能。
  4. +
  5. 查看电解电容器(CD)上的规格和极性标记,并用万用表检查电解电容器的漏电阻(注意万用表笔的极性),测出任意二个电容器的漏电阻值。
  6. +
  7. 调节稳压电源输出 +/-12V,用万用表测量并验证。
  8. +
+

测试过程和结果

+

(一)万用表测电阻

+
测试过程
+
    +
  1. 打开万用表并选择电阻测量模式,将红色连接线连结到Ω测量口,黑色链接COM输入口。
  2. +
  3. 选择一个电阻,调节档位至相应档位。
  4. +
  5. 将红黑表笔分别插入电阻对应的插孔。
  6. +
  7. 读取液晶屏读数,并记录读数。
  8. +
  9. 选取不同的电阻,重复2~4步。
  10. +
+
测试结果
+

+

这些电阻为五道色环对应读数

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
电阻标称阻值标称允许误差测量值实际误差是否在容许误差内
2KΩ(红黑黑棕200*10^1^)±1%1.992KΩ0.40%
510Ω(绿棕黑黑510*10^0^)±1%505.8Ω0.82%
+
结果分析
+

使用万用表欧姆档所测量的电阻阻值与标称阻值略有偏差,但均在允许误差范围内。

+
+

(二)电位器(M) 中心头的功能

+
测试过程与测试结果
+
    +
  1. +

    打开万用表并选择电阻测量模式,将红色连接线连结到Ω测量口,黑色链接COM输入口。

    +
  2. +
  3. +

    选择合适的量程,由于我们选择的是10KΩ的电位器,所以将欧姆表调为60KΩ档位。

    +
  4. +
  5. +

    将黑色表笔插入电位器位于中心的孔,红表笔插入两旁的孔。

    +
  6. +
+

+
    +
  1. 旋转电位器旋钮,发现万能表示数发生变化。
  2. +
+

我们观察到阻值从8.71KΩ,变至10.15KΩ。

+

+
    +
  1. +

    调换红表笔至另一端的插孔,发现读书变为0,反方向旋转电位器,示数增大。

    +
  2. +
  3. +

    将红黑表笔插入电位器两端接口,发现示数即为之前所得最大值10.15KΩ。

    +
  4. +
+
结果分析
+

旋转电位器,能够改变电位器的阻值。中心头应该起到调节短路部分电阻的作用,从而使得电位器阻值发生变化。

+
+

(三)测量电容漏电阻

+

理想电容在充满电的情况下,应该完全绝缘,但实际情况并非如此,仍有一定量的电流通过,说明此时电容存在一个电阻,这个电阻被称为漏电阻。从以上分析也可以知道,电容的漏电阻应该非常大,所以选取的万用表欧姆最大档进行测量。在测验过程中,也选择过较小档位,但是,很快就会出现OL显示,说明电容的漏电阻非常大。

+
测试过程
+
    +
  1. 打开万用表并选择最大欧姆档(60MΩ)测量模式,将红色连接线连结到Ω测量口,黑色链接COM输入口。
  2. +
  3. 将红表笔接在电解电容正级,黑表笔接在负极,等待电表示数稳定以后,读出示数。
  4. +
  5. 更换一个电阻,重复上述步骤2,得到多个电容的漏电电阻。
  6. +
+
测试结果与分析
+ + + + + + + + + + + + + + + + + + + + +
电容量/最大工作耐压测试结果分析
100µF/25V未知,>8.3MΩ由于万用表中的阻值也非常大,充电时间非常长,示数一直在增大,所以未知实际漏电电阻为多少
1000µF/25V>8.61MΩ等待电容充完电后,万用表示数,保持稳定,该大电容的示数也一直在增大,但增大速度小于100µF的电容,根据t=CR,可以猜想,所需要的充电时间更长,充电速度更慢,因此相应的欧姆表示数跳大的速率也比较小。
+
+

(四)调节稳压电源输出 +/-12V

+
测试过程与测试结果
+
    +
  1. 打开直流稳压源,切换至channel2,旋转Voltage按钮,直至显示12V(这里要慢慢地旋转,否则会以为示数并没有变化)
  2. +
  3. 将万用表切换至60V电压档,将红表笔与电源正极连接,黑表笔与负极连接,按输出按钮,测得读数12.09V,此时电源的电流示数自动跳为0A
  4. +
  5. 再按一次输出按钮,停止电源输出,交换红黑表笔,再按输出按钮,此时,万用表显示-12.09V
  6. +
+

IMG_8752

+
结果分析
+

想要输出-12V,实际上只需要交换正常的输出方式即可

+
+

实验2:示波器和信号源的联合使用I

+

实验器材

+
    +
  1. 示波器(1000 X-Series)
  2. +
  3. 信号源( SDG2000X)
  4. +
  5. 连接线(包含10:1 无源探头)
  6. +
+

实验方案

+
    +
  1. 用机内“探头补偿信号” 对示波器进行自检,并记录波形,顷率,周期,幅值,上升下降沿时间等。
  2. +
  3. 信号源设置波形,示波器进行测量
  4. +
+

测试过程与结果

+

(一)探头补偿信号自检

+
    +
  1. 打开示波器电源,将10:1无源探头连接线连接在channel1的口和demo输出端。
  2. +
  3. AutoScale按钮,将波形稳定地显示在屏幕上。
  4. +
  5. 点按Meas按钮进行数据测量。
  6. +
+

+ + + + + + + + + + + + + + + + + + + + + +
波形频率峰峰值周期上升沿时间下降沿时间
方波1.0002kHz2.61V999.78µs1.95µs1.95µs
+

(二)信号源设置波形,示波器进行测量

+
操作过程
+
    +
  1. 打开信号源和示波器电源,使用连接线将两台机器相连。我们组选择使用信号源1和输入端2进行实验。
  2. +
  3. 在信号源处进行操作,选择所需的信号类型,例如正弦波。
  4. +
  5. 调整信号源的频率和振幅,以产生所需的信号,并按output按键输出信号。
  6. +
  7. 使用示波器观察信号源产生的信号波形,利用AutoScale按钮,等待示波器调节好波形,并利用Horizontal Vertical部分的旋钮,将波形调至合适的显示尺寸,如果波形仍然不稳定,调节Trigger部分按键(触发模式和触发电平)得到想要的稳定的波形。
  8. +
  9. 点按Meas按钮进行数据测量。
  10. +
  11. 更换信号源信号,重新测量。
  12. +
+
数据记录与分析
+

234

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
信号源输出电压及频率峰峰值有效值周期频率
25kHz 正弦波 80mV,偏移量 20mV88mV28.545mV39.973us25.017kHz
1kHz 方波5V,偏移口,占空比40%6.03V2.4837V1.0000ms1.0000kHz
2kHz 锯齿5V,偏移1V,对称性20%5.03V1.4080V501.1us1.9955kHz
IkHz脉冲3V,偏移1V,占空比50%,边沿t50ns3.62V1.5232V1.0000ms1.0000kHz
+

可见,信号源输出有一定误差,当然示波器检测也有一定的误差,导致测量值与所设想不同。

+
+

实验3:示波器和信号源的联合使用II

+

实验器材

+
    +
  1. 示波器(1000 X-Series)
  2. +
  3. 信号源( SDG2000X)
  4. +
  5. 连接线
  6. +
  7. 0.01µF的电容
  8. +
  9. 10kΩ的电阻U~R~
  10. +
+

实验方案

+

截屏2023-09-21 18.51.58

+

实验电路图如上。调节信号源为正弦函数,并且将信号频率分别调至10, 10^2^, 10^3^, 10^4^, 10^5^, 10^6^kHz,并将示波器探测头两端并联在阻值R处,利用自带的测试工具,测量出U~R~的有效值,并绘图,得出结论。

+

实验过程

+
    +
  1. 利用连接线将电路图连接完毕。
  2. +
  3. 调节频率,并按Output按钮。
  4. +
  5. 观察示波器波形,使用上一个实验中的调节方法,至波形稳定,并测量出实际的有效值大小。
  6. +
  7. 调至不同频率,重复上述实验。
  8. +
+

+

实验过程中发现,当频率为10Hz时,示波器中显示的波形噪声非常大(如上图显示),因此,使用了trigger按键中,降低噪声的按钮,从而能够较好地测量出有效值,而非显示屏数字一直上下跳动。

+

实验结果

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
频率(Hz)1010^1.510010^2.5100010^3.510^410^4.510^510^5.510^6
电压有效值(mV)6.72720.13364.68200.49543.5895.9986.1990.4985.8990.61004.1
+

根据以上数据,绘制出数据图

+

+

结论

+

电阻两端的有效值随着信号源频率的升高先是缓慢上升,然后在10^2^~10^4^区间快速上升,最后趋于平缓,直至近似于电压源的有效值。体现出电容“隔直流,通交流”或者“通高频,阻低频”的特性。

+
+

探究性实验:万用表电流档

+

实验目的

+

探究万用表电流档(以6mA和60mA为例)内部阻值对测量结果的影响。

+

实验器材

+
    +
  1. 万用表(HY63)
  2. +
  3. ADCL-I模拟数字电子技术实验箱中的点电阻、电位器
  4. +
  5. 直流稳压电源
  6. +
  7. 连接线
  8. +
+

实验方案

+
    +
  1. 观察不同电流档档位测电流时的示数,从而定性地探究电流档内部的阻值大小分析。
  2. +
  3. 使用半偏法估测电流档内部的阻值。
  4. +
+

测试过程与结果

+
(一)探究不同电流档对真值的影响
+
    +
  1. 选择电阻阻值为2kΩ,按照如下电路图进行连接。
  2. +
  3. 调节电源电压为6.00V。
  4. +
  5. 分别使用万用表的6mA和60mA档测量电路中的电流大小。
  6. +
+

截屏2023-09-23 16.12.04

+

结果如下:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
电流表档位6mA60mA
万用表示数2.862mA2.98mA0.118mA
\(R_总=\dfrac{U}{I}\),电路内电阻和2096.4Ω2013.4Ω83Ω
估算得\(R_A=R_总-R\)96.4Ω13.4Ω83Ω
+

可以看到,电流档两档的测量相差了0.118mA。所以,如果想利用伏安法测量电阻阻值,得到的电阻值将相差83Ω,所以电流表内阻对测量有非常大的影响。

+
(二)利用半偏法测量电流表内阻
+
实验过程
+
    +
  1. 将电路连接成下图所示。根据一定的估测,我们选择使用20V电源和最大阻值为1kΩ的电位器。
  2. +
  3. 先将60mA档电流表串入电路,断开S~2~开关,闭合S~1~开关,调节R~H~阻值,直至电流表显示50mA(60mA是最大量程,但是由于是数字电流表,很容易显示OL,所以选择50mA)
  4. +
  5. 再闭合S~2~开关,然后保证R~H~阻值不发生改变的情况下,调节R~B~的阻值,直到电流表显示25mA。
  6. +
  7. 断开电路,由于R~B~不能显示电阻,所以使用了万用表欧姆档测量其电阻,得到结果即可近似为电流表内阻。
  8. +
  9. 将电流表档位调为6mA,重复2~4步,其中第2步中电流表显示改为6mA(实验过程中,发现6mA可以调到所以没有考虑减小),第3步改为3mA。
  10. +
+

截屏2023-09-23 16.47.02

+
实验结果
+ + + + + + + + + + + + + + + +
电流表档位6mA60mA
阻值99.8Ω11.2Ω
+
实验误差分析
+

该方法存在系统误差,并不能很准确地代表电流表的阻值,但是经过一定改进的方法,使得测量值非常接近于真实阻值,原理如下:

+
\[ +I_1=\dfrac{E}{R_H+R_A}\\ +I_{2}=\dfrac{E}{R_H+\dfrac{R_AR_B}{R_A+R_B}} +\]
+

我们在使用半偏法的时候,假定整体电流并没有发生变化,但实际上,由于新电阻的并联,电路中的总阻值变小,外部电流\(I\)变大。如果想要\(R_B\)的阻值等同于\(R_A\),那么万用表所显示的电流应该要更大(\(I_A=I_B=\dfrac{1}{2}I_2\))。然而实际上,\(I_A\)的电流仍然为 \(\dfrac{1}{2}I_1<\dfrac{1}{2}I_2\),因此,经过\(R_B\)的电流大于\(R_A\)\(R_B<R_A\),测量值小于真实值。

+

但是再分析,

+

情况1:

+
\[ +(R_A+R_H)\cdot{I_1}=E +\]
+

情况2:

+
\[ +\dfrac{1}{2}I_1\cdot{R_A}+R_H\cdot(\dfrac{1}{2}I_1+I_B)=E +\]
+

可以列出方程

+
\[ +\begin{cases} +(R_A+R_H)\cdot{I_1}=E\\ +\dfrac{1}{2}I_1\cdot{R_A}+R_H\cdot(\dfrac{1}{2}I_1+I_B)=E +\end{cases} +\]
+

解得,

+
\[ +\begin{cases} +I_B=\dfrac{E\cdot\dfrac{1}{2}I_1}{E-IR}\\ +R_B=R_A-\dfrac{I_1\cdot{R_A^2}}{E}=\dfrac{1}{1+\dfrac{R_A}{R_H}}\cdot{R_A} +\end{cases} +\]
+

根据(5)中的2式,可以看出,当\(R_A<<R_H\)时,\(R_B≈R_A\)

+

所以,在已经确定电流表阻值和电流的情况下,扩大\(R_H\)的阻值显得非常必要。我们可以通过扩大电压源电压的方法,来增大

+

\(R_H\)的阻值,所以电压源选择了20V。

+

以60mA为例,分析其中误差: +$$ +R_A=\dfrac{R_B\cdot{R_H}}{R_H-R_B}\ +相对误差: +1-\dfrac{R_B}{R_A}=\dfrac{R_B}{R_H}≈2.88\% +$$ +由于约为10Ω左右,所以相差0.3Ω左右的阻值,在可接受范围内。

+

而6mA的误差只会更小,所以可以考虑选用半偏法进行测量。

+

最后我们发现,60mA档的6mA档内部的阻值相差十倍。因此在平时选用合理档位测量电路中的电流时应该妥善选择量程。

+

结合电流表的组装,即将一个微小电流表和分流电阻并连的结构可知,量程越大相对应的阻值越小。

+

截屏2023-09-23 22.56.17

+
+

示波器显示李萨如图像

+

实验目的

+

学会利用示波器上的Acquire键,调节出两个信号源合并之后的李萨如图像。

+

实验器材

+
    +
  1. 示波器
  2. +
  3. 信号源
  4. +
  5. 连接线
  6. +
+

测试过程和结果

+
    +
  1. 打开信号源和示波器,并用连接线将两台机器相连(本组采用Channel1对Channel1,Channel2对Channel2)。
  2. +
  3. 然后调制信号源输出波形均为1kHz的正弦波,然后点按输出键。
  4. +
  5. 按示波器中的AutoScale按钮,然后发现两列波稳定地显示在屏幕上。
  6. +
+

+
    +
  1. 点按Acquire按钮,然后将时间模式调为XY显示,随后,发现示波器界面并没有变成预想的直线,后意识到,输出的波形并没有同相位,因此只要在信号源中点按同相位即可。
  2. +
  3. 调制不同相位差及频率之比的波形,重复2~3步。
  4. +
+

实验结果

+

截屏2023-09-23 23.01.58

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/2k_1.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/2k_1.jpeg" new file mode 100644 index 00000000..466582fa Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/2k_1.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/2k_2.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/2k_2.jpeg" new file mode 100644 index 00000000..905c3e4f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/2k_2.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/510_1.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/510_1.jpeg" new file mode 100644 index 00000000..13266c60 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/510_1.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/510_2.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/510_2.jpeg" new file mode 100644 index 00000000..8ab16ee9 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/510_2.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/\347\224\265\351\230\273.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/\347\224\265\351\230\273.jpeg" new file mode 100644 index 00000000..81ff6884 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_1/\347\224\265\351\230\273.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8724.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8724.jpeg" new file mode 100644 index 00000000..3dc17ae0 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8724.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8726.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8726.jpeg" new file mode 100644 index 00000000..307766c1 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8726.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8728.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8728.jpeg" new file mode 100644 index 00000000..dec393a8 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_2/IMG_8728.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/1000.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/1000.jpeg" new file mode 100644 index 00000000..d509b635 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/1000.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/1000_.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/1000_.jpeg" new file mode 100644 index 00000000..8b199941 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/1000_.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/IMG_8740.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/IMG_8740.jpeg" new file mode 100644 index 00000000..8e71eb80 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/IMG_8740.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/IMG_8741.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/IMG_8741.jpeg" new file mode 100644 index 00000000..f579cd76 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_3/IMG_8741.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_4/IMG_8749.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_4/IMG_8749.jpeg" new file mode 100644 index 00000000..28913aab Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_4/IMG_8749.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_4/IMG_8752.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_4/IMG_8752.jpeg" new file mode 100644 index 00000000..93b53bc5 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_4/IMG_8752.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_5/IMG_8906.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_5/IMG_8906.jpeg" new file mode 100644 index 00000000..e217cfcf Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_5/IMG_8906.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_5/IMG_8907.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_5/IMG_8907.jpeg" new file mode 100644 index 00000000..08e51777 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/1_5/IMG_8907.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_1/IMG_8906.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_1/IMG_8906.jpeg" new file mode 100644 index 00000000..e217cfcf Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_1/IMG_8906.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/1.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/1.jpeg" new file mode 100644 index 00000000..e68e62c3 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/1.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/2.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/2.jpeg" new file mode 100644 index 00000000..16a1d094 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/2.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/3.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/3.jpeg" new file mode 100644 index 00000000..7051ae3b Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/3.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/4.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/4.jpeg" new file mode 100644 index 00000000..bd6f9e07 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/2_2/4.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/Figure_1.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/Figure_1.png" new file mode 100644 index 00000000..7098d03a Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/Figure_1.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/IMG_8942.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/IMG_8942.jpg" new file mode 100644 index 00000000..e887ffc6 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/IMG_8942.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/WechatIMG94.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/WechatIMG94.jpeg" new file mode 100644 index 00000000..c4c9045c Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/WechatIMG94.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 16.12.04.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 16.12.04.png" new file mode 100644 index 00000000..f8823bd1 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 16.12.04.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 16.47.02.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 16.47.02.png" new file mode 100644 index 00000000..fe33d2bf Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 16.47.02.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 22.56.17.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 22.56.17.png" new file mode 100644 index 00000000..f1bc13f5 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\346\210\252\345\261\2172023-09-23 22.56.17.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\347\224\265\350\267\257\345\233\276.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\347\224\265\350\267\257\345\233\276.png" new file mode 100644 index 00000000..c7a55fd0 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_1/\347\224\265\350\267\257\345\233\276.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_2/\346\210\252\345\261\2172023-09-23 23.01.58.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_2/\346\210\252\345\261\2172023-09-23 23.01.58.png" new file mode 100644 index 00000000..f722d606 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab1/image/3_2/\346\210\252\345\261\2172023-09-23 23.01.58.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/Lab2 \345\215\212\345\257\274\344\275\223\344\272\214\346\236\201\347\256\241\347\211\271\346\200\247\346\265\213\350\257\225/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/Lab2 \345\215\212\345\257\274\344\275\223\344\272\214\346\236\201\347\256\241\347\211\271\346\200\247\346\265\213\350\257\225/index.html" new file mode 100644 index 00000000..1b29551b --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/Lab2 \345\215\212\345\257\274\344\275\223\344\272\214\346\236\201\347\256\241\347\211\271\346\200\247\346\265\213\350\257\225/index.html" @@ -0,0 +1,5419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 2 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

半导体⼆极管特性测试

+

实验日期:2023/9/26

+

地点:东3-406

+

实验目的

+
    +
  1. 掌握半导体⼆极管特性测试
  2. +
  3. 学习MULTISIM电路仿真软件的使⽤
  4. +
  5. 进⼀步熟悉电⼦仪器的使⽤
  6. +
+

基本实验内容

+

实验器材

+
    +
  1. 万用表(HY63)
  2. +
  3. ADCL-I模拟数字电子技术实验箱中的半导体二极管【1N4007的整流二极管,5V/1W的稳压二极管】
  4. +
  5. 连接线
  6. +
  7. 示波器(1000 X-Series)
  8. +
  9. 信号源( SDG2000X)
  10. +
+

实验方案

+

本实验首先掌握判断二极管好坏的方法。接着采用三种方法绘制二极管VA特性曲线。具体流程如下:

+
    +
  1. +

    ⽤万⽤表粗略判别⼆极管好坏。

    +
  2. +
  3. +

    采⽤逐点测量法测量⼆极管的VA特性。

    +
  4. +
  5. +

    采⽤扫描测量法测量⼆极管的VA特性,并双踪观察信号源与⼆极管两端电压(注意其击穿值)。

    +
  6. +
+

采⽤扫描测量法测量稳压管的VA特性,并双踪观察信号源与⼆极管两端电压(注意其击穿值)。

+
    +
  1. 应⽤MULTISIM软件仿真⼆极管的VA特性。
  2. +
+
+

实验一:应⽤万⽤表初步测试⼆极管的好坏

+

测试过程与结果

+
    +
  1. 认识万用表测量二极管档
  2. +
+

截屏2023-09-27 18.45.41截屏2023-09-27 18.47.04

+
    +
  1. +

    将黑表笔插入COM口,红表笔插入二极管测试对应二极管测试插口,并将档位调至二极管测量档位。由于蜂鸣器档位和二极管是同一档位,点按左上角Select按钮,切换至二极管档位。

    +
  2. +
  3. +

    将万用表红表笔接入1N4007正级,黑色接负极,此时万用表显示二极管导通电压。如下图所示,测得1N4007的正向导通电压约为0.568V。

    +
  4. +
+

+
    +
  1. 将红黑表笔交换,测量方向电压,如下图所示,显示OL,超出量程。
  2. +
+

+
    +
  1. 利用相同方法测量稳压二极管,得到相似结果
  2. +
+

IMG_9034

+

结果分析

+

首先通过万用表可以很好地对二极管进行检测,如检验其是否被击穿。同时可以看到,在同样的测量条件下,稳压二极管比整流二极管正向导通电压要高。可以与课上所给的VA特性曲线相联系,万用表所提供的电压为三伏,稳压二极管导通后,电压将保持0.7V左右,而整流二极管的曲线类似于大电阻,因而万用表显示的电压值在0.568V。

+
+

实验二:逐点法测量二极管VA特性曲线

+

实验方案

+

采用以下电路,利用欧姆定律对二极管在每一点电压下的阻值进行测量。最后利用excel对数据进行处理,绘制曲线。

+

截屏2023-10-02 12.43.34

+

由于万用表的安培表阻值在该测试条件下(mA级别),视为短路;而相反,电压表的阻值足够大,可以视为开路,所以实验中只使用电压表来进行测量,将电压表并联在R~1~两端。并且利用电压源的示数,通过计算得出二极管两端电压与电流。

+

测试过程与结果

+
    +
  1. 连接电路,并将电压源输出值调为0。
  2. +
+

+
    +
  1. +

    将万用表并联在电阻两端,测得电压示数。将此示数和电压源示数,一起记录到excel表格中。

    +
  2. +
  3. +

    逐渐增大电压源输出电压,并重复步骤2。

    +
  4. +
  5. +

    使用excel处理数据,并且绘制曲线,在变化较为剧烈处,增加多组数据测量,从而得到更为光滑、准确的曲线。

    +
  6. +
+

数据处理与分析

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
电压源输出电压(V)R1两端电压(V)二极管两端电压(=A#-B#)电流(=B#/1000)
0000
0.30.00140.29860.0000014
0.4030.01340.38960.0000134
0.4520.03020.42180.0000302
0.5020.05540.44660.0000554
0.550.0850.4650.000085
0.6020.12090.48110.0001209
0.7030.19790.50510.0001979
0.8030.2810.5220.000281
0.9030.36780.53520.0003678
1.1020.54810.55390.0005481
1.2020.6450.5570.000645
1.30.7390.5610.000739
1.5510.9760.5750.000976
1.7511.1690.5820.001169
1.8511.2650.5860.001265
1.9511.3620.5890.001362
2.1511.5570.5940.001557
2.4511.8510.60.001851
2.7512.1470.6040.002147
2.9512.3440.6070.002344
3.5512.9380.6130.002938
4.5513.9310.620.003931
5.5514.9280.6230.004928
7.657.020.630.00702
9.558.920.630.00892
11.04910.420.6290.01042
+

截屏2023-10-02 12.56.02

+
+

实验三:扫描法测量二极管VA特性曲线

+

实验方案

+
    +
  1. 将电路连接成下图所示。由于信号源与示波器的接地设置,装置只能设置为如图所示,所有的接地线应该连接在一起。
  2. +
  3. +

    并将信号源设置为1kHz,10Vp的锯齿波。通过信号源的XY显示,展示VA特性曲线直观样式。由于\(U_{diode}=U_{ch1}-U_{ch2},I_{diode}=\dfrac{U_{ch1}}{51Ω}\),因此,XY曲线一定程度上反映了最终结果的图线。

    +
  4. +
  5. +

    后通过matlab等数据处理,生成正确的曲线。

    +
  6. +
+

截屏2023-10-02 15.33.04

+

测试过程与结果

+
    +
  1. +

    连接电路(二极管选择1N4007整流二极管,电阻选择51Ω),调节信号源、示波器,观察图样。

    +
  2. +
  3. +

    利用示波器的USB接口,将图样信息和数据保存。

    +
  4. +
  5. +

    利用Matlab处理信息,生成图像。

    +
  6. +
+

Matlab代码如下:

+
Matlab
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
% 读取数据
+data = readmatrix('./Lab2/数据/111.csv');
+
+% 获取vd和id列
+v1 = data(:, 2);
+v2= data(:, 3);
+vd=v1-v2;
+id=v2/51*1000;
+plot(vd, id);
+
+%生成平滑曲线
+smoothed_vd = smooth(vd, 0.1, 'loess'); 
+smoothed_id = smooth(id, 0.1, 'loess');
+hold on;
+plot(smoothed_vd, smoothed_id, 'b-', 'LineWidth', 0.2);
+legend('原始数据', '光滑曲线');
+xlabel('电压(V)');
+ylabel('电流(mA)');
+legend('实验数据','VA特性曲线');
+
+
    +
  1. 将二极管更换为稳压二极管,重复上述步骤。
  2. +
+

结果分析

+

整流二极管

+

+

观察到以下几个特殊的地方:

+
    +
  1. +

    截止时,电流不完全为0,由于R~1~两端存在一个非常小的电压,该曲线在截止部分的电流不为0。

    +
  2. +
  3. +

    该曲线在导通与截止部分,存在两条曲线,上面那条曲线一般认为是理想情况下的VA特性曲线。而下面那条曲线说明,二极管存在一个反向的电流。再经过数据分析可知,在截止与导通部分,当二极管两端电压逐渐增大时,即由截止切换到导通模式时,电流增大;而当电压减小时,即由导通切换为截止模式时,存在一个反向电流。后经过资料查询可知,二极管存在一个特性:

    +
  4. +
+

二极管方向恢复电流(Reverse Recovery Current) 在二极管由导通状态转变为截止状态时,电流反向流动的现象。当二极管从正向导通状态切换到反向截止状态时,载流子需要一定时间来清除。在这个短暂的时间内,二极管中的电流会反向流动,这就是方向恢复电流。方向恢复电流的大小和持续时间取决于二极管的特性和工作条件。

+

稳压二极管

+

+

可以观察到,稳压二极管的截止电压约为5.2V左右,与标称的5V/1W相匹配,同时可以观察到,稳压二极管相比于整流二极管,在两端电压增大的情况下,能保持一个较为稳定的电压值,约为0.76V左右。

+
+

实验三:仿真⼆极管的VA特性

+

实验方案

+

利用Multisim平台搭建电路,利用扫描法绘制二极管曲线。

+

Multisim平台一定需要一个接地端,同时示波器的接地端并不影响电路中的电位,因而实验电路如下:

+

+

示波器A接口为二极管两端电压,B接口为R1两端电压。利用示波器的B/A按钮,定性地显示VA特性曲线,再利用Matlab处理输出的数据。

+

测试过程与结果

+
    +
  1. 打开Multisim平台,选择器件,并将器件连接为上图所示。
  2. +
  3. 双击信号源和示波器,将信号源调为1kHz每秒,振幅分别为1V和700V,示波器视图为B/A。
  4. +
  5. 打开图像视图,导出图像为csv格式。
  6. +
  7. 利用Matlab处理csv中的数据。
  8. +
+

根据不同曲线的特点,采用了以下两种方式进行数据拟合:

+

1V,没有为负数的点,因而采用了指数的拟合方式

+
Matlab
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
data = readmatrix('./Lab2/数据/1V.csv');
+vd = data(:, 1);
+vr = data(:, 2);
+id = vr * 0.1;
+
+% 使用fit函数进行数据拟合
+fitType = fittype('a * exp(b * x)'); % 选择适当的拟合函数
+fitOptions = fitoptions('Method', 'NonlinearLeastSquares'); % 选择拟合方法
+fitOptions.StartPoint = [1, -0.1]; % 初始拟合参数猜测
+
+% 进行数据拟合
+fitResult = fit(vd, id, fitType, fitOptions);
+
+% 绘制拟合曲线
+plot(fitResult,vd, id);
+xlabel('电压(V)');
+ylabel('电流(mA)');
+legend('VA特性曲线');
+
+

700V,由于数据点非常多,直接输出即位较光滑的曲线

+
Matlab
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
% 读取数据
+data = readmatrix('./Lab2/数据/700V_2.csv');
+
+% 获取vd和id列
+v1 = data(:, 1);
+v2= data(:, 2);
+vd=v1;
+id=v2*0.1;
+plot(vd, id);
+xlabel('电压(V)');
+ylabel('电流(mA)');
+legend('实验数据','VA特性曲线');
+
+

结果分析

+

1V,主要分析二极管由导通到截止这一段的特点

+

+

700V,主要分析1N4007截止电压的特性

+

+

可以看出,由导通到截止这一部分,二极管的性质并不是非常稳定,所以曲线几乎填满了该段区域。

+

探究性实验:信号源内部电阻

+

引入

+

+

观察上面的黄色曲线,会发现,当二极管导通后,峰值电压骤降。而分析可知,Channel1所测的是信号源两端电压,而电压骤降说明了信号源内部有电阻,进行分压,导致其峰值减小。现测量信号源两端的电阻大小。

+

实验方案

+

采用以下电路,利用欧姆定律对其进行测量。通过测量峰值电压的变化,得出信号源内部电阻大小

+

截屏2023-10-04 10.56.35

+

测试过程与结果

+
    +
  1. 将示波器接口两端与信号源两端连接。测出原本输出的电压幅值,\(V_{p1}=10.5V\)
  2. +
+

+
    +
  1. 连接方案中的电路图。
  2. +
+

+
    +
  1. 测出此时的电压峰值为,\(V_{p2}=5.23V\)
  2. +
+

+
    +
  1. 再次测量信号源两端电压,发现保持在10.5V,因此可以将信号源两端电压视为10.5V。
  2. +
+

结果分析

+
\[ +I_R=\dfrac{V_{p2}}{R}=5.23V÷51Ω=0.102A\\ +R_S=\dfrac{V_{p1}-V_{p2}}{I_R}=5.27V÷0.102A=51.7Ω +\]
+

计算得到,信号源内阻为51.7Ω,查阅说明书,得知Channel1输出的内阻在50Ω左右,因此可知测量基本准确。

+

信号源内部有50Ω左右的阻值,所以,以后在定量测量的时候,需要将内阻考虑在内,以免影响最后结果的准确性。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/111.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/111.jpg" new file mode 100644 index 00000000..3a96f67f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/111.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/111aaa.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/111aaa.jpg" new file mode 100644 index 00000000..2dcdc341 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/111aaa.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/1V.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/1V.jpg" new file mode 100644 index 00000000..1e80f95e Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/1V.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/222.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/222.jpg" new file mode 100644 index 00000000..85e82f16 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/222.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/700V.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/700V.jpg" new file mode 100644 index 00000000..0ec8575e Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/700V.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/777.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/777.jpg" new file mode 100644 index 00000000..1c2b23be Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/777.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9031.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9031.jpg" new file mode 100644 index 00000000..e95a633b Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9031.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9032.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9032.jpeg" new file mode 100644 index 00000000..98798239 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9032.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9033.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9033.jpeg" new file mode 100644 index 00000000..d4c82675 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9033.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9034.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9034.jpeg" new file mode 100644 index 00000000..4eb533da Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9034.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9035.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9035.jpg" new file mode 100644 index 00000000..a8203f32 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9035.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9072.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9072.jpeg" new file mode 100644 index 00000000..92787b4f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9072.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9073.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9073.jpeg" new file mode 100644 index 00000000..b0a2dd2b Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9073.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9074.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9074.jpeg" new file mode 100644 index 00000000..00b625e6 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/IMG_9074.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/ab99.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/ab99.png" new file mode 100644 index 00000000..c8d53f30 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/ab99.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-09-27 18.45.41.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-09-27 18.45.41.png" new file mode 100644 index 00000000..607e5d26 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-09-27 18.45.41.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-09-27 18.47.04.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-09-27 18.47.04.png" new file mode 100644 index 00000000..cc50a4e0 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-09-27 18.47.04.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 12.43.34.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 12.43.34.png" new file mode 100644 index 00000000..52025ad6 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 12.43.34.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 12.56.02.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 12.56.02.png" new file mode 100644 index 00000000..378f92da Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 12.56.02.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 15.33.04.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 15.33.04.png" new file mode 100644 index 00000000..8916b2a7 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-02 15.33.04.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-04 10.56.35.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-04 10.56.35.png" new file mode 100644 index 00000000..8bd04ad5 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\346\210\252\345\261\2172023-10-04 10.56.35.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\347\224\265\350\267\257\345\233\276.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\347\224\265\350\267\257\345\233\276.png" new file mode 100644 index 00000000..2d71408c Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab2/assets/\347\224\265\350\267\257\345\233\276.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/Lab3 \346\225\260\345\255\227\347\224\265\350\267\257\351\200\273\350\276\221\350\256\276\350\256\241/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/Lab3 \346\225\260\345\255\227\347\224\265\350\267\257\351\200\273\350\276\221\350\256\276\350\256\241/index.html" new file mode 100644 index 00000000..c31ffe43 --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/Lab3 \346\225\260\345\255\227\347\224\265\350\267\257\351\200\273\350\276\221\350\256\276\350\256\241/index.html" @@ -0,0 +1,5545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 3 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

数字电路逻辑设计

+

实验日期:2023/10/9

+

地点:东3-406

+

实验目的

+
    +
  1. 了解数字电路基础知识
  2. +
  3. 掌握简单数字逻辑电路的设计
  4. +
  5. 学习FPGA开发工具
  6. +
+

实验内容

+

用QUARTUS软件和DE10开发板设计并实现如下逻辑功能

+
    +
  1. +

    输入是三位二进制数A,B,C,要求当输入是2或3的倍数时输出等于逻辑1,其它情况,输出等于0。

    +
  2. +
  3. +

    设计并实现一位二进制全加器(输入是一位二进制加数、被加教和低位进位,共3个逻辑变量)。

    +
  4. +
  5. +

    【探究】某客厅四周有4个房间,每个房间门口有一个开关,客厅中间有一盏灯A。试设计一个逻辑电路,要求每个开关都能控制

    +
  6. +
+

灯A的亮灭,并在DE10开发板上模拟此逻辑电路的功能。

+

实验器材

+
    +
  1. QUARTUS软件
  2. +
  3. DE10开发板
  4. +
  5. 电脑
  6. +
+

实验一:判断2或3的倍数

+

1. 分析真值表

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numABCZ
00001
10010
20101
30111
41001
51010
61101
71110
+

由于总情况较少,所以选择打表的方式列写代码。

+

2. 利用QUARTUS INTEL FPGA软件自带的Multisim软件先进行模拟

+

逻辑设计输入 task1.vhd

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
---------库说明与库引用------------
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+---------------------------------
+
+
+---------实体定义Task1------------
+entity Task1 is
+    port (  A,B,C: in std_logic;
+            Z: out std_logic);
+end Task1;
+---------------------------------
+
+
+----------结构体定义 BEHAV---------    
+architecture BEHAV of Task1 is
+
+begin
+----------进程语句 P1---------------
+P1:process(A,B,C)
+variable tmp:std_logic_vector(2 downto 0); -- 定义变量tmp(std_logic_vector)记录ABC的输入 
+begin
+    tmp:=A&B&C;-- 将ABC的输入值连接
+    --case语句 根据不同情况输出不同的Z值
+    case tmp is
+    when "000" => Z<='1';
+    when "001" => Z<='0';
+    when "010" => Z<='1';
+    when "011" => Z<='1';
+    when "100" => Z<='1';
+    when "101" => Z<='0';
+    when "110" => Z<='1';
+    when "111" => Z<='0';
+    when others => Z<='0';
+    end case;
+end process;        
+---------------------------------
+
+end BEHAV ;
+---------------------------------
+
+

逻辑设计仿真 test_tb.vhd

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
---------库说明与库引用------------
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+---------------------------------
+
+------实体定义TEST_tb仿真元件--------
+entity TEST_tb is
+end TEST_tb;
+---------------------------------
+
+----------结构体定义 BEHAV---------  
+architecture BEHAV of TEST_tb is
+
+----------引用元件Task1---------
+component Task1 is
+    port (  A,B,C: in std_logic;
+            Z: out std_logic);
+end component;
+signal A,B,C,Z: std_logic;--定义实参,方便后续控制输入输出
+
+begin
+U1: Task1 port map (A=>A,B=>B,C=>C,Z=>Z);--端口映射,将ABC的值输入到元件Task1中
+P1: process
+begin -- 仿真
+    A<='0';B<='0';C<='0';wait for 10ns;
+    A<='0';B<='0';C<='1';wait for 10ns;
+    A<='0';B<='1';C<='0';wait for 10ns;
+    A<='0';B<='1';C<='1';wait for 10ns;
+    A<='1';B<='0';C<='0';wait for 10ns;
+    A<='1';B<='0';C<='1';wait for 10ns;
+    A<='1';B<='1';C<='0';wait for 10ns;
+    A<='1';B<='1';C<='1';wait for 10ns;
+end process;
+end BEHAV;
+
+

仿真结果

+

+

根据波形图结果,可知,该元件的代码编写正确,可以进行下一操作。

+

3. 生成编程文件

+
    +
  1. 新建project
  2. +
+

+
    +
  1. 导入关于元件的文件task1.vhd
  2. +
+

+
    +
  1. 编译生成文件,并导入DE10芯片
  2. +
+

点按步骤如下:

+
    +
  • Analysis&Synthesis,可在RTL Viewer中查看逻辑线路
  • +
  • Fitter
  • +
  • Assemble
  • +
+

+
    +
  • pin planner,进行线脚安排
      +
    • ABC以开关的形式输入输出
    • +
    • Z以LED的方式显示
    • +
    +
  • +
+

+

实验成果

+

+

实验二:二进制全加器

+

1. 分析真值表

+

image-20231016132054066

+

2. 仿真模拟

+

逻辑设计输入 task2.vhd

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+---------定义实体--------------------
+entity Task2 is
+    port (  A,B,C0: in std_logic;
+            C,Z: out std_logic);
+end Task2;
+
+---------定义结构体--------------------
+architecture BEHAV of Task2 is
+begin
+P1:process(A,B,C0)
+variable tmp:std_logic_vector(2 downto 0);--变量tmp记录ABC0的输入值
+begin
+    tmp:=A&B&C0;
+    case tmp is -- case语句根据ABC0不同的值输出不同的C与Z
+    when "000" => C<='0';Z<='0';
+    when "001" => C<='0';Z<='1';
+    when "010" => C<='0';Z<='1';
+    when "011" => C<='1';Z<='0';
+    when "100" => C<='0';Z<='1';
+    when "101" => C<='1';Z<='0';
+    when "110" => C<='1';Z<='0';
+    when "111" => C<='1';Z<='1';
+    when others => C<='0';Z<='0';
+    end case;
+end process;
+end BEHAV ;
+
+

逻辑设计仿真 test_tb.vhd

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+entity TEST_tb is
+end TEST_tb;
+
+
+architecture BEHAV of TEST_tb is
+
+component Task2 is
+    port (  A,B,C0: in std_logic;
+            C,Z: out std_logic);
+end component;
+
+signal A,B,C0,Z,C: std_logic;
+
+begin
+U1: Task2 port map (A=>A,B=>B,C0=>C0,Z=>Z,C=>C);
+P1: process
+-----------主要的仿真部分-------------------------------------------------
+begin
+    A<='0';B<='0';C0<='0';wait for 10ns;
+    A<='0';B<='0';C0<='1';wait for 10ns;
+    A<='0';B<='1';C0<='0';wait for 10ns;
+    A<='0';B<='1';C0<='1';wait for 10ns;
+    A<='1';B<='0';C0<='0';wait for 10ns;
+    A<='1';B<='0';C0<='1';wait for 10ns;
+    A<='1';B<='1';C0<='0';wait for 10ns;
+    A<='1';B<='1';C0<='1';wait for 10ns;
+end process;
+end BEHAV;
+
+

仿真结果

+

+

与预期一致,所以可以进行下一步操作

+

3. 生成编程文件

+
    +
  1. +

    编译输出,得到以下逻辑图

    +
  2. +
  3. +

    pin planner

    +
  4. +
+

+
    +
  • A, B, C0对应三个开关
  • +
  • C与Z对应两盏LED灯
  • +
+

实验成果

+

+

上图对应A=0, B=0, C0=0的情况,输出C=0,Z=0的情况。

+

IMG_9548

+

上图对应A=0, B=1, C0=0的情况,输出C=0,Z=1的情况。

+

IMG_9549

+

上图对应A=1, B=1, C0=0的情况,输出C=1,Z=0的情况。

+

IMG_9550

+

上图对应A=1, B=1, C0=1的情况,输出C=1,Z=1的情况。

+

实验三:开灯关灯的探究性实验  !注意:这个部分我写的些许有点错误,直接单数开关开则打开的思路即可

+

1. 分析电路逻辑

+

ABCD作为四个开关,任意的改变状态都将改变电灯的状态,不同于上面的电路,该电路没有真值表。

+

2. 仿真模拟

+

设计元件 task3.vhd

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+------------定义实体Task3-----------------------------------
+entity Task3 is
+    port (  A,B,C,D: in std_logic;
+            Z: out std_logic);
+end Task3;
+
+architecture BEHAV of Task3 is
+
+begin
+---------关键部分:process-----------------------------------
+P1:process
+---------定义变量 记录开关A,B,C,D,Z先前的状态----------------
+variable mA:std_logic:='0';
+variable mB:std_logic:='0';
+variable mC:std_logic:='0';
+variable mD:std_logic:='0';
+variable mZ:std_logic:='0';
+variable tmp:std_logic:='0';
+
+begin
+if (mA /= A) then  --如果A开关状态发生改变,下方各个结构同理
+mA:=A; mZ:=not mZ;Z<=mZ; --改变mA的值,并且输出与Z的记录值相反的值
+end if;
+if (mB /= B) then 
+mB:=B; mZ:=not mZ;Z<=mZ;
+end if;
+if (mC /= C) then 
+mC:=C; mZ:=not mZ;Z<=mZ;
+end if;
+if (mD /= D) then 
+mD:=D; mZ:=not mZ;Z<=mZ;
+end if;
+
+end process;
+
+end BEHAV ;
+
+

仿真task3_tb.vhd

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+entity TEST_tb is
+end TEST_tb;
+
+architecture BEHAV of TEST_tb is
+
+component Task3 is
+    port (  A,B,C,D: in std_logic;
+            Z: out std_logic);
+end component;
+
+signal A,B,C,D,Z: std_logic;
+
+begin
+U1: Task3 port map (A=>A,B=>B,C=>C,D=>D,Z=>Z);
+------------仿真过程-------------------------------------------
+P1: process
+begin
+    A<='0';B<='0';C<='0';D<='0';wait for 10ns;
+    A<='0';B<='0';C<='0';D<='1';wait for 10ns;
+    A<='1';B<='0';C<='0';D<='1';wait for 10ns;
+    A<='0';B<='0';C<='0';D<='1';wait for 10ns;
+end process;
+end BEHAV;
+
+

仿真结果

+

+

任意改变ABCD四个开关中任意状态,Z就会输出与原来相反的结果,仿真结果正确。

+

3. 生成编程文件

+
    +
  1. 编译输出
  2. +
+

+
    +
  1. +

    Pin Planner

    +
  2. +
  3. +

    ABCD对应四个开关

    +
  4. +
  5. Z对应一个LED灯
  6. +
+

实验成果

+ + +

实验结果视频

+

结果分析,由于这个代码的问题,也就是在芯片最开始执行结构体部分的代码时,由于mA与A并不一定相匹配,所以刚刚开始,Z的灯可能混乱闪烁。但是一段时间后,也就是当所有mA,mB,mC,mD都已经与现实情况相匹配以后,就能够正常显示。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/1.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/1.png" new file mode 100644 index 00000000..32e2e6c1 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/1.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/11.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/11.png" new file mode 100644 index 00000000..79913e31 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/11.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/111.mp4" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/111.mp4" new file mode 100644 index 00000000..c97f6c7a Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/111.mp4" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/2-7433947.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/2-7433947.png" new file mode 100644 index 00000000..aa6ee362 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/2-7433947.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/2.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/2.png" new file mode 100644 index 00000000..19d94cae Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/2.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/3.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/3.png" new file mode 100644 index 00000000..c9f375ea Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/3.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/4-7434005.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/4-7434005.png" new file mode 100644 index 00000000..7edc8361 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/4-7434005.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/4.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/4.png" new file mode 100644 index 00000000..a06c1b28 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/4.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/5.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/5.png" new file mode 100644 index 00000000..eb580fcf Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/5.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/6.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/6.png" new file mode 100644 index 00000000..897f0035 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/6.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9536.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9536.jpg" new file mode 100644 index 00000000..2db24b7f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9536.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9537.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9537.jpeg" new file mode 100644 index 00000000..f2cf2a42 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9537.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9538.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9538.jpeg" new file mode 100644 index 00000000..cdb45e22 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9538.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9539.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9539.jpeg" new file mode 100644 index 00000000..928f011d Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9539.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9540.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9540.jpeg" new file mode 100644 index 00000000..16ac5397 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9540.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9541.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9541.jpeg" new file mode 100644 index 00000000..71b563ae Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9541.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9542.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9542.jpeg" new file mode 100644 index 00000000..b8f16b03 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9542.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9543.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9543.jpeg" new file mode 100644 index 00000000..951521b9 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9543.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9544.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9544.jpeg" new file mode 100644 index 00000000..636ca638 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9544.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9547.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9547.jpeg" new file mode 100644 index 00000000..ca2e51f7 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9547.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9548.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9548.jpeg" new file mode 100644 index 00000000..eef0a8d4 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9548.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9549.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9549.jpeg" new file mode 100644 index 00000000..6e0e472f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9549.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9550.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9550.jpeg" new file mode 100644 index 00000000..17b46180 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/IMG_9550.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/image-20231016132054066.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/image-20231016132054066.png" new file mode 100644 index 00000000..7d9c26da Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/image-20231016132054066.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/pin.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/pin.png" new file mode 100644 index 00000000..171e2c6e Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/pin.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/result.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/result.png" new file mode 100644 index 00000000..b9a4aa2e Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/result.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/result1.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/result1.png" new file mode 100644 index 00000000..3cc11315 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/result1.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.pdf" new file mode 100644 index 00000000..6fcc369b Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.png" new file mode 100644 index 00000000..b23791d9 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.xlsx" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.xlsx" new file mode 100644 index 00000000..d20b6f97 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab3/assets/task1.xlsx" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/2.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/2.png" new file mode 100644 index 00000000..35d9eb21 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/2.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/3\347\232\204\345\211\257\346\234\254.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/3\347\232\204\345\211\257\346\234\254.png" new file mode 100644 index 00000000..d7f92cc8 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/3\347\232\204\345\211\257\346\234\254.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9687.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9687.jpeg" new file mode 100644 index 00000000..8122ffec Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9687.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9689.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9689.jpeg" new file mode 100644 index 00000000..bbb8427c Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9689.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9690.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9690.jpeg" new file mode 100644 index 00000000..a23b2ad2 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9690.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9691.jpeg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9691.jpeg" new file mode 100644 index 00000000..1662488c Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9691.jpeg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9697.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9697.jpg" new file mode 100644 index 00000000..3757fcdd Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/IMG_9697.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/MVCE.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/MVCE.bmp" new file mode 100644 index 00000000..f8d3acd8 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/MVCE.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/bcope_6.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/bcope_6.bmp" new file mode 100644 index 00000000..e775e798 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/bcope_6.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/bcope_9.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/bcope_9.bmp" new file mode 100644 index 00000000..2529f5ef Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/bcope_9.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/circ1.jpg" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/circ1.jpg" new file mode 100644 index 00000000..ece412e4 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/circ1.jpg" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure1.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure1.bmp" new file mode 100644 index 00000000..e7a9a3a8 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure1.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure10.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure10.bmp" new file mode 100644 index 00000000..a9e7ef65 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure10.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure2.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure2.bmp" new file mode 100644 index 00000000..810e1087 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure2.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure25.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure25.bmp" new file mode 100644 index 00000000..05560836 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/figure25.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/ib.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/ib.bmp" new file mode 100644 index 00000000..2071d4ed Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/ib.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022155558924.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022155558924.png" new file mode 100644 index 00000000..c671b478 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022155558924.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022165919379.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022165919379.png" new file mode 100644 index 00000000..d7b962ce Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022165919379.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022204950152.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022204950152.png" new file mode 100644 index 00000000..5ace2e30 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022204950152.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022211723785.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022211723785.png" new file mode 100644 index 00000000..bbce9a82 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022211723785.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022212159202.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022212159202.png" new file mode 100644 index 00000000..1553f84d Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022212159202.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022213340242.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022213340242.png" new file mode 100644 index 00000000..4eb95350 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022213340242.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022220805720.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022220805720.png" new file mode 100644 index 00000000..02189a85 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/image-20231022220805720.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/untitledp20.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/untitledp20.bmp" new file mode 100644 index 00000000..446adfc6 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/untitledp20.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 15.53.51.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 15.53.51.png" new file mode 100644 index 00000000..1262b394 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 15.53.51.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.03.09.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.03.09.png" new file mode 100644 index 00000000..a5b81e57 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.03.09.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.49.53.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.49.53.png" new file mode 100644 index 00000000..4b1d334c Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.49.53.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.51.12.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.51.12.png" new file mode 100644 index 00000000..cc7aec32 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 16.51.12.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.06.55.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.06.55.png" new file mode 100644 index 00000000..452c3565 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.06.55.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.20.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.20.png" new file mode 100644 index 00000000..d6465ea2 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.20.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.30.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.30.png" new file mode 100644 index 00000000..cf346bc3 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.30.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.42.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.42.png" new file mode 100644 index 00000000..77244882 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 17.07.42.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 20.21.21.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 20.21.21.png" new file mode 100644 index 00000000..e3d16c1c Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 20.21.21.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 20.57.37.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 20.57.37.png" new file mode 100644 index 00000000..0ea117b2 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 20.57.37.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 21.25.32.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 21.25.32.png" new file mode 100644 index 00000000..a0e8e0ab Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 21.25.32.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 21.56.17.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 21.56.17.png" new file mode 100644 index 00000000..1a21d370 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 21.56.17.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 22.10.24.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 22.10.24.png" new file mode 100644 index 00000000..f2617ad2 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/assets/\346\210\252\345\261\2172023-10-22 22.10.24.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/lab4 \344\270\211\346\236\201\347\256\241\345\222\214\351\227\250\347\224\265\350\267\257\347\211\271\346\200\247\346\265\213\350\257\225/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/lab4 \344\270\211\346\236\201\347\256\241\345\222\214\351\227\250\347\224\265\350\267\257\347\211\271\346\200\247\346\265\213\350\257\225/index.html" new file mode 100644 index 00000000..937def03 --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab4/lab4 \344\270\211\346\236\201\347\256\241\345\222\214\351\227\250\347\224\265\350\267\257\347\211\271\346\200\247\346\265\213\350\257\225/index.html" @@ -0,0 +1,5351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 4 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 4

+ +

三极管和门电路特性测试

+

实验日期:2023/10/9

+

地点:东3-406

+

实验目的

+
    +
  1. 掌握半导体三极管特性测试。
  2. +
  3. 掌握门电路电气特性测试。
  4. +
  5. 学习MULTISIM电路仿真软件的使用。
  6. +
+

实验一:万用表测量三极管

+

实验器材

+
    +
  1. 万用表(HY63)
  2. +
  3. 三极管
  4. +
  5. 连接线
  6. +
+

实验方案

+
    +
  1. 判别三极管类型,E\B\C三极,测量放大倍数。
  2. +
  3. 测量VCE=0 ; 1V ; 5V条件下的输入特性。
  4. +
  5. 测量IB =2.5uA ; 5uA ; 7.5uA;10uA条件下输出特性。
  6. +
+

实验过程与结果

+

一、判别三极管类型

+
    +
  • 将三极管从右到左三只脚命名为a,b,c,利用万用表二极管测试级,测量三极管三只脚的极性。
  • +
+

截屏2023-10-22 15.53.51

+

+

根据以上表格可以判断,该三极管中间的端口为b基极,且为NPN型三极管。

+
    +
  • 接下来判断E和C极
  • +
+

IMG_9691

+

将万用表切换到HFE档,通过对三极管的放大倍数的测量,判断三极管的e和c极。已知正常的ß应该在100~300之间。

+

将三极管中间的极脚插入b口,两端分别插入e和c。可见当示数显示为249时,e,b,c脚插入正确,放大倍数ß=249。从而可判断三极管的三只脚的极性:当平面对向自己时,从左到右三只脚分别为e,b,c。

+

二、采用逐点法测量三极管输入VA特性

+
(1)固定V~CE~下,I~B~与V~BE~的关系
+
    +
  1. 将电路连接为下图
  2. +
+

image-20231022155558924

+

fig1 固定VCE下的实验电路图
+
    +
  1. +

    调整V2的大小,即调整V~CE~的大小分别为0V和15V。调整直流输出源V1的大小,用万用表测量R1两端电压,从而得出V~BE~和I~B~的大小。

    +
  2. +
  3. +

    利用Matlab绘制伏安特性曲线。

    +
  4. +
+
Matlab
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
% 使用xlsread函数从Excel文件中读取数据
+data1 = readtable('./1016all.xlsx', 'Sheet','0V','Range', 'C2:D17');
+data2 = readtable('./1016all.xlsx', 'Sheet','15V', 'Range','C2:D19');
+
+% 提取电压和电流数据
+vbe1 = data1{:, 1};
+ib1 = data1{:, 2};
+vbe2 = data2{:,1};
+ib2 = data2{:,2};
+
+% 绘制伏安特性曲线
+plot(vbe1, ib1, 'o'); % 绘制数据点和连接线
+title('固定VCE下三极管输出VA曲线'); % 添加标题
+xlabel('V_{BE}(V)'); % 添加x轴标签
+ylabel('I_B(uA)'); % 添加y轴标签
+grid on; % 添加网格线
+
+% 对曲线进行平滑处理
+smoothed_ib1 = smooth(ib1, 5, 'loess'); 
+hold on; % 在同一图中叠加平滑曲线
+plot(vbe1, smoothed_ib1, 'b-', 'LineWidth', 1); % 绘制平滑曲线
+
+%绘制曲线2
+hold on;
+plot(vbe2, ib2, 'o'); % 绘制数据点和连接线
+grid on; % 添加网格线
+
+% 对曲线进行平滑处理
+smoothed_ib2 = smooth(ib2, 5, 'loess'); % 使用rloess平滑算法
+hold on; % 在同一图中叠加平滑曲线
+plot(vbe2, smoothed_ib2, 'r-', 'LineWidth', 1); % 绘制平滑曲线
+legend('原始数据(0V)', '曲线(0V下)','原始数据(15V)', '曲线(15V下)');
+
+
实验结果与分析
+

实验数据如下:

+

VCE=0V
+

截屏2023-10-22 16.51.12

+

VCE=15V下
+

截屏2023-10-22 16.49.53

+

+

fig2 三极管VA特性曲线
+
(2)固定I~B~ 下,I~C~与V~CE~的关系
+
    +
  1. 将电路图连接为下图
  2. +
+

image-20231022165919379

+

fig3 固定Ib下的实验电路图
+
    +
  1. 设定V1的大小,通过测量R1两端的电压,得出I~b~的电流大小,并在接下来的实验中不再改变V1,由于V2对I~b~的改变非常小,在此实验中忽略不计。
  2. +
  3. 调节V2,测量R2两端电压,通过计算得出V~CE~和Ic的大小。
  4. +
  5. 绘制伏安特性曲线。
  6. +
+
实验结果与分析
+

Ib=2.5uA
+

+

Ib=5uA
+

截屏2023-10-22 17.07.30

+

Ib=7.5uA
+

截屏2023-10-22 17.07.42

+

Ib=10uA
+

截屏2023-10-22 17.07.20

+

+

fig4 绘制VA特性曲线
+
一些特殊点的分析
+

+

fig5 I_b=2.5uA下的VA曲线
+

我们发现,当I~b~=2.5uA时ce的压降使得Ic到达饱和区时,放大电流随着压降增大而减小。

+

+

fig6 I=10uA下的VA曲线
+

而当I~b~=10uA时,放大电流随着V~CE~增加增大。这种现象,可能也恰好反映了基极电流会随着CE两端电压的大小变化而发生变化,但是所造成的变化并不明显,所以上述实验可以通过保持V1不变控制I~b~不变。

+

实验二:采用MULTISIM逐点仿真三极管输入VA特性

+

仿真过程

+
    +
  1. 利用MULTISIM软件搭建以下电路:
  2. +
+

+

fig7 控制VCE不变下的实验电路
+

+

fig8 控制Ib不变下的实验电路
+
    +
  1. 利用软件自带的仿真功能仿真->直流扫描功能,改变所要调节的参数,获得所要的特性曲线。
  2. +
+

+

fig9 固定Vce=15V,改变V1的值,获得的扫描曲线
+
    +
  1. 利用matlab进行数据处理,获得最终值。
  2. +
+

固定Vce

+
Matlab
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
data1 = readmatrix('./1016/1_0V.csv','NumHeaderLines',1);
+% 提取电压和电流数据
+vbe1 = data1(:, 5);
+ib1 = data1(:, 2);
+
+% 对曲线进行平滑处理
+smoothed_ib1 = smooth(ib1, 5, 'loess'); 
+plot(vbe1, smoothed_ib1, 'b-', 'LineWidth', 1); % 绘制平滑曲线
+title('固定VCE下三极管输出VA曲线'); % 添加标题
+xlabel('V_{BE}(V)'); % 添加x轴标签
+ylabel('I_B(uA)'); % 添加y轴标签
+grid on; % 添加网格线
+
+data2 = readmatrix('./1016/2_15V.csv','NumHeaderLines',1);
+% 提取电压和电流数据
+vbe2 = data2(:,5);
+ib2 = data2(:,2);
+% 对曲线进行平滑处理
+smoothed_ib2 = smooth(ib2, 5, 'loess'); % 使用rloess平滑算法
+hold on; % 在同一图中叠加平滑曲线
+plot(vbe2, smoothed_ib2, 'r-', 'LineWidth', 1); % 绘制平滑曲线
+legend('V_{CE}=0V','V_{CE}=15V');
+
+

实验结果

+

+

+

实验三:测试与非门逻辑功能

+

实验器材

+
    +
  1. 万用表(HY63)
  2. +
  3. 74LS00与非门
  4. +
  5. 连接线
  6. +
+

测试过程与结果

+
    +
  1. 连接电路为下图,注意7脚接地和14脚接高电平
  2. +
+

+

fig10 连接电路
+
    +
  1. 点按按钮,改变输入两端电压。
  2. +
  3. 利用万用表测量引脚电压。
  4. +
+

实验结果

+

+

实验四:与非门传输特性测量

+

实验器材

+
    +
  1. 示波器(1000 X-Series)
  2. +
  3. 信号源( SDG2000X)
  4. +
  5. 74LS00与非门
  6. +
  7. 连接线
  8. +
  9. 万用表(HY63)
  10. +
+

测试方案与结果

+

(1)逐点输入直流电压,测量其传输特性。

+
    +
  1. 连接电路
  2. +
+

image-20231022204950152

+

fig11 测试电路
+
    +
  1. +

    调节2脚的电位,使用万用表测量2脚以及输出端电压。

    +
  2. +
  3. +

    记录数据,并根据数据绘制图线。

    +
  4. +
+

截屏2023-10-22 20.57.37

+

+

(2)输入0至5V变化的电压,利用扫描法测量传输特性

+
    +
  1. 连接电路。
  2. +
+

image-20231022211723785

+

fig12 测试电路
+
    +
  1. +

    调节信号源为0V~5V锯齿波,对称性为50%,频率为10Hz。

    +
  2. +
  3. +

    调节示波器至显示清晰稳定图像。

    +
  4. +
+

+
    +
  1. 切换观察选项为XY显示。
  2. +
+

+

结果分析

+
    +
  • +

    根据XY显示,实际上,从高电位变到低点位,临界值偏大;而当低点位变到高电位过程中,临界值偏小。所以,在进行万用表测量时,正反两次调节电压所获数据不同属于是正常现象。

    +
  • +
  • +

    根据示波器读数,当电位在2.3V到3.5V之间时,输入并不是准确的高电位抑或低电位,此处的引脚输出也并不是准确的高电位/低点位。因此在实际使用过程中,应该避免引脚输入处于这个值之间。

    +
  • +
+

实验五:与非门输入电流测量

+

实验器材

+
    +
  1. 74LS00与非门
  2. +
  3. 连接线
  4. +
  5. 万用表(HY63)
  6. +
+

测试过程与结果

+
    +
  1. 连接电路
  2. +
+

image-20231022212159202

+
    +
  1. 利用万用表测量电压,并记录数据
  2. +
+

+

结果分析

+
    +
  • 当2脚接低点位时,与非门内部的电压高于外界电压,导致有电流通过。
  • +
  • 当2脚接高电位时,与非门也相当于一个内阻,并不能完全反映高电位电压,而是进行一定的分压。不过,由于电流非常小(在1e-5A的数量级),往往可以将与非门当作无穷大内阻;但是如果外接电阻非常大(1e5Ω数量级)的时候,需要考虑在内。
  • +
+

实验六:

+

实验器材

+
    +
  1. 74LS00与非门
  2. +
  3. 连接线
  4. +
  5. 万用表(HY63)
  6. +
+

测试过程与结果

+
    +
  1. 连接电路
  2. +
+

image-20231022213340242

+

输出高电平                                        输出低电平
+

200Ω作为保护电阻,保护电路

+
    +
  1. +

    用万用表欧姆档测量R~L~阻值,并将R~L~调节为合适大小。后连接电路利用万用表测量电压,并记录数据。

    +
  2. +
  3. +

    计算出集成门电路的输出负载电流,在坐标系中画出输出端负载特性曲线。

    +
  4. +
  5. +

    注意:每次测量电阻RL的值时须断电,并将R~L~两端中的任意一端从电路中断开,以免连接的电路影响电阻的测量值。

    +
  6. +
+

实验结果与分析

+

+

image-20231022220805720

+

可以看到与非门输出在外端串联电阻时,尤其是小电阻,输出并不是标准的高电平或者低电平。与非门内部呈现一定的定值电阻特性(由两段曲线呈现直线可以看出)。经过一定的计算,可以得出与非门内部的电阻可以近似估计为0.02Ω。

+

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/Lab5 \345\260\217\350\275\246\346\243\200\346\265\213\347\224\265\350\267\257\345\222\214\347\224\265\346\234\272\351\251\261\345\212\250\347\224\265\350\267\257\346\265\213\350\257\225/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/Lab5 \345\260\217\350\275\246\346\243\200\346\265\213\347\224\265\350\267\257\345\222\214\347\224\265\346\234\272\351\251\261\345\212\250\347\224\265\350\267\257\346\265\213\350\257\225/index.html" new file mode 100644 index 00000000..f82f9196 --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/Lab5 \345\260\217\350\275\246\346\243\200\346\265\213\347\224\265\350\267\257\345\222\214\347\224\265\346\234\272\351\251\261\345\212\250\347\224\265\350\267\257\346\265\213\350\257\225/index.html" @@ -0,0 +1,5103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 5 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

小车检测电路和电机驱动电路测试

+

实验日期:2023/10/23

+

地点:东3-406

+

实验目的

+
    +
  1. 了解智能小车结构和工作原理。
  2. +
  3. 掌握光电检测的原理和测量方法。
  4. +
  5. 了解直流电机驱动电路工作原理和测试方法。
  6. +
  7. 学会参照原理图测量和调试PCB板。
  8. +
+

实验器材

+
    +
  1. +

    万用表(HY63)

    +
  2. +
  3. +

    实验室配备小车

    +
  4. +
+

实验一:红外光电检测电路测试

+

测试方案

+
    +
  1. 分析红外光电检测电路参数设计。
  2. +
  3. 缺省高度(2CM),白底/黑底/其它表面下,光电管反射电压测量比较(至少测试2组光电管)。
  4. +
  5. 计算并确定区分黑白地面的比较电压值,总结光电检测轨道对地面的最低要求。
  6. +
  7. 不同高度(2至6CM),光电管反射电压测量比较,总结光电检测轨道对安装高度的要求。
  8. +
  9. 观察环境光亮对光电检测电路的影响。
  10. +
+

测试过程与结果

+
    +
  1. 分析电路
  2. +
+

+

fig1 OPTO5内部电路
+

我们主要讨论R17的阻值,R19的阻值和W5为什么为大电阻(10k)。

+
    +
  1. +

    使直流电压源输出稳定15V电压,给小车供电。

    +
  2. +
  3. +

    将小车的红外探测仪置于不同表面,使用万用表6V电压档测量电路各参数。

    +
  4. +
+

##### 【1.1 分析红外光电检测电路参数设计】

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Led0511脚输入/V10脚输入/V13脚输出/VV~R19~/VV~R20~/VV~R17~/VV~R18~/V5V实际输入电压/V3.3V实际输入电压/V
桌面白0.2001.9920.1531.2533.1683.7084.7214.9333.329
桌面黑3.6551.9923.3200.0000.0003.7091.340~~
+
    +
  • +

    R19与R20

    +

    这两个电阻位于发光电路之中。R19作为LED灯的限流电阻,R20作为LED的并联电阻。 + $$ + \begin{array}{l} + I_{19}=\dfrac{U_{R_{19}}}{R_{19}} = 1.253/680mA=1.84mA\ + U_{LED}=V_{I}-U_{R_{19}}=3.329-1.253=2.076V + \end{array} + $$

    +

    +

    fig2 发光二极管I-V特性曲线
    +

    根据上述图表,同时根据我们的二极管为绿色二极管可知,当选用3.3V的发光二极管时,已经能够较好地体现发光特性,电流以毫安级别通过。

    +

    R20作为并联电阻,搜索资料得知,在LED两端并联大电阻,当有反向电流流过时,能稳定LED两端电压,避免所有分压在一个LED灯上,导致LED灯反向击穿;同时,能够很好的释放LED内部存储的能量,使得LED灯快速熄灭。

    +
  • +
  • +

    W5,10脚输入电压

    +

    W5采用10kΩ大电阻,在控制电位压降的同时,也很好地控制进入比较器的电流大小,,一般要将输入比较器的电流控制在10mA以下。

    +
  • +
  • +

    红外检测电路部分R17,R18

    +

    R17作为红外发光二极管的限流电阻,控制流过二极管的电流大小。 + $$ + I_{R_{17}}=U_{R_{17}}/R_{17}=3.708/150=24.72mA + $$ + 同样根据fig2,可以看到,将红外发光二极管维持在20mA左右的电流通过,能使其更好地发挥作用。

    +

    R18作为检测支路上的电阻,与光电二极管构成了一个为11脚提供电位的之路。 + $$ + \begin{array}{l} + 1. 当光电二极管接收红外光线,产生电流时,等于光电二极管导通:\ + I_{R_{18}}=U_{R_{18}}/R_{18}=4.721/10k=0.47mA\ + U_d=U_s-U_{R_{18}}=0.2V\ + \ + 2. 当光电二极管未接收到红外光线,等于光电二极管截止:\ + I_{R_{18}}=U_{R_{18}}/R_{18}=0.13mA\ + U_d=U_s-U_{R_{18}}=3.655V\ + \end{array} + $$ + 当然,接收到的红外光线越少,光电二极管两端电压越大,11脚电位越高。

    +
  • +
  • +

    比较器的使用

    +

    11脚电位比10脚电位低,则输出低电压,稳定在0.153V。

    +

    11脚电位比10脚电位高,这输出高电压,稳定在3.320V。

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LED0611脚输入/V10脚输入/V13脚输出/VV~R19~/VV~R20~/VV~R17~/VV~R18~/V
0.1931.9650.1521.2493.1693.7124.711
3.2011.9653.320003.7131.728
+

测量LED06阻值两端的电压与LED05所得结果基本相似。

+
【1.2 不同表面,光电管反射电压测量】
+
【1.3 区分黑白地面的比较电压值】
+

截屏2023-10-29 13.51.21

+

根据实验结果,可以得到以下结论:反射表面对红外线吸收能力越强,光电管反射电压越高。

+

随着反射表面对红外线能力的吸收增强,光电管两端电压增加,当超过另外一只引脚的输入电压后,比较器输出相反的性质。

+
    +
  1. 将红外探测仪置于白色表面不同高度处(通过小车下面垫置书本实现),测量光电管反射电压。
  2. +
+
【1.4不同高度(2至6CM),光电管反射电压测量比较】
+

截屏2023-10-29 13.52.21

+

截屏2023-10-29 13.25.50

+
    +
  • 当光电管离地越来越高,所能吸收的红外光线越来越少,两端电压越来越大。
  • +
  • 当光电管高度大约为3.5~3.7cm左右时,光电管两端电压逐渐靠近1.992V(另一只脚的电压),此时从比较器从输出低电压转变为高电压,在这个电压值以下,指示LED灯发光,以上则熄灭。
  • +
  • 在实际使用中,为了避免高度对测量结果的影响,当一只脚的引脚为2V左右,应该将光电管置于<2.5cm的位置。当然,也要根据具体的另一只脚的电位,具体调整光电管离地高度。
  • +
+
【1.5 观察环境光亮对光电检测电路的影响】
+

截屏2023-10-29 13.34.58

+
    +
  • 可见,环境对实验有一定的影响,当其影响在1%左右,所以可以忽略不计。
  • +
  • 在昏暗环境下,去除了日光中的红外线对光电管的影响,从而使得其引脚11两端电压略微升高
  • +
  • 在明亮的条件下,新增加的光源中的红外线对光电管造成一定影响,使得引脚11两端电压略微下降(0.001V的偏差可视为车辆上的不精确,可以忽略)。
  • +
+

实验二:测量直流电机正转和反转时的VA特性

+

测试方案

+

测量不同输入直流电压时,经过小车上的电机的电流。

+

测试过程与结果

+
    +
  1. 拆下小车电源线,将其与直流输入电压源、万用表60mA电流档串联,60mA的电流档内阻约为10Ω左右,对曲线的影响较小
  2. +
  3. 调节直流稳压源的电压,记录万用表读数
  4. +
  5. 交换输入电压源正负极,测量电机反转时的VA特性。
  6. +
+

截屏2023-10-29 13.54.32

+

+
    +
  • 直流电压源从高到低变化时,电流逐渐较小,同时也可以观察到,电动机的转速慢慢减小。
  • +
  • 当电压源电压过小时,电动机停转,同时电流急剧上升,此时不再对外输出机械能,而是等效为一个电阻,只输出热能。
  • +
+

实验三:电机驱动模块功能验证

+

测试方案

+

对集成H桥各端口输入不同情况下的电压,检验芯片各端口的输出特性,验证电机的转动情况。

+

测试过程与结果

+
    +
  1. 分析PCB板上的电路图。
  2. +
+

截屏2023-10-29 18.46.29

+

fig3 电机控制电路电路图
+

该电路分为三个模块:

+
    +
  • 光电控制电路
  • +
+

通过IN1,IN2等各接口输入电压,当输入高电位后,控制灯光发亮,光电管接收到光信号导通,集成H桥芯片中的IN1脚变为高电位。

+

这样子利用光电控制的好处在于,低电流控制高电流,将控制电路与高电压、大电流驱动电路分开,避免高电压、高电流出问题后,造成控制电路的损坏。

+
    +
  • 集成H桥驱动芯片
  • +
+

有输入端4四个,其中IN1、IN2和OUT1、OUT2控制一个电机的两端,IN3、IN4和OUT3、OUT4控制另外一个电机。

+
    +
  • 电机部分
  • +
+

电机有两个端口,两端的电压差驱动电机的转动。

+
    +
  1. 将电板接入电源,根据引脚图连接电路
  2. +
+

截屏2023-10-29 19.19.00

+

fig4 引脚输入图
+

将输入脚ENA总控制开关,IN1、IN2等输入引脚与3.3V或者GND脚连接,以控制输入电位的高低。

+
    +
  1. 利用万用表测量各电位电压,记录数据。
  2. +
+

+
    +
  • 输入IN1,IN2,输入端的高电压对应了OUT1和OUT2的高电压。
  • +
  • 当输出端OUT1、OUT2对应的电压有一定的电压差时,电机转动。
  • +
  • ENA类似于总开关,当输入为高电压时,芯片正常工作;输入为低电压的时候,芯片不工作,两输出脚输出较低电压,但并没有非常低(1.3V左右,相比于0.17/0.71的低电压)。
  • +
+

实验四:电机开环控制时小车运行状态观测

+

测试方案

+

观察电机正转/反转时,小车的运动情况。

+

测试过程与结果

+
    +
  1. ENA输入高电压。调节IN1、IN2、IN3、IN4的输入逻辑以控制电机正反转。
  2. +
  3. 观察小车的运转情况。
  4. +
+

截屏2023-10-29 20.02.13

+
    +
  • 当两端均正转后,由于两端的电机并不一定完全一致,所以在实际情况中,两电机均正转时,并不如设想一般直走,而是有微微的偏移,在我们实验过程中,小车微微左转,可见左边电机的转速略微慢于右边。在后续编程小车的时候,需要对电路进行一定的改进,使得输出电压能够使小车正走。
  • +
  • 左右电机一正一反时,小车绕两轮线段的中心旋转。
  • +
  • 左右电机中一个为正,一个停转时,这基本上绕停转的轮转。
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/1-8559682.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/1-8559682.bmp" new file mode 100644 index 00000000..bc655d69 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/1-8559682.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/1.bmp" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/1.bmp" new file mode 100644 index 00000000..fd10f393 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/1.bmp" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/2.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/2.png" new file mode 100644 index 00000000..899b6cd6 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/2.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/diode-diode12-8502958.gif" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/diode-diode12-8502958.gif" new file mode 100644 index 00000000..455606d7 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/diode-diode12-8502958.gif" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.08.35-8556124.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.08.35-8556124.png" new file mode 100644 index 00000000..013e38c6 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.08.35-8556124.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.23.35.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.23.35.png" new file mode 100644 index 00000000..53b0b97f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.23.35.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.25.50.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.25.50.png" new file mode 100644 index 00000000..3bf1b270 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.25.50.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.34.58.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.34.58.png" new file mode 100644 index 00000000..0b271be4 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.34.58.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.51.21.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.51.21.png" new file mode 100644 index 00000000..fc961998 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.51.21.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.52.21.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.52.21.png" new file mode 100644 index 00000000..c2fb78cd Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.52.21.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.54.32.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.54.32.png" new file mode 100644 index 00000000..429bb03d Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 13.54.32.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 18.46.29.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 18.46.29.png" new file mode 100644 index 00000000..2b5d984d Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 18.46.29.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 19.19.00.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 19.19.00.png" new file mode 100644 index 00000000..1df884cf Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 19.19.00.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 19.38.19.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 19.38.19.png" new file mode 100644 index 00000000..f14df638 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 19.38.19.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 20.02.13.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 20.02.13.png" new file mode 100644 index 00000000..1bced753 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab5/assets/\346\210\252\345\261\2172023-10-29 20.02.13.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/Lab6 \346\231\272\350\203\275\345\260\217\350\275\246\346\216\247\345\210\266/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/Lab6 \346\231\272\350\203\275\345\260\217\350\275\246\346\216\247\345\210\266/index.html" new file mode 100644 index 00000000..b747336e --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/Lab6 \346\231\272\350\203\275\345\260\217\350\275\246\346\216\247\345\210\266/index.html" @@ -0,0 +1,4995 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 6 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

智能小车控制

+

实验日期:2023/10/30

+

地点:东3-406

+

实验目的

+
    +
  1. 复习之前所学知识:FPGA板的编程,小车各控制芯片的连接。
  2. +
  3. 编写程序,使小车能够沿着轨道运行。
  4. +
+

实验器材

+
    +
  1. 智能小车一台
  2. +
  3. 编程电脑
  4. +
  5. 连接线
  6. +
  7. 电源
  8. +
+

实验方案

+
    +
  1. 编写程序,并仿真。
  2. +
  3. 将各功能模块芯片连接。
  4. +
  5. 利用Quartus软件将辨析的好的程序传入FPGA板。
  6. +
  7. 连入电源,测试小车。
  8. +
+

测试过程与结果

+
    +
  1. +

    测量轨道部分数据,选择合适的红外检测管,作为本次试验作为判定的光电管。

    +
  2. +
  3. +

    轨道经测量,约为两指宽。所以,选择中间两盏小灯作为沿轨道行进判定,和间隔一个旁边的小灯作为转弯判定。

    +
  4. +
+

截屏2023-11-01 19.48.09

+

fig1 光电管示意图(蓝色为选择的光电管)
+
    +
  • +

    分析输出端口电位

    +

    根据上一次实验,得知地面为黑色,比较器出高,灯熄灭;地面为白色,比较器出低,灯发光。

    +
  • +
  • +

    编写程序,并进行编译仿真。

    +
  • +
+

根据第一步的分析,我们需要一个以下有5个接口,7个输出口的逻辑芯片。

+

截屏2023-11-01 21.03.41

+

fig2 设计逻辑示意图
+
    +
  • +

    开关设计,利用FPGA板上的开关键Switch0,来控制实体的运作与否。

    +
      +
    • 当开关打开,LED0发光,ENA,ENB输出高电位
    • +
    • 当开关关闭,LED0熄灭,ENA,ENB输出低电位
    • +
    +
  • +
+
Vhdl
1
+2
+3
+4
+5
+6
+7
+8
+9
if (swt='1') then
+  swto<='1';
+  ena<='1';
+  enb<='1';
+else
+  swto<='0';
+  ena<='0';
+  enb<='0';
+end if;
+
+
    +
  • +

    小车直线循轨

    +
      +
    • +

      四个探测器,从左到右分别为inp1, inc1, inc2, inp2

      +
    • +
    • +

      左轮为in1,in2控制,右轮为in3,in4控制

      +
    • +
    +

    当左轮转动时,in1输出1,in2输出0

    +

    当左轮转动时,in3输出1,in4输出0

    +

    截屏2023-11-01 21.46.32

    +
  • +
+
Vhdl
1
+2
+3
+4
-------------直行循轨-------------------------------
+when "0110"=> in1<='1';in2<='0';in3<='1';in4<='0';
+when "0010"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "0100"=> in1<='0';in2<='0';in3<='1';in4<='0';
+
+
    +
  • +

    小车遇到岔路判断

    +
      +
    • 主要岔路判断过程,小车在行进过程中,最旁边的灯判断了在左/右遇到岔路的情况
    • +
    +

    截屏2023-11-01 21.57.16

    +
      +
    • 如果在遇到岔路过程中,中间的两盏灯出现了一亮一灭的情况,具体如下图(左边遇到岔路的情况,右边遇到岔路同理)所示,则应该一定地修正轨迹。
    • +
    +

    +
  • +
+
Vhdl
1
+2
+3
+4
+5
+6
+7
+8
-------------岔路判断-------------------------------
+when "0111"=> in1<='1';in2<='0';in3<='1';in4<='0';
+when "0011"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "0101"=> in1<='0';in2<='0';in3<='1';in4<='0';
+
+when "1110"=> in1<='1';in2<='0';in3<='1';in4<='0';
+when "1010"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "1100"=> in1<='0';in2<='0';in3<='1';in4<='0';
+
+
    +
  • +

    小车直角转弯

    +

    截屏2023-11-05 18.48.32

    +

    当小车回到轨道后,由于光电管并不一定稳定运行,所以利用之前的发光判断,小车会自行沿着轨道左转或者右转。

    +
  • +
  • +

    小车停止运行

    +

    当小车四个光电管均位于停车处的黑框时,即tmp=0000时,小车停止运行

    +
  • +
+
Vhdl
1
+2
when "0000"=> in1<='0';in2<='0';in3<='0';in4<='0';
+when "1111"=> in1<='0';in2<='1';in3<='0';in4<='1';
+
+

全代码

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+
+entity controller is
+  port (
+ledc1,ledc2,ledp1,ledp2,swt: in std_logic;
+      ena,enb,in1,in2,in3,in4,swto: out std_logic);
+end controller;
+
+
+architecture runner of controller is
+
+begin
+P1:process(ledc1,ledc2,ledp1,ledp2)
+variable tmp:std_logic_vector(3 downto 0);
+begin
+tmp:=ledp1&ledc1&ledc2&ledp2;
+case tmp is
+when "0000"=> in1<='0';in2<='0';in3<='0';in4<='0';
+when "1111"=> in1<='0';in2<='1';in3<='0';in4<='1';
+
+when "0110"=> in1<='1';in2<='0';in3<='1';in4<='0';
+when "0010"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "0100"=> in1<='0';in2<='0';in3<='1';in4<='0';
+
+when "0111"=> in1<='1';in2<='0';in3<='1';in4<='0';
+when "0011"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "0101"=> in1<='0';in2<='0';in3<='1';in4<='0';
+
+when "1110"=> in1<='1';in2<='0';in3<='1';in4<='0';
+when "1010"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "1100"=> in1<='0';in2<='0';in3<='1';in4<='0';
+
+when "1000"=> in1<='0';in2<='0';in3<='1';in4<='0';
+when "1001"=> in1<='0';in2<='0';in3<='0';in4<='0';
+when "0001"=> in1<='1';in2<='0';in3<='0';in4<='0';
+when "1101"=> in1<='0';in2<='0';in3<='0';in4<='0';
+when "1011"=> in1<='0';in2<='0';in3<='0';in4<='0';
+when others =>in1<='X';in2<='X';in3<='X';in4<='X';
+
+end case;
+end process;
+
+P2: process(swt)
+begin
+if (swt='1') then
+swto<='1';
+ena<='1';
+enb<='1';
+else
+swto<='0';
+ena<='0';
+enb<='0';
+end if;
+end process;
+end runner;
+
+
    +
  1. 连接各功能芯片模块。
  2. +
+

截屏2023-11-01 21.03.41

+

根据以上示意图,先物理上连接各引脚的输入输出。

+

后在Quartus软件上,对FPGA进行pin planner

+

000000

+

在Quartars中编译文件,成功运行并导入FPGA板中。

+
    +
  1. 连入电源,测试小车。
  2. +
+

测试结果

+
    +
  1. 直角转弯时非常困难的一部分,我们发现,小车有概率地在直角转弯处停下,后观察光电管情况,发现,一些时候,tmp可能出现“0001”或者“1000”的情况,即最旁边的引脚在轨道内,而其他光电管偏离轨道。于是,对程序进行修改,
  2. +
+
Vhdl
1
+2
when "1000"=> in1<='0';in2<='0';in3<='1';in4<='0';
+when "0001"=> in1<='1';in2<='0';in3<='0';in4<='0';
+
+

修改后,小车能够顺利转弯。

+
    +
  1. 小车能依照轨道进行运动。
  2. +
+

结果分析

+

即要从逻辑上分析小车运动的情况,也要根据实验中具体出现的问题进行调整。这也说明,在未来的实验中,不光光要从理论上严谨分析,也要从具体实际中实践,修改,然后完善。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/000000.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/000000.png" new file mode 100644 index 00000000..3b92901e Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/000000.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 19.48.09.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 19.48.09.png" new file mode 100644 index 00000000..159188e3 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 19.48.09.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.03.41.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.03.41.png" new file mode 100644 index 00000000..a8b0d94f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.03.41.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.46.32.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.46.32.png" new file mode 100644 index 00000000..6103fa8f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.46.32.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.57.16.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.57.16.png" new file mode 100644 index 00000000..9c7b2531 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-01 21.57.16.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-05 18.22.45.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-05 18.22.45.png" new file mode 100644 index 00000000..a9d5a59f Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-05 18.22.45.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-05 18.48.32.png" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-05 18.48.32.png" new file mode 100644 index 00000000..b685c20b Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/Lab6/assets/\346\210\252\345\261\2172023-11-05 18.48.32.png" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab1/WLab1.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab1/WLab1.pdf" new file mode 100644 index 00000000..28690046 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab1/WLab1.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab1/WLab1/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab1/WLab1/index.html" new file mode 100644 index 00000000..91cfb767 --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab1/WLab1/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab 1 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab 1

+ +

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab2/WLab2.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab2/WLab2.pdf" new file mode 100644 index 00000000..2f410721 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab2/WLab2.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab2/WLab2/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab2/WLab2/index.html" new file mode 100644 index 00000000..9df0bc2e --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab2/WLab2/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab 2 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab 2

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab3/WLab3.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab3/WLab3.pdf" new file mode 100644 index 00000000..d6994121 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab3/WLab3.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab3/WLab3/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab3/WLab3/index.html" new file mode 100644 index 00000000..a22205e1 --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab3/WLab3/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab 3 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab 3

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab4/WLab4/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab4/WLab4/index.html" new file mode 100644 index 00000000..eca7154c --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab4/WLab4/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab 4 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab 4

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab4/Wlab4.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab4/Wlab4.pdf" new file mode 100644 index 00000000..f6fb60b4 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab4/Wlab4.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab6/WLab6/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab6/WLab6/index.html" new file mode 100644 index 00000000..86b75e8b --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab6/WLab6/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab 6 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab 6

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab6/Wlab6.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab6/Wlab6.pdf" new file mode 100644 index 00000000..87868cd1 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab6/Wlab6.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab7/WLab7/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab7/WLab7/index.html" new file mode 100644 index 00000000..90e10066 --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab7/WLab7/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + WLab 7 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WLab 7

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab7/Wlab7.pdf" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab7/Wlab7.pdf" new file mode 100644 index 00000000..f8139a41 Binary files /dev/null and "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/WLab7/Wlab7.pdf" differ diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/lab7/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/lab7/index.html" new file mode 100644 index 00000000..37d48f2a --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/lab7/index.html" @@ -0,0 +1,4854 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 7 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

参考代码

+

以下代码有些许语法错误

+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+entity DIVX is
+    port(
+        Freq_in,Clr_n: in std_logic;
+        Div_num: in natural range 0 to 49999999;
+        Freq_out: out std_logic;
+    );  
+end DIVX;
+
+architecture BEHAV of DIVX is
+begin
+p1:process (Freq_in,Clr_n)
+variable cnt_val: natural range 0 to 49999999;
+begin
+    if(Clr_n='0')then
+        cnt_val:=0;
+    elsif(Freq_in'event and Freq_in='1')then
+        if(cnt_val=Div_num)then 
+            cnt_val:=0;
+        elsif(cnt_val<Div_num/2)then
+            cnt_val:=cnt_val+1;
+            Freq_out<='0';
+        else
+            cnt_val:=cnt_val+1;
+            Freq_out<='1';
+        end if;
+    end if;
+end process;
+end BEHAV;
+
+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+entity CNT16 is
+    port(
+        Clk,Clr_n:in std_logic;
+        Q:out std_logic_vector(3 downto 0);
+    );
+end CNT16;
+
+architecture BEHAV of CNT16 is
+signal Q_tmp: std_logic_vector(3 downto 0);
+begin
+    P1:process(Clk,Clr_n)
+    begin
+        if(Clr_n='0')then
+            Q_tmp<="0000";
+        elsif(Clk'event and Clk='1')then
+            Q_tmp<=Q_tmp+1;
+        end if;
+    end process;
+        Q<=Q_tmp;
+end BEHAV;
+
+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+entity COMP4BIT is
+    port(
+        A,B: in std_logic_vector(3 downto 0);
+        AGB:out std_logic;
+    );
+end COMP4BIT;
+architecture BEHAV of COM4BIT is
+begin
+    process(A,B)
+    begin
+        if(A>B)then
+            AGB<='1';
+        else
+            AGB<='0';
+        end if;
+    end proscess;
+end BEHAV;
+
+
Vhdl
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_unsigned.all; 
+use IEEE.numeric_std.all;
+use IEEE.std_logic_arith.all;
+
+entity TOP is
+Port ( 
+    swtch:in std_logic_vector(3 downto 0);
+    Freq_in:in std logic;
+    PWM:out std_logic;);
+end TOP;
+architecture Behavioral of TOP is
+component DIVX is
+    Port(Freq_in, Clr_n:in std_logic;
+         Div_num:in natural range 0 to 49999999;
+         Freq_out:out std_logic);
+end component;
+
+component CNT16 is
+    port(
+        Clk,Clr_n:in std_logic;
+        Q:out std_logic_vector(3 downto 0);
+    );
+end component;
+component COMP4BIT is
+    port(
+        A,B: in std_logic_vector(3 downto 0);
+        AGB:out std_logic;
+    );
+end component;
+signal Freq_out:std_logic;
+signal cnt_out:std_logic_vector (3 downto 0);
+begin
+    ul:DIVX port map (Freq_in=>Freq_in, Clr_n=>'1', Div_num=>26315, Freq_out=>Freq_out);
+    u2:CNT16 port map (Clk=>Freq_out, Clr_n=>'1', Q=>cnt_out);
+    u3:CMP4BIT port map (A=>cnt_out, B=>swtch, AGB=>PWM)
+end Behavioral;
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/preview/index.html" "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/preview/index.html" new file mode 100644 index 00000000..27ea131e --- /dev/null +++ "b/JY_FENG/1 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257I\345\256\236\351\252\214/preview/index.html" @@ -0,0 +1,4685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Preview - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Preview

+ +

写在前面 for 电路与电子技术实验I

+

电院实验课本身内容并不复杂,具体操作老师基本上会给出,但是完成实验并得到效果还是一个比较繁琐的内容,再加上对实验报告有一定的要求,所以会觉得这2学分的课实在是性价比过高。

+

综合实验报告成绩和两次考核成绩,本人最终成绩为94,所以可以以此为基准参考需要的努力程度。

+

综合一年的实验感受,实验报告总的完成以下两点要求差不多就可以拿到一个不错的成绩:

+
    +
  • 实验内容不缺不漏
  • +
  • 实验结果准确无误,和理论基本一致
  • +
+

学习内容

+

秋学期:综合实验,各类内容均有涉及,主要目的是了解实验器材,然后对”电“有一定的概念。祁才军老师负责,但应该教完我们这一届就退休了。期末考试内容涉及PPT内容较多,认真阅读PPT,对期末考试有较大帮助。

+

冬学期:电路原理部分实验。实际上涉及较多模电实验的内容。姚缨英老师主要负责。姚老师虽然看上去事情很多,实际上事情也是真的多。PPT上的实验内容也比较杂乱,但可以根据往届的实验报告推测老师的实验要求。同时有任何不理解的内容和要求,也建议主动问姚老师。姚老师会非常耐心地解答。

+

考试

+

秋学期:期末考试以笔试形式考察秋学期的所有实验内容,认真阅读PPT

+

冬学期:姚老师基本上会以各种方式提示期末考试的内容

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab1/Lab1.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab1/Lab1.pdf" new file mode 100644 index 00000000..1e68a84d Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab1/Lab1.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab1/Lab1/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab1/Lab1/index.html" new file mode 100644 index 00000000..f4e3bffb --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab1/Lab1/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 1 PSpice使用练习 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 1 PSpice使用练习

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10 Multisim.zip" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10 Multisim.zip" new file mode 100644 index 00000000..9d570985 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10 Multisim.zip" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10.pdf" new file mode 100644 index 00000000..e4a8aeb7 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10/index.html" new file mode 100644 index 00000000..98a7a02a --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab10/Lab10/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 10 触发器 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 10 触发器

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab11/Lab11.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab11/Lab11.pdf" new file mode 100644 index 00000000..772be98e Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab11/Lab11.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab11/Lab11/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab11/Lab11/index.html" new file mode 100644 index 00000000..52f3a59d --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab11/Lab11/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 11 时序电路 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 11 时序电路

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab12/Lab12.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab12/Lab12.pdf" new file mode 100644 index 00000000..9efc4889 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab12/Lab12.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab12/Lab12/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab12/Lab12/index.html" new file mode 100644 index 00000000..6c76175b --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab12/Lab12/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 12 一位全加器和四位加法器 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 12 一位全加器和四位加法器

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab13/Lab13.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab13/Lab13.pdf" new file mode 100644 index 00000000..af1f6c6d Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab13/Lab13.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab13/Lab13/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab13/Lab13/index.html" new file mode 100644 index 00000000..4f4063e1 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab13/Lab13/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 13 数字钟(Quartus) - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 13 数字钟(Quartus)

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab14/Lab14.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab14/Lab14.pdf" new file mode 100644 index 00000000..6644803f Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab14/Lab14.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab14/Lab14/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab14/Lab14/index.html" new file mode 100644 index 00000000..8c63ba41 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab14/Lab14/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 14 步进电机脉冲分配器 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 14 步进电机脉冲分配器

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab2/Lab2.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab2/Lab2.pdf" new file mode 100644 index 00000000..409779bc Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab2/Lab2.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab2/Lab2/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab2/Lab2/index.html" new file mode 100644 index 00000000..7795d035 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab2/Lab2/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 2 信号发生电路实验 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 2 信号发生电路实验

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab3/Lab3.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab3/Lab3.pdf" new file mode 100644 index 00000000..7209717d Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab3/Lab3.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab3/Lab3/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab3/Lab3/index.html" new file mode 100644 index 00000000..47e95088 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab3/Lab3/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 3 电压比较器 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 3 电压比较器

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab4/Lab4.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab4/Lab4.pdf" new file mode 100644 index 00000000..a9c513f1 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab4/Lab4.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab4/Lab4/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab4/Lab4/index.html" new file mode 100644 index 00000000..b85a333a --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab4/Lab4/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 4 光耦合电路及其应用实验 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 4 光耦合电路及其应用实验

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5 PSpice\344\273\277\347\234\237.zip" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5 PSpice\344\273\277\347\234\237.zip" new file mode 100644 index 00000000..9b9a7d63 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5 PSpice\344\273\277\347\234\237.zip" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5.pdf" new file mode 100644 index 00000000..cf7e642e Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5/index.html" new file mode 100644 index 00000000..4c678d66 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab5/Lab5/index.html" @@ -0,0 +1,4607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 5 仪用放大电路及其应用实验 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 5 仪用放大电路及其应用实验

+ +

仿真所用文件在这里: Lab5 PSpice仿真.zip

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6 PSpice\344\273\277\347\234\237.zip" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6 PSpice\344\273\277\347\234\237.zip" new file mode 100644 index 00000000..a6c3dc65 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6 PSpice\344\273\277\347\234\237.zip" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6.pdf" new file mode 100644 index 00000000..c7fb9722 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6/index.html" new file mode 100644 index 00000000..94a52d27 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab6/Lab6/index.html" @@ -0,0 +1,4607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 6 滤波器的设计与实现 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 6 滤波器的设计与实现

+ +

Lab6所使用仿真软件 Lab6 PSpice仿真.zip

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7.pdf" new file mode 100644 index 00000000..b6f283e9 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7/index.html" new file mode 100644 index 00000000..7646ab48 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7/index.html" @@ -0,0 +1,4607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 7 扩音机电路的设计制作与测试 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 7 扩音机电路的设计制作与测试

+ +

Lab7中所使用的仿真文件: Lab7PSpice仿真.zip

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7PSpice\344\273\277\347\234\237.zip" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7PSpice\344\273\277\347\234\237.zip" new file mode 100644 index 00000000..0e1a8f0f Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab7/Lab7PSpice\344\273\277\347\234\237.zip" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab8/Lab8.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab8/Lab8.pdf" new file mode 100644 index 00000000..27a88081 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab8/Lab8.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab8/Lab8/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab8/Lab8/index.html" new file mode 100644 index 00000000..ea8f4798 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab8/Lab8/index.html" @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 8 数字钟 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 8 数字钟

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9 Multisim.zip" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9 Multisim.zip" new file mode 100644 index 00000000..03e24084 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9 Multisim.zip" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9.pdf" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9.pdf" new file mode 100644 index 00000000..dc40cb60 Binary files /dev/null and "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9.pdf" differ diff --git "a/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9/index.html" "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9/index.html" new file mode 100644 index 00000000..ae082e09 --- /dev/null +++ "b/JY_FENG/2 \347\224\265\350\267\257\347\224\265\345\255\220\346\212\200\346\234\257II\345\256\236\351\252\214/Lab9/Lab9/index.html" @@ -0,0 +1,4607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Lab 9 全加器与奇偶位检验电路 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Lab 9 全加器与奇偶位检验电路

+ +

Lab9中所使用的Multisim仿真文件: Lab9 Multisim.zip

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_FENG/3 \347\224\265\347\275\221\347\273\234\345\210\206\346\236\220/Preview/index.html" "b/JY_FENG/3 \347\224\265\347\275\221\347\273\234\345\210\206\346\236\220/Preview/index.html" new file mode 100644 index 00000000..79ae6089 --- /dev/null +++ "b/JY_FENG/3 \347\224\265\347\275\221\347\273\234\345\210\206\346\236\220/Preview/index.html" @@ -0,0 +1,4548 @@ + + + + + + + + + + + + + + + + + + + + + 写在前面 for 电网络分析 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

写在前面 for 电网络分析

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_FENG/JY-Feng/index.html b/JY_FENG/JY-Feng/index.html new file mode 100644 index 00000000..170c9022 --- /dev/null +++ b/JY_FENG/JY-Feng/index.html @@ -0,0 +1,4626 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Preview - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Preview

+ +

编写者为ZJU 22级电子信息工程专业学生,由于加入爱迪生班,所以内容主要面向爱迪生班专业内容(爱迪生班内容会在后面标注\(\alpha\))。

+

这里作为我对本专业的回顾,以及一些经验~

+

专业课大致内容如下:(打勾内容为已更新)

+
    +
  • 电路与电子技术I与II实验(\(\alpha\)) 实验报告 ✓
  • +
  • 电网络分析(\(\alpha\)) 课程内容与拓展
  • +
  • 电路与电子技术I与II(\(\alpha\))一些笔记和经验之谈
  • +
  • 工程电磁场与波
  • +
  • 微机原理及应用(\(\alpha\))
  • +
  • 微机原理及应用综合实验(\(\alpha\))
  • +
  • 信号分析与处理实验(\(\alpha\)),【为什么没有理论课?因为我恨傅里叶】
  • +
  • ......
  • +
+

各类通识课:

+
    +
  • 微观经济学原理
  • +
  • 概率论及数理统计
  • +
  • 微积分
  • +
  • 大学物理
  • +
  • ......
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/Approach almost/index.html b/JY_HU/AI/Approach almost/index.html new file mode 100644 index 00000000..c68030bf --- /dev/null +++ b/JY_HU/AI/Approach almost/index.html @@ -0,0 +1,4650 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Approaching-almost - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Approaching almost any machine learning problem

+

Principal Component Analysis (PCA):

+

PCA 是一种用于降维和数据压缩的线性技术。它的目标是找到数据中最重要的方向,即方差最大的方向,然后将数据投影到这些方向上。这些方向被称为主成分。通过选择最重要的主成分,我们可以保留数据中的大部分信息,同时降低数据的维度。

+
    +
  1. 计算协方差矩阵: 首先,计算数据集的协方差矩阵。协方差矩阵描述了数据中不同维度之间的关系。
  2. +
  3. 计算特征向量和特征值: 对协方差矩阵进行特征值分解,得到特征向量和特征值。特征向量表示主成分的方向,而特征值表示在这个方向上的方差大小。
  4. +
  5. 选择主成分: 根据特征值的大小选择主成分。特征值越大,说明相应的特征向量所代表的主成分越重要。
  6. +
  7. 投影数据: 将数据投影到选定的主成分上,从而实现降维。这样,我们就可以用较少的主成分表示原始数据。
  8. +
+

PCA 在数据压缩、特征提取和可视化等领域广泛应用。

+

t-distributed Stochastic Neighbor Embedding (t-SNE):

+

t-SNE 是一种非线性降维算法,主要用于可视化高维数据。它能够保留数据点之间的相对距离,特别适用于发现数据中的聚类结构。

+
    +
  1. 计算相似度: 对于每对数据点,计算它们之间的相似度,使用高斯分布表示。
  2. +
  3. 构建条件概率分布: 基于相似度构建条件概率分布,描述数据点在高维空间中的分布。
  4. +
  5. 构建 t 分布: 在低维空间中重复上述步骤,构建 t 分布,表示数据点在低维空间中的分布。
  6. +
  7. 最小化 KL 散度: 通过最小化 KL 散度(Kullback-Leibler divergence),调整低维空间中的数据点位置,使其尽可能符合条件概率分布。
  8. +
+

t-SNE 通常用于可视化高维数据,尤其在发现聚类结构方面表现出色。然而,需要注意的是,t-SNE 对于不同的初始化可能会导致不同的结果,因此在解释结果时需要谨慎。

+

Image compression using PCA (Principal Component Analysis) involves applying PCA to the pixel values of an image and retaining only the most significant principal components. The basic idea is to reduce the dimensionality of the image while preserving as much information as possible. Here's a step-by-step guide on how to perform image compression using PCA:

+
    +
  1. Flatten the Image:
  2. +
  3. Convert the 2D image matrix to a 1D vector by flattening the pixel values. For a color image, you'll have separate vectors for each color channel (e.g., Red, Green, Blue).
  4. +
  5. Standardize the Data:
  6. +
  7. Standardize the pixel values (subtract mean, divide by standard deviation) to ensure that each color channel has zero mean and unit variance.
  8. +
  9. Compute Covariance Matrix:
  10. +
  11. Calculate the covariance matrix of the standardized pixel values. The covariance matrix represents the relationships between different color channels.
  12. +
  13. Perform PCA:
  14. +
  15. Use PCA to compute the eigenvectors and eigenvalues of the covariance matrix. The eigenvectors represent the principal components, and the eigenvalues indicate their significance.
  16. +
  17. Select Principal Components:
  18. +
  19. Select the top-k eigenvectors corresponding to the k largest eigenvalues. These principal components capture the most important information in the image.
  20. +
  21. Project Data onto Lower-Dimensional Space:
  22. +
  23. Project the standardized pixel values onto the subspace spanned by the selected principal components. This effectively reduces the dimensionality of the image.
  24. +
  25. Reconstruction:
  26. +
  27. Reconstruct the compressed image by reversing the PCA transformation. This involves multiplying the lower-dimensional representation by the transpose of the selected principal components and adding back the mean.
  28. +
  29. Visualize the Results:
  30. +
  31. Compare the original image with the compressed image to assess the quality of the compression.
  32. +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/ML-zju/index.html b/JY_HU/AI/ML-zju/index.html new file mode 100644 index 00000000..b76f8b79 --- /dev/null +++ b/JY_HU/AI/ML-zju/index.html @@ -0,0 +1,4728 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 一些截图 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

ML-for-zju

+

image-20231022102907303

+

generative model 生成式模型和非生成式模型

+

linear model/none linear model

+

image-20231022103347613

+

生成模型(Generative Model)和判别模型(Discriminative Model)是机器学习中两种不同类型的模型,它们的主要区别在于它们对数据的建模方式和应用领域。

+
    +
  1. 生成模型(Generative Model)
  2. +
  3. 生成模型试图对整个数据分布进行建模,它学习如何生成数据。生成模型能够生成与训练数据集相似的新数据点。
  4. +
  5. 生成模型通常用于生成新数据、样本合成、缺失数据填补以及密度估计等任务。
  6. +
  7. 代表性的生成模型包括变分自编码器(Variational Autoencoders,VAE)、生成对抗网络(Generative Adversarial Networks,GAN)、隐马尔可夫模型(Hidden Markov Models,HMM)等。
  8. +
  9. 生成模型通常需要更多的数据和计算资源来训练,因为它们要学习整个数据分布。
  10. +
  11. 判别模型(Discriminative Model)
  12. +
  13. 判别模型关注的是对不同类别之间的边界进行建模,它学习如何对输入数据进行分类或标记。
  14. +
  15. 判别模型通常用于分类、回归和标记任务,其中目标是预测输入数据的标签或属性。
  16. +
  17. 代表性的判别模型包括逻辑回归、支持向量机、决策树、神经网络中的前馈神经网络等。
  18. +
  19. 判别模型通常在小规模数据上效果较好,因为它们只需要建模与任务相关的部分信息,而不需要学习整个数据分布。
  20. +
+

总结来说,生成模型和判别模型的关键区别在于其建模目标。生成模型试图理解整个数据分布并生成新数据,而判别模型关注的是对数据的分类或标记。在实际应用中,选择生成模型还是判别模型通常取决于具体问题和任务的性质。有时,这两种类型的模型可以结合使用,以实现更复杂的机器学习任务。

+

image-20231022110143358

+

linear feature+nonlinear model/ nonlinear feature+linear model是什么意思

+

ChatGPT

+

"线性特征 + 非线性模型" 和 "非线性特征 + 线性模型" 是机器学习中的两种不同方法,用于处理数据和建立预测模型。它们可以在特征工程和模型选择方面用于处理非线性关系。

+
    +
  1. 线性特征 + 非线性模型
  2. +
  3. 在这种方法中,特征是原始数据或线性组合的结果,而模型是非线性的。这意味着模型可以学习非线性关系,但特征本身是线性的。
  4. +
  5. 举例:特征可以是原始数据,如长度、宽度和高度,但模型可以是多项式回归模型,能够拟合非线性关系,例如长度和宽度的乘积对输出的影响。
  6. +
  7. 非线性特征 + 线性模型
  8. +
  9. 在这种方法中,特征本身是经过非线性变换的,例如,通过应用某种非线性函数(例如对数、指数、多项式等)对原始数据进行处理。然后,线性模型被用于学习特征之间的线性关系。
  10. +
  11. 举例:特征可以是原始数据的对数,模型可以是线性回归模型,通过对数变换能够捕捉数据中的非线性关系,如指数增长。
  12. +
+

这两种方法通常用于处理不同类型的数据和问题。选择哪种方法通常取决于问题的性质以及数据的分布。在某些情况下,可以尝试两种方法,然后根据模型性能来选择最佳方法。

+

需要注意的是,"非线性特征 + 线性模型" 也可以被看作是一种"线性特征 + 非线性模型"的特殊情况,因为线性模型本身可以学习非线性关系,只要特征经过适当的非线性变换。这种灵活性使得线性模型成为许多机器学习问题的有力工具。

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Truth/PredictionPositive
PositiveTP
NegativeFP
+

image-20231022110708240

+

mean-squared error

+

image-20231022112204191

+

image-20231022113633010

+

10-25

+

symbolism

+

logic theorist

+

expert system

+

automated theoroem proving

+

connectionism

+

transformers

+

recurrent neural networks

+

convolution neural netorks

+

Neyman-Pearson方法

+

Neyman-Pearson方法是统计学中的一种假设检验方法,由Jerzy Neyman和Egon Pearson命名。它在频率主义统计学中被广泛应用,用于根据观察到的数据在两个竞争性假设之间做出决策。该方法着重于控制第一类错误的概率,即当真实的零假设被错误拒绝时发生的错误。

+

以下是Neyman-Pearson方法的关键要点:

+
    +
  1. 零假设(\(H_0\))和备择假设(\(H_1\)\(H_a\)):
  2. +
  3. \(H_0\):零假设代表默认假设,通常是无效果或无差异的陈述。
  4. +
  5. \(H_1\):备择假设表示与零假设相对的陈述,通常涉及效果或差异的存在。
  6. +
  7. 显著性水平(Significance Level):
  8. +
  9. 定义:显著性水平是在零假设为真的情况下拒绝零假设的概率
  10. +
  11. 应用:研究者在实验设计时选择显著性水平,通常用符号 �α 表示。
  12. +
  13. 试验统计量(Test Statistic):
  14. +
  15. 定义:一个数值,根据观察到的数据计算而得,用于决定是否拒绝零假设。
  16. +
  17. 应用:根据试验统计量与临界值(由显著性水平确定)的关系来做出决策。
  18. +
  19. 拒绝域和接受域(Rejection Region and Acceptance Region):
  20. +
  21. 定义:拒绝域是试验统计量的值,当它落在这个区域内时,拒绝零假设。接受域则是拒绝域的补集。
  22. +
  23. 应用:通过选择拒绝域的边界,研究者可以控制第一类错误的概率。
  24. +
+

Neyman-Pearson方法通过在控制显著性水平的同时最小化第二类错误的概率,提供了一种强假设检验的框架。这种方法在实际应用中对于需要明确控制错误率的问题非常有用。

+

posterior = beta.pdf(p, a, b)是什么意思

+

这个表达式表示了后验概率的计算方式,其中beta.pdf(p, a, b)表示了一个Beta分布的概率密度函数(probability density function,PDF)。在这个表达式中,p是概率的取值,ab是Beta分布的参数。

+

Beta分布是一个常用的概率分布,它在概率论和统计学中经常被用于描述随机变量的取值范围在[0, 1]之间的情况。它的概率密度函数可以表示为:

+
\[ \text{Beta}(p|a, b) = \frac{1}{B(a, b)} \cdot p^{a-1} \cdot (1-p)^{b-1} \]
+

其中,$$ \text{Beta}(p|a, b)$$是Beta函数(Beta function),用于归一化Beta分布。在后验概率的计算中,通常会假设先验分布为Beta分布,并结合观测数据,通过贝叶斯定理计算得到后验分布。这里的beta.pdf(p, a, b)就是计算给定参数ab的Beta分布在概率值p处的概率密度。

+

因此,posterior = beta.pdf(p, a, b)表示计算后验概率,即给定先验分布和观测数据,通过Beta分布的概率密度函数计算在概率值p处的后验概率密度。

+

Metropolis-Hastings算法

+

Metropolis-Hastings算法是一种用于从目标分布中抽样的马尔可夫链蒙特卡罗(MCMC)方法。这个算法允许我们在无法直接从目标分布中抽样的情况下,通过构建一个马尔可夫链来间接地生成样本。以下是一个通俗的解释:

+
    +
  1. 背景:
  2. +
  3. 目标分布(Target Distribution): 我们想要从中抽样的分布,通常是由于它很难直接从中抽样。
  4. +
  5. 马尔可夫链(Markov Chain): 一系列随机变量的序列,其中每个变量的状态仅依赖于前一个状态。
  6. +
  7. 思想:
  8. +
  9. 我们构建一个马尔可夫链,使其平稳分布(稳态分布)为我们想要抽样的目标分布。
  10. +
  11. 步骤:
  12. +
  13. 提议步骤(Proposal Step): 从当前状态生成一个提议状态。这可以通过从某个简单分布中抽样来实现。
  14. +
  15. 接受/拒绝步骤(Accept/Reject Step): 以一定的概率接受提议状态,否则保持当前状态。这个概率由目标分布和提议分布的比例决定。
  16. +
  17. 具体流程:
  18. +
  19. 从当前状态开始,通过提议步骤生成一个新的状态。
  20. +
  21. 计算接受概率,它考虑了目标分布在新状态和当前状态下的概率密度比。
  22. +
  23. 根据接受概率决定是否接受新状态。如果接受,则更新为新状态;否则,保持当前状态。
  24. +
  25. 重复这个过程,得到一个马尔可夫链。
  26. +
  27. 收敛性:
  28. +
  29. 随着抽样次数的增加,马尔可夫链趋向于稳态分布,从而生成的样本趋近于目标分布。
  30. +
+

总体而言,Metropolis-Hastings算法通过引入提议步骤和接受/拒绝步骤,利用马尔可夫链的性质,逐步探索并逼近目标分布,从而实现从目标分布中抽样的目的。这种方法在贝叶斯统计学、统计物理学等领域中广泛应用。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/assets/000151.png b/JY_HU/AI/assets/000151.png new file mode 100644 index 00000000..75766003 Binary files /dev/null and b/JY_HU/AI/assets/000151.png differ diff --git a/JY_HU/AI/assets/43a69d21d6ca9b411ebbdaaeafb292b.png b/JY_HU/AI/assets/43a69d21d6ca9b411ebbdaaeafb292b.png new file mode 100644 index 00000000..74ee3459 Binary files /dev/null and b/JY_HU/AI/assets/43a69d21d6ca9b411ebbdaaeafb292b.png differ diff --git a/JY_HU/AI/assets/640-1706021353902-82.png b/JY_HU/AI/assets/640-1706021353902-82.png new file mode 100644 index 00000000..d4214cda Binary files /dev/null and b/JY_HU/AI/assets/640-1706021353902-82.png differ diff --git a/JY_HU/AI/assets/640-1706021353903-83.png b/JY_HU/AI/assets/640-1706021353903-83.png new file mode 100644 index 00000000..9cad8671 Binary files /dev/null and b/JY_HU/AI/assets/640-1706021353903-83.png differ diff --git a/JY_HU/AI/assets/640.png b/JY_HU/AI/assets/640.png new file mode 100644 index 00000000..a7f42eab Binary files /dev/null and b/JY_HU/AI/assets/640.png differ diff --git a/JY_HU/AI/assets/822.jpg b/JY_HU/AI/assets/822.jpg new file mode 100644 index 00000000..41403c03 Binary files /dev/null and b/JY_HU/AI/assets/822.jpg differ diff --git a/JY_HU/AI/assets/OIP-1705891331401-67-1705908072743-71.jpeg b/JY_HU/AI/assets/OIP-1705891331401-67-1705908072743-71.jpeg new file mode 100644 index 00000000..20a02d77 Binary files /dev/null and b/JY_HU/AI/assets/OIP-1705891331401-67-1705908072743-71.jpeg differ diff --git a/JY_HU/AI/assets/OIP-1705891331401-67.jpeg b/JY_HU/AI/assets/OIP-1705891331401-67.jpeg new file mode 100644 index 00000000..20a02d77 Binary files /dev/null and b/JY_HU/AI/assets/OIP-1705891331401-67.jpeg differ diff --git a/JY_HU/AI/assets/OIP.jpeg b/JY_HU/AI/assets/OIP.jpeg new file mode 100644 index 00000000..20a02d77 Binary files /dev/null and b/JY_HU/AI/assets/OIP.jpeg differ diff --git a/JY_HU/AI/assets/R.png b/JY_HU/AI/assets/R.png new file mode 100644 index 00000000..070a044c Binary files /dev/null and b/JY_HU/AI/assets/R.png differ diff --git a/JY_HU/AI/assets/ad3b7251fa90407eb7017f1d529490d8.png b/JY_HU/AI/assets/ad3b7251fa90407eb7017f1d529490d8.png new file mode 100644 index 00000000..978ab9b0 Binary files /dev/null and b/JY_HU/AI/assets/ad3b7251fa90407eb7017f1d529490d8.png differ diff --git a/JY_HU/AI/assets/image-20240102195030931.png b/JY_HU/AI/assets/image-20240102195030931.png new file mode 100644 index 00000000..f6993426 Binary files /dev/null and b/JY_HU/AI/assets/image-20240102195030931.png differ diff --git a/JY_HU/AI/assets/image-20240120202935801-1705753780433-57.png b/JY_HU/AI/assets/image-20240120202935801-1705753780433-57.png new file mode 100644 index 00000000..3d87992f Binary files /dev/null and b/JY_HU/AI/assets/image-20240120202935801-1705753780433-57.png differ diff --git a/JY_HU/AI/assets/image-20240120202935801.png b/JY_HU/AI/assets/image-20240120202935801.png new file mode 100644 index 00000000..3d87992f Binary files /dev/null and b/JY_HU/AI/assets/image-20240120202935801.png differ diff --git a/JY_HU/AI/assets/image-20240122103344840.png b/JY_HU/AI/assets/image-20240122103344840.png new file mode 100644 index 00000000..e63068fd Binary files /dev/null and b/JY_HU/AI/assets/image-20240122103344840.png differ diff --git a/JY_HU/AI/assets/image-20240122152121671.png b/JY_HU/AI/assets/image-20240122152121671.png new file mode 100644 index 00000000..bf177af8 Binary files /dev/null and b/JY_HU/AI/assets/image-20240122152121671.png differ diff --git a/JY_HU/AI/assets/image-20240122165410500.png b/JY_HU/AI/assets/image-20240122165410500.png new file mode 100644 index 00000000..a3a51ef3 Binary files /dev/null and b/JY_HU/AI/assets/image-20240122165410500.png differ diff --git a/JY_HU/AI/assets/image-20240123110821931-1705979304458-74.png b/JY_HU/AI/assets/image-20240123110821931-1705979304458-74.png new file mode 100644 index 00000000..f12fd891 Binary files /dev/null and b/JY_HU/AI/assets/image-20240123110821931-1705979304458-74.png differ diff --git a/JY_HU/AI/assets/image-20240123110821931.png b/JY_HU/AI/assets/image-20240123110821931.png new file mode 100644 index 00000000..f12fd891 Binary files /dev/null and b/JY_HU/AI/assets/image-20240123110821931.png differ diff --git a/JY_HU/AI/assets/image-20240123110904146.png b/JY_HU/AI/assets/image-20240123110904146.png new file mode 100644 index 00000000..c522a367 Binary files /dev/null and b/JY_HU/AI/assets/image-20240123110904146.png differ diff --git a/JY_HU/AI/assets/image-20240123170508438.png b/JY_HU/AI/assets/image-20240123170508438.png new file mode 100644 index 00000000..0f237c40 Binary files /dev/null and b/JY_HU/AI/assets/image-20240123170508438.png differ diff --git a/JY_HU/AI/assets/image-20240123211120304.png b/JY_HU/AI/assets/image-20240123211120304.png new file mode 100644 index 00000000..11a9500d Binary files /dev/null and b/JY_HU/AI/assets/image-20240123211120304.png differ diff --git a/JY_HU/AI/assets/image-20240124210645454.png b/JY_HU/AI/assets/image-20240124210645454.png new file mode 100644 index 00000000..4ce6c8f4 Binary files /dev/null and b/JY_HU/AI/assets/image-20240124210645454.png differ diff --git a/JY_HU/AI/assets/v2-1ef2dbc04eac36e74b219e88a2f7d078_1440w.jpg b/JY_HU/AI/assets/v2-1ef2dbc04eac36e74b219e88a2f7d078_1440w.jpg new file mode 100644 index 00000000..d9797a30 Binary files /dev/null and b/JY_HU/AI/assets/v2-1ef2dbc04eac36e74b219e88a2f7d078_1440w.jpg differ diff --git a/JY_HU/AI/assets/v2-6444601b4c41d99e70569b0ea388c3bd_1440w.png b/JY_HU/AI/assets/v2-6444601b4c41d99e70569b0ea388c3bd_1440w.png new file mode 100644 index 00000000..befa905c Binary files /dev/null and b/JY_HU/AI/assets/v2-6444601b4c41d99e70569b0ea388c3bd_1440w.png differ diff --git a/JY_HU/AI/assets/v2-76324941c4251678fb80b9ec9c957a05_1440w.webp b/JY_HU/AI/assets/v2-76324941c4251678fb80b9ec9c957a05_1440w.webp new file mode 100644 index 00000000..7284015e Binary files /dev/null and b/JY_HU/AI/assets/v2-76324941c4251678fb80b9ec9c957a05_1440w.webp differ diff --git a/JY_HU/AI/assets/v2-8f03a496d97441bdc436befc66bfeccb_1440w.webp b/JY_HU/AI/assets/v2-8f03a496d97441bdc436befc66bfeccb_1440w.webp new file mode 100644 index 00000000..758f154b Binary files /dev/null and b/JY_HU/AI/assets/v2-8f03a496d97441bdc436befc66bfeccb_1440w.webp differ diff --git a/JY_HU/AI/assets/v2-ced21dbc2d476ae37d61dce4376a1631_1440w.webp b/JY_HU/AI/assets/v2-ced21dbc2d476ae37d61dce4376a1631_1440w.webp new file mode 100644 index 00000000..121cd8d7 Binary files /dev/null and b/JY_HU/AI/assets/v2-ced21dbc2d476ae37d61dce4376a1631_1440w.webp differ diff --git a/JY_HU/AI/assets/v2-f0cd36d214b248c905f32680d3243279_1440w.webp b/JY_HU/AI/assets/v2-f0cd36d214b248c905f32680d3243279_1440w.webp new file mode 100644 index 00000000..d9d58c9d Binary files /dev/null and b/JY_HU/AI/assets/v2-f0cd36d214b248c905f32680d3243279_1440w.webp differ diff --git a/JY_HU/AI/d2l-zh-pytorch/index.html b/JY_HU/AI/d2l-zh-pytorch/index.html new file mode 100644 index 00000000..4031ba72 --- /dev/null +++ b/JY_HU/AI/d2l-zh-pytorch/index.html @@ -0,0 +1,5321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + d2l笔记 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

d2l-zh-pytorch

+

image-20240123211120304

+

1.20

+

torch.tensor使用

+

广播机制

+

降维

+
Python
torch.tensor()
+
+

轴(axis)就是张量的维度

+

torch.arange(a): 生成从0~a-1的一个向量

+

torch.dot

+

数据预处理:pandas用法

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
import pandas as pd
+import torch
+
+data = pd.read_csv(data_file) #假设已经写好了csv文件,使用pandas的read_csv方法创建数据集
+print(data)  
+
+#输出为:
+NumRooms Alley Price
+0 NaN Pave 127500
+1 2.0 NaN 106000
+2 4.0 NaN 178100
+3 NaN NaN 140000
+
+inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
+inputs = inputs.fillna(inputs.mean()) #data有iloc,fillna,get_dummies等方法
+
+X = torch.tensor(inputs.to_numpy(dtype=float))
+y = torch.tensor(outputs.to_numpy(dtype=float)) #在处理好数据中的缺失后,从数值转化成tensor
+
+

反向传播:autograd

+

输出的y是x的多元函数,对\(x_i\)求偏导的格式为:

+

image-20240120202935801

+

例如\(y=2X^TX\)

+

y是标量,x是一个向量

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
import torch
+x = torch.arange(4.0)  #输出 tensor([0.,1.,2.,3.])
+x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True)
+x.grad # 默认值是None
+y = 2 * torch.dot(x, x)
+y.backward()
+x.grad  #输出为:tensor([ 0., 4., 8., 12.])
+x.grad == 4 * x #输出为: tensor([True, True, True, True]) 
+
+# 再计算另外一个函数的梯度值:
+x.grad.zero_()  # 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
+y = x.sum()
+y.backward()
+x.grad  #输出tensor([1., 1., 1., 1.])
+
+

1.22

+

引入激活函数的理由:

+

1.各层级之间的线性操作可以直接等价于一层线性操作

+

2.由于线性组合相当于是对原始参数矩阵张成的空间进行伸缩,旋转和剪切

+

但是可能真实世界有些原始数据本身就是线性不可分的,必须要对原始空间进行一定的非线性操作(对原空间进行一定的扭曲?)

+

对于回归问题也可以同样运用高数的思维,把回归看成分类问题的无限细分,当极限存在时,分类也就成为了回归问题。

+

激活函数应该具有的特征 +避免梯度消失的特性,造成网络更新过慢 +输出最好关于0对称,这样就不会造成梯度向特定方向移动 +激活函数应该为神经网络引入非线性 +激活函数应该是可微的,使得满足各层之间梯度下降的计算(至少部分可微) +梯度的计算不应该太复杂,影响网络性能

+

img

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
class Model(Module):
+    def __init__(self):
+        super(Model, self).__init__()
+        self.conv1 = nn.Conv2d(1, 6, 5)
+        #1,6,5分别表示输入通道数,输出通道数,卷积核大小
+        self.relu1 = nn.ReLU()
+        self.pool1 = nn.MaxPool2d(2)
+        self.conv2 = nn.Conv2d(6, 16, 5)
+        self.relu2 = nn.ReLU()
+        self.pool2 = nn.MaxPool2d(2)
+        self.fc1 = nn.Linear(256, 120)
+        self.relu3 = nn.ReLU()
+        self.fc2 = nn.Linear(120, 84)
+        self.relu4 = nn.ReLU()
+        self.fc3 = nn.Linear(84, 10)
+        self.relu5 = nn.ReLU()
+
+    def forward(self, x):
+        y = self.conv1(x)
+        y = self.relu1(y)
+        y = self.pool1(y)
+        y = self.conv2(y)
+        y = self.relu2(y)
+        y = self.pool2(y)
+        y = y.view(y.shape[0], -1)
+        # 此处view操作是为了将y的形状从[b, c, h, w]变为[b, c*h*w],以便送入全连接层
+        # -1的涵义是自适应,即自动计算此处应填多少
+        y = self.fc1(y)
+        y = self.relu3(y)
+        y = self.fc2(y)
+        y = self.relu4(y)
+        y = self.fc3(y)
+        y = self.relu5(y)
+        return y
+
+

image-20240122103344840

+

Transformer各层网络结构详解!面试必备!(附代码实现) - 掘金

+

上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。

+

跟李沐学ai

+

masked multi-head attention

+

batch norm 和layer norm的区别

+

ChatGPT

+

ChatGPT

+

Batch Normalization(批归一化,简称 Batch Norm)和 Layer Normalization(层归一化,简称 Layer Norm)是用于神经网络中的正则化技术,它们有一些关键的区别:

+
    +
  1. 归一化的层级:
  2. +
  3. Batch Normalization: 归一化是在每个 mini-batch 中的每个特征维度上进行的。它对每个特征维度进行平均和标准差的归一化,因此可以看作是对 mini-batch 维度和特征维度的归一化。
  4. +
  5. Layer Normalization: 归一化是在每个样本的每个特征维度上进行的。它对每个特征维度进行平均和标准差的归一化,因此可以看作是对样本维度和特征维度的归一化。
  6. +
  7. 归一化的计算方式:
  8. +
  9. Batch Normalization: 对于每个特征维度,计算 mini-batch 中所有样本的均值和标准差。使用这些均值和标准差进行归一化。
  10. +
  11. Layer Normalization: 对于每个样本的每个特征维度,计算该样本的均值和标准差。使用这些均值和标准差进行归一化。
  12. +
  13. 计算时的依赖关系:
  14. +
  15. Batch Normalization: 在训练时,由于需要计算 mini-batch 的均值和标准差,因此需要使用当前 mini-batch 中的所有样本。在测试时,通常使用训练阶段计算的移动平均值进行归一化。
  16. +
  17. Layer Normalization: 在训练和测试时都是独立计算每个样本的均值和标准差,因此不需要使用 mini-batch。
  18. +
  19. 适用场景:
  20. +
  21. Batch Normalization: 在深度神经网络中,特别是卷积神经网络(CNNs)中广泛使用,对于深层网络的训练有助于梯度传播。
  22. +
  23. Layer Normalization: 更适用于循环神经网络(RNNs)等不适合使用 mini-batch 归一化的场景,因为 RNNs 的输入序列长度可能不同。
  24. +
+

总体而言,Batch Normalization 和 Layer Normalization都是用于加速神经网络训练、防止梯度消失和梯度爆炸的方法,但它们的实现和应用场景有所不同。

+

残差连接(Residual Connection)是一种神经网络中的建模技术,旨在解决深度神经网络训练过程中的梯度消失和梯度爆炸问题。这一技术最初由何恺明等人提出,并在2016年的论文 "Deep Residual Learning for Image Recognition" 中首次引入。

+

在残差连接中,网络的某些层(通常是卷积层)的输入直接通过跳跃连接(skip connection)添加到网络的输出中。这样的连接使得网络可以直接学习残差,而不是完整地学习特征映射。残差连接的数学表达如下:

+

输出=输入+残差输出=输入+残差

+

具体而言,如果 �(�)F(x) 表示网络的映射函数(例如卷积层和激活函数的组合),那么残差块的输出为:

+

输出=�(�)+�输出=F(x)+x

+

其中,�x 是输入。

+

残差连接的主要优势包括:

+
    +
  1. 解决梯度消失问题: 通过直接传播残差,梯度可以更轻松地传播回较早的层,从而减轻了梯度消失问题。
  2. +
  3. 简化网络训练: 使得更深的网络更容易训练,因为网络可以学习将输入直接传递到输出的恒等映射,而不需要对输入进行复杂的变换。
  4. +
  5. 降低特征映射学习的难度: 网络可以选择性地学习残差,而不是完整地学习特征映射,这有助于更好地捕捉数据中的变化。
  6. +
+

残差连接在许多深度学习任务中都取得了显著的成功,并被广泛用于各种架构,如 ResNet、DenseNet 等。

+

img

+

注意力函数:scaled dot-product attention

+

\(\(Attention(Q,K,V)=softmax(QK^T / sqrt(d_k)) V\)\)

+

将query和key-value对

+

output是value的加权和

+

value的加权和是query和key的相似度算出的

+

key是名字,query是想查谁的名字,也是一个名字,value是key对应的值

+

关于矩阵乘法:非常便于并行

+

假设进行了n次query,dk为key的特征维度数,dv为单词特征维数,一般来说dk和dv相同

+

一般来说Query,Key,Value矩阵的形状一致

+

Query矩阵 n行dk列

+

Key矩阵 m行dk列

+

weight矩阵 n行m列,每一行都是一次query,对应一个单词

+

value矩阵,m行dv列,每一列是一个单词,dv是单词特征的维度

+

output矩阵,n行dv列,n次query,输出了

+

multi-head 多头注意力机制,拆开来再合并

+

在模型中attention机制的三次使用场景

+
    +
  1. 开始输入的时候,一个输入复用为三条线,Q,K,V都是自己本身
  2. +
  3. masked-multihead-attention 来源于上一层decoder的输出,也是复用三次
  4. +
  5. multihead-attention,key-value对来源于decoder,query来源于encoder
  6. +
+

如下图,在第一次multi-head-attention之后,实际上整个序列的信息已经通过attention层,把不同的query和position encoding被拆解成独立的部分,和RNN不同

+

image-20240122152121671

+

ResNet 残差网络

+

很深的神经网络误差变大的问题

+

不是过拟合造成的

+

"Identity mapping" 是深度学习领域中一个重要的概念,通常与残差网络(Residual Networks,简称 ResNets)相关。

+

在深度卷积神经网络中,当模型变得非常深时,训练变得更加困难。梯度消失和梯度爆炸是训练深度网络时常见的问题之一。为了解决这个问题,ResNet 引入了残差块(Residual Block),其中的关键部分就是 "identity mapping"。

+

Identity Mapping 的定义:

+

在 ResNet 的残差块中,通过引入跳跃连接(skip connection)和 "identity mapping",使得网络可以直接学习残差(residual)。具体而言,对于一个残差块,其输出可以表示为:

+

Output=F(Input)+Input

+

其中,F(Input) 是经过残差块内部操作的结果,Input 是输入。上式中的 "input" 就是 "identity mapping",它允许模型学习对输入进行恒等映射(即不进行任何变换)。

+

作用和优势:

+
    +
  1. 梯度流动: "Identity mapping" 使得梯度可以更直接地传播回网络的较早层,有助于缓解梯度消失问题,使训练更加稳定。
  2. +
  3. 模型学习残差: 通过引入 "identity mapping",模型可以选择性地学习对输入进行变换,而不是必须学习整个映射。这有助于模型更轻松地适应底层和高层的特征。
  4. +
  5. 网络深度: ResNet 中的 "identity mapping" 允许构建非常深的网络,而不会导致训练困难。这使得 ResNet 成为处理复杂任务的强大工具。
  6. +
+

总体而言,"identity mapping" 在深度学习中的应用是为了提高模型的训练稳定性和深度网络的可训练性。

+

mapping 投影 线性映射

+

image-20240122165410500

+

在深度学习中,"downsample" 和 "upsample" 是指改变输入数据的空间分辨率的操作。

+
    +
  1. Downsample(下采样):
  2. +
  3. 下采样是指将输入数据的空间分辨率降低的过程。在图像处理中,这通常通过降低图像的宽度和高度来实现。常见的下采样操作包括池化(Pooling)和步幅大于1的卷积操作。
  4. +
  5. 池化操作中,通常使用最大池化或平均池化,将每个池化窗口内的数值合并为一个单一的值,从而降低空间分辨率。
  6. +
  7. Upsample(上采样):
  8. +
  9. 上采样是指将输入数据的空间分辨率增加的过程。在图像处理中,这通常通过插值操作来实现。常见的上采样操作包括反卷积(Deconvolution)和转置卷积(Transpose Convolution)。
  10. +
  11. 上采样的目标是通过填充额外的像素或特征来增加图像的维度,从而提高空间分辨率。
  12. +
+

这两个操作在深度学习中经常用于神经网络的不同层次和任务:

+
    +
  • 特征提取层: 在卷积神经网络(CNNs)中,下采样通常在卷积层中进行,以减少特征图的空间维度,捕捉更高级的特征。池化操作是常见的下采样方法。
  • +
  • 特征生成层: 在某些任务中,如图像分割或生成,上采样用于增加特征图的空间分辨率,使其能够输出与输入相同大小的结果。反卷积或转置卷积是常见的上采样方法。
  • +
+

这些操作在神经网络中的使用可以根据任务和网络结构的需求而变化。

+

1.23

+

43a69d21d6ca9b411ebbdaaeafb292b

+

"LR" 在深度学习领域中通常指的是逻辑回归(Logistic Regression),是一种用于二分类问题的模型。对于逻辑回归模型,通常使用二元交叉熵损失函数(Binary Cross Entropy Loss)作为损失函数,而不是传统的均方误差损失。

+

逻辑回归的损失函数为:

+

\(\text{Binary Cross Entropy Loss} = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]\)

+

其中:

+
    +
  • \(N\) 是样本数量。
  • +
  • \(y_i\) 是第 \(i\) 个样本的真实标签。
  • +
  • \(p_i\) 是模型对第 \(i\) 个样本的预测概率。
  • +
+

优化损失函数的过程通常使用梯度下降法或其变种。梯度下降法的基本思想是通过迭代调整模型参数,使损失函数最小化。

+
    +
  1. 梯度计算: 计算损失函数对模型参数的梯度。对于逻辑回归,这可以通过反向传播算法计算得到。
  2. +
  3. +

    参数更新: 使用梯度下降法或其他优化算法更新模型参数。更新规则通常为 \(\theta_{\text{new}} = \theta_{\text{old}} - \alpha \nabla L\),其中 \(\alpha\) 是学习率,▽L 是损失函数关于模型参数的梯度。

    +
  4. +
  5. +

    迭代: 重复上述步骤,直到满足停止条件,如达到最大迭代次数或梯度接近零。

    +
  6. +
+

对于逻辑回归,由于损失函数是凸函数,梯度下降法通常能够收敛到全局最小值。学习率的选择很重要,过大的学习率可能导致不稳定的训练,而过小的学习率可能导致收敛缓慢。

+

在 PyTorch 中,你可以使用自动微分和优化器来实现梯度下降。例如:

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
import torch
+import torch.nn as nn
+import torch.optim as optim
+
+# 定义逻辑回归模型
+model = nn.Linear(in_features, out_features)
+# 定义损失函数
+criterion = nn.BCEWithLogitsLoss()
+# 定义优化器
+optimizer = optim.SGD(model.parameters(), lr=learning_rate)
+# 训练过程
+for epoch in range(num_epochs):
+    # 前向传播
+    outputs = model(inputs)
+    # 计算损失
+    loss = criterion(outputs, labels)
+    # 反向传播
+    optimizer.zero_grad()
+    loss.backward()
+    # 参数更新
+    optimizer.step()
+
+

SVM原理简析

+

怎样才是最好的分割:

+

“分的清,没有含糊不清的点”:各点离平面的距离设为\(r_i\),求使得所有\(r_i\)的最小值最大的一个分割

+

理解凸优化 - 知乎 (zhihu.com)

+

支持向量机(SVM)——原理篇 (zhihu.com)

+

pytorch自定义数据集使用

+

pytorch--transform工具箱及用法

+
Python
1
+2
+3
+4
+5
+6
+7
from torchvision import transforms
+from PIL import image
+
+img_path = "relative/path/to/image"
+img = Image.open(img_path)
+print(img)  #<PIL.JpegImage.JpegImageFile image mode=RGB size = 768x512 at 0275820fe60>
+tensor_trans = transforms.ToTensor(img)
+
+
Python
1
+2
+3
+4
+5
from torch.utils.tensorboard import SummaryWriter
+writer = SummaryWriter("logs")
+
+writer.add_image("Tensor_img",tensor_img)
+writer.close()
+
+

ToTensor

+

把PIL Image 或者 numpy.ndarray转换为tensor类型

+
Python
1
+2
+3
+4
+5
+6
train_augs = torchvision.transforms.Compose([
+torchvision.transforms.RandomHorizontalFlip(),
+torchvision.transforms.ToTensor()])
+
+test_augs = torchvision.transforms.Compose([
+torchvision.transforms.ToTensor()])
+
+

resize

+

torchvision提供的标准数据集和transform结合使用

+

标准数据集网址:Datasets — Torchvision 0.16 documentation (pytorch.org)

+

torchvision — Torchvision master documentation (pytorch.org)

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
#torchvision官方数据集和transforms联合使用
+import torchvision
+from torch.utils.tensorboard import SummaryWriter
+dataset_transform = torchvision.transforms.Compose([
+    torchvision.transforms.ToTensor()
+])
+train_set = torchvision.datasets.CIFAR10(root = "./dataset",train = True,download=True,transform=dataset_transform)
+test_set = torchvision.datasets.CIFAR10(root = "./dataset",train = False,download=True,transform=dataset_transform)
+#下载后解压
+print(train_set[0])
+writer = SummaryWriter("cifar10")  #新建的tensorboard日志的路径文件夹名称
+for i in range(10):
+    img, target = test_set[i]
+    writer.add_image("test_set",img,i)  #图片在tensorboard会话中的名称
+
+

tensorboard使用:

+

commandline:tensorboard --logdir = "mydirname"

+

或在vscode中启动tensorboard会话也可

+

pytorch-dataloader使用

+

把dataset中的数据一个个加载到神经网络中

+

dataloader类属性:

+

​ dataset,from which to load the data

+

​ batch_size,每次抓几张牌

+

​ shuffle ,每个epoch是否重新加载

+

​ num_workers 主进程加载,=0,>0对windows可能有问题,broken pipes

+

​ drop_last 舍去最后一份牌,是否保留整数

+

image-20240123170508438

+

torch-nn使用

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
import torch.nn as nn
+import torch.nn.functional as F
+
+class Model(nn.Module)
+    def __init__(self):
+        super(Model,self).__init__()
+        self.conv1 = nn.Conv2d(1,20,5)
+        self.conv2 = nn,Conv2d(20,20,5)
+
+    def forward(self,x)
+        x = F.relu(self.conv1(x))
+        return F.relu(self.conv2(x))
+
+

torch-sequential 结合CIFAR-10数据集使用

+

Structure of CIFAR10-quick model. | Download Scientific Diagram

+

层的参数设置:

+
Python
1
+2
+3
    Conv2d(input_channel,output_channel,kernel_size,padding)
+    #比如input 的通道数为前后相同方块的大小 为3,output channel为32,kernel_size为5,padding为2
+    maxpool2d(size)
+
+

微调 迁移学习

+
    +
  1. 迁移学习将从源数据集中学到的知识迁移到目标数据集,微调是迁移学习的常见技巧。
  2. +
  3. 除输出层外,目标模型从源模型中复制所有模型设计及其参数,并根据目标数据集对这些参数进行微 + 调。但是,目标模型的输出层需要从头开始训练。
  4. +
  5. 通常,微调参数使用较小的学习率,而从头开始训练输出层可以使用更大的学习率。
  6. +
+

img

+

​ VGG 网络结构示意

+

计算机视觉基础知识

+

我们以图像的每个像素为中心生成不同形状的锚框。 +• 交并比(IoU)也被称为杰卡德系数,用于衡量两个边界框的相似性。它是相交面积与相并面积的比率。 +• 在训练集中,我们需要给每个锚框两种类型的标签。一个是与锚框中目标检测的类别,另一个是锚框真 +实相对于边界框的偏移量。 +• 预测期间可以使用非极大值抑制(NMS)来移除类似的预测边界框,从而简化输出。

+

非极大值抑制 NMS

+

NMS(非极大值抑制,Non-Maximum Suppression)是一种常用于目标检测任务的技术,用于从一组重叠的候选框中选择最符合条件的框。其主要原理是消除多余的、与最终选择框高度重叠的候选框,以确保最终输出的框具有最佳的质量和非重叠性。

+

以下是NMS的基本原理:

+
    +
  1. 得分排序: 首先,对所有的候选框按照其得分(置信度或其他评估指标)进行降序排列。通常,得分越高的框越有可能是正确的目标。
  2. +
  3. 选择最高得分框: 选取得分最高的候选框作为输出,将其加入最终的输出结果集合。
  4. +
  5. 计算重叠面积: 计算当前选择的框与剩余的候选框的重叠面积。这里常用的是 IoU(Intersection over Union)指标,即两个框相交面积与它们的并集面积之比。
  6. +
  7. 删除重叠框: 对于与当前选择的框重叠面积超过某个设定的阈值的其他候选框,将其从候选框集合中移除。
  8. +
  9. 重复步骤2至步骤4: 重复以上步骤,选择下一个得分最高的框,然后删除与它重叠面积超过阈值的其他框。直到所有的候选框都被处理。
  10. +
+

这样,NMS 确保了最终输出的框具有较高的得分,并且彼此之间有较低的重叠度。这对于目标检测任务很重要,因为它可以防止在同一个目标上产生多个高度重叠的检测结果,从而提高检测的准确性。

+

单发多框检测 SSD

+

"单发多框检测"(Single Shot Multibox Detection,SSD)是一种用于目标检测的深度学习架构,旨在实现快速而准确的目标检测。SSD是一种多尺度、多框架的检测方法,能够在一次前向传播中检测图像中的多个目标。

+

以下是SSD的主要特点和原理:

+
    +
  1. 多尺度特征图: SSD 在卷积神经网络中引入了多个不同尺度的特征图。每个特征图对应于网络的不同层,具有不同的感受野和分辨率。这样可以使网络在不同尺度上对目标进行检测。
  2. +
  3. 多框框架: 对于每个尺度的特征图,SSD 通过预定义的一系列锚框(anchor boxes)来检测不同形状和尺寸的目标。每个锚框与网络的每个空间位置相关联,通过卷积层的预测来输出目标的位置和类别信息。
  4. +
  5. 损失函数: SSD 使用多任务损失函数,同时考虑位置回归和类别分类。位置回归损失关注锚框的位置精度,而类别分类损失关注预测的目标类别。
  6. +
  7. 非极大值抑制(NMS): 在SSD的输出中,采用非极大值抑制来移除高度重叠的框,以提高检测的准确性。NMS通过保留具有最高置信度的框,并消除与其高度重叠的其他框。
  8. +
  9. 实时性能: SSD设计旨在实现实时目标检测。通过一次前向传播,SSD可以在图像中检测多个目标,并提供目标的位置和类别信息。
  10. +
+

SSD的设计使得它在准确性和速度之间取得了平衡,使其成为在实际应用中广泛使用的目标检测框架之一。它适用于各种尺寸和形状的目标,并且在复杂的场景中表现良好

+

img

+

1.24 多模态模型

+

gradio

+

特化的AI前端界面,语法非常轻量级,采用很多block搭建交互式的web UI

+

强化学习

+

huggingface

+

Zero-shot image classification is a computer vision task to classify images into one of several classes, without any prior training or knowledge of the classes. Zero shot image classification works by transferring knowledge learnt during training of one model, to classify novel classes that was not present in the training data.

+

CLIP:openai的clip模型,Contrastive Language-Image Pre-training

+

img

+

GLIP简介:Grounded Language-Image Pre-training

+

目前的视觉识别任务通常是在一个预先定义好的类别范围内进行的,这样限制了其在真实场景中的扩展。CLIP的出现打破了这一限制,CLIP利用image-text对进行训练,从而使得模型可以根据文字prompt识别任意类别。关于CLIP的详细介绍可以看我的文章:深度解读CLIP:打破文字与图像之间的壁垒。CLIP适用于分类任务,而GLIP尝试将这一技术应用于目标检测等更加复杂的任务中。

+

+

在多模态网络(Multimodal Network)中,通常会使用类似于单模态网络的结构,但在设计上进行了一些调整以处理多个模态(例如图像、文本、声音等)的输入。其中,backbone、neck 和 head 是网络的不同部分,各自有不同的功能。

+
    +
  1. Backbone:
  2. +
  3. 定义: Backbone 是网络的主干部分,负责提取输入数据的高级特征表示。在多模态网络中,可能存在多个并行的 backbone,每个用于处理不同的输入模态。
  4. +
  5. 功能: 提取共享的低级和中级特征,以捕捉不同输入模态的共性信息。
  6. +
  7. Neck:
  8. +
  9. 定义: Neck 是连接 backbone 和 head 的中间部分,通常位于网络的中心。它可以包含一系列的层或模块,有助于整合来自不同模态的特征。
  10. +
  11. 功能: 实现特征的融合或整合,以便更好地处理多模态信息。在 neck 中,可以应用一些融合策略,例如注意力机制、融合层等,以加强不同模态之间的关联性。
  12. +
  13. Head:
  14. +
  15. 定义: Head 是网络的最后部分,负责执行任务特定的输出。在多模态网络中,可能存在多个 head,每个用于处理不同的任务或输出模态。
  16. +
  17. 功能: 生成最终的任务输出,例如分类、回归或生成任务的结果。每个 head 可以专注于处理与其任务相关的特征表示。
  18. +
+

总体而言,backbone 负责提取共享的特征,neck 负责整合多模态特征,而 head 则专注于执行具体的任务。多模态网络的设计需要考虑如何在这三个部分中合理地处理不同模态的信息,以实现对多模态输入的有效建模。不同的应用场景和任务可能需要不同的架构设计。

+

grounding DINO:根据文字提示检测任意目标

+

img

+
    +
  • Phasa A: 设计了结合self-attention、text-to-image cross-attention、image-to-text attention的特征enhancer应用在Neck中;
  • +
  • Phasa B: 设计了一个language-guided query selection方法用于初始化Head的query;
  • +
  • Phasa C: 设计了一个跨模态的decoder用于Head部分,从而增强query的特征表达。
  • +
+

img

+

SAM-track model

+

“Segment and Track Anything” 利用自动和交互式方法。主要使用的算法包括 SAM(Segment Anything Models)用于自动/交互式关键帧分割,以及 DeAOT(Decoupling features in Associating Objects with Transformers)(NeurIPS2022)用于高效的多目标跟踪和传播。SAM-Track 管道实现了 SAM 的动态自动检测和分割新物体,而 DeAOT 负责跟踪所有识别到的物体。

+

image-20240124210645454

+

AOT(associating objects with transformers)网络介绍

+

[NIPS21][CVPR21竞赛冠军] Associating Objects with Transformers for Video Object Segmentation - 知乎 (zhihu.com)

+

DeAOT achieves promising results on various benchmarks. However, as a semi-supervised video segmentation model, DeAOT requires reference frame annotations for initialization, which limits its application.

+

半监督视频目标分割

+

1.25

+

VILT

+

vision transformer

+

把目标检测从视觉端移除?

+

用预训练的目标检测器去抽取视觉特征的时候会有很多局限性

+

视觉特征:patch embedding?

+

模态融合部分非常大

+

推理时间和训练时间复杂度?

+

模型推理过程

+

模型的推理时间指的是使用训练好的机器学习或深度学习模型进行实际预测或推断的时间。在模型训练之后,模型通常需要通过输入数据进行推理,即根据学到的规律或模式对新的未见过的数据进行预测或分类。

+

推理时间是衡量模型性能的一个重要指标,尤其是在实际应用中,对于需要快速响应的场景,推理时间的效率至关重要。推理时间的快慢受到多个因素的影响,包括但不限于:

+
    +
  1. 模型复杂度: 复杂的模型通常需要更多的计算资源来执行推理,因此推理时间可能更长。
  2. +
  3. 硬件设备: 推理时间与使用的硬件设备密切相关。GPU(图形处理单元)通常能够提供比 CPU 更快的推理速度,而专用的硬件加速器(如TPU、FPGA等)可能进一步提高推理性能。
  4. +
  5. 输入数据大小: 处理更大规模的输入数据可能会增加推理时间,因为模型需要在更多的数据上执行计算。
  6. +
  7. 模型优化: 通过模型剪枝、量化(Quantization)、深度学习加速库等技术,可以优化模型,减少推理时间。
  8. +
  9. 并发性: 模型是否能够有效地利用并行计算能力也会影响推理时间。一些框架和库提供了多线程或分布式计算的支持,以提高并发性。
  10. +
+

因此,模型的推理时间是在实际部署或使用过程中,模型处理输入数据所需的时间,直接关系到模型在实际应用中的实用性和性能。

+

CLIP是典型的双塔模型,特征

+

VE TE MI

+

VE: Visual embedding

+

TE: Text embedding

+

MI: modality interaction

+

VQA,VR,VE

+

VQA(Visual Question Answering)、VR(Visual Reasoning)和VE(Visual Explanation)是三个涉及多模态(图像和文本)的任务,它们在计算机视觉和自然语言处理领域中有着不同的目标和侧重点。

+
    +
  1. VQA(Visual Question Answering):
  2. +
  3. 概念: VQA 是一种任务,旨在使计算机能够回答关于图像内容的自然语言问题。通常,输入是一张图像和一个与图像相关的问题,输出是该问题的自然语言答案。
  4. +
  5. 应用: VQA 在图像理解、智能问答系统和视觉场景理解等领域具有广泛应用。它要求系统理解图像内容,理解问题,并生成相应的文本答案。
  6. +
  7. VR(Visual Reasoning):
  8. +
  9. 概念: VR 是一种任务,旨在通过对视觉场景进行推理来回答更为复杂的问题。与简单的问题答案不同,VR 要求模型通过对图像中的关系、场景和对象进行推理,更深层次地理解视觉信息。
  10. +
  11. 应用: VR 的应用范围包括智能图像理解、决策支持系统等,要求系统不仅能够识别图像中的对象,还能够进行高级的推理和分析。
  12. +
  13. VE(Visual Explanation):
  14. +
  15. 概念: VE 是一种任务,旨在通过生成视觉解释来回答问题。除了提供简单的答案外,VE 要求系统生成图像或图形化的解释,以说明为什么给定的答案是正确的。
  16. +
  17. 应用: VE 在教育、可解释性人工智能等领域具有应用潜力。通过生成解释,系统可以更好地与用户交互,并提高对模型决策的理解。
  18. +
+

这些任务都涉及到图像和文本之间的跨模态理解和交互,要求计算机系统能够处理视觉信息和自然语言信息的复杂关系。这些任务在推动计算机视觉和自然语言处理交叉研究的发展,使计算机能够更全面地理解和处理多模态信息。

+

ALBEF之前的论文总结:

+

视觉特征在图像处理中比文本特征要重要

+

模态融合部分也非常关键

+

Visual Encoder > Modality Interaction > Text Encoder

+

目标函数总结:

+

CLIP使用的 ITC lost :image text contrasting

+

(word patch alignment WPA lost训练起来非常慢)

+

masked laguage modeling :MLM lost, 完形填空

+

image text matching lost: ITM lost

+

img

+

​ 多模态大模型综述(插图)

+

ALBEF : ALign BEfore Fuse:在融合文本和图像特征前就对齐特征

+

vision and language representation learning with momentum distillation

+

不需要使用bounding box annotation(锚框定位及标注)

+

momentum distilliation

+

momentum encoder

+

自训练模型

+

何恺明:MAE(Masked Autoencoders) - 知乎 (zhihu.com)

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/interview-questions/index.html b/JY_HU/AI/interview-questions/index.html new file mode 100644 index 00000000..98340af0 --- /dev/null +++ b/JY_HU/AI/interview-questions/index.html @@ -0,0 +1,4683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AI算法岗面试问题汇总 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

AI算法岗面试问题汇总

+ +

1. 解释SVM的工作原理。

+

SVM,全称支持向量机(Support Vector Machine),是一种有监督学习算法,主要用于解决数据挖掘或模式识别领域中的数据分类问题。

+

SVM的工作原理是建立一个最优决策超平面,使得该平面两侧距平面最近的两类样本之间的距离最大化,从而对分类问题提供良好的泛化力(推广能力)。这里的“支持向量”是指训练集中的某些训练点,这些点最靠近分类决策面,是最难分类的数据点。

+

SVM可以处理二类分类问题,也可以扩展到多类分类问题。在二类分类问题中,SVM寻找一个最优超平面,将两类样本分隔开。这个最优超平面需要满足间隔最大化的条件,即两侧距平面最近的两类样本之间的距离最大化。当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机。当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机。当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

+

SVM使用核函数来处理非线性可分的情况。核函数的定义是K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数K计算的结果。通过使用核函数,SVM可以将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。

+

2. k-means和k-means++算法有什么区别?

+

两者之间的唯一区别是初始化质心的方式。在k-means算法中,质心从给定点随机初始化。这种方法存在一个缺点,即有时这种随机初始化会导致非优化的聚类,这是由于两个聚类的初始化可能彼此接近。

+

为了解决这个问题,k-means++算法应运而生。在k-means++中,第一个质心从数据点中随机选择。后续质心的选择基于它们与初始质心的分离。一个点被选为下一个质心的概率与该点和已经被选择的最近质心之间的平方距离成比例。这保证了质心均匀地分散开,并降低了收敛到不理想聚类的可能性。这有助于算法达到全局最小值,而不是陷入局部最小值。

+

3. 解释机器学习中常用的一些相似性度量。

+

一些最常用的相似性度量如下:

+
    +
  • 余弦相似性-通过考虑n维的两个向量,我们计算两者之间夹角的余弦。该相似性度量的范围从[-1,1]变化,其中值1表示两个向量高度相似,而-1表示两个向量彼此完全不同。
  • +
  • 欧几里得或曼哈顿距离-这两个值表示n维平面中两点之间的距离。两者之间的唯一区别在于两者的计算方式。
  • +
  • Jaccard相似性-它也被称为IoU或Intersection over union,它广泛用于对象检测领域,以评估预测边界框和地面真实边界框之间的重叠。
  • +
+

4. 当数据分布右偏和左偏时,均值、中位数和众数会发生什么变化?

+

标准正态分布特征:均值=中位数=众数

+

左偏态特征:众数>中位数>均值

+

右偏态特征:均值>中位数>众数

+

右偏分布

+

图片

+

左偏分布,

+

图片

+

5. 对于离群值,决策树和随机森林谁的鲁棒性更强。

+

决策树和随机森林对离群值都相对稳健。随机森林模型是多个决策树的集成,因此,随机森林模型的输出是多个决策树的聚合。因此,当我们对结果进行平均时,过拟合的可能性就会降低。因此,我们可以说随机森林模型对离群值更具鲁棒性。

+

6. L1正则化和L2正则化有什么区别?它们的意义是什么?

+

L1正则化:在L1正则化中,也被称为Lasso正则化,其中我们在损失函数中添加模型权重的绝对值之和。

+

在L1正则化中,那些根本不重要的特征的权重被惩罚为零,因此,反过来,我们通过使用L1正则化技术来获得特征选择。

+

L2正则化:在L2正则化中,也称为岭正则化,我们将权重的平方添加到损失函数中。在这两种正则化方法中,权重都是不利的,但它们帮助实现的目标之间存在细微的差异。

+

在L2正则化中,权重不会被惩罚为0,但对于不相关的特征,它们接近于零。它通常用于通过将权重缩小到零来防止过拟合,特别是当有许多特征并且数据有噪声时。

+

7. 什么是径向基函数?解释它的用途。

+

RBF(径向基函数)是一种用于机器学习的实值函数,其值仅取决于输入和称为中心的固定点。径向基函数的公式如下:

+

图片

+

机器学习系统经常将RBF函数用于各种函数,包括:

+
    +
  • RBF网络可以用来逼近复杂函数。通过训练网络的权重以适应一组输入输出对,
  • +
  • RBF网络可以用于无监督学习来定位数据组。通过将RBF中心视为聚类中心,
  • +
  • RBF网络可以用于分类任务,通过训练网络的权重,根据输入与RBF节点的距离将输入分组。
  • +
+

它是SVM算法中通常使用的非常著名的内核之一,用于将低维数据映射到高维平面,因此,我们可以确定一个边界,该边界可以将这些平面的不同区域中的类以尽可能多的余量分开。

+

8. 解释用于处理数据不平衡的SMOTE方法。

+

SMOTE是用来处理数据集中数据不平衡问题的方法之一。在这种方法中,基于现有的少数类,我们通过使用线性插值合成新的数据点。使用这种方法的优点是模型不会在相同的数据上进行训练。但是使用这种方法的缺点是它向数据集添加了不需要的噪声,并且可能对模型的性能产生负面影响。

+

9. 准确率得分是否总是衡量分类模型性能的良好指标?

+

不,有时候我们在不平衡的数据集上训练模型时,准确度分数并不是衡量模型性能的好指标。在这种情况下,我们使用查准率和查全率来衡量分类模型的性能。此外,f1-score是另一个可用于衡量性能的指标,但最终,f1-score也是使用精确度和召回率计算的,因为f1-score只是精确度和召回率的调和平均值。

+

10. 什么是 KNN 插值填充?

+

我们通常通过数据的描述性统计测量(如平均值、众数或中位数)来估算空值,但KNN 插值是一种更复杂的填补空值的方法。在该方法中还使用距离参数,其也被称为k参数。这项工作在某种程度上类似于聚类算法。缺失值是参照缺失值的邻域点进行插补的。

+

11. 解释XGB模型的工作流程。

+

XGB模型是机器学习集成技术的一个例子,在这种方法中,权重通过将它们传递到决策树来以顺序的方式进行优化。在每一遍之后,权重变得越来越好,因为每棵树都试图优化权重,最终,我们获得了手头问题的最佳权重。像正则化梯度和小批量梯度下降这样的技术已经被用来实现这个算法,所以它以非常快速和优化的方式工作。

+

12. 将给定数据集拆分为训练和验证数据的目的是什么?

+

主要目的是保留一些模型尚未训练的剩余数据,以便我们可以在训练后评估机器学习模型的性能。此外,有时我们使用验证数据集在多个先进的机器学习模型中进行选择。就像我们首先训练一些模型一样,比如LogisticRegression,XGBoost或任何其他模型,而不是使用验证数据测试它们的性能,并选择验证和训练精度之间差异较小的模型。

+

13. 解释一些处理数据中缺失值的方法。

+

处理缺失值的一些方法如下:

+
    +
  • 删除具有空值的行,可能会导致丢失一些重要信息。
  • +
  • 如果列包含的信息价值很低,则删除包含空值的列。可能会导致丢失一些重要信息。
  • +
  • 使用描述性统计测量(如平均值、众数和中位数)插补空值。
  • +
  • 使用KNN 插值等方法以更复杂的方式估算空值。
  • +
+

14. k-means和KNN算法有什么区别?

+

k-means算法是用于聚类目的的流行的无监督机器学习算法之一。但KNN是一种通常用于分类任务的模型,是一种有监督的机器学习算法。k-means算法通过在数据集中形成聚类来帮助我们标记数据。

+

15. 什么是LDA线性判别分析?

+

LDA是一种有监督的机器学习降维技术,因为它也使用目标变量进行降维。它通常用于分类问题。LDA主要致力于两个目标:

+
    +
  • 最大化两个类的均值之间的距离。
  • +
  • 最大限度地减少每个类中的差异。
  • +
+

16. 如何在二维中可视化高维数据?

+

最常用和有效的方法之一是使用t-SNE算法。该算法采用了一些非线性的复合形方法对给定的数据进行降维。我们还可以使用PCA或LDA将n维数据转换为2维,以便我们可以绘制它以获得更好的分析视觉效果。但是PCA和t-SNE之间的区别在于前者试图保持数据集的方差,而t-SNE试图保持数据集中的局部相似性。

+

17. 维度灾难背后的原因是什么?

+

随着输入数据的维度增加,概括或学习数据中存在的模式所需的数据量也增加。对于模型,很难从有限数量的数据集中识别每个特征的模式,或者我们可以说,由于数据的高维性和用于训练模型的有限数量的示例,权重没有得到适当的优化。由于这一点,在输入数据的维数达到一定的阈值后,我们不得不面对维数灾难。

+

18. 度量MAE或MSE或RMSE, 哪个对离群值有更好的鲁棒性。

+

在上述三个指标中,与MSE或RMSE相比,MAE对离群值具有鲁棒性。这背后的主要原因是因为平方误差值。在离群值的情况下,误差值已经很高,然后我们将其平方,这导致误差值的爆炸超过预期,并为梯度产生误导性结果。

+

19. 为什么删除高度相关的特征被认为是一种良好的做法?

+

当两个特征高度相关时,它们可能向模型提供类似的信息,这可能导致过拟合。如果数据集中存在高度相关的特征,那么它们不必要地增加了特征空间的维数,有时会产生维数灾难的问题。如果特征空间的维数很高,那么模型训练可能需要比预期更多的时间,这将增加模型的复杂性和出错的机会。这在某种程度上也有助于我们实现数据压缩,因为这些功能已经被删除,而没有太多的数据丢失。

+

20. 推荐系统中基于内容的过滤算法和协同过滤算法有什么区别?

+

在一个基于内容的推荐系统中,内容和服务的相似性进行评估,然后通过使用这些相似性措施,从过去的数据,我们推荐产品给用户。但另一方面,在协同过滤中,我们根据相似用户的偏好推荐内容和服务。例如,如果一个用户过去已经使用了A和B服务,并且新用户已经使用了服务A,则将基于另一用户的偏好向他推荐服务A。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/labs & hw review/index.html b/JY_HU/AI/labs & hw review/index.html new file mode 100644 index 00000000..793822cc --- /dev/null +++ b/JY_HU/AI/labs & hw review/index.html @@ -0,0 +1,4608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 课程Lab&hw - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

课程Lab&hw

+ +

labs & hw review quickly!

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/notes for ZJU-AI-ML/index.html b/JY_HU/AI/notes for ZJU-AI-ML/index.html new file mode 100644 index 00000000..6c2149c6 --- /dev/null +++ b/JY_HU/AI/notes for ZJU-AI-ML/index.html @@ -0,0 +1,4939 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 赶快补课抄笔记 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

notes for ZJU-AI-ML

+

machine learning bullet points

+

期末主要考后四章?

+

第8章

+

集成学习算法之Boosting - 知乎 (zhihu.com)

+

一文看懂决策树(Decision Tree) - 知乎 (zhihu.com)

+

【机器学习】Bootstrap详解 - 知乎 (zhihu.com)

+

KMeans(K均值)和KNN(K最近邻)是两种不同的机器学习算法,它们在任务和实现上有很大的区别。

+

KMeans(K均值):

+
    +
  1. 任务:
  2. +
  3. KMeans 是一种聚类算法,用于将数据分成K个不同的组或簇,使得每个数据点属于最近的簇中心。
  4. +
  5. 目标是最小化每个簇内的点与簇中心的平方距离之和。
  6. +
  7. 工作原理:
  8. +
  9. 首先,选择K个初始簇中心。
  10. +
  11. 然后,将每个数据点分配到离它最近的簇中心。
  12. +
  13. 更新簇中心为分配给该簇的所有数据点的平均值。
  14. +
  15. 重复上述两个步骤,直到簇中心不再变化或变化很小。
  16. +
  17. 应用:
  18. +
  19. KMeans 可用于图像压缩、文档聚类、无监督特征学习等。
  20. +
+

KNN(K最近邻):

+
    +
  1. 任务:
  2. +
  3. KNN 是一种分类和回归算法,用于根据最近邻居的标签对新数据进行分类或预测。
  4. +
  5. 工作原理:
  6. +
  7. 对于给定的数据点,找到与其最近的K个训练数据点。
  8. +
  9. 对于分类,采用多数投票的原则确定该点的类别。
  10. +
  11. 对于回归,采用K个邻居的平均值来预测该点的值。
  12. +
  13. 应用:
  14. +
  15. KNN 可用于模式识别、图像识别、推荐系统等。
  16. +
+

区别:

+
    +
  1. 任务:
  2. +
  3. KMeans 用于聚类,将数据分成K个簇。
  4. +
  5. KNN 用于分类和回归,根据最近邻居的标签对数据进行分类或预测。
  6. +
  7. 目标函数:
  8. +
  9. KMeans 的目标是最小化簇内平方距离之和。
  10. +
  11. KNN 的目标是基于最近邻居进行分类或回归。
  12. +
  13. 监督/无监督:
  14. +
  15. KMeans 是无监督学习,不需要类别标签。
  16. +
  17. KNN 既可以是监督学习也可以是无监督学习,具体取决于它是用于分类还是回归任务。
  18. +
  19. 输出:
  20. +
  21. KMeans 输出是数据点所属的簇。
  22. +
  23. KNN 输出是分类标签(对于分类)或连续值(对于回归)。
  24. +
+

总体而言,KMeans 和 KNN 是两种不同类型的算法,用于解决不同的问题。 KMeans 是一种无监督学习算法,用于聚类,而 KNN 通常用于监督学习中的分类和回归任务

+

监督学习和无监督学习是机器学习中两种不同类型的学习范式,它们之间的主要区别在于训练数据的标签信息。

+

监督学习(Supervised Learning):

+
    +
  1. 定义
  2. +
  3. 在监督学习中,算法接收带有标签(类别或输出)的训练数据。
  4. +
  5. 每个训练样本都包括输入特征和相应的标签。
  6. +
  7. 任务
  8. +
  9. 监督学习的目标是学习一个从输入到输出的映射,以便在给定新输入时能够预测相应的输出标签。
  10. +
  11. 典型任务包括分类和回归。
  12. +
  13. 示例
  14. +
  15. 分类:预测输入数据属于哪个类别(例如,垃圾邮件分类)。
  16. +
  17. 回归:预测输入数据的数值输出(例如,房价预测)。
  18. +
  19. 训练数据
  20. +
  21. 训练数据包括输入-输出对,每个输入都有一个对应的输出标签。
  22. +
+

无监督学习(Unsupervised Learning):

+
    +
  1. 定义
  2. +
  3. 在无监督学习中,算法接收没有标签信息的训练数据。
  4. +
  5. 训练样本只包括输入特征,没有相应的输出标签。
  6. +
  7. 任务
  8. +
  9. 无监督学习的目标是探索数据的结构,发现数据中的模式和关系。
  10. +
  11. 典型任务包括聚类、降维和关联规则学习。
  12. +
  13. 示例
  14. +
  15. 聚类:将相似的数据点分组到同一类别中。
  16. +
  17. 降维:减少数据维度,保留关键特征。
  18. +
  19. 关联规则学习:发现数据中的关联性,例如购物篮分析。
  20. +
  21. 训练数据
  22. +
  23. 训练数据没有输出标签,算法试图从数据中学习隐藏的结构。
  24. +
+

区别总结:

+
    +
  • 数据标签
  • +
  • 监督学习需要带有标签的训练数据。
  • +
  • 无监督学习使用没有标签的训练数据。
  • +
  • 目标
  • +
  • 监督学习目标是预测输出标签。
  • +
  • 无监督学习目标是发现数据中的模式和结构。
  • +
  • 任务
  • +
  • 监督学习任务包括分类和回归。
  • +
  • 无监督学习任务包括聚类、降维和关联规则学习。
  • +
  • 示例
  • +
  • 监督学习示例包括图像分类、语音识别。
  • +
  • 无监督学习示例包括社交网络分析、信用卡欺诈检测。
  • +
+

无监督学习通常用于在数据中发现隐藏的结构,而监督学习则用于构建输入和输出之间的映射关系。这两者在解决不同类型的问题时发挥着重要的作用。

+

LSTM

+

一步干四件事情:

+

输入新的输入信息和上一个状态的cell state和hidden state,输出hidden state和cell state

+

根据当前新的输入,选择从上个状态的cell state中要忘记的内容,

+

根据当前新的输入,选择从上个状态的cell state中要更新的内容

+

根据更新后的状态和当前新的输入,更新hidden state的内容

+

Softmax、ReLU(Rectified Linear Unit)、和Sigmoid是常用的激活函数,它们在深度学习中用于不同的场景。以下是它们的函数表达式和主要应用情形:

+
    +
  1. Softmax函数:
  2. +
  3. 函数表达式:
  4. +
  5. 给定一个向量$ z = [z_1, z_2, ..., z_k]$,Softmax函数将每个元素转化为非负且和为1的概率值。 + $ \text{Softmax}(z)i = \frac{e^{z_i}}{\sum $}^{k} e^{z_j}
  6. +
  7. 应用情形: 主要用于多类别分类问题的输出层。Softmax将模型的原始输出转化为类别概率分布,便于模型在训练时计算损失并进行梯度下降。
  8. +
  9. ReLU函数:
  10. +
  11. 函数表达式:
  12. +
  13. ReLU激活函数将所有负输入设为零,保持正输入不变。 + ${ReLU}(x) = \max(0, x) $
  14. +
  15. 应用情形: 用于隐藏层的激活函数。ReLU的非线性特性使得模型能够学习更复杂的表示,同时避免了梯度消失问题。
  16. +
  17. Sigmoid函数:
  18. +
  19. 函数表达式:
  20. +
  21. Sigmoid函数将输入映射到一个取值范围在0到1之间的概率值。 + ${Sigmoid}(x) = \frac{1}{1 + e^{-x}} $
  22. +
  23. 应用情形: 主要用于二元分类问题的输出层。Sigmoid将模型的原始输出映射为0到1之间的概率,方便进行二元分类的阈值判定。
  24. +
+

这些激活函数的选择通常取决于任务的性质和网络的结构。一般而言,Softmax适用于多类别分类,ReLU适用于隐藏层以增加模型的非线性表达能力,而Sigmoid适用于二元分类。

+

week 9

+

word embedding 词嵌入

+

Convert words into numerical form (e.g., vector). +例如,Embed words into a mathematical space.

+

one-hot编码的优点和缺点:维度太高,无法表征相似(靠近)程度

+

distributional representation 分布式表示方法

+

distributional hypothesis指出,应该用这个词所处的语境来生成词向量

+

word2vec is used for distributional representation

+

inference based methods:在自然语言处理(NLP)中,skip-gram和CBOW(Continuous Bag of Words)是两种用于学习词向量表示的模型,它们被称为“inference based methods”(基于推理的方法)的原因主要与它们的训练目标和方法有关。

+

这两种模型都是基于推断(inference)的方法,因为它们的核心目标是通过观察词汇之间的上下文关系来推断每个词的词向量表示。具体而言:

+
    +
  1. Skip-gram模型: 在skip-gram中,模型试图从给定的中心词预测其周围的上下文词。这就好像模型在推断中心词的上下文信息。因此,skip-gram是一种基于上下文推断的方法。
  2. +
  3. CBOW模型: 与skip-gram相反,CBOW试图从周围的上下文词预测中心词。CBOW将上下文中的词汇信息结合起来,试图推断中心词。因此,CBOW也是一种基于上下文推断的方法,只是它关注的是中心词。
  4. +
+

这两种方法之所以被称为“inference based methods”,是因为它们的核心任务是从给定的上下文信息中推断单词的表示。这与一些其他方法,如计数方法(count-based methods)不同,后者主要关注的是统计词汇的共现信息而不是直接推断词向量。

+

总的来说,skip-gram和CBOW模型被称为基于推理的方法,因为它们通过观察上下文关系来推断词汇的语义表示,从而实现更好的词向量学习。

+

Continuous bag-of-words model(CBOW model)

+

Predict one word (target word) from multiple words (context). +The convergence rate is fast. +The distributional representation (word vector) is relatively inferior.

+

Skip-gram model

+

Predict multiple words (context) from one word (target word). +The convergence rate is slow. +The distributional representation (word vector) is relatively superior.

+

CBOW(Continuous Bag of Words)和Skip-gram是自然语言处理(NLP)中用于生成词向量的两种流行模型。关于CBOW的词向量相对较差的说法可能受到一些因素的影响,但需要注意的是,这些模型的性能可能取决于具体的任务、数据集和训练参数。

+

以下是CBOW的词向量在某些情境下被认为相对较差的一些原因:

+
    +
  1. 上下文过度简化: CBOW倾向于对窗口内的上下文词求平均,以预测目标词。这可能导致在处理多义词(具有多个含义的词)或捕捉含义微妙差异时,表征相对过于简化。
  2. +
  3. 丢失词序信息: CBOW忽略了上下文窗口内的词序,因为它将上下文词视为无序集合。这可能导致顺序信息的丢失,而这对某些任务可能至关重要。
  4. +
  5. 对频繁词汇的优势: CBOW在语料库中频繁出现的词汇上表现较好,因为在训练过程中它对它们进行了优先考虑。然而,对于稀有词汇或特定词汇关系的捕捉效果可能不够显著。
  6. +
  7. 上下文窗口大小: 在CBOW中,上下文窗口大小的选择会影响词向量的质量。窗口太小可能无法捕捉足够的上下文信息,而窗口太大可能引入噪声。
  8. +
  9. 任务特定性能: 对相对较差的看法可能是与具体任务有关的。对于某些NLP任务,Skip-gram或其他嵌入模型可能在性能上优于CBOW。
  10. +
+

值得注意的是,在CBOW和Skip-gram之间的选择通常取决于数据集的具体特性以及下游任务的需求。在实践中,研究人员和从业者可能会尝试使用这两种模型,以确定哪种模型更适合其特定的用例。此外,诸如基于Transformer的更近期的词向量模型等技术的进步在各种NLP应用中超越了传统方法,如CBOW和Skip-gram。

+

image-20240102195030931

+

"RNN能够Correlate temporal information" 表示循环神经网络(Recurrent Neural Network,RNN)能够关联或捕捉时间上的信息。在这种上下文中,"temporal information" 指的是与时间相关的数据、模式或序列。

+

RNN是一种具有循环结构的神经网络,它在处理序列数据时表现出色。这意味着它能够考虑先前的时间步信息,从而更好地理解和预测序列中的模式。RNN的循环结构允许信息在网络中传递,使得网络能够捕捉和利用时间上的依赖关系。

+

具体而言,RNN中的隐藏状态允许网络在处理序列时保留过去的信息,并在当前时间步使用。这种机制使得RNN能够关联不同时间步的输入,从而更好地理解序列中的动态模式。这样,RNN就能够在处理时间序列数据时有效地"correlate temporal information",也就是关联或捕捉时间上的信息。

+

然而,传统的RNN在处理长序列时可能会面临梯度消失或梯度爆炸的问题,为了解决这一问题,一些改进的结构,如长短时记忆网络(LSTM)和门控循环单元(GRU)等,被提出来以更有效地捕捉和利用时间信息。这些改进的结构在处理长期依赖性时表现更好。

+

Large models, especially those based on transformer architectures like OpenAI's GPT-3, have shown significant advancements in various natural language processing (NLP) and machine learning tasks. These models are known for their ability to capture complex patterns in data, generate coherent and contextually relevant outputs, and achieve state-of-the-art performance in multiple benchmarks.

+

Here are some considerations regarding the future of large models:

+
    +
  1. +

    Increased Model Size: There is a trend of increasing model sizes to improve performance. Researchers continue to explore even larger models with more parameters to push the boundaries of what's possible in terms of understanding and generating natural language.

    +
  2. +
  3. +

    Broader Applicability: Large models are being adapted and fine-tuned for a broader range of tasks beyond NLP, including computer vision, reinforcement learning, and more. This trend may continue as researchers aim to develop models with general intelligence.

    +
  4. +
  5. +

    Resource Intensiveness: Training and deploying large models require substantial computational resources, which may limit accessibility. Future developments might focus on making these models more efficient and accessible, allowing a wider range of researchers and applications to benefit from them.

    +
  6. +
  7. +

    Ethical Considerations: As large models become more powerful, there's a growing need to address ethical concerns, including issues related to biases in training data, potential misuse, and the environmental impact of training such models.

    +
  8. +
  9. +

    Hybrid Models: Future research might explore hybrid models that combine the strengths of large pre-trained models with more task-specific architectures. This approach could enhance efficiency and performance for specific applications.

    +
  10. +
+

agents

+
    +
  1. Explainability: There is a growing demand for models that not only perform well but also provide interpretable and explainable results. Future developments may involve designing large models that are more transparent and easier to interpret.
  2. +
+

It's important to note that the field of machine learning is dynamic, and new developments may occur beyond my last update. The future of large models will likely depend on ongoing research, technological advancements, and societal considerations.

+

贝叶斯分类器:

+

训练样本为 特征 对应 分类

+

需要预测的是:某特征x下对应的分类y,求出最大可能性的y,argmax p(y|x)

+

训练方法是:

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/AI/srtp-2024-plan/index.html b/JY_HU/AI/srtp-2024-plan/index.html new file mode 100644 index 00000000..156edb25 --- /dev/null +++ b/JY_HU/AI/srtp-2024-plan/index.html @@ -0,0 +1,4616 @@ + + + + + + + + + + + + + + + + + + + + + + + + + srtp - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

srtp 2023 plan

+

google colab

+

使用模型,想一个应用场景

+

视频剪辑

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/1-\345\246\202\344\275\225\350\257\273\350\256\272\346\226\207/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/1-\345\246\202\344\275\225\350\257\273\350\256\272\346\226\207/index.html" new file mode 100644 index 00000000..220a23d8 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/1-\345\246\202\344\275\225\350\257\273\350\256\272\346\226\207/index.html" @@ -0,0 +1,4682 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 如何读论文 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

如何读论文

+

结构

+
    +
  1. title
  2. +
  3. abstract
  4. +
  5. introduction
  6. +
  7. method
  8. +
  9. exp
  10. +
  11. conclusion
  12. +
+

三遍读

+

第一遍:标题摘要结论。可以看一眼exp中的图表,瞄一眼method

+

第二遍:对整个文章过一遍,证明公式忽略,图表要细看,和其他人工作的对比,圈出引用的文章。

+

第三遍:每句话都要理解,如果是我来做应该怎么做,哪些地方可以往前做

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/10-\345\246\202\344\275\225\346\211\276\347\240\224\347\251\266\346\203\263\346\263\225.assets/image-20230420111414655.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/10-\345\246\202\344\275\225\346\211\276\347\240\224\347\251\266\346\203\263\346\263\225.assets/image-20230420111414655.png" new file mode 100644 index 00000000..867fe34f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/10-\345\246\202\344\275\225\346\211\276\347\240\224\347\251\266\346\203\263\346\263\225.assets/image-20230420111414655.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/10-\345\246\202\344\275\225\346\211\276\347\240\224\347\251\266\346\203\263\346\263\225/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/10-\345\246\202\344\275\225\346\211\276\347\240\224\347\251\266\346\203\263\346\263\225/index.html" new file mode 100644 index 00000000..89151c22 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/10-\345\246\202\344\275\225\346\211\276\347\240\224\347\251\266\346\203\263\346\263\225/index.html" @@ -0,0 +1,4639 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 如何找研究想法 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

如何找研究想法

+
    +
  • +

    打补丁法

    +
  • +
  • +

    以MAE为例:

    +

    image-20230420111414655

    +
  • +
  • +

    第一个想法:“遮住更多的图片块”就是给图片加很强的噪声,相当于数据增强,数据增强是为了使模型不过拟合,但是坏处就是训练很慢,收敛速度极慢,考虑在更大数据集或更大架构上做MAE成本过大。因此可以考虑其他的数据增强,使得效果不差且训练速度快

    +
  • +
  • +

    第二个想法:对于ViT,可以考虑使用新的model,例如自注意力、MLP都是可以替换的;

    +
  • +
  • +

    第三个想法:对于BERT,使用的是完形填空和句子对匹配,是否可以增加额外的一个损失函数,例如contrast learning

    +
  • +
  • +

    打补丁逻辑要串起来

    +
  • +
  • +

    打补丁要找一篇脑洞比较大的

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420114950020.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420114950020.png" new file mode 100644 index 00000000..1f93dcdd Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420114950020.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420120108842.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420120108842.png" new file mode 100644 index 00000000..acf60bc6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420120108842.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420131856394.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420131856394.png" new file mode 100644 index 00000000..41582eab Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420131856394.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420141648330.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420141648330.png" new file mode 100644 index 00000000..cfa23565 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420141648330.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420144608350.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420144608350.png" new file mode 100644 index 00000000..1ae7c838 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420144608350.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420144829649.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420144829649.png" new file mode 100644 index 00000000..53787443 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420144829649.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420145213138.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420145213138.png" new file mode 100644 index 00000000..507afcc1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420145213138.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420145917503.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420145917503.png" new file mode 100644 index 00000000..e58f819f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo.assets/image-20230420145917503.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo/index.html" new file mode 100644 index 00000000..33b22622 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/11-MoCo/index.html" @@ -0,0 +1,4878 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MoCo - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

MoCo

+

知识铺垫

+
    +
  • 对比学习
  • +
  • 三张图片:高兴的人、不高兴的人、狗,模型可以识别出前两者属于同一种类别
  • +
  • 将上述图片经过网络投影到特征空间,希望前两者向量尽可能拉近,而与第三张向量距离拉远(聚类)
  • +
  • 在CV中属于无监督,因为可以设计一些巧妙的代理任务pretext task,从而人为定义一些规则,来定义哪些图片是相似的哪些是不相似的
  • +
  • 最常用的代理任务instance discrimination个体判别,在数据集\(N\)中有如下图片\(X_1,X_2,\dots,X_n\)。然后从中随机选一张图\(X_i\),并对该图做任意处理,例如裁剪等,得到\(X_i^1,X_i^2,\dots\),这些处理后的被称为正样本,而数据集里其他任务都是负样本
  • +
  • 对比函数常用的loss函数有NCE Loss
  • +
  • 灵活性就是找到定义正样本和负样本的方法即可,NLP领域也有例如SimCSE,还有RGB图深度图当正样本,正面图和背面图当正样本,后来扩展到多模态,即CLIP模型
  • +
+

标题

+
    +
  • +

    Momemtum Contrast for Unsupervised Visual Represententation Learning

    +
  • +
  • +

    MoCo是CV领域使用对比学习的里程碑工作

    +
  • +
  • +

    无监督,在分类任务上逼近有监督的基线模型,而且在其他任务中甚至超越了有监督的预训练模型

    +
  • +
  • +

    动量:指数移动平均。\(y_t\)是当前输出,\(y_{t-1}\)是上一次输出,\(m\)是超参数动量,\(x_t\)是当前输入。当\(m\)趋向于1的时候函数变化慢 + $$ + y_t=m\cdot y_{t-1}+(1-m)\cdot x_t,m\in[0,1] + $$

    +
  • +
+

摘要

+
    +
  • 我们将对比学习看做是字典查询的任务
  • +
  • 字典有两部分组成
  • +
  • 一个队列,不需要做梯度回传,所以可以放很多负样本,字典可以很大
  • +
  • 一个移动平均的编码器,让字典的特征尽量保持一致
  • +
  • 大的一致的字典对无监督学习有好处
  • +
  • 主要介绍效果
  • +
  • 在ImageNet分类任务,linear protocol(freeze backbone,只修改全连接层)效果和有监督类似
  • +
  • MoCo学到的特征可以很好地迁移到下游任务,超越了很多有监督的模型
  • +
+

引言

+
    +
  • +

    NLP领域的无监督学习效果很好,但是CV领域不行,原因可能是两者的信号空间不同。语言任务是离散的信号空间(词、词缀等),容易建立tokenized字典(表示某个词表示某个特征)。视觉是高维连续信息,没有很强语义信息,比较难浓缩,不简洁,不适合建字典

    +
  • +
  • +

    结构图:

    +
  • +
  • +

    红色的字是对比学习范式内容。我们将\(X_1\)通过不同的变换\(T_1,T_2\)形成\(X_1^1,X_1^2\),前者是anchor锚点,后者是正样本positive,其他样本是负样本negative。锚点和正样本分别通过编码器\(E_{11}\)\(E_{12}\)得到特征\(f_{11}\)\(f_{12}\)(这里的Encoder可以不一样,所以标号不同,但也可以一样,MoCo中不一样),然后负样本通过\(E_{12}\)得到\(f_2,f_3,\dots,f_n\)

    +
  • +
  • 本文认为\(f_{12},f_2,f_3,\dots,f_n\)组成了一个字典,里面都是key,重新标号为\(k_0,k_1,\dots\)。而\(f_{11}\)称为query,标为\(q\),于是对比学习变成字典查询问题。尽可能让\(f_{11}\)和它相近的特征接近。另外\(X_1^1\)表示为\(X^q\),其他为\(X^k\)
  • +
+

image-20230420114950020

+
    +
  • +

    字典要

    +
  • +
  • +

    大:包含更多视觉信息

    +
  • +
  • +

    一致:字典中的key要用相同或相似的编码器得到

    +
  • +
  • +

    框架:

    +
  • +
  • +

    和对比学习最大的不同是queue队列。队列可以很大,但是每次更新可以只更新一个batch size。最旧的mini batch出队列,新的mini batch进入队列

    +
  • +
  • +

    为了保持一直性,所有的key都通过相似的encoder,所以这里使用动量编码器。假设encoder的参数为\(\theta_q\),动量编码器的参数是\(\theta_k=m\cdot \theta_{k-1}+(1-m)\cdot\theta_q\)

    +
  • +
+

image-20230420120108842

+

image-20230420131856394

+
    +
  • MoCo很灵活,代理任务可以有很多选择,这里使用的是instance discriminaton。
  • +
+

结论

+
    +
  • MoCo从ImageNet-1M的数据集迁移到Instagram-1B的数据集上,效果没有显著提升,考虑修改代理任务,例如结合MAE
  • +
+

相关工作

+
    +
  • 无监督学习和自监督学习一般就考虑代理任务和loss函数
  • +
  • Loss函数
  • +
  • 判别式:例如eight positions,将一张图打成九宫格,然后给定中间一格,然后预测给定格是在中间格的哪个方位,相当于八选一;代理任务变成了分类任务
  • +
  • 生成式:例如Auto Encoder,衡量原图和新生成图之间的差异
  • +
  • 对比学习:表示空间里各个样本对之间的相似性,对比学习与上面最大的不同是目标一直在改变,因为目标是encoder出来的key,encoder的参数在变化,所以目标也在变化
  • +
  • 对抗学习:主要是两个概率分布之间的差异
  • +
  • 代理任务
  • +
  • 去噪重建整张图、重建某个patch、上色重建某个通道
  • +
  • 生成伪标签,数据增广、九宫格、聚类等
  • +
  • 代理任务可以和对比学习Loss函数配对使用
  • +
+

方法

+
    +
  • 假设字典里对于query \(q\) 只有一个正样本(之后任务证明使用多个正样本对有可能提升效果),称为\(k_+\),这里使用的目标函数是 InfoNCE(NCE是Noise Contrasive Estimation)
  • +
+

Softmax: + $$ + \frac{\exp(z_+)}{\sum\limits_{i=0}^k\exp(z_i)} + $$ + 交叉熵: + $$ + -\log\frac{\exp(z_+)}{\sum\limits_{i=0}^k\exp(z_i)} + $$ + 以上的 \(k\) 表示数据集的类别。在代理任务 instance discrimination 中 \(k\) 会达到几百万(ImageNet)

+

NCE简化类别数量为两类,一个是data一个是noise,同时做估计近似(E表示estimation),字典越大能提供越好的近似。InfoNCE觉得二分类不够,所以就使用如下公式:

+

image-20230420141648330

+

\(\tau\)是温度超参数,用来控制分布形状,\(\tau\)大的时候分布变peek就越集中。温度太大,所有负样本都一视同仁,学习没有轻重;反之过小就会只关注特别特别困难的样本,导致模型很难收敛学到的特征不好泛化。这里的\(K\)是负样本的数量。

+
    +
  • +

    队列字典

    +
  • +
  • +

    字典是队列的数据结构,每个mini batch编码后放进来,最老的就出去,这意味着字典里面的key有的是用不同的encoder编码的

    +
  • +
  • +

    动量更新

    +
  • +
  • +

    当字典很大的时候,很难通过反向传播去更新key encoder(不理解)

    +
    +

    GPT(不一定准确):

    +

    当字典很大时,key encoder的参数数量会非常庞大,导致反向传播需要计算大量的梯度,计算量非常大。此外,由于key encoder是不可微的,因此无法通过自动微分来计算其梯度,而需要使用其他方法,如近似梯度或离散化梯度等。这些方法的精度和效率都不如自动微分,因此更新key encoder的效率会受到很大的限制。

    +
    +
  • +
  • +

    query encoder一直在更新,但是key encoder不更新,所以简单的方法是将query encoder复制到key encoder中,但结果不好,作者认为是快速改变的key encoder破坏了一致性

    +
  • +
  • +

    所以使用动量更新:

    +

    image-20230420144608350

    +
  • +
  • +

    探讨之前的架构存在的dictionary size和consistency的问题

    +
  • +
  • +

    端到端:字典大小和batch size相等,可以梯度回传,优点编码器实时更新一致性好,缺点是字典不能过大

    +

    image-20230420144829649

    +
  • +
  • +

    memory bank:对整个数据集都抽特征(ImageNet有128万个样本,每个特征128维,仅需要600M大小),训练时随机抽样当做字典。

    +

    训练的逻辑:128万维的memory bank中随机抽取几个key然后求loss反向传播更新key encoder,然后再重新算key更新memory中那几个key的值,导致一致性很低。同时memory bank过大导致训练每个epoch(遍历128万的特征)后再选的key是非常老的key。

    +

    image-20230420145213138

    +
  • +
  • +

    伪代码:注意交叉熵这里有个labes = zeros(N)是因为0号位置上的是ground truth \(k_+\)

    +
  • +
+

image-20230420145917503

+
    +
  • BN在90%的情况下都不好,且很难debug
  • +
+

实验

+
    +
  • Linear Classification Protocol
  • +
  • 在Freeze backbone的情况下,学习率设置成了30最优,所以无监督学习和对比学习可以考虑较大的学习率
  • +
  • 在很多任务上都超过有监督模型,但是在实例分割和语义分割上不强,怀疑对比学习不太适合做dense prediction的task,就是每个像素点都要预测的任务,后来出现了dense contrast和pixel contrast等工作。
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420152823718.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420152823718.png" new file mode 100644 index 00000000..5ba9ce36 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420152823718.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153236519.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153236519.png" new file mode 100644 index 00000000..5ba9ce36 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153236519.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153508118.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153508118.png" new file mode 100644 index 00000000..9050c80d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153508118.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153641305.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153641305.png" new file mode 100644 index 00000000..cf5b47b1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420153641305.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420154340339.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420154340339.png" new file mode 100644 index 00000000..441215bc Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420154340339.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420155158128.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420155158128.png" new file mode 100644 index 00000000..6ff064df Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420155158128.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420155435106.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420155435106.png" new file mode 100644 index 00000000..9d7a00a5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420155435106.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420160949779.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420160949779.png" new file mode 100644 index 00000000..313d7bef Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420160949779.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420161524708.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420161524708.png" new file mode 100644 index 00000000..ae70a4bd Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420161524708.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420161653704.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420161653704.png" new file mode 100644 index 00000000..dfcc1513 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420161653704.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162109722.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162109722.png" new file mode 100644 index 00000000..b6aba1d2 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162109722.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162325974.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162325974.png" new file mode 100644 index 00000000..c6fd4252 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162325974.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162350151.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162350151.png" new file mode 100644 index 00000000..df54abbe Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162350151.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162745884.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162745884.png" new file mode 100644 index 00000000..1a27b050 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420162745884.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420165322527.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420165322527.png" new file mode 100644 index 00000000..4f2c768c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420165322527.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420165858026.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420165858026.png" new file mode 100644 index 00000000..58c4b908 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230420165858026.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421004840266.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421004840266.png" new file mode 100644 index 00000000..ff582b53 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421004840266.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010040095.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010040095.png" new file mode 100644 index 00000000..23402c0e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010040095.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010055351.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010055351.png" new file mode 100644 index 00000000..1348cc6c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010055351.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010123327.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010123327.png" new file mode 100644 index 00000000..7d9e3565 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010123327.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010257798.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010257798.png" new file mode 100644 index 00000000..b5d097a4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010257798.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010741940.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010741940.png" new file mode 100644 index 00000000..e1977cf3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230421010741940.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502210937866.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502210937866.png" new file mode 100644 index 00000000..8ab3eb12 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502210937866.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211043094.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211043094.png" new file mode 100644 index 00000000..c25858e3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211043094.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211324533.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211324533.png" new file mode 100644 index 00000000..fd8388e3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211324533.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211939234.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211939234.png" new file mode 100644 index 00000000..4a0ad613 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502211939234.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502212313882.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502212313882.png" new file mode 100644 index 00000000..76c6e285 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502212313882.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502212949299.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502212949299.png" new file mode 100644 index 00000000..8888626a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502212949299.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502213133288.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502213133288.png" new file mode 100644 index 00000000..e6a8ea4a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502213133288.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502213146533.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502213146533.png" new file mode 100644 index 00000000..6de40f26 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning.assets/image-20230502213146533.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning/index.html" new file mode 100644 index 00000000..e0a90553 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/12-ContrastLearning/index.html" @@ -0,0 +1,5040 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 对比学习 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

对比学习

+

阶段

+
    +
  • 百花齐放
  • +
  • CV双雄
  • +
  • 不用负样本
  • +
  • Transformer
  • +
+

百花齐放

+
    +
  • +

    InstDisc

    +
  • +
  • +

    标题:Unsupervised Feature Learning via Non-Parametric Instance Discrimination

    +
  • +
  • +

    个体判别任务+Memory Bank

    +
  • +
  • +

    想法:在有监督学习中,很多图片就是很相似,没有语义便签也可以

    +
  • +
  • +

    学习到特征,然后让不同类别的图像在语义空间中尽可能分开

    +

    image-20230420152823718

    +
  • +
  • +

    InvaSpread

    +
  • +
  • +

    标题:Unsupervised Embedding Learning via Invariant and Spreading Instance Feature

    +
  • +
  • +

    被认为是SimCLR的前身

    +
  • +
  • +

    MoCo中提到的端到端的学习方式,只用一个编码器,在一个minibatch中找正负样本

    +
  • +
  • +

    Invariant相似图片特征不变形,Spreading不同图片特征不同

    +

    image-20230420153508118

    +
  • +
  • +

    也使用InstDisc个体判别的代理任务,主要是看正负样本的选择

    +
      +
    • 对于\(x_1\),正样本是\(\hat{x}_1\),其他未增强的和增强的图片都是负样本
    • +
    +

    image-20230420153641305

    +
  • +
  • +

    没有SimCLR效果好的原因:字典不够大

    +
  • +
  • +

    CPC

    +
  • +
  • +

    标题:Representation Learning with Contrastive Predictive Coding

    +
  • +
  • +

    新的代理任务,个体判别是判别式任务,那一定存在生成式任务

    +
  • +
  • +

    音频、图片、文字、强化学习都可以用

    +
  • +
  • +

    思路:将之前的输入通过encoder变成特征\(z_{t-3},z_{t-2},\dots,z_{t}\),然后喂给自回归的模型例如RNN或者LSTM,然后得到\(c_t\)(context representation,代表上下文的特征),这个上下文的特征应该可以预测\(z_{t+1}\)

    +

    对比学习:预测是query,未来时刻编码后的\(z_{t+1}\)等是正样本,任意输入通过编码器都是负样本

    +

    image-20230420154340339

    +
  • +
  • +

    CMC

    +
  • +
  • +

    标题:Contrastive Multiview Coding

    +
  • +
  • +

    一个物体的很多视角都可以当做是正样本

    +
  • +
  • +

    摘要很好:人感知世界有非常多方式,视觉听觉等,我们希望能学习其中强大的mutual information(所有视角下的关键因素)

    +

    image-20230420155158128

    +
  • +
  • +

    例子:使用NYU RGBD数据集,其中包括原始图片、深度图、分割图等,这些互为正样本

    +

    image-20230420155435106

    +
  • +
  • +

    很早做多视角的对比学习,证明多视角和多模态的可行性,后来OpenAI出了CLIP模型,图片和文本是正样本对。CMC原班人马做了一篇蒸馏的工作,无论使用什么样的网络,同一个图片都应该得到类似的特征,我们希望让teacher模型和student模型的输出尽可能相似,使teacher和student形成一个正样本对

    +
  • +
  • +

    使用几个视角可能得配几个编码器,但是CLIP使用的是BERT+ViT(底层都是Transformer),所以可能Transformer能够统一处理不同类型的数据

    +
  • +
+

CV双雄

+
    +
  • +

    MoCo

    +
  • +
  • +

    将对比学习转化成字典查询问题

    +
  • +
  • +

    使用Res50等

    +
  • +
  • +

    SimCLR

    +
  • +
  • +

    标题:A Simple Framework for Contrastive Learning of Visual Representations

    +
  • +
  • +

    方法:和InvaSpread非常类似,对于batch size \(N\),正样本是数据增强的,负样本是数据增强和没有数据增强的,主要的不同是加了个投影层\(g(\cdot)\),其实就是MLP,但是这一个层让效果提升10个点,但是这个projection只在训练的时候用,在下游任务的时候把projection去掉了

    +

    image-20230420160949779

    +
  • +
  • +

    和InvaSpread的区别

    +
      +
    • 数据增强:能用的方法都用了
    • +
    +

    image-20230420161524708

    +
      +
    • +

      投影层:

      +
    • +
    • +

      MLP中是FC+ReLU是Non-Linear,只有FC是Linear,都不用是None,可以看到效果对比

      +
    • +
    • 特征维度高没有必要
    • +
    +

    image-20230420161653704

    +
      +
    • 更大的batch size和更久时间
    • +
    +
  • +
  • +

    MoCo v2

    +
  • +
  • +

    标题:Improved Baselines with Momentum Contrastive Learning

    +
  • +
  • +

    作者发现SimCLR中的东西是即插即用的,所以直接加上,主要是MLP head和数据增强

    +
  • +
  • +

    数据:

    +

    image-20230420162109722

    +

    image-20230420162325974

    +
  • +
  • +

    MoCo比SimCLR的优越性,就是硬件

    +

    image-20230420162350151

    +
  • +
  • +

    SimCLR v2

    +
  • +
  • +

    标题:Big Self-Supervised Models are Strong Semi-Supervised Learners

    +
  • +
  • +

    大的自监督模型适合做半监督学习

    +
  • +
  • +

    架构图

    +
      +
    • 左边(就是SimCLR v2)是用自监督对比学习的方法训练出一个大模型出来
    • +
    • 中间是用一小部分小的标签做有监督的微调,微调完获得一个teacher模型,然后teacher模型生成很多伪标签
    • +
    • 然后就可以在更多的数据上做无标签的自学习
    • +
    • 启发于google 19年一篇noisy student的工作:现在ImageNet上训练一个teacher模型,然后JFT 300M数据集上生成很多伪标签,然后一起训练了student模型,这个student霸占ImageNet SOTA 1年时间(被ViT打败)
    • +
    +

    image-20230420162745884

    +
    +

    Task-agnostic在机器学习中指的是一种算法或模型,它不针对特定的任务进行优化,而是具有通用性和适应性,可以应用于多种不同的任务和领域。这种算法或模型通常具有更广泛的适用性和更好的泛化能力,因为它们不会过度拟合任何特定任务的特定数据集。例如,一些常见的task-agnostic模型包括线性回归、决策树、随机森林等。

    +
    +
  • +
  • +

    和SimCLR v1的区别

    +
      +
    • 更大的模型 Res152
    • +
    • MLP从一层变成2层
    • +
    • 动量编码器:提升不大,一个点,原因是本来minibatch就已经很大了,负样本已经相当多了
    • +
    +
  • +
  • +

    SwAV

    +
  • +
  • +

    标题:Unsupervised Learning of Visual Features by Contrasting Cluster Assignment

    +
  • +
  • +

    Sw是Swap,A是Assignment,V是Views

    +
  • +
  • +

    希望用一个视角的特征去预测另一个视角的特征

    +
  • +
  • +

    对比学习+聚类

    +
  • +
  • +

    架构图

    +

    之前的负样本只是近似(例如MoCo从128万个特征中取65536个做负样本),所以可以考虑和聚类中心比。

    +

    聚类中心是Prototypes \(c\),大小 \(D\times K\)\(D\)是特征维度,\(K\)是聚类中心个数),\(z\)大小\(B\times D\)\(q\)大小\(B\times K\)

    +

    image-20230420165858026

    +
  • +
  • +

    聚类的方法使用的是deep cluster、deep cluster 2

    +
  • +
  • +

    使用到一个trick:multi-crop,正样本取多个crop,现在取2个长宽160和4个长宽96的可以有提高

    +
  • +
  • +

    CPC v2

    +
  • +
  • 用了更大的模型,更大图像块,更多数据增强,BN换成LN
  • +
  • InfoMin
  • +
  • 不能一味最大化mutual information
  • +
+

不用负样本

+
    +
  • +

    BYOL

    +
  • +
  • +

    标题:Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning

    +
  • +
  • +

    Bootstrap改造,Latent特征。自己跟自己学,左脚踩右脚

    +
  • +
  • +

    不使用负样本。在一般的对比学习中,如果没有负样本,那Loss Function的目的就是让所有正样本都相似,那么就存在一个捷径解,即无论给任何输入都返回相同输出,此时所有正样本一定相似,一旦模型躺平就称为model collapse / learning collapse。

    +
  • +
  • +

    架构图

    +
      +
    • \(f_{\theta}\)\(f_{\xi}\)是相同的模型,但是参数不同,后者使用动量更新
    • +
    • 匹配问题换成预测问题:对\(z_{\theta}\)作用\(q_{\theta}\),然后来预测\(z_{\xi}'\),自己预测自己就学起来了
    • +
    • 一个视角的特征去预测另一个视角的特征
    • +
    • 最后只留下\(f_{\theta}\),以及输出\(y_{\theta}\)
    • +
    • Loss函数是MSE
    • +
    +

    image-20230421004840266

    +
  • +
  • +

    博客解释:Understanding Self-Supervised and Contrastive Learning with "Bootstrap Your Own Latent" (BYOL) - generally intelligent

    +
  • +
  • +

    SimCLR使用了BN且有两个

    +

    image-20230421010040095

    +

    MoCo没有BN

    +

    image-20230421010055351

    +

    BYOL:只有一个BN

    +

    image-20230421010123327

    +
  • +
  • +

    消融实验证明是BN的效果

    +

    image-20230421010257798

    +
  • +
  • +

    BN的效果是算Batch的均值方差,这意味着你在算某个正样本Loss的时候其实也看到了别的样本的特征,造成信息泄漏。所以BYOL也是对比学习,它的任务是正样本和平均图片之间的差异(相当于SwAV中的聚类中心)

    +
  • +
  • +

    但是后来原作者又发了新的文章:BYOL works even without batch statistics

    +

    image-20230421010741940

    +

    -/BN/-的时候训练失败;-/-的时候SimCLR也失败了,即用了负样本也训不出来

    +
  • +
  • +

    后来达成一致:BN增加训练稳健性

    +
  • +
  • +

    作者发现一开始初始化比较好不使用BN也可以。使用了Group Norm和Weight Standardization初始化,在BEiT中提出的,也是ResNet v2初始化方法

    +
  • +
  • +

    SimSam

    +
  • +
  • +

    标题:Exploring Simple Siamese(孪生网络) Representation Learning

    +
  • +
  • +

    没有负样本、不需要大的batch size、没有动量编码器

    +
  • +
  • +

    image-20230502210937866

    +
  • +
  • +

    孪生网络:编码器结构相同且共享参数

    +
  • +
  • +

    和BYOL的区别,没有用动量编码器

    +
  • +
  • +

    伪代码:\(D\)函数是计算MSE,可以用p1预测z2,也可以用p2预测z1

    +

    image-20230502211043094

    +
  • +
  • +

    主要是stop gradient的操作

    +
  • +
  • +

    作者认为是EM算法,接近聚类

    +
  • +
  • +

    image-20230502211324533

    +
  • +
  • +

    动量编码器很可以提点,分类任务最强的是BYOL

    +
  • +
  • +

    迁移学习是MoCo v2和SimSam最好,推荐用MoCo v2做基线模型,训练快训练稳

    +
  • +
+

Transformer

+
    +
  • +

    MoCo v3

    +
  • +
  • +

    标题:An Empirical Study of Training Self-Supervised Vision Transformers

    +
  • +
  • +

    主要内容是如何提高ViT的训练稳定性

    +
  • +
  • +

    MoCo v3相当于v2和SimSam的合体

    +
  • +
  • +

    image-20230502211939234

    +
  • +
  • +

    两个编码器,query和key,后者是动量编码器,loss用的是对比学习的loss,看起来是MoCo v2。而query编码器还用了projection和prediction,相当于BYOL和SimSam。同时backbone骨干网络从残差网络换成了ViT

    +
  • +
  • +

    batchsize大的时候会突然下降

    +

    image-20230502212313882

    +
  • +
  • +

    作者检查了梯度,发现是ViT第一层patch projection发生梯度的波峰。相当于tokenization阶段,如何将图片打成patch然后给他一个特征,就是一个MLP,所以直接给一个random patch projecion层然后freeze,问题就解决了,发现这个trick对MoCo v3和BYOL都可以用

    +
  • +
  • +

    如果不改Transformer,那就只有一开始的tokenization和最后的目标函数能改

    +
  • +
  • +

    DINO

    +
  • +
  • +

    标题:Emerging Properties in Self-Supervised Vision Transformers

    +
  • +
  • image-20230502212949299
  • +
  • 作者发现ViT的自注意力图可视化能够非常准确地抓住问题轮廓
  • +
  • image-20230502213146533
  • +
  • 名字来源于上图中的 Self-distillation with no labels
  • +
  • 和BYOL一样,自己预测自己所以是自蒸馏
  • +
  • 为了避免坍塌,给所有样本算个均值 centering
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/13-AI-guided-Intuition.assets/image-20230502221954327.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/13-AI-guided-Intuition.assets/image-20230502221954327.png" new file mode 100644 index 00000000..f2e86056 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/13-AI-guided-Intuition.assets/image-20230502221954327.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/13-AI-guided-Intuition/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/13-AI-guided-Intuition/index.html" new file mode 100644 index 00000000..b00fb5e7 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/13-AI-guided-Intuition/index.html" @@ -0,0 +1,4733 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AI-guided intuition - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

AI-guided intuition

+

标题

+
    +
  • Advancing mathematics by guiding human intuition with AI
  • +
  • AI指导人的直觉从而推进数学进展
  • +
+

摘要

+
    +
  • 应用机器学习发现数学规律,然后证明
  • +
  • 本文发现并证明了拓扑中结的代数结构和几何结构之间的一个新的关系;由对称群的组合不变猜想预测而来的候选算法
  • +
+

框架

+
    +
  • 针对一个数学物体 \(z\),分别有两种数学变换 \(X(z)\)\(Y(z)\),使用机器学习去学其中的关系 \(\hat{f}(X(z))\approx Y(z)\),如果存在即可开始证明
  • +
  • 两种方式来帮助数学定理证明
  • +
  • 发现模式
  • +
  • 归因技术来理解模式,其实就是特征选择,找到哪些特征是有用的
  • +
  • +

    归因技术是 gradient saliency,计算输出关于输入的梯度,如果比较大就说明该特征比较重要

    +
  • +
  • +

    image-20230502221954327

    +
  • +
+

拓扑学

+
    +
  • +
  • unknot就是圆环,如果扯一扯能变成圆环就说明和unknot等价,否则不等价。要求首尾相连,同时不能剪断
  • +
+

表示论

+

+

AutoML

+
    +
  • autogluon
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502224729576.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502224729576.png" new file mode 100644 index 00000000..eddc8029 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502224729576.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225006854.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225006854.png" new file mode 100644 index 00000000..bda31e64 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225006854.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225439902.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225439902.png" new file mode 100644 index 00000000..b10d1015 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225439902.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225835280.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225835280.png" new file mode 100644 index 00000000..f5c06257 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502225835280.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502230146897.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502230146897.png" new file mode 100644 index 00000000..1b2ebc38 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502230146897.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502233008208.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502233008208.png" new file mode 100644 index 00000000..0756b7dc Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502233008208.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502233454477.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502233454477.png" new file mode 100644 index 00000000..8ffe0df9 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502233454477.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502234059031.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502234059031.png" new file mode 100644 index 00000000..f210e8e1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502234059031.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502234456643.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502234456643.png" new file mode 100644 index 00000000..d9119b3a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer.assets/image-20230502234456643.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer/index.html" new file mode 100644 index 00000000..84aacd32 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/14-SwinTransformer/index.html" @@ -0,0 +1,4768 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SwinTransformer - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

SwinTransformer

+

标题

+
    +
  • Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
  • +
  • 希望ViT也像CNN一样提取特征的时候有层级的概念
  • +
+

摘要

+
    +
  • ViT主要做了分类,将下游任务交给其他人做,本文证明ViT在其他任务中效果都很好——可以做通用的骨干网络
  • +
  • 从NLP到CV领域迁移Transformer有两个挑战
  • +
  • 视觉物体尺寸大小的invariance很大
  • +
  • 图片的像素高:要么使用特征图,要么把图片打成patch,要么把图片化成小的窗口
  • +
  • 本文使用移动窗口的方式学习。自注意力在窗口内计算(复杂度线性增长),移动能够让相邻窗口有交互
  • +
+

引言

+
    +
  • +

    image-20230502224729576

    +
  • +
  • +

    ViT使用16倍的下采样率,虽然使用全局自注意力,但是对多尺度特征提取能力就差一些

    +
  • +
  • +

    下游任务如检测和分割(密集预测任务),多尺寸特征是至关重要的。目标检测用的最广的方法是FPN,feature pyramid network。物体分割最常用的是UNet。都会使用不同尺寸上的特征

    +
  • +
+

image-20230502225006854

+
    +
  • +

    CNN中使用池化来增大感受野,SwinTransformer使用PatchMerging将相邻小patch合成大patch

    +
  • +
  • +

    有了多尺度特征就可以输给一个FPN做检测,或者扔给UNet做分割

    +
  • +
  • +

    移动窗口:灰色是小patch(4*4),红色框内是有7*7个小patch(下图仅为示意图),

    +
  • +
+

image-20230502225439902

+

结论

+
    +
  • 希望能用在多模态中,即在NLP中应用Shift Window
  • +
+

方法

+
    +
  • 模型总览图
  • +
+

image-20230502225835280

+
    +
  • 老师:
  • +
+

image-20230502230146897

+
    +
  • 一开始的patch paritition分成了4*4,然后通过Linear Embedding变成Transformer能接受的大小。
  • +
  • 上图中的Swin Transformer Block是在小窗口内做的,Transformer不改变输入的尺寸
  • +
  • patch merging:本来是\(H*W*C\),然后行列各一位取得到 \(\frac{H}2*\frac{W}2*4C\),然后为了和CNN一致(通道数翻倍而不是乘4)所以就再通过一个\(1*1\)的卷积将通道数降成\(2C\)
  • +
  • ViT加了一个CLS token让维度从196变成了197,但是本文没有加
  • +
  • +

    作者最后直接用全局池化操作 global average pooling 将最后 \(7*7\) 变成了 \(1*1\) 来做分类

    +
  • +
  • +

    计算复杂度

    +
  • +
+

image-20230502233008208

+

上式是标准的多头自注意力,而下式是窗口多头自注意力

+
    +
  • +

    架构图中右侧是两个block合成一个计算单元,分别使用窗口自注意力和移动窗口自注意力

    +
  • +
  • +

    移动窗口的问题:移动之后变得不规则了(4个窗口变成了9个窗口),解决方法之一是直接pad但是计算复杂度变大了

    +
  • +
+

作者提出的方法:循环移位,窗口数量始终是4个,但是问题是ABC所在窗口内的patch有的是从很远的地方搬过来的并不相关,这里作者使用mask来处理,最后还要使用循环移位来变回去

+

image-20230502233454477

+

掩码操作:假设窗口是14*14的大小,对于3和6区域,我们首先将3区域内的所有patch拉直,得到28*C个向量,然后再接6号区域21*C个向量拼在一起,然后转置相乘算自注意力,得到的结果中左上和右下区域是不需要的,最后会加上一个Mask矩阵,Mask矩阵的左上和右下都是很大的负数,经过softmax之后就没了

+

image-20230502234059031

+

image-20230502234456643

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/15-\344\273\200\344\271\210\346\230\257\345\245\275\347\232\204\347\240\224\347\251\266\345\267\245\344\275\234/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/15-\344\273\200\344\271\210\346\230\257\345\245\275\347\232\204\347\240\224\347\251\266\345\267\245\344\275\234/index.html" new file mode 100644 index 00000000..e0639ebb --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/15-\344\273\200\344\271\210\346\230\257\345\245\275\347\232\204\347\240\224\347\251\266\345\267\245\344\275\234/index.html" @@ -0,0 +1,4620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 什么是好的研究工作 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

什么是好的研究工作

+
    +
  • 用有新意的方法有效地解决一个研究问题
  • +
  • 新意度*有效性*问题大小=价值
  • +
  • 可以把上述三个点分成1/10/100三档,然后评分
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503000715355.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503000715355.png" new file mode 100644 index 00000000..c3561ccb Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503000715355.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503001650376.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503001650376.png" new file mode 100644 index 00000000..afc82029 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503001650376.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503002547693.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503002547693.png" new file mode 100644 index 00000000..555f8870 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503002547693.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003342829.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003342829.png" new file mode 100644 index 00000000..3cc208ea Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003342829.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003746999.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003746999.png" new file mode 100644 index 00000000..bf5ddb04 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003746999.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003906767.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003906767.png" new file mode 100644 index 00000000..0ed03217 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003906767.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003937939.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003937939.png" new file mode 100644 index 00000000..712161d5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503003937939.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004422998.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004422998.png" new file mode 100644 index 00000000..ba98b0fe Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004422998.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004432357.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004432357.png" new file mode 100644 index 00000000..b93f1334 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004432357.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004651515.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004651515.png" new file mode 100644 index 00000000..6be480fe Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004651515.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004838522.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004838522.png" new file mode 100644 index 00000000..ecc278d7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503004838522.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005023336.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005023336.png" new file mode 100644 index 00000000..459a707e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005023336.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005435643.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005435643.png" new file mode 100644 index 00000000..7d951f3d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005435643.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005850488.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005850488.png" new file mode 100644 index 00000000..4b92c333 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2.assets/image-20230503005850488.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2/index.html" new file mode 100644 index 00000000..fee42587 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/16-AlphaFold2/index.html" @@ -0,0 +1,4786 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AlphaFold2 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

AlphaFold2

+

标题

+
    +
  • Highly accurate protein structure prediction with AlphaFold
  • +
+

摘要

+
    +
  • 通俗认识:蛋白质是一串较长的氨基酸序列(相当于代码),然后会形成独特的空间结构(相当于可执行文件),蛋白质结构预测主要是预测空间结构
  • +
  • 知道结构的蛋白质有10万,而已知的蛋白质有10亿,目前看一个蛋白质结构需要数年或数月
  • +
  • AlphaFold2预测精度是原子级别(建议讲实验结果的时候和绝对值比较)
  • +
+

模型

+
    +
  • 算法总览
  • +
+

image-20230503000715355

+
    +
  • 第一部分:抽取特征
      +
    • 在数据库中寻找类似的氨基酸序列形成MSA(Multi Sequence Alignment)
    • +
    • 形成一个二维矩阵表示两个氨基酸之间的关系
    • +
    • 额外去结构数据库中搜索,知道真实氨基酸在空间中的距离
    • +
    +
  • +
  • 第二部分:Encode
      +
    • 输入
    • +
    • MSA representation:一个 \((s,r,c)\) 的矩阵,\(s\)表示蛋白质种类(第一个是我们要预测的),\(r\)是氨基酸序列,\(c\)是每个氨基酸的向量表示
    • +
    • Pair representation:一个 \((r,r,c)\) 的矩阵
    • +
    • 输入进入一个 Transformer,称为Evoformer
    • +
    • 和普通Transformer的不同在于这里是二维矩阵,行上和列上都有相互关系
    • +
    +
  • +
  • 第三部分:Decode
  • +
  • +

    另外还有一个回收机制,将编码器和解码器的输出都加入到编码器的输入,回收机制不参与梯度回传,降低训练压力

    +
  • +
  • +

    编码器

    +
  • +
  • +

    和Transformer类似,区别是Pair会传到MSA,而MSA也会传到Pair。同时因为是二维矩阵,所以会处理按行信息以及按列信息

    +
  • +
+

image-20230503001650376

+
    +
  • +

    补充材料:row-wise gated self-attention with pair bias

    +

    上图中第一行的第二个block:

    +

    row-wise表示按行,所以特征长度是\(c_m\)

    +

    gated表示除了qkv之外加了一个linear+Sigmoid使之在0-1之间然后做一个按元素点乘实现门的效果(输出门)

    +

    pair表示:假设计算第\(i\)个氨基酸为query,\(j\)个氨基酸为key,那么可以在pair representation中取第\(i\)行第\(j\)列通过线性投影到一维然后加上去(表示氨基酸之间的预设关系)

    +

    image-20230503002547693

    +
      +
    • 伪代码: \(m_{si}\)表示第\(s\)个蛋白质第\(i\)个氨基酸对应的编码,\(z_{ij}\)表示第\(i\)个和第\(j\)个氨基酸之间的关系,长度都是\(c_m\)
    • +
    +

    image-20230503003342829

    +
  • +
  • +

    编码器图第一行的第三个block:对列的特征提取

    +

    image-20230503003746999

    +
  • +
  • +

    编码器第一行第四个block:MLP

    +

    image-20230503003906767

    +
  • +
  • +

    编码器第一行和第二行之间的紫色模块

    +

    image-20230503003937939

    +

    在MSA中两个氨基酸对是一个矩阵,每个氨基酸是一个\(s*c_m\)的矩阵;在Pair矩阵中每个氨基酸对是一个\(c_m\)的向量,所以要把两个矩阵变成一个向量。

    +

    这里outer product是将两个矩阵分别扩成 \((s,c,1)\)\((s,1,c)\) 然后外积得到 \((s,c,c)\)

    +
  • +
  • +

    编码器第二行第4/5个block

    +

    image-20230503004422998

    +

    image-20230503004432357

    +

    这里称为 Triangular,是因为这里使用了 \(i,j,k\) 三个氨基酸之间的关系

    +

    image-20230503004651515

    +

    这里矩阵是不对称的

    +
  • +
  • +

    编码器第二行第2/3个block

    +

    image-20230503004838522

    +

    为了计算\(i\)\(j\)之间的关系,使用了所有\(i,k\)\(k,j\)之间的关系,和图神经网络类似

    +

    image-20230503005023336

    +

    outgoing和incoming,相当于汇聚出去和进来的边两种结构

    +
  • +
  • +

    解码器

    +
  • +
  • +

    氨基酸在3D中的位置表示使用的是相对位置,即每个氨基酸的位置相对于上一个的相对位置

    +
  • +
  • +

    \(Y^{3\times 1}=R^{3\times 3}X^{3\times 1}+t^{3\times1}\),因此主要需要预测 \(R\)\(t\)

    +
  • +
  • +

    需要符合生物和物理规则

    +
  • +
  • +

    结构:先预测Backbone即蛋白质主干网络位置,然后预测枝干网络

    +

    image-20230503005435643

    +
  • +
  • +

    IPA拿到氨基酸对信息、不断更新的序列信息、主干网旋转平移信息

    +
  • +
  • +

    类似RNN

    +
  • +
  • +

    IPA模块的算法:不动点的注意力

    +

    image-20230503005850488

    +
  • +
  • +

    后面太复杂了……略了

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503112225535.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503112225535.png" new file mode 100644 index 00000000..32d6cdd1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503112225535.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503113337747.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503113337747.png" new file mode 100644 index 00000000..d06197ac Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503113337747.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503113345798.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503113345798.png" new file mode 100644 index 00000000..d06197ac Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503113345798.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503130540380.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503130540380.png" new file mode 100644 index 00000000..622f4952 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503130540380.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503131019140.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503131019140.png" new file mode 100644 index 00000000..59db0b64 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP.assets/image-20230503131019140.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP/index.html" new file mode 100644 index 00000000..804124bd --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/17-CLIP/index.html" @@ -0,0 +1,4834 @@ + + + + + + + + + + + + + + + + + + + + + + + + + CLIP - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

CLIP

+

标题

+
    +
  • +

    Learning Transferable Visual Models From Natural Language Supervision

    +
  • +
  • +

    利用自然语言监督的信号来训练一个可迁移的视觉模型

    +
  • +
  • +

    输入是文字和图片的配对,各自通过一个encoder得到特征,然后做对比学习(只需要有正样本和负样本的定义即可,配对的样本是正样本,即矩阵中对角线是正样本)

    +
  • +
+

image-20230503113337747

+
    +
  • +

    正常的CLIP是没有分类头的,因此要额外进行prompt template,即将类别转成一个句子(例如This is a dog)然后抽取文本特征,图片抽取特征,然后计算相似度

    +
  • +
  • +

    zero shot:能够预测出不在ImageNet中的类别

    +
  • +
  • +

    将图片语义和文本语义联系起来,所以迁移效果非常好

    +
  • +
+

摘要

+
    +
  • 传统数据集定义了类别,而使用自然语言的监督信号scale性好
  • +
  • 预训练任务:图片和文本的配对
  • +
+

引言

+
    +
  • NLP领域已经常用无监督学习,而CV领域使用有标注的数据仍有诸多限制
  • +
  • CLIP全称Contrastive Language-Image Pre-training
  • +
  • 是ConVIRT的简化版本,但是在数据和模型大小上大大提高了
  • +
+

方法

+
    +
  • +

    我们的想法一点也不新,但是之前的工作说法混淆、规模不够大、NLP模型不够好,当Transformer解决NLP大一统问题之后容易获得语义特征了

    +
  • +
  • +

    多模态特征适合zero shot迁移

    +
  • +
  • +

    数据集:WIT(WebImage Text)

    +
  • +
  • +

    之前的预训练工作在ImageNet1K上就需要数十个GPU/TPU年的训练时间,而OpenAI注重效率,所以选择对比学习。而其他OpenAI工作都基于GPT,仅有CLIP基于对比学习

    +
  • +
  • +

    一开始采用类似VirTex,图像CNN文本Transformer,给定图片预测其对应文本。但是图片的描述有很多可能,所以预训练非常慢

    +
  • +
  • +

    当把预测型任务换成对比型任务,判断图片与文本是否是配对就比较简单(生成式变判别式),效率提高4倍

    +
  • +
  • +

    伪代码

    +
  • +
+

第一步抽取特征。第二步中会点乘一个\(W\),这个投影是为了将单模态信息转成多模态信息,然后归一化。第三步算相似度。第四步算loss,正样本是对角线上,对称式的loss函数

+

作者没有使用非线性投影层(之前的对比学习中提升了近10个点)因为作者发现多模态中提升不大

+

只做了随机裁剪的数据增强

+

image-20230503112225535

+ +

实验

+
    +
  • +

    之前的自监督无监督学习到一个特征之后,还需要对下游任务做有监督的微调

    +
  • +
  • +

    +
  • +
+

image-20230503113345798

+
    +
  • +

    prompt engineering and ensembling

    +
  • +
  • +

    prompt的重要性:ImageNet中有两个类construction crane(起重机)和crane(鹤),文本多义性可能导致问题;另外输入输出要尽可能保持一致,避免distribution gap

    +
  • +
  • 作者使用prompt template,类似A phot of {label},还可以加一些例如A photo of {label}, a type of pet
  • +
  • +

    ensemble,用多种提示模板,CLIP使用了80个模板

    +
  • +
  • +

    大规模迁移学习结果:

    +
  • +
+

这里是Linear Probe表示将前面的模型freeze掉只从中抽特征,然后训练一个FC来做分类任务。普通物体zero shot任务比较好,但是比较难的任务(DTD纹理分类,CLEVRCounts物体计数)。

+

image-20230503130540380

+

Few Shot的结果:BiT为Big Transfer本身就是谷歌为了迁移学习设计的

+

image-20230503131019140

+

所有数据:略

+

讨论

+
    +
  • 和人类对比
  • +
  • 去重实验,证明泛化性强
  • +
+

局限性

+
    +
  • 目前和基线模型水平相近,但和SOTA水平还有差距,同时扩大CLIP规模也很难实现SOTA
  • +
  • 在某些细分类任务或抽象概念效果很差,不知道什么是异常什么是安全
  • +
  • 虽然zero shot在某些数据集还可以,但是如果推理和训练的数据差的太远,还是不行的,out-of-distribution(例如MNIST,原因是4亿数据集中都是自然图片,没有合成数字图片)
  • +
  • CLIP需要给一个类别来判断,不能做到图片加caption这种生成。之后可能会把对比式和生成式的目标函数合在一起
  • +
  • CLIP对数据利用效率不高
  • +
  • CLIP存在bias,有用ImageNet test训练,27个数据集也用到了,最好有一个专门的用来zero-shot的数据集
  • +
  • 数据从网上爬的,没有被清洗过,存在偏见和可能的不当使用
  • +
  • 复杂的任务或概念不能用语言描述,所以做下游任务泛化的时候能提供一些训练样本(Few-Shot)也是有必要的,但是CLIP的提出不是为了Few-Shot,所以会有提供一些训练样本还不如zero-shot,和人不太一样
  • +
+

回顾

+
    +
  • 文本经过Encoder得到文本特征,图像经过Encoder得到图像特征,然后进行文本图像对的对比学习
  • +
  • 做分类任务的时候:将类别通过prompt template通过文本编码器形成很多query,然后图像通过图像编码器得到一个图像特征,然后相当于依次问query,得到图像特征和文本特征之间的相似度
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503134305824.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503134305824.png" new file mode 100644 index 00000000..51032286 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503134305824.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503140955776.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503140955776.png" new file mode 100644 index 00000000..8b08f4da Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503140955776.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503141350010.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503141350010.png" new file mode 100644 index 00000000..83ff4602 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503141350010.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503142917824.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503142917824.png" new file mode 100644 index 00000000..be5114e6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503142917824.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503143111436.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503143111436.png" new file mode 100644 index 00000000..e090bb52 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503143111436.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503143354397.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503143354397.png" new file mode 100644 index 00000000..c5d8910d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream.assets/image-20230503143354397.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream/index.html" new file mode 100644 index 00000000..0843f970 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/18-TwoStream/index.html" @@ -0,0 +1,4818 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Two-Stream - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Two-Stream

+

标题

+
    +
  • +

    Two-Stream Convolutional Networks for Action Recognition in Videos

    +
  • +
  • +

    我们对视频中的动作识别比较感兴趣、收集容易、落地场景多

    +
  • +
  • +

    结构:

    +
  • +
+

作者认为卷积神经网络适合学习局部规律,但是不适合学习物体移动规律(Motion Information)

+

由于物体不会学,那就教你学,直接先把运动信息抽取好(光流抽取),然后去学习映射

+

上面一只为空间流CNN,下一只为时间流CNN

+

image-20230503134305824

+
    +
  • 光流描述物体的运动
  • +
+

摘要

+
    +
  • 希望将手工设计的特征带到数据驱动的深度学习框架中
  • +
+

引言

+
    +
  • 视频天生有数据增强的效果
  • +
  • 之前的手工设计的特征能够抓住光流信息
  • +
  • 之前视频动作识别使用的是STIP(spatio-temporal interest point)特征,在局部做时空信息这种特征的学习;但是SOTA使用的是dense point trajectories,即视频前后帧点之间的关系得到的轨迹信息。方法是光流得到轨迹然后在轨迹附近抽特征,后来出现idt特征(improved dense trajectories)也非常强,19/20年论文还会和它比
  • +
  • 局部时空学习演变成了3D网络
  • +
  • 基于光流和轨迹的方法演变成了双流网络
  • +
  • 之前的深度网络没有学习到时序信息,尽管有很大的数据集 Sports-1M
  • +
+

方法

+
    +
  • 结构图
  • +
+

image-20230503134305824

+
    +
  • +

    空间流使用单张frame,从静止的图片中做动作识别,其实就是图像分类,但是图像分类本身就和动作识别强相关(例如出现钢琴、篮球等),所以空间流已经非常有竞争力。甚至空间流可以做预训练

    +
  • +
  • +

    时间流

    +
      +
    • 光流:水平和竖直上的位移。输入a和b都是240*320*3,光流图c是240*320*2(水平和竖直方向),光流图每个点都有值(dense optical flow)。视频L帧,光流L-1帧
    • +
    +

    image-20230503140955776

    +
      +
    • 光流图希望能叠加起来,叠加有两种方式:直接叠加、根据光流轨迹进行数值相加。后者看起来更合理但是效果没有前者好
    • +
    +

    image-20230503141350010

    +
      +
    • +

      双向光流:Bidirectional,同时计算前向光流和后向光流,即上面的向量可以取反向(一半帧计算正向,一半帧计算反向)

      +
    • +
    • +

      最后光流图的大小是 \(W\times H\times 2L\),如果视频帧是 \(L+1\),作者一般使用的是11帧

      +
    • +
    +
  • +
  • +

    最后两个流使用的是softmax得到值取平均相加

    +
  • +
+

实验

+
    +
  • +

    测试方法

    +
  • +
  • +

    对于空间流:每次等间距取,一共取25帧。数据增强:一帧上crop取5块,然后翻转再crop出5块,每帧得到10张图(250view),这250个图结果取平均得到空间流结果

    +
  • +
  • +

    对于时间流:取25帧每帧位置后面11帧,得到250张光流图

    +
  • +
  • +

    后来测试方法取view数就很多样了,3D网络30view,Transformer有使用4或3view的

    +
  • +
  • +

    预处理光流

    +
  • +
  • +

    机器耗时,数据dense占用空间(每个位置都有值)

    +
  • +
  • +

    作者的方法是将数据rescale到0-255整数然后存成JPEG

    +
  • +
  • +

    消融实验

    +
  • +
  • +

    空间流

    +
      +
    • 使用预训练模型,由于数据集小所以容易过拟合,所以Fine-tuning需要设置比较大的Dropout Ratio,而last layer就不需要设置较大的Dropout Ratio
    • +
    +

    image-20230503142917824

    +
  • +
  • +

    时间流

    +
      +
    • 发现简单堆叠效果更好。另外双向一般不会掉点
    • +
    +

    image-20230503143111436

    +
  • +
  • +

    总对比

    +
  • +
  • +

    时间流得到的正确率很高(不使用Pretraining),甚至超过空间流

    +
  • +
+

image-20230503143354397

+

结论

+
    +
  • 未来工作
  • +
  • 时间流能否使用预训练模型,或者使用更多光流数据
  • +
  • 基于轨迹的方法为什么表现不好
  • +
  • 相机自带移动会导致不准,作者简单的使用减全局平均来解决但是可能不是很好
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503145341496.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503145341496.png" new file mode 100644 index 00000000..f94e3dfa Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503145341496.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503150220662.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503150220662.png" new file mode 100644 index 00000000..d7fd4352 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503150220662.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503150842100.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503150842100.png" new file mode 100644 index 00000000..49a2f399 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503150842100.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503165251124.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503165251124.png" new file mode 100644 index 00000000..4275cafc Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT.assets/image-20230503165251124.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT/index.html" new file mode 100644 index 00000000..989da8ff --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/19-GPT/index.html" @@ -0,0 +1,4775 @@ + + + + + + + + + + + + + + + + + + + + + + + + + GPT - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

GPT

+

历史

+
    +
  • GPT是把Transformer的解码器拿出来然后在没有标号的大量文本数据上训练一个语言模型
  • +
  • BERT是把Transformer的编码器收集一个更大的数据集训练,实现BERT-Base和BERT-Large,前者就比GPT更强了
  • +
  • GPT2收集一个更大的数据集以及实现一个更大的模型,比BERT-Large更大
  • +
  • GPT3比GPT2在数据和模型上都大了100倍
  • +
+

GPT1

+
    +
  • +

    标题:Improving Language Understanding by Generative Pre-Training

    +
  • +
  • +

    方法

    +
  • +
  • +

    无监督预训练

    +
      +
    • 用前\(k\)个词预测下一个词
    • +
    • 使用Transformer的Decoder,和Encoder不同的是它用到了掩码使得当前词看不到之后的词
    • +
    • \(W_e\) 是 token编码矩阵,\(W_p\) 是位置编码矩阵
    • +
    +

    image-20230503145341496

    +
      +
    • GPT的目标函数是预测未来,比BERT更难,所以在训练和效果比BERT差,但是能力更强
    • +
    +
  • +
  • +

    微调

    +
      +
    • 输入是一串词 \(x_1,\dots,x_m\) 以及label为\(y\),然后给定一个序列去预测\(y\),然后得到loss。这里预测的方法是看最后一个Transformer块对\(x_m\)的输出,然后接一个Linear Layer+Softmax得到概率
    • +
    • image-20230503150220662
    • +
    • 预测下一个词 \(L_1(C)\) 和 预测当前tokens对应label \(L_2(C)\),这两个loss函数一起考虑效果最佳
    • +
    +
  • +
  • +

    下游任务

    +
      +
    • 如何将下游任务表示成GPT形式
    • +
    +

    image-20230503150842100

    +
      +
    • +

      分类:判断一段话的标号(例如评价是正面还是负面的),方法是前面加个start后面加个extract然后放到Transformer中,然后将extract的输出接linear

      +
    • +
    • +

      蕴涵:判断premise中是否蕴涵hypothesis中假设的东西(例如premise是a给了b玫瑰花,hypothesis是a喜欢b,那么就是支持),其实是三分类问题,支持或反对或中立

      +
    • +
    • +

      相似:对称关系

      +
    • +
    • +

      多选题

      +
    • +
    +
  • +
+

GPT2

+
    +
  • 标题:Language Models are Unsupervised Multitask Learners
  • +
  • 主要亮点是zero shot
  • +
  • 下游任务不需要加分隔符
  • +
  • 数据来源于Reddit中收录的网页,用户已经读过并且觉得有价值
  • +
+

GPT3

+
    +
  • +

    标题:Language Models are Few-Shot Learners

    +
  • +
  • +

    导言

    +
  • +
  • +

    NLP预训练的问题:需要一个下游数据集做微调

    +
  • +
  • +

    方法

    +
  • +
  • +

    不做模型更新:所谓zero-shot / one-shot / few-shot都是in-context learning,直接在prompt里给

    +

    image-20230503165251124

    +
  • +
  • +

    大模型不容易过拟合

    +
  • +
  • +

    数据集收集

    +
  • +
  • +

    将Reddit上的网页(精选)定义为正类,Common Crawl(多但脏)上的网页定义为负类,然后做二分类,获得更多的正类网页

    +
  • +
  • 去重过程,使用LSH算法
  • +
  • 加了一些高质量数据集
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115157704.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115157704.png" new file mode 100644 index 00000000..06305d5f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115157704.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115205686.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115205686.png" new file mode 100644 index 00000000..4d8ca0f9 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115205686.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115218848.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115218848.png" new file mode 100644 index 00000000..e058f398 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115218848.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115229210.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115229210.png" new file mode 100644 index 00000000..109f4343 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115229210.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115518851.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115518851.png" new file mode 100644 index 00000000..02b212fb Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415115518851.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415121901636.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415121901636.png" new file mode 100644 index 00000000..97b9acb0 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet.assets/image-20230415121901636.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet/index.html" new file mode 100644 index 00000000..d9be7b31 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/2-AlexNet/index.html" @@ -0,0 +1,4751 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AlexNet - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

AlexNet

+

第一遍

+

标题:ImageNet Classification with Deep Convolutional Neural Networks,ImageNet是当时最大的图片数据集

+

作者:Hinton当时机器学习的大牛

+

image-20230415115157704

+

Abstract:重点介绍了AlexNet的效果,有点像技术报告

+

image-20230415115205686

+

结尾不是Conclusion而是Discussion:提出深度和网络效果正相关,因为五层去掉一层效果降低2%(实际上是调参没调好,去掉一层影响不大,但是前面提到的深度和网络效果正相关是正确的,另外宽度也很重要)。使用Supervised Training(但是当时Hinton和LeCun都认为无监督学习才是最重要的,最近BERT和GAN让人对无监督又开始感兴趣起来了)。未来希望能够在video数据上训练(在video上一直都比较慢)。

+

image-20230415115218848

+

图:

+

image-20230415115229210

+

右边的图片是最后一层输出的向量,在数据集中找最相邻的图片,可以看到基本相似。这是最重要的一点,相似的图经过神经网络在语义空间里是相近的

+

image-20230415115518851

+

由于该工作的正确率非常高,因此决定继续往下读。

+

第二遍

+

introduction:

+
    +
  • 当时认为正则很重要
  • +
+
+

在深度学习中,正则化(regularization)是一种用于减少模型过拟合的技术。正则化通过在损失函数中添加一个惩罚项,来限制模型参数的值域,使其不能过大,从而降低过拟合的风险。

+

正则化通常被应用于优化算法的损失函数中。它的目的是在保持良好的拟合能力的同时,降低模型的复杂度。常见的正则化方法包括:

+
    +
  1. L1正则化:在损失函数中添加L1范数惩罚项,使得模型的参数稀疏化,即将一些参数缩减为0,从而降低模型的复杂度。
  2. +
  3. L2正则化:在损失函数中添加L2范数惩罚项,使得模型的参数权重被限制在一个较小的范围内,从而降低模型的过拟合风险。
  4. +
  5. Dropout正则化:在模型的训练过程中,以一定的概率随机忽略掉一些神经元,从而使得模型不依赖于某些特定的神经元,提高模型的泛化能力。
  6. +
+

正则化方法的选择取决于具体的问题和数据集。

+

L1范数和L2范数是向量空间中常见的两种范数,它们都可以用来衡量向量的大小。在深度学习中,L1范数和L2范数通常被用来作为正则化方法的惩罚项。

+

L1范数是指向量中各个元素的绝对值之和,也就是说,对于一个n维向量x,它的L1范数为:

+

||x||₁ = ∑|xᵢ|

+

其中,|xᵢ|表示向量x中第i个元素的绝对值。

+

L2范数是指向量中各个元素的平方和的开方,也就是说,对于一个n维向量x,它的L2范数为:

+

||x||₂ = √(∑xᵢ²)

+

其中,xᵢ²表示向量x中第i个元素的平方。

+

可以看出,L1范数和L2范数都可以衡量向量的大小,但是它们的数值大小和性质不同。L1范数倾向于使得向量中某些元素变为0,从而得到一个稀疏的向量,适用于特征选择等需要稀疏性的场景。而L2范数倾向于使得向量中每个元素都变小,但不会减为0,适用于需要平滑性的场景。

+

在深度学习中,L2范数通常被用作权重衰减(weight decay)的惩罚项,以避免过拟合问题。L1范数也可以用作正则化方法,但由于它的导数在0点处不连续,不利于优化算法的求解,因此通常需要使用一些特殊的算法进行优化。

+
+
    +
  • 说当时大家都在用CNN,Fake!需要提一下其他流行的算法
  • +
+

Dataset:

+
    +
  • ImageNet的分辨率不同,我先都转成256*256。多出来的以中心为界裁剪。直接在Raw RGB上训练,而不是SIFT之类的
  • +
  • End-to-End:该论文没有指出端到端的价值,虽然它是端到端
  • +
+

Architecture:

+
    +
  • +

    我们使用了ReLU,一般用的是Sigmod和tanh。在当时更快一些,但是目前换成其他的也无所谓

    +
  • +
  • +

    多卡训练:工程细节可以忽略

    +
  • +
  • +

    Local Response Normalization:避免饱和(饱和此时不理解),实际上目前有更好的Normalizatio的方法

    +
  • +
  • +

    Overlapping Pooling:Pooling是什么?对传统Pooling做了一些修改

    +
  • +
  • +

    Overall Architecture:

    +
  • +
+

CNN的长宽减小代表压缩信息,一个像素代表之前多个像素。通道数增加,代表观察的模式类型增加

+

image-20230415121901636

+

有两块GPU,将一张图分成两个部分分别卷积,在第2层和第3层之间做一次GPU通信。模型并行在AlexNet之后的七八年没有受到关注,但是最近也有收到关注(因为太大)

+

Reducing Overfitting:

+
    +
  • 数据增强:将图片人工变大,在256*256扣出224*224
  • +
  • PCA,将图片略作修改
  • +
  • Dropout:随机将隐藏层的数据以50%的概率设成0,等价于L2正则。目前CNN不会用那么多全连接,dropout在RNN还是很有用的
  • +
+

Details of learning:

+
    +
  • SGD:当时觉得很难调,但是现在发现其中的噪音对模型的泛化性有很大帮助,最主流的算法。weight decay很重要,其实是L2正则。momentum挺好。初始化权重是用均值为0,方差0.01的高斯随机变量来初始化(BERT也只用了0.02),
  • +
  • 学习率的调整:ResNet就是每30轮下降常数,AlexNet是规则性地下降10倍(目前很少用),目前喜欢用平滑的曲线往下降,例如cos函数(先从很小的值开始,线性增加,然后用cos减小)
  • +
+

Result:

+
    +
  • 只有是大牛或者审论文或者复现的时候才去看他的exp
  • +
  • ImageNet有120万图片,实际上它的完整数据集是890万张,用后者可能效果更好
  • +
  • +

    经常混用val和test,一般来说val是能一直调参的,而test只能提交几次

    +
  • +
  • +

    作者说GPU0上和color有关,而GPU1上和color无关,实际上这可能是随机发生的

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/20-Codex/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/20-Codex/index.html" new file mode 100644 index 00000000..81f14599 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/20-Codex/index.html" @@ -0,0 +1,4723 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Codex - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Codex

+

标题

+
    +
  • Evaluating Large Language Models Trained on Code
  • +
+

摘要

+
    +
  • +

    基于GPT,使用GitHub微调

    +
  • +
  • +

    将Python的docstrings(注释)翻译成code,作者自己实现了一个数据集HumanEval用来判断Code的正确性

    +
  • +
  • 使用sampling:即生成大量的samples然后看哪个能过,类似图片分类中的top five
  • +
+

方法

+
    +
  • 核采样,将预测的当前词按概念从大到小依次留下来,直到所有的词的概率达到95%
  • +
  • +

    训练集也进行了额外的收集,为了和测试集的输入类似,相当于增加一个带标准答案的数据集

    +
  • +
  • +

    考虑一个新的任务:从代码生成文档或函数名等,BERT可以但是GPT是前向的,所以他们重新做了一个训练数据集,这个数据集里注释在最后

    +
  • +
+

局限性

+
    +
  • Codex训练不efficient
  • +
  • prompt的使用方法,当docstring很长的时候代码水平会打折
  • +
+

主要内容

+
    +
  • 基于GPT,使用GitHub数据微调,然后设计了164个问题来test,另外自己做了一些标准答案来提高准确率
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/21-AlphaCode/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/21-AlphaCode/index.html" new file mode 100644 index 00000000..0e097385 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/21-AlphaCode/index.html" @@ -0,0 +1,4684 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AlphaCode - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

AlphaCode

+

摘要

+
    +
  • 标题:Competition-Level Code Generation with AlphaCode
  • +
  • 在OpenAI的基础上支持了更长的文档和生成更长的代码
  • +
+

导言

+
    +
  • 数据集涉及多语言,比Codex大了5倍,同时微调数据集也更大
  • +
  • 基于标准的Encoder-decoder transformer
  • +
  • 编码器是解码器的4倍,因为输出一般比较长
  • +
  • Attention中KV是共享矩阵参数同时小于Query的矩阵大小
  • +
  • 非对称,编码器的输入序列长度2倍于解码器
  • +
  • 微调
  • +
  • 温度:高则分布靠近,低则分布远离,这里使用0.2让分布更加sharper
  • +
  • 保留不正确的解也是好的,增加两个判别方法:conditioning和prediction
      +
    • conditioning:在输入问题前加上correct solution或者false solution
    • +
    • 预测
    • +
    +
  • +
  • GOLD
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/22-StanfordAIReport.assets/image-20230503182040186.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/22-StanfordAIReport.assets/image-20230503182040186.png" new file mode 100644 index 00000000..744ec8a8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/22-StanfordAIReport.assets/image-20230503182040186.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/22-StanfordAIReport/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/22-StanfordAIReport/index.html" new file mode 100644 index 00000000..9e993d25 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/22-StanfordAIReport/index.html" @@ -0,0 +1,4741 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 2022 Stanford AI Index Report - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

2022 Stanford AI Index Report

+

Takeaways

+

image-20230503182040186

+

Technical Performance

+
    +
  • +

    CV

    +
  • +
  • +

    Image

    +
      +
    • 图片分类
    • +
    +

    ImageNet:使用额外训练数据有更好的结果

    +
      +
    • 图片生成
    • +
    +

    STL-10数据集:使用FID分数评价生成图片和真实图片之间的区别

    +
      +
    • +

      Deepfake Detection

      +
    • +
    • +

      姿势识别

      +
    • +
    • +

      语义分割

      +
    • +
    • +

      ...

      +
    • +
    +
  • +
  • +

    Video

    +
      +
    • 行为识别
    • +
    +

    Kinetics数据集、ActivityNet数据集(标出几秒到几秒是什么动作)

    +
      +
    • 物体检测
    • +
    +

    COCO数据集

    +
      +
    • 数据常识推理
    • +
    +
  • +
  • +

    NLP

    +
  • +
  • +

    文本理解

    +
  • +
  • 文本摘要
  • +
  • 自然语言推理,判断两句话的关系
  • +
  • 拓展推理
  • +
  • 情绪识别
  • +
  • +

    机器翻译

    +
  • +
  • +

    语言

    +
  • +
  • +

    语言识别

    +
  • +
  • +

    推荐系统

    +
  • +
  • +

    强化学习

    +
  • +
  • +

    硬件系统

    +
  • +
  • +

    机器人

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503213028453.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503213028453.png" new file mode 100644 index 00000000..6cf1a4ec Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503213028453.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503214422699.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503214422699.png" new file mode 100644 index 00000000..842fa113 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503214422699.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503214754576.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503214754576.png" new file mode 100644 index 00000000..8e979ed8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503214754576.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503220052571.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503220052571.png" new file mode 100644 index 00000000..85d26065 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D.assets/image-20230503220052571.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D/index.html" new file mode 100644 index 00000000..e88ff360 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/23-I3D/index.html" @@ -0,0 +1,4764 @@ + + + + + + + + + + + + + + + + + + + + + + + + + I3D - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

I3D

+

标题

+
    +
  • Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset
  • +
  • I3D:Inflated 3D Network,将2D模型扩张到3D
  • +
  • 卖点就是一个新模型和一个新数据集,但是这个数据集其实也并没有让模型很好地学习到时序信息,抽取整个视频的中间帧其实也就可以比较准确地预测结果
  • +
+

摘要

+
    +
  • 希望直接从二维的模型直接inflated到三维模型,例如将kernel核从3*3变成3*3*3,最好能直接使用二维的参数,不需要做太多的消融实验
  • +
+

引言

+
    +
  • CV领域常用大规模数据集做预训练然后迁移到其他任务,但是视频领域还没有一个大的数据集
  • +
  • 构建了Kinetics-400,每个class有400个例子
  • +
  • 测试之前的网络
  • +
+

方法

+
    +
  • +

    各种方法对比

    +
  • +
  • +

    a:将每个帧通过CNN抽取特征,然后将特征放入LSTM加上时序信息,效果不好

    +
  • +
  • b:将视频帧叠在一起直接放入3D CNN中
  • +
  • c:双流网络,最后是latent fusion(已经出结果了再融合在一起),将两个特征直接取平均相加
  • +
  • d:使用early fusion(还没出结果直接融合在一起),最后使用3D CNN
  • +
  • e:本文
  • +
+

image-20230503213028453

+
    +
  • +

    inflate

    +
  • +
  • +

    将2D直接变成3D网络,不需要设计网咯

    +
  • +
  • +

    bootstrap 引导

    +
  • +
  • +

    用已经训练好的网络参数来做初始化,一般是两个完全一样的网络结构

    +
  • +
  • 本文需要用2D预训练模型去初始化3D网络
  • +
  • +

    作者的方法是:如果两个模型的输入相同且输出也相同说明两个模型初始化一致,因此作者将图片复制很多帧形成视频,然后将图片喂给2D网络,给视频喂给3D网络

    +
  • +
  • +

    具体结构:最初使用Inception模型,因为当时比ResNet好一点,但是后来也换回ResNet了。Pooling层做了修改,时间维度上不要做下采样,即输入64帧输出64帧

    +
  • +
+

image-20230503214422699

+
    +
  • 5种网络架构的具体比较:(1秒25帧)
  • +
+

测试的时候10s视频最好都囊括在内

+

image-20230503214754576

+

实验

+
    +
  • +

    光流始终能提点

    +
  • +
  • +

    整体微调效果会更好

    +
  • +
  • +

    效果:

    +
  • +
  • +

    可以不使用IDT等传统特征

    +
  • +
  • 可以直接在Kinetics上训练而不需要ImageNet预训练,视频模型在视频训练集上训练
  • +
+

image-20230503220052571

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504110149263.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504110149263.png" new file mode 100644 index 00000000..048b0469 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504110149263.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504110616205.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504110616205.png" new file mode 100644 index 00000000..dd61fce6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504110616205.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504111443494.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504111443494.png" new file mode 100644 index 00000000..937c6fbe Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504111443494.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504111637588.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504111637588.png" new file mode 100644 index 00000000..7f1de9e4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504111637588.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504112401133.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504112401133.png" new file mode 100644 index 00000000..e82b3ddf Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504112401133.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504112709882.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504112709882.png" new file mode 100644 index 00000000..43ed59a4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504112709882.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504113004195.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504113004195.png" new file mode 100644 index 00000000..a7043a24 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504113004195.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504113621843.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504113621843.png" new file mode 100644 index 00000000..329a6084 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504113621843.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504135452511.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504135452511.png" new file mode 100644 index 00000000..95f86a05 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504135452511.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504142043275.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504142043275.png" new file mode 100644 index 00000000..f7ced684 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504142043275.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504143246084.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504143246084.png" new file mode 100644 index 00000000..8a7a9fea Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504143246084.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504143508276.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504143508276.png" new file mode 100644 index 00000000..d25af535 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504143508276.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504144643081.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504144643081.png" new file mode 100644 index 00000000..32a9a4a1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504144643081.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504144724579.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504144724579.png" new file mode 100644 index 00000000..b75f8261 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504144724579.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504145413901.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504145413901.png" new file mode 100644 index 00000000..ad584049 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504145413901.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504145727042.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504145727042.png" new file mode 100644 index 00000000..0f3120a3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition.assets/image-20230504145727042.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition/index.html" new file mode 100644 index 00000000..8b211cf7 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/24-VideoRecognition/index.html" @@ -0,0 +1,4947 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Video Action Recognition - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Video Action Recognition

+

综述

+
    +
  • 标题:A Comprehensive Study of Deep Video Action Recognition
  • +
  • 四个阶段
  • +
  • Hand-crafted -> CNN
  • +
  • 双流
  • +
  • 3D CNN
  • +
  • Video Transformer
  • +
+

CNN

+
    +
  • +

    Large-scale Video Classification with Convolutional Neural Networks

    +
  • +
  • +

    提出Sports-1M数据集

    +
  • +
  • +

    不同方法

    +

    image-20230504110149263

    +

    Single Frame就是图片分类,后面三种使用到了时序信息。Late Fusion是两帧分别通过CNN然后将特征结合起来通过FC,Early Fusion是多帧一开始就直接叠加然后通过CNN,Slow Fusion是一开始四帧叠加进入CNN之后慢慢合并

    +

    实际上不同方法效果差不多,同时在小数据集上训练之后比不过手工特征

    +
  • +
  • +

    多分辨率CNN

    +

    image-20230504110616205

    +

    fovea流的输入是图片中间的信息,context流是全局信息,效果研究不够好,迁移学习效果远不如手工特征

    +
  • +
+

双流

+
    +
  • +

    之前的双流光流网络

    +
  • +
  • +

    Late Fusion,是否能够尝试别的Fusion方法

    +
  • +
  • 中间的CNN是AlexNet的变体,能否使用别的网络
  • +
  • 抽取出的特征直接去做分类,是否能够通过RNN和LSTM来更好地抽取特征
  • +
  • +

    单帧和光流图片还是比较短,需要针对长时间视频

    +
  • +
  • +

    Beyond Short Snippets: Deep Networks for Video Classification

    +
  • +
  • +

    架构图

    +

    image-20230504111443494

    +
  • +
  • +

    抽取特征之后使用哪种Pooling,本文进行了深入的探索,发现Conv Pooling效果最好

    +
  • +
  • +

    使用LSTM发现效果提升有限

    +
  • +
  • +

    LSTM:最底层是CNN抽取出的特征,然后接5层LSTM,最后Softmax输出

    +

    image-20230504111637588

    +
  • +
  • +

    LSTM的输入必须有一定变化才能学到时间上的改变,如果视频比较短,那就没有效果了

    +
  • +
  • +

    Convolutional Two-Stream Network Fusion for Video Action Recognition

    +
  • +
  • +

    本文详细探索了不同Fusion的效果

    +
  • +
  • +

    Spatial Fusion

    +

    保证时间流和空间流特征图在同一个位置产生的通道Response是能联系起来的,这样才算Early Fusion

    +

    包括 Max Fusion / Concatenation Fusion / Conv Fusion / Bilinear Fusion / Sum Fusion,表现最好的是Conv Fusion

    +
  • +
  • +

    Fusion的阶段

    +

    image-20230504112401133

    +

    作者总结了两种比较好的Fusion时机

    +
  • +
  • +

    Temporal Fusion

    +

    作者尝试了3D Pooling和3D Conv+3D Pooling

    +
  • +
  • +

    结论

    +

    image-20230504113004195

    +

    作者的网络有两个分支,一个包括时空信息,而另一种只包含时间信息

    +

    推理的时候用两个loss late fusion

    +
  • +
  • +

    证明了early fusion和3D Conv的效果

    +
  • +
  • +

    TSN

    +
  • +
  • +

    标题:Temporal Segment Networks: Towards Good Practices for Deep Action Recognition

    +
  • +
  • +

    能处理更长时间的视频,同时确定了很多很好用的技巧即Towards Good Practices

    +
  • +
  • +

    长时间视频就先分段,然后在每段里随机抽取一帧,然后在之后几帧中计算光流,然后再通过共享参数的双流网络。作者认为虽然图片不同但是最高层语义信息相同,所以将空间流进行一个Segmental Consensus,可以做加法、乘法、LSTM等,然后两个Consensus做一个加权平均

    +

    image-20230504113621843

    +
  • +
  • +

    技巧

    +
      +
    • Cross Modality Pre-training:ImageNet预训练模型如何迁移到光流图上,因为光流图有10张共20个通道,但是ImageNet预训练模型只接受3个通道。作者将第一个层的结构改变了,这里就先将三个通道的参数值取平均变成一个通道,然后复制20份形成20个通道,效果非常好
    • +
    • 模型正则化:BN导致严重的过拟合,这里使用partial BN,即打开第一层BN,freeze之后的所有BN
    • +
    • 数据增强
    • +
    • Corner Crop:正常的Random Crop一般都会在中间Crop,所以作者强制在边缘Crop
    • +
    • Scale-jittering:改变图片的长宽比
    • +
    +
  • +
+

3D CNN

+
    +
  • +

    由于提前抽取光流非常耗时,不能支持实时光流抽取

    +
  • +
  • +

    C3D

    +
  • +
  • +

    标题:Learning Spatiotemporal Features with 3D Convolutional Networks

    +
  • +
  • +

    最主要特点是使用大型数据集Sports-1M,网络更加深

    +
  • +
  • +

    就是3D版本的VGG

    +
  • +
  • +

    结构:作者发现FineTune效果并不好,不如直接从FC6抽取特征然后训练SVM,C3D特征指的就是FC6抽取出的特征

    +

    image-20230504135452511

    +
  • +
  • +

    后来很多任务都直接使用FC6特征然后做下游任务

    +
  • +
  • +

    I3D

    +
  • +
  • +

    降低了网络训练难度

    +
  • +
  • 作者看到C3D效果并不太好,所以认为一定要有一个预训练模型,所以就想把2D网络扩展成3D网络
  • +
  • +

    I3D还是用到了光流,且带来了提升,所以光流有用

    +
  • +
  • +

    Non-local Neural Networks

    +
  • +
  • +

    摘要:卷积和递归都是在局部区域中的feature,而非局部的信息可能对泛化有很多好处,所以这里实现一个Non-local的算子,这是一个即插即用的block,作用就是建模长距离信息,在各种任务中都很有效

    +
  • +
  • +

    结构:

    +

    时空算子,其实是标准的attention以及残差连接,为了适配3D所以这里2D操作都变成了3D

    +

    image-20230504142043275

    +
  • +
  • +

    消融实验比较重要

    +
      +
    • 一开始确定attention的操作:dot-product
    • +
    • 检测哪个ResNet Block之后插入这个算子效果最好:发现在非最后一个都还好,作者认为到后面没有很多空间信息了,也没有远距离信息可学;而太早做成本比较大
    • +
    • 尝试加多少:发现更多算子更有用
    • +
    • 时间是否有必要:发现在时空上做attention效果最好
    • +
    • 更长的视频:能有提升
    • +
    +
  • +
  • +

    之后大家更不用LSTM了,Non-Local成为重要算子

    +
  • +
  • +

    R(2+1)D

    +
  • +
  • +

    标题:A Closer Look at Spatiotemporal Convolutions for Action Recognition

    +
  • +
  • +

    测试2D和3D各种网络,最后发现将3D卷积拆分成空间上的2D和时间上的1D效果最好

    +
  • +
  • +

    架构比较

    +

    image-20230504143246084

    +
  • +
  • +

    R(2+1)D

    +

    image-20230504143508276

    +
  • +
  • +

    比之前好的原因

    +
      +
    • 增加非线性,原来只有一个ReLU,现在有两个ReLU
    • +
    • 相对容易优化
    • +
    +
  • +
  • +

    但是最终结果在UCF101和HMDB51比I3D差,在K400上单独的RGB / Flow效果比较好,但是合起来就比I3D差

    +
  • +
  • +

    输入是112*112而I3D的输入是224*224,且前者不需要使用ImageNet预训练模型,同时R(2+1)D训练更容易

    +
  • +
  • +

    SlowFast

    +
  • +
  • +

    标题:SlowFast Networks for Video Recognition

    +
  • +
  • +

    借鉴双流模型,但是不使用光流作为输入

    +
  • +
  • +

    作者说来源于人有p细胞和m细胞,前者捕捉静态信息后者捕捉高频运动信息,前者占80%后者占20%,所以作者设计了两只网络,一个是Slow网络(I3D)输入少但是参数量大,另一个是Fast网络输入多但是参数量小

    +
  • +
  • +

    image-20230504144643081

    +
  • +
  • +

    具体网络结构

    +

    image-20230504144724579

    +

    快分支每16帧取1帧,慢分支2帧取一帧,所以快分支的通道数少很多,另外时间维度上不下采样

    +
  • +
+

Video Transformer

+
    +
  • +

    Timesformer

    +
  • +
  • +

    标题:Is space-time attention all you need for video understanding?

    +
  • +
  • +

    实验性论文,探索如何将Transformer迁到视频领域

    +
  • +
  • +

    架构对比

    +
      +
    • S:baseline
    • +
    • ST:最暴力的方法,直接将三个维度过attention层——GPU内存塞不下
    • +
    • T+S:时空分别做自注意力
    • +
    • L+G:局部算然后全局算
    • +
    • T+W+H:分别根据时间+宽度+长度维度做自注意力
    • +
    +

    image-20230504145413901

    +
  • +
  • +

    更详细的attention设计方案

    +
      +
    • 蓝色patch是基准点,红色的patch是会和它做attention的patch
    • +
    +

    image-20230504145727042

    +
  • +
  • +

    最后最好的方案是Divided Space-Time Attention

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508165711290.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508165711290.png" new file mode 100644 index 00000000..be7a1205 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508165711290.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508170000345.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508170000345.png" new file mode 100644 index 00000000..ab780c81 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508170000345.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508171806949.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508171806949.png" new file mode 100644 index 00000000..65595ba7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508171806949.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508203043673.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508203043673.png" new file mode 100644 index 00000000..4987457e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508203043673.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508203207293.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508203207293.png" new file mode 100644 index 00000000..a8b7aab8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508203207293.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204321597.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204321597.png" new file mode 100644 index 00000000..b8c4769e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204321597.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204559681.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204559681.png" new file mode 100644 index 00000000..3c1ea510 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204559681.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204832004.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204832004.png" new file mode 100644 index 00000000..c636f4af Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer.assets/image-20230508204832004.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer/index.html" new file mode 100644 index 00000000..6e402614 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/25-ParameterServer/index.html" @@ -0,0 +1,4851 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ParameterServer - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

ParameterServer

+

标题

+
    +
  • Scaling Distributed Machine Learning with the Parameter Server
  • +
+

摘要

+
    +
  • 提出一个参数服务器的框架:数据和任务在工作节点上,服务器节点上维护一个全局共享的参数,这些参数表示为密集或者稀疏的向量或者矩阵
  • +
+

引言

+
    +
  • 痛点
  • +
  • 访问共享参数需要非常大的网络带宽
  • +
  • 机器学习算法是线性的,同步开销非常大
  • +
  • 容灾要求很高
  • +
  • 贡献
  • +
  • 最初是李沐老板在Yahoo实现了第一代参数服务器框架,Jeff Dean实现第二代,本文实现第三代参数服务器
  • +
  • 更好的抽象,方便实现各种AI算法,且贴合真实工业界
  • +
  • Features:
      +
    • 高效通信:异步通信,通信量压缩
    • +
    • 灵活的一致性模型:两个机器在同一时刻对某个值具有一致性,本文实现了弱一致性模型,但是之后深度学习希望有强一致性
    • +
    • 弹性地可扩展性:新的节点可以加进来而不让整个任务停止
    • +
    • 容灾:向量钟技术,使得整个系统发生非致命性错误1秒内能够恢复
    • +
    • 易用:提供了C++的向量和矩阵
    • +
    +
  • +
  • 新颖度:使用正确的系统技术,将他们适配机器学习算法,并且修改机器学习算法使其更加系统友好
  • +
  • 工程挑战
  • +
  • server node会维护全局共享的参数,可能参数很大,需要多台server node来存储
  • +
  • worker node计算节点会取参数中一块来做计算
  • +
  • 挑战:
      +
    • 通信:之前的分布式系统使用key-value对来更新datastore里的参数(往往是逐一更新),但是机器学习里往往是向量、矩阵、张量等结构的更新,同时还可能出现稀疏矩阵的情况
    • +
    • 容灾:会对每个节点的参数有实时的复制
    • +
    +
  • +
+

机器学习

+
    +
  • +

    分布式算法

    +
  • +
  • +

    Task Scheduler负责通知Worker做计算

    +
  • +
  • Worker读取自己的训练数据,然后拉去服务器端的参数(不是全部参数,所以这里标为working set),然后做梯度计算并迭代
  • +
  • Server汇总梯度计算然后更新所有参数 \(w\)
  • +
+

image-20230508165711290

+
    +
  • 流程
  • +
+

注意图中的训练数据可能是稀疏的,所以它有些 \(w\) 参数是不需要pull到的

+

image-20230508170000345

+

架构

+
    +
  • +

    架构图

    +
  • +
  • +

    多个worker group的目的是可以训练多个有交集的任务、或者提供多个线上服务例如inference接口

    +
  • +
+

image-20230508171806949

+
    +
  • +

    参数服务器对参数的抽象是 (Key, Value)

    +
  • +
  • +

    key简单认为是参数\(w\)的下标,但是下标不一定连续,往往是hash值

    +
  • +
  • value可以是浮点数或者向量
  • +
  • key一般是int64或者int128(hash值),value是一个浮点数或者一串浮点数
  • +
  • +

    所以可以使用BLAS库等写矩阵乘法

    +
  • +
  • +

    Range Push and Pull

    +
  • +
  • +

    相当于参数可以将某个range内的key发送出去(或接受)

    +
  • +
  • +

    server端用户设计函数

    +
  • +
  • +

    服务器代码非常重要,挂了就很危险

    +
  • +
  • +

    提供了一个接口,在安全性基础上,用户可以设置\(w\)怎么更新

    +
  • +
  • +

    异步任务

    +
  • +
  • +

    一个任务通过一个RPC触发,这里会异步地触发任务,即让Worker0执行WorkerIterate,不等它执行完直接让Worker1执行WorkIterate

    +
  • +
  • 但是有些任务是有依赖的,就是有顺序执行的要求
  • +
  • 下图 iter11 用的不是最新的 \(w\),但是速度比较快
  • +
+

image-20230508203043673

+
    +
  • +

    顺序图 DAG 有向无环图

    +

    image-20230508203207293

    +
  • +
  • +

    用户定义过滤器

    +
  • +
  • +

    我们需要发送大量数据,但是某些数据发送是没有必要的,我们会通过一些过滤器让它少发一些东西

    +
  • +
  • 例如significant modifier filter,如果在上一轮没有改变很多的情况下就不发了
  • +
  • 例如precision filter,压缩数据的精度,从32位到16位等
  • +
+

实现

+
    +
  • +

    向量钟

    +
  • +
  • +

    server需要维护每个节点访问参数 \(w\) 的时间

    +
  • +
  • +

    可以记录每个层的时间(利用上面提到的Range Push and Pull)

    +
  • +
  • +

    通信

    +
  • +
  • +

    内容:如果数据在上一轮没有改变就不用发,就是看hash之后的key是否有改变

    +

    image-20230508204321597

    +
  • +
  • +

    一致性hash ring

    +
  • +
  • +

    Key Ring:所有参数按照hash值排列成环,每个server占用一部分同时保存下段的replica。因此允许两个server挂掉;如果要加一个节点,只需要在某段上加一个节点然后将原段分成两个

    +

    image-20230508204559681

    +
  • +
  • +

    流程:

    +

    左边图表示:当worker获得ack的时候,它的server和备份节点都接收到了

    +

    右边图表示:为了提高带宽可以做汇聚,将多个梯度累加然后不着急备份,但是延迟会增加

    +

    机器学习关注带宽不关注延迟

    +

    image-20230508204832004

    +
  • +
  • +

    worker management

    +
  • +
  • +

    容灾比较简单,如果挂了,server就ping一下,ping不到就直接发任务给别的worker

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/26-Pathways/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/26-Pathways/index.html" new file mode 100644 index 00000000..5cd6218d --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/26-Pathways/index.html" @@ -0,0 +1,4788 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Pathways - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Pathways

+

标题

+
    +
  • Pathways: Asynchronous Distributed Dataflow for ML
  • +
+

摘要

+
    +
  • 我们提出一个新的大规模的编排层的设计。编排层是云设计中,计算任务如何映射到底层计算资源
  • +
+
+

编排层是计算机网络中的一种抽象层级,主要负责对网络数据进行编排和排序,以保证数据在传输过程中的正确性和完整性。编排层通常包括以下功能:

+
    +
  1. 数据分段:将大块数据分成较小的数据块,以便在传输过程中更好地管理和控制。
  2. +
  3. 数据排序:对分段后的数据进行排序,以保证数据在传输过程中的正确性和完整性。
  4. +
  5. 流量控制:通过控制数据发送速率和接收速率,避免网络拥塞和数据丢失。
  6. +
  7. 错误检测和纠正:对传输过程中出现的错误进行检测和纠正,以保证数据的完整性和正确性。
  8. +
  9. 重传机制:在数据传输过程中,如果发生数据丢失或错误,可以通过重传机制重新发送数据,以保证数据的完整性和正确性。
  10. +
+

编排层通常是网络协议栈中的一个重要组成部分,常见的编排协议包括TCP、UDP、SCTP等。

+
+

引言

+
    +
  • +

    本系统Pathways将被未来的ML所需要

    +
  • +
  • +

    当前的系统都是SPMD(Single Program Multiple Data),每台机器用一样的代码,算完自己的梯度然后调用AllReduce函数(MPI函数),等待所有机器都执行完这一步,然后将所有的梯度相加,BSP模型

    +
  • +
+

image-20230508232258097

+
    +
  • +

    BSP模型会在新的语言任务上出现问题,数据在一个加速器上放不下,需要用Pipeline;另外模型有稀疏性

    +
  • +
  • +

    单台机器上的TPU/GPU比较快,但是不同机器之间数据传输比较慢,同时有异构存在,然后大家追求MPMD(不同机器的代码不同,调度优化不同)

    +
  • +
  • +

    Foundation模型很大,且推理和训练可能同时使用

    +
  • +
+

设计

+
    +
  • 动机:
  • +
+

图(a)中Host表示CPU,Dev表示GPU

+

图(b)中ctrl会派送任务到不同机器,报错信息比较难看

+

图(c)即本文架构,用ctrl向不同节点派送不同任务,系统上称作dataflow。在dataflow中计算表示成图,每个计算为一个节点,箭头表示依赖。

+

Transformer中矩阵乘法数量远超CNN,但是单个计算复杂度又不高,导致整个计算图多了很多边,通信成本增加非常多,本文希望在(c)架构上提升性能

+

image-20230509001121160

+
    +
  • 例子:
  • +
+

pathways提供额外的函数,能够分配虚拟TPU,然后计算逻辑先编译成计算图,然后发给TPU运行

+

@pw.program将多个计算合并成一个program,可以直接编译成大的模块

+

image-20230509002733558

+

架构

+
    +
  • +

    资源管理器

    +
  • +
  • +

    蓝色小块就是一个TPU核,它和邻居之间(上下左右前后)高速连接,然后一堆蓝色小块连在一起就是一个Pod(一个Pod最多2048核);Pod之间的网络带宽低很多;jax和TensorFlow一般会在Pod内划出一块矩形来运算,这样通信速度比较快

    +

    image-20230509003128130

    +
  • +
  • +

    Pathways希望让多个pod之间的通信加速。我们称A/B/C为一个岛,我们目标是在三个岛上有效执行。

    +
  • +
  • +

    资源管理器就是根据用户代码中的虚拟TPU要求去请求物理TPU,然后将虚拟TPU映射到物理TPU上,Pathways就先简单地直接分配然后一对一映射,未来可以支持动态加减

    +
  • +
  • +

    将代码编译到某个IR然后再优化?

    +
  • +
+

image-20230509110832346

+
    +
  • TPU可能会发送死锁:使用GangSchedule,每个岛有个调度器来排序
  • +
+

image-20230509110938690

+
    +
  • 异步
  • +
+

图(a)的流程:TPU0获得程序开始编译并执行,然后发送给TPU1要求它创建一块内存来等待接受TPU0的输出,同时TPU1也让TPU2开内存。当TPU0计算完的时候会send给TPU2,中间会有一个stall。

+

图(b)的流程:客户端会有提前的调度同时发送给其他TPU开内存

+

image-20230509111144787

+

评价

+
    +
  • 稍有失望,只是让TPU pod不再局限于2048核,没有实现最初愿景
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509115507561.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509115507561.png" new file mode 100644 index 00000000..af7ea626 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509115507561.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509115731030.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509115731030.png" new file mode 100644 index 00000000..5adb0504 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509115731030.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509120955989.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509120955989.png" new file mode 100644 index 00000000..27748a01 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip.assets/image-20230509120955989.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip/index.html" new file mode 100644 index 00000000..19a33546 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/27-GPip/index.html" @@ -0,0 +1,4716 @@ + + + + + + + + + + + + + + + + + + + + + + + + + GPipe - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

GPipe

+

标题

+
    +
  • GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism
  • +
  • 参数服务器是数据并行,Pathways用到了流水线并行但是上次在实验部分跳过去了
  • +
+

摘要

+
    +
  • 模型增大之后,内存需求可能超过单个加速器的内存
  • +
  • 我们提出一个流水线并行的库 GPipe,只要你的网络是一层层串联而成,就都可以使用这个库
  • +
  • 加速器内存限制以及通信带宽要求我们对模型进行partition
  • +
  • GPipe使用 re-materialization (将某些中间结果丢掉然后下次重新计算)和 micro-batch(微批,将batch做到更小的size)
  • +
+

The GPipe Library

+
    +
  • +

    GPipe基于Lingvo,后者是TensorFlow上的一个库(注重可重复性、可复现性,它会保存所有配置项)

    +
  • +
  • +

    假设神经网络是 \(L\)层,GPipe允许用户设置切的块数 \(K\),然后开始做计算

    +
  • +
  • +

    \(K\) 块放在第 \(K\) 个加速器上——最简单的模型并行

    +
  • +
  • +

    模型并行和数据并行

    +
  • +
+

模型并行就是将不同层分给不同GPU,然后数据和梯度相互传递

+

数据并行就是将输入的数据分成块然后在每个GPU上通过所有的层,最后加起来

+

image-20230509115507561

+
    +
  • 模型并行的问题
  • +
+

图(b)模型并行和单GPU运算是相同的,因为其他时间都在等待,其实就是内存翻4倍但是计算没有翻4倍

+

图(c)就是流水线,具体就是数据切开成微批量,相当于数据并行和模型并行同时做,当切的微批量越多的时候就能让效率提的更高。注意使用批量归一化的时候需要对整个批量做一个均值和方差,而现在是做微批量,而Transformer是层归一化就无所谓了

+

image-20230509115731030

+

BubbleTime为 \(O(\frac{K-1}{M+K-1})\),其中 \(K\) 是流水线级数,\(M\) 是指令数。作者发现 \(M\ge 4\times K\)的时候就可以忽略不计了

+
    +
  • 性能优化
  • +
+

前向过程中中间值不能被丢掉,因为后面回传的时候可能会用到,导致activation memory比较大。GPipe使用 re-materialization 或者 active checkpoint

+

在没有做re-materialization的时候,需要保存的数据量是 \(O(\frac{L}{K}\cdot N)\)(N是批量大小),做了re-materializaion之后只需要保留一开始的输入 \(N\),而每层只需要保留微批量大小 \(\frac{L}{K}\cdot \frac{N}{M}\),所以最后是 \(O(N+\frac{L}{M}\cdot \frac{N}{M})\)

+

代价是慢一些,但是内存降低

+

image-20230509120955989

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509145329676.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509145329676.png" new file mode 100644 index 00000000..35fc4f74 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509145329676.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509150457745.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509150457745.png" new file mode 100644 index 00000000..a0bbeb9c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509150457745.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509151720894.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509151720894.png" new file mode 100644 index 00000000..d4a7f8b5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509151720894.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509152340568.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509152340568.png" new file mode 100644 index 00000000..dfc89e7b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM.assets/image-20230509152340568.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM/index.html" new file mode 100644 index 00000000..f15c96e5 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/28-MegatronLM/index.html" @@ -0,0 +1,4708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MegatronLM - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

MegatronLM

+

标题

+
    +
  • +

    Megatron-LM: Training Multi-Billion Parameter Language Model Using Model Parallelism

    +
  • +
  • +

    针对特别大的语言模型,题目是模型并行,但是本文其实是张量并行

    +
  • +
+

摘要

+
    +
  • +

    内存不够,本文提出层内模型并行,不需要新的包或者新的编译器,和之前的Pipeline是互补正交关系

    +
  • +
  • +

    之前的工作需要一个编译器或者一个framework,但是本文实现更加简单;但是牺牲的是通用性,本文只适合Transformer

    +
  • +
+

方法

+
    +
  • Transformer的MLP:
  • +
+

X是输入,A和B分别是两个隐藏层,本文探讨的问题是A和B很大需要拆分,所以就将A竖着拆分成两个模块,分别在GPU0和GPU1上,输入X在两块GPU上;然后各自得到一半的\(XA\),然后将\(B\)横着拆分成两块在GPU0和GPU1上,然后各自计算,得到各自的\(Y\),最后的结果就是两个\(Y\)相加即可。如果不考虑初始的\(X\)获取,两个GPU的通信之后最后的\(Y\)相加

+

image-20230509150457745

+
    +
  • Transformer的Attention:
  • +
+

多头就在不同的GPU上做运算,然后到MLP的时候就和上面一样

+

image-20230509151720894

+
    +
  • 输入输出:\(b\)是batch数量,\(l\)是句子长度,\(k\)是每个词的向量表示长度,\(v\)是词典中词的个数
  • +
+

输入是\(b\times l\),然后去\(v\times k\)的词典里查询,每个词会对应一个\(k\)的向量,所以得到\(b\times l\times k\),整个词典可以放在不同的GPU上,然后各自查询如果查询到就是\(k\)否则就是\(0\),然后all reduce加起来就能得到词向量表示。

+

输出的时候是\(b\times l\times k\),然后也去查字典,得到 \(b\times l\times v\),因为每个词会得到\(v\)长度的logits(表示和每个word的相似程度),然后要做 softmax,可以在两个GPU上分别做 exp以及求和,然后得到的竖着的向量再all reduce相加就可以得到最后的 softmax

+

image-20230509152340568

+

每一层做一次all reduce,通讯量为 \(O(b\times l\times k\times n)\)

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504153104196.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504153104196.png" new file mode 100644 index 00000000..b16f651d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504153104196.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155046090.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155046090.png" new file mode 100644 index 00000000..87b8857c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155046090.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155236186.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155236186.png" new file mode 100644 index 00000000..53dd84d9 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155236186.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155320669.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155320669.png" new file mode 100644 index 00000000..02ed56b1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR.assets/image-20230504155320669.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR/index.html" new file mode 100644 index 00000000..5bfa0c7c --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/29-DETR/index.html" @@ -0,0 +1,4770 @@ + + + + + + + + + + + + + + + + + + + + + + + + + DETR - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

DETR

+

标题

+
    +
  • End-to-End Object Detection with Transformers
  • +
  • 目标检测很少有端到端的方法,一般都会在最后接一个NMS(Non-maximum Suppression非极大值抑制)
  • +
  • 之前需要很多人工干预甚至使用一些普通硬件不支持的算子
  • +
+

摘要

+
    +
  • 本文将物体检测转变成集合预测问题
  • +
  • 本来的目标检测问题:给定图片预测一堆框,然后每个框要知道坐标以及框内物体类别
  • +
  • 本文提出一种新的目标函数,使用二分图匹配强制模型输出一个独一无二的预测,没有冗余的框;另外本文使用Transformer的Encoder和Decoder,Decoder还有一个输入learned object query,本文Transformer的输出是in parrallel即直接输出全部
  • +
+

引言

+
    +
  • +

    之前使用proposals / anchor / window center 等将问题变成回归和分类问题,导致会出现冗余的框(重复预测),然后就得用NMS来抑制掉这些框

    +
  • +
  • +

    架构

    +
  • +
+

训练:

+
    +
  • CNN抽特征
  • +
  • Transformer Encoder学全局特征
  • +
  • Transformer Decoder生成很多预测框(默认100个)
  • +
  • 预测框和ground truth做匹配,只留下匹配上的框,然后在匹配的框上算loss
  • +
+

推理:去掉上面第四步,取置信度大于0.7的物体

+

image-20230504153104196

+
    +
  • 检查大物体效果好,原因可能是Transformer学习到了全局特征,而anchor会受限于anchor大小;但是检测小物体效果不太好。后来出现Deformable DETR出现利用多尺度信息解决了该问题,同时解决了DETR训练慢的问题
  • +
+

方法

+
    +
  • +

    集合目标函数

    +
  • +
  • +

    模型生成100个框,而gound truth只有几个框,解决匹配问题——二分图匹配问题

    +
  • +
  • +

    二分图匹配问题:

    +

    例子,假如有3个员工和3个工作,每个员工对于不同工作有不同的cost(cost matrix),目标是进行分配之后总cost最低

    +

    可以使用scipy.linear_sum_assignment解决这种问题,所以需要确定cost matrix中的cost怎么填,使用如下的公式:

    +

    image-20230504155046090

    +
    +

    二分图匹配问题是指在一个二分图中,找到一种最大匹配方案,使得尽可能多的节点能够匹配成功。二分图是指一个图中的节点可以分为两部分,使得同一部分内的节点之间没有边相连,不同部分的节点之间有边相连。匹配是指将图中的边和节点配对,使得每个节点只能和一个边匹配,每个边也只能和一个节点匹配。最大匹配是指在所有匹配方案中,能够匹配成功的节点最多的方案。

    +

    二分图匹配问题可以通过匈牙利算法解决。匈牙利算法是一种增广路算法,通过寻找增广路来增加匹配的数量。具体步骤如下:

    +
      +
    1. 初始时,所有节点都还没有匹配。
    2. +
    3. 从未匹配的节点开始,按照某种顺序遍历所有未匹配的节点,对于每个未匹配的节点,尝试与其相邻的未匹配的节点进行匹配。
    4. +
    5. 如果相邻节点还没有匹配,直接将它们匹配起来。
    6. +
    7. 如果相邻节点已经匹配,那么就尝试将相邻节点的匹配对象换成当前节点。如果能够成功,就将原来的匹配关系断开,将当前节点和相邻节点匹配起来。
    8. +
    9. 如果不能成功,就继续尝试与下一个相邻节点匹配。
    10. +
    11. 如果所有相邻节点都尝试过了,还是没有匹配成功,就将当前节点标记为已经匹配过了,并返回上一层继续寻找未匹配的节点。
    12. +
    13. 最终,所有节点都将被匹配或者标记为无法匹配。
    14. +
    +

    通过匈牙利算法,可以求得二分图的最大匹配方案。

    +
    +
  • +
  • +

    最后的loss函数

    +

    image-20230504155236186

    +
  • +
  • +

    最优匹配之后再算loss

    +
  • +
  • +

    DETR结构

    +
  • +
+

image-20230504155320669

+

object query也是一个可学习的参数

+

实验

+
    +
  • Encoder学习全局特征,将物体分开
  • +
  • Decoder去学习边缘和遮挡
  • +
  • 可视化object query之后发现:每个query相当于一个问问题的人,不断地问某个位置是否有大/小物体。作者发现每个query都会问中间是否有个大物体,作者怀疑是COCO数据集物体都在中间导致的
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/20200717100917650.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/20200717100917650.png" new file mode 100644 index 00000000..867f87be Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/20200717100917650.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415130646251.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415130646251.png" new file mode 100644 index 00000000..84c1ce72 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415130646251.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415130853545.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415130853545.png" new file mode 100644 index 00000000..6390d207 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415130853545.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415151535157.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415151535157.png" new file mode 100644 index 00000000..b72f1806 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415151535157.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415152251451.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415152251451.png" new file mode 100644 index 00000000..e61b4e46 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415152251451.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415153027934.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415153027934.png" new file mode 100644 index 00000000..3ec71186 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415153027934.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415153049233.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415153049233.png" new file mode 100644 index 00000000..bfc72f77 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415153049233.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415154722200.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415154722200.png" new file mode 100644 index 00000000..f00db43e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415154722200.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415155010937.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415155010937.png" new file mode 100644 index 00000000..207363b0 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415155010937.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415155145243.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415155145243.png" new file mode 100644 index 00000000..7966bbe3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415155145243.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415160104560.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415160104560.png" new file mode 100644 index 00000000..1e213745 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/image-20230415160104560.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0h1bnRlcl9NdXJwaHk=,size_16,color_FFFFFF,t_70#pic_center.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0h1bnRlcl9NdXJwaHk=,size_16,color_FFFFFF,t_70#pic_center.png" new file mode 100644 index 00000000..867f87be Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0h1bnRlcl9NdXJwaHk=,size_16,color_FFFFFF,t_70#pic_center.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet/index.html" new file mode 100644 index 00000000..1e29dee8 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/3-ResNet/index.html" @@ -0,0 +1,4750 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ResNet - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

ResNet

+

第一遍

+

Abstrat:深的神经网络训练很困难,我们使用残差网络来ease深度学习。深度152层,8倍于VGG,但是计算复杂度降低了。赢得了ImageNet和COCO第一,COCO是物体检测中最大的数据集

+

没有conclusion:因为CVPR限制论文在8页之内

+

图(一般第一页会放上好看的图,CG甚至会在标题上面放图):

+

image-20230415130646251

+

提出当深度增加的时候,error反而很高

+

image-20230415130853545

+

第二遍

+

Introduction:

+
    +
  • 网络深的时候会发生梯度爆炸消失。解决方法:权重初始化,batch normalization
  • +
+
+

Batch Normalization(批归一化)是一种用于深度神经网络中加速训练和减轻过拟合的技术。它通过对每个batch的数据进行归一化操作,使得模型的训练更加稳定和快速。

+

Batch Normalization的基本思想是对每个batch的输入数据进行归一化处理,使得它们的均值为0,方差为1,从而使得输入数据分布更加稳定。具体来说,Batch Normalization包括以下几个步骤:

+
    +
  1. 对每个batch的输入数据进行归一化,使得其均值为0,方差为1。
  2. +
  3. 对归一化后的数据进行线性变换,包括缩放和偏移操作,使得模型可以学习到不同的特征组合。
  4. +
  5. 将线性变换后的数据输入到激活函数中进行非线性变换,从而得到网络的输出。
  6. +
+

Batch Normalization可以应用于网络的任意层,包括卷积层、全连接层等,可以有效地加速训练,减轻过拟合,同时可以使得学习率更大,从而更快地收敛。

+

Batch Normalization的一个重要特点是可以减少对超参数的敏感性,例如学习率和权重初始化等。此外,Batch Normalization还可以被视为一种正则化方法,因为它对每个batch的数据进行了限制,从而使得模型更加健壮。

+
+
    +
  • +

    当网络深的时候观察到train和test的error都提高了,说明并不是overfitting

    +
  • +
  • +

    照理来说深的网络一定包含了浅的网络,直接做identical mapping,所以显示构造identical mapping

    +
  • +
  • +

    shortcut connection

    +
  • +
+

image-20230415151535157

+

Related Work:

+
    +
  • gradient boosting
  • +
+

Deep Residual Learning:

+
    +
  • implementation:图片resize然后随机crop。使用BN。注意这里的iteration次数是和batch size相关的,所以一般不推荐写iteration,一般写的是遍历所有数据的epoch。没有全连接层,所以没有使用dropout
  • +
+

image-20230415152251451

+
+

在随机梯度下降(Stochastic Gradient Descent,SGD)算法中,batch指的是一批次(subset)的训练数据。具体来说,SGD将所有的训练样本分成若干个batch,每个batch包含了一定数量的训练样本,通常是2的幂次方,如32、64、128等。

+

在每次迭代中,SGD会从训练集中随机选择一个batch的数据进行训练,计算其梯度并更新模型参数。这样做的好处是可以减少训练过程中的内存占用,同时也可以提高训练速度,因为每个batch的数据量相对较小,计算梯度的时间更短,模型参数也更容易更新。

+

batch size的大小通常是根据硬件设备的内存大小和训练集的大小来确定的。如果batch size太小,训练过程中的噪声会更大,但是可以更频繁地更新模型参数;如果batch size太大,训练过程中的噪声会更小,但是每次更新模型参数的时间会更长,训练速度也会减慢。

+

需要注意的是,SGD在每个batch上计算的梯度只是整个训练集上梯度的一个无偏估计,因此可能会存在一定程度上的不稳定性。为了解决这个问题,可以采用一些优化的算法,如Momentum、Adagrad、RMSProp和Adam等。

+
+

Experiments

+
    +
  • 池化层不带权重参数。可以对照下面两图中的34layer的图
  • +
+

image-20230415153027934

+

image-20230415153049233

+
    +
  • 结果:注意一开始train error比test error要大,因为使用了数据增强。突变是因为学习率乘以0.1,不推荐,一般前期尽量找到一个正确位置再跳。残差网络的收敛速度快很多。
  • +
+

image-20230415130853545

+
    +
  • 当输入输出大小不一样的时候怎么做残差连接,即上上图中的虚线部分,这里用三种做法(填零,虚线projection,所有线都projection)。其中projection就表示用1*1的卷积核来调整通道。最后推荐使用B,C的投影开销比较大。
  • +
+

注意:ResNet中的通道数是一直在增加的

+

image-20230415154722200

+

image-20230415155010937

+
+

20200717100917650

+
+
    +
  • 如何构建更深的resnet:使用bottleneck,因为输入很大,为了降低复杂度就先降维,然后再升维
  • +
+

image-20230415155145243

+
    +
  • +

    ResNet计算快的原因:加法后面的梯度相对比较大 + $$ + \frac{\partial (f(g(x))+g(x))}{\partial x}=\frac{\partial (f(g(x))}{\partial x}+\frac{\partial g(x)}{\partial x}=\frac{\partial (f(g(x))}{\partial g(x)}\cdot\frac{\partial g(x)}{\partial x}+\frac{\partial g(x)}{\partial x} + $$

    +
  • +
  • +

    Failure is another way of convergence。SGD一般都能收敛但是要收敛到一个小的值,就是要一直有梯度,能跑得动。所以一般梯度够大就有比较好的结果

    +
  • +
  • +

    为什么ResNet在CIFAR10小的数据集上没有过拟合还是一个open question,可能是加了resnet降低了模型的复杂度,所以就会找到一个更简单的模型去学而不过拟合

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162318269.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162318269.png" new file mode 100644 index 00000000..d533f622 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162318269.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162758253.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162758253.png" new file mode 100644 index 00000000..68270cb8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162758253.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162809220.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162809220.png" new file mode 100644 index 00000000..37ba8a38 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509162809220.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509165534101.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509165534101.png" new file mode 100644 index 00000000..8948507e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero.assets/image-20230509165534101.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero/index.html" new file mode 100644 index 00000000..8b23d806 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/30-Zero/index.html" @@ -0,0 +1,4768 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Zero - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Zero

+

标题

+
    +
  • ZeRO: Memory Optimizations Toward Training Trillion Parameter Models
  • +
+

摘要

+
    +
  • ZeRO:Zero Redundancy Optimizer,0冗余优化器,优化内存,数据和模型并行
  • +
  • 超线性?
  • +
+

引言

+
    +
  • Megatron-LM在更多卡上通信量巨大,效率很低
  • +
  • 首先看内存用在哪些地方:
  • +
  • 优化器状态、梯度、参数
  • +
  • 中间值,临时buffer,以及碎片化内存
  • +
+

内存

+
    +
  • 混精度训练:N卡在fp16上有很多优化,但是在梯度相加的时候会出现问题,所以梯度更新的时候用fp32,算完之后再变成fp16
  • +
+

参数和梯度用fp16保存,这里需要使用\(4\Psi\)字节,另外Adam里需要用fp32保存,需要\(12\Psi\)

+

image-20230509162758253

+

image-20230509162809220

+
    +
  • pytorch会在计算中析构一些不使用的内存导致碎片化
  • +
+

ZeRO: Insights and Overview

+
    +
  • 想法
  • +
  • 数据并行(DP)比模型并行(MP) scaling efficiency 高
  • +
  • 数据并行需要更多内存,因为模型需要都存一份
  • +
  • DP和MP都需要存很多中间状态,可以使用参数服务器只存一份在GPU上,其他需要用的时候去取
  • +
  • ZeRO-R
  • +
  • 不重算,直接从参数服务器获取,当传输速度高于重算速度就划得来
  • +
  • buffer使用固定大小,提高效率
  • +
  • 内存碎片不断进行内存整理
  • +
+

ZeRO: DP

+
    +
  • +

    三种分割方法:\(P_{os},P_{g},P_{p}\),一般称为 \(Zero_1,Zero_2,Zero_3\)

    +
  • +
  • +

    \(Zero_1,Zero_2\)

    +
  • +
+

假设两张卡(卡数记为\(N_d=2\)),一层网络。状态用fp32存(\(12\Psi\)),fp16的梯度(\(2\Psi\)),fp16的梯度(\(2\Psi\))。

+

将整个状态切成两半,一半留在GPU0(斜线部分),一半留在GPU1,另一半是不需要的,这称为\(Zero_1\),所以内存开销为 \(12\Psi/N_d\)

+

fp16的梯度切成两半,称为\(Zero_2\),开销为 \(2\Psi/N_d\)

+

假设 \(w\) 是都保存在内存中,那么此时可以计算出一般状态对应的梯度,然后将这个梯度的一半发给另一个GPU的梯度加起来做all reduce。状态更新也是更新一半然后发给对方的参数

+

image-20230509162318269

+
    +
  • \(Zero_3\):将参数也分开,这里会产生一些额外通信,因为每次需要的时候需要从别的GPU上获取,可以做一定的异步
  • +
+

image-20230509165534101

+

ZeRO-R

+
    +
  • 使用Buffer
  • +
  • 内存去碎片化
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/31-\347\240\224\347\251\266\347\232\204\350\211\272\346\234\257/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/31-\347\240\224\347\251\266\347\232\204\350\211\272\346\234\257/index.html" new file mode 100644 index 00000000..ef63f46a --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/31-\347\240\224\347\251\266\347\232\204\350\211\272\346\234\257/index.html" @@ -0,0 +1,4659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 研究的艺术 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

研究的艺术

+

跟读者建立联系

+
    +
  • 写作是和读者交流,时刻考虑现在读者知道什么了,接下来他们想要知道什么
  • +
  • 研究:Gather Information to answer a question that solves a problem
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504172522918.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504172522918.png" new file mode 100644 index 00000000..029e6180 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504172522918.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504211330838.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504211330838.png" new file mode 100644 index 00000000..acb50c2f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504211330838.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504211609523.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504211609523.png" new file mode 100644 index 00000000..cb04c69c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504211609523.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212132424.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212132424.png" new file mode 100644 index 00000000..ba003b4d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212132424.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212224309.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212224309.png" new file mode 100644 index 00000000..c43d387d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212224309.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212907890.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212907890.png" new file mode 100644 index 00000000..38edb140 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504212907890.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213050969.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213050969.png" new file mode 100644 index 00000000..be6c15fb Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213050969.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213411779.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213411779.png" new file mode 100644 index 00000000..d1c3e6d5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213411779.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213739816.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213739816.png" new file mode 100644 index 00000000..5143e807 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213739816.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213758433.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213758433.png" new file mode 100644 index 00000000..31cbb2c1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504213758433.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504214029986.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504214029986.png" new file mode 100644 index 00000000..d973f693 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504214029986.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504214831926.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504214831926.png" new file mode 100644 index 00000000..16e31183 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504214831926.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215156774.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215156774.png" new file mode 100644 index 00000000..bb3dac96 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215156774.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215435603.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215435603.png" new file mode 100644 index 00000000..f3672a27 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215435603.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215517408.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215517408.png" new file mode 100644 index 00000000..912d3d1f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2.assets/image-20230504215517408.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2/index.html" new file mode 100644 index 00000000..5ec7d68d --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/32-DALLE2/index.html" @@ -0,0 +1,4811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + DALLE2 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

DALLE2

+

标题

+
    +
  • Hierarchical Text-Conditional Image Generation with CLIP Latents
  • +
  • Hierarchical 先生成64*64,然后上采样到256*256,再上采样到1024*1024
  • +
  • 先用CLIP找到图片和文本对之间的关系,然后给定一个文本通过CLIP文本编码器变成文本特征,然后DALLE2训练一个Prior模型(输入是文本特征,输出是图像特征),然后图像特征给解码器(Diffusion)得到图像
  • +
+

引言

+
    +
  • +

    CLIP学到的特征很稳健,扩散模型多样性比较好且保真度一直在提高

    +
  • +
  • +

    结构

    +
  • +
+

虚线上方是CLIP模型,左边图片是文本通过Encoder到文本特征,右边图片通过Encoder得到图像特征,两者构成正样本;CLIP模型是锁住的

+

用CLIP中的图像特征做Ground Truth,做预测任务

+

本文称自己为unCLIP,相当于CLIP的反过程

+

image-20230504172522918

+

补充材料

+
    +
  • +

    GAN

    +
  • +
  • +

    问题是训练不稳定,生成多样性不高

    +
  • +
  • +

    AutoEncoder

    +
  • +
  • +

    原理:自己预测自己

    +

    image-20230504211330838

    +
  • +
  • +

    DAE先给输入一个打乱然后再给Encoder,让结果去重建原始的\(x\),而不是扰动后的\(x_c\),效果很好比较稳健。图片信息比较稳健,加一些noise不会有太多问题,和MAE原理类似

    +
  • +
  • +

    VAE架构:和之前的架构不同之处,在于之前的工作是学习Bottleneck中的特征,而本文是学习分布。作者假设是高斯分布,将Encoder输出的特征通过几个FC层来预测高斯分布,即均值和方差,然后采样出一个\(z\)然后做生成

    +
      +
    • 给定\(x\)得到\(z\)是 后验概率 \(q(z|x)\),学出来的distribution是先验分布,给定 \(z\) 预测一张图片 \(x\) 是likelihood,所以就是maximize likelihood
    • +
    +

    image-20230504212132424

    +
  • +
  • +

    VQ-VAE

    +

    VQ的含义是vector quantised,即给VAE做量化。VAE模型尺寸不好做大,分布不好学,所以不去做Distribution的预测,而是用Codebook代替,可以理解为\(K\)个聚类中心。然后将Encoder出来的特征图和Codebook中的聚类中心看距离的接近程度,选择接近的聚类中心放到\(Z\)中,然后用这些聚类中心形成新的特征图\(f_a\)

    +

    这里特征是从Codebook中拿到的,所以不能做随机采样,因此不能生成,必须加一个Prior网络来做生成。这些特征本来是做high level任务的,例如分类检测等

    +

    image-20230504212224309

    +
  • +
  • +

    VQ-VAE2:模型变成层级式,除了局部建模还做全局建模,加上了attention。然后根据Codebook学了一个Prior网络(pixelCNN,这是一个自回归模型),生成效果很好

    +
    +

    自回归模型(Autoregressive Model)是一种时间序列预测模型,它假设当前时刻的值与前面若干个时刻的值有关。具体来说,自回归模型将当前时刻的值看做是前面p个时刻的值的线性组合,其中p称为模型的阶数。自回归模型常用的表示形式是AR(p),其中p表示模型的阶数。自回归模型可以用于预测时间序列的未来值,也可以用于时间序列的分析和建模。

    +
    +
  • +
  • +

    DALLE

    +

    image-20230504213050969

    +

    OpenAI将上面的自回归模型pixelCNN换成GPT

    +
  • +
  • +

    扩散模型

    +
  • +
  • +

    架构:前向过程,每次加一点噪声,如果\(T\)无穷大,那么就会得到各向同性的正太分布。

    +

    image-20230504213739816

    +
  • +
  • +

    reverse diffusion使用的网络模型是UNet

    +

    image-20230504213758433

    +
  • +
  • +

    DDPM

    +

    之前是从\(x_t\)预测\(x_{t-1}\),作者认为可以只预测噪声\(\epsilon\)。UNet中要加上time embedding(正弦的位置编码或者傅里叶特征),我们希望反向过程中可以先学习低频信息生成物体轮廓coarse,然后最后学习到高频信息,而所有模型是共享参数的,所以需要用time Embedding来提醒模型做到哪一步了

    +

    image-20230504214029986

    +

    预测正太分布其实都不需要学习方差,只学习均值就已经很好了,进一步降低了训练难度

    +
  • +
  • +

    Improved DDPM:继续学习方差发现效果不错;添加噪声的schedule从线性的schedule改成了余弦的schedule;Diffusion scale很好

    +
  • +
  • +

    Diffusion beats GAN:更大网络;新的归一化方式,adaptive group normalization,根据步数做自适应的归一化;使用classifier guidance的方法来引导模型采样和生成,加速反向生成过程

    +

    image-20230504214831926

    +

    在训练模型的时候加了一个分类器(简单的图像分类器,可以在ImageNet上预训练,但加了很多噪声),每次\(x_t\)都经过分类器算一个交叉熵然后算梯度再给\(x_{t-1}\),目的是使其更接近某种物体,增加逼真度。

    +

    其他guidance:除了使用简单的分类器做guidance,可以换成使用CLIP模型,另外可以在图像上做特征级别的引导、风格层面的引导,文本可以用LLM。这些引导都是下式中的 \(y\)

    +

    image-20230504215156774

    +

    缺陷是需要使用其他模型,要么自己训要么用预训练模型

    +

    后续工作classifier free guidance(GLIDEDALLE2):假设我用text做guidance(下式中\(y\)),但是我随机去掉这个guidance(下式中为\(\empty\)),然后会有两个分布,我就可以得到一个方向,然后最后反向扩散的时候如果没有guidance也可以生成。但是这个方法很贵。

    +

    image-20230504215517408

    +
  • +
+

方法

+
    +
  • +

    Decoder(图像特征到图像):基于GLIDE,classifier guidance和classifier-free guidance都用到了

    +
  • +
  • +

    Prior(文本特征到图像特征):作者尝试了两种方法,自回归和扩散(两者都用到了classifier-free guidance,效果很好)。

    +
  • +
+

前者训练效率很低(输入是文本特征,有CLIP的图像特征做GT,然后就可以把图片遮住做自回归的预测);

+

后者在反向扩散的时候使用了Transformer的Decoder(因为输入输出都是Embedding所以直接Transformer,用UNet不太合适)。模型输入:文本、CLIP文本特征、步数Embedding、加过噪声的图像特征、Transformer自身的Embedding(例如CLS Token),而这个CLS Token就拿去预测没有加过噪声的CLIP图像特征。从DDPM开始大家都是预测噪声,但是本文发现预测图像特征在这个任务里效果更好

+
    +
  • +

    DALLE2使用上述两阶段生成,但是ImageGen里用一个阶段且只用UNet效果也很好

    +
  • +
  • +

    Scale Matters

    +
  • +
+

局限性

+
    +
  • +

    不能很好地将物体和属性结合起来,例如方向位置等。可能是CLIP模型的问题,CLIP模型只看物体相似性,不了解方向等抽象概念

    +
  • +
  • +

    生成文字不对,可能是因为使用BPE编码导致,因为这是对词根词缀编码的

    +
  • +
  • 不能生成复杂场景,细节缺失比较严重
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505204250606.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505204250606.png" new file mode 100644 index 00000000..257adb80 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505204250606.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505204522474.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505204522474.png" new file mode 100644 index 00000000..7faa7c2b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505204522474.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505211706144.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505211706144.png" new file mode 100644 index 00000000..c08e3191 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505211706144.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505213213279.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505213213279.png" new file mode 100644 index 00000000..0699409f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT.assets/image-20230505213213279.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT/index.html" new file mode 100644 index 00000000..6fc9daa2 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/33-ViLT/index.html" @@ -0,0 +1,4850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ViLT - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

ViLT

+

标题

+
    +
  • +

    ViLT:Vision-and-Language Transformer Without Convolution or Region Supervision

    +
  • +
  • +

    将目标检测从多模态学习框架中去除

    +
  • +
  • +

    架构

    +
  • +
+

之前的模型一般都是文本处理比较简单直接将文本变成Embedding,然后直接和图片特征放到Transformer里做模态融合

+

之前的工作Region Feature就像目标检测一样是抽取局部特征,先用CNN Backbone,然后再经过Region Operations获得很多框(使用目标检测的任务)

+

image-20230505204250606

+

之前的Region Feature在视觉这边占用时间极长

+

image-20230505204522474

+

ViLT的训练成本很贵且效果一般,但是运行时间非常快

+
    +
  • 标题中所以说without convolution and region supervision
  • +
+

摘要

+
    +
  • 之前的Vision-and-Language Pre-training(VLP),比较贵,效率低。甚至单模态的抽取时间比多模态的融合时间还长
  • +
  • 目前目标检测数据集并不大
  • +
  • 提出一个极简的Framework,直接让图片和文本一样直接都通过Linear Embedding
  • +
+

引言

+
    +
  • 预训练非常重要,出现了很多VLP模型,一般输入都是图像文本对,loss用的是图像文本match loss,并且使用BERT一样的掩码学习
  • +
  • 语言只能用Transformer,但是图片不能直接丢到Transformer里因为太长了,需要提取更高的离散性的语义特征,ViT是分成patch,当时用的是预训练的目标检测器(图像变成bounding box,每个都是一个物体,有明确的语义信息,且离散,每个区域都相当于NLP中的一个word;另外当时的下游任务很多都和物体有很强的联系,例如VQA),一般是在Visual Genome上训练,这个数据集有1600个类400个属性,因为多模态希望图像能覆盖更多特征,能和文本匹配起来。目标检测非常贵
  • +
  • pixel-BERT能够不用目标检测抽特征,直接用resnet的特征
  • +
  • 作者认为上面的任务基本关注图像编码器的性能,而没有关注效率,推理开销很大
  • +
  • 本文受启发于ViT,把图像打成patch,然后将patch变成linear embedding
  • +
  • 模态融合的方法
  • +
  • single-stream:两种输入直接连接然后给模型
  • +
  • dual-stream:两种输入分别给一个模型然后在某个时候融合起来
  • +
  • 本文三点贡献
  • +
  • 简单,推理速度快
  • +
  • 性能比较好
  • +
  • 使用数据增强,之前多模态学习用数据增强比较少,因为增强之后可能语义信息发生mismatch,作者发现数据增强还是比较好的
  • +
+

相关工作

+
    +
  • +

    VLP模型分类

    +
  • +
  • +

    image-20230505211706144

    +

    上图VE表示视觉Embedding,TE是文本Embedding,MI是模态融合

    +
  • +
  • +

    CLIP适合抽特征,但是融合比较轻量就不太适合做下游任务,因为它的融合是不可学习的简单的点乘

    +
  • +
  • +

    前两年主要研究的是方法c,模态融合也使用Transformer

    +
  • +
  • +

    作者认为抽特征影响不大,模态融合比较重要

    +
  • +
  • +

    模态融合

    +
  • +
  • +

    single-stream:两个序列直接compact然后放到模型里

    +
  • +
  • dual-stream:先各自通过模型然后在过程中融合
  • +
  • +

    作者认为第二种方法比较贵

    +
  • +
  • +

    语言特征抽取:一般都使用预训练的BERT

    +
  • +
  • +

    视觉特征抽取

    +
  • +
  • +

    区域学习 Region Feature:Backbone抽特征(ResNet)+ RPN网络抽ROI,然后用NMS将ROI降低到固定数量 + RoI Head将bounding box变成一维向量

    +
    +

    RPN网络是一种用于目标检测的神经网络,全称为Region Proposal Network。它是在Faster R-CNN模型中提出的一种新型网络结构,用于生成候选区域并对其进行分类,以提高目标检测的准确性和效率。RPN网络可以在一张图像中生成多个候选区域,每个区域都有可能包含目标物体,然后再通过后续的网络结构对这些候选区域进行分类和定位。RPN网络通常使用卷积神经网络(CNN)来提取特征,具有较高的计算效率和准确性。

    +

    ROI(Region of Interest)在目标检测中是指感兴趣区域,即图像中可能包含目标的区域。在目标检测中,先通过一些预处理方法(如边缘检测、图像分割等)找到图像中的ROI,然后对这些ROI进行特征提取、分类等操作,以判断其中是否包含目标物体。ROI的准确性和有效性对目标检测的结果影响很大。

    +
    +
  • +
  • +

    Grid Feature:比较贵且性能下降极大

    +
  • +
  • +

    Patch Projection:借鉴ViT,只使用patch

    +
  • +
+

方法

+
    +
  • +

    模型结构:Transformer Encoder

    +
  • +
  • +

    将图片和文本变成Embedding之后需要在前面加一些指示Flag,因为single-stream不能区分图像文本,所以需要在前面加0/1表示文本或图像;文本和图像最前面需要加CLS Token;另外需要加position embedding;注意这里三个Embedding是相加的而不是拼接

    +
  • +
+

image-20230505213213279

+
    +
  • +

    loss:Image Text Matching + Masked Language Modeling + Word Patch Alignment,最后一种用的人比较少,也是想算文本和图像特征相似度,利用Optimal Transport最优运输理论,简单理解是输出的文本特征和图像特征各有一个概率分布,作者计算了两个分布之间的距离。第二种loss就是BERT的完型填空

    +
  • +
  • +

    Whole Word Masking

    +
  • +
  • +

    之前用的是WordPiece Token,就是将一个word切成几份,如果中间mask掉一个的话,模型可以根据首尾几个字母直接猜出来,而不用去从图像中学,相当于一个Shortcut。所以直接将整个word去掉

    +
  • +
  • +

    这个trick很有效

    +
  • +
  • +

    数据增强

    +
  • +
  • +

    RandAugment,但是不使用Color inversion和cutout

    +
  • +
+

实验

+
    +
  • 预训练
  • +
  • 数据集:
      +
    • MSCOCO:一个图片有5个Caption,标题比较长
    • +
    • VG:标题非常多,但比较短
    • +
    • GCC:一个图片一个标题,标题比较长
    • +
    • SBU:同上
    • +
    +
  • +
  • 这四个数据集一般称作 4Million,因为这些图片相加数量大概是4M
  • +
  • 前两个图片在数据集里,后两个放的是URL导致很多图片失效了
  • +
  • 结论:取舍比较好
  • +
+

结论和未来工作

+
    +
  • 未来工作
  • +
  • scalability
  • +
  • 图像完型填空,MAE非常有前途
  • +
  • 数据增强很有用
  • +
  • 当你不知道做什么可以读最近的Future Work,主要担心手速
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505220338385-16832954190071.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505220338385-16832954190071.png" new file mode 100644 index 00000000..336674e5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505220338385-16832954190071.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505220338385.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505220338385.png" new file mode 100644 index 00000000..336674e5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505220338385.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505221359787.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505221359787.png" new file mode 100644 index 00000000..7a6cd458 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505221359787.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505221746436.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505221746436.png" new file mode 100644 index 00000000..04ff465a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505221746436.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505223105725.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505223105725.png" new file mode 100644 index 00000000..a1f72f7b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505223105725.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224042804.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224042804.png" new file mode 100644 index 00000000..e044e71e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224042804.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224114661.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224114661.png" new file mode 100644 index 00000000..f8b7fc2d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224114661.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224743495.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224743495.png" new file mode 100644 index 00000000..0486b7c5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505224743495.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233152152.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233152152.png" new file mode 100644 index 00000000..349429d9 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233152152.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233254589.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233254589.png" new file mode 100644 index 00000000..4d8f3b22 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233254589.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233401300.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233401300.png" new file mode 100644 index 00000000..5dd1cdca Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505233401300.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505234021903.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505234021903.png" new file mode 100644 index 00000000..f2b6841c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505234021903.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505235704175.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505235704175.png" new file mode 100644 index 00000000..e97e7184 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230505235704175.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506000154178.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506000154178.png" new file mode 100644 index 00000000..fa8f1627 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506000154178.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506000321367.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506000321367.png" new file mode 100644 index 00000000..a4d615c4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506000321367.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506001157848.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506001157848.png" new file mode 100644 index 00000000..84400226 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506001157848.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506002858074.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506002858074.png" new file mode 100644 index 00000000..7421c4e1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506002858074.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506010406437.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506010406437.png" new file mode 100644 index 00000000..3e21a137 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506010406437.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506011513345.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506011513345.png" new file mode 100644 index 00000000..dbd4f8b6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506011513345.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506012027855.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506012027855.png" new file mode 100644 index 00000000..14433953 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506012027855.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506012728607.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506012728607.png" new file mode 100644 index 00000000..2e69c817 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506012728607.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506120736882.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506120736882.png" new file mode 100644 index 00000000..1cda83b6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506120736882.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506121148588.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506121148588.png" new file mode 100644 index 00000000..c7dbabac Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506121148588.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506121201009.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506121201009.png" new file mode 100644 index 00000000..d779f033 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506121201009.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506135644684.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506135644684.png" new file mode 100644 index 00000000..1afe6171 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506135644684.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506140742341.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506140742341.png" new file mode 100644 index 00000000..7a339b4c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506140742341.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506142237201.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506142237201.png" new file mode 100644 index 00000000..91e2e0ba Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506142237201.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506142739442.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506142739442.png" new file mode 100644 index 00000000..e2406e9d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506142739442.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506143649935.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506143649935.png" new file mode 100644 index 00000000..16b9fd01 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262.assets/image-20230506143649935.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262/index.html" new file mode 100644 index 00000000..6963cd5c --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/34-CLIP\344\270\262\350\256\262/index.html" @@ -0,0 +1,5070 @@ + + + + + + + + + + + + + + + + + + + + + + + + + CLIP串讲 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

CLIP串讲

+

总览

+

image-20230505220338385

+

回顾

+
    +
  • 文本经过Encoder得到文本特征,图像经过Encoder得到图像特征,然后进行文本图像对的对比学习
  • +
  • 做分类任务的时候:将类别通过prompt template通过文本编码器形成很多query,然后图像通过图像编码器得到一个图像特征,然后相当于依次问query,得到图像特征和文本特征之间的相似度
  • +
+

分割

+
    +
  • +

    分割和分类很像,相当于像素级别上的分类。Paperwithcode上分割论文最多,因为分类任务都能直接在分割上用

    +
  • +
  • +

    Language-Driven Semantic Segmentation

    +
  • +
  • +

    架构:和CLIP非常像。图像特征变成了dense feature密集特征,然后做点积做融合

    +

    图像Encoder使用的是DPT,相当于ViT+Decoder,将原图降维一些。不看上面的文本信息其实和分割模型是一样的。

    +

    说是zero-shot但是是有监督的学习,不是对比学习(无监督学习)的loss

    +

    image-20230505221746436

    +
  • +
  • +

    训练:文本编码器就是用的CLIP,并且由于分割数据集小,所以freeze了整个文本编码器。图像编码器使用CLIP反而不行,用ViT更好,很难解释

    +
  • +
  • +

    Zero-Shot的效果比之前用ResNet的OneShot的效果差很多,提升空间很大

    +
  • +
  • +

    CLIP其实关注算图像和文本之间的相似性,所以如果把上面的标签other换成一些抽象的虚词也可以替代原来的other的效果,并不是真正的分类

    +
  • +
  • +

    Group ViT: Semantic Segmantation Emerges from Text Supervision

    +
  • +
  • +

    上面的工作还依赖于手工标注,如何做到无监督训练是更被关注的

    +
  • +
  • +

    架构

    +

    之前做无监督分割的时候经常用一种方法叫Grouping,如果有一些聚类中心点,然后从这个点开始发散,然后逐步扩充成一个Group,自下而上的方法,这个Group就相当于一个segmentation mask

    +

    作者在ViT的框架中加上Grouping Block以及可学习的Group Tokens,在浅层的分割效果一般,但到上层效果就很好了

    +

    一开始Group Tokens维度是64表示一开始有64个聚类中心(替代了之前一个CLS,因为之前想用一个Token来代表整个图片),384是ViT模型特征长度

    +

    经过6个Transformer Layers之后然后进入Group Block,Group Block的作用是将图像特征进行一次Assign,相当于将图像特征cluster到一个聚类中心去,所以得到64个Segmentation Token

    +

    image-20230505224042804

    +

    具体的Group Block如下:类似自注意力。聚类中心的分配是不可导的(?),所以这里用一个gumbel softmax将此过程转变为可导的

    +

    image-20230505224114661

    +

    之后再加新的Group Tokens,来进一步减少聚类中心,最后得到8个聚类中心

    +

    loss使用CLIP的对比学习,文本直接得到文本特征,图像最后8个特征经过平均池化加MLP得到图像特征

    +
  • +
  • +

    zero-shot推理:就是图像有8个特征,然后文本一个特征算相似性,最大的局限是最多只有8类

    +

    image-20230505224743495

    +
  • +
  • +

    背景类:设置前景的阈值,如果所有的Embedding都小于阈值则将其分给背景类。导致的问题就是如果图像内类别很多置信度就不够高。作者发现Group ViT分割做的很好,但是语义分割不太好,可能是因为CLIP只能学到物体语义信息非常明确的物体

    +
  • +
+

目标检测

+
    +
  • +

    Open-Vocabulary Object Detection Via Vision and Language Knowledge Distillation

    +
  • +
  • +

    CLIP当老师蒸馏网络,open-vocabulary就是任意类别

    +
  • +
  • +

    image-20230505233152152

    +
  • +
  • +

    方法

    +
      +
    • 架构对比:
    • +
    +

    image-20230505233254589

    +
      +
    • Baseline:相当于MaskRCNN,两阶段的分类器,第一个阶段会得到Region Proposal(第一阶段略了,最底下就是Proposal),然后通过Detection Head得到分类头,然后通过Classifier得到Bounding Box是什么类。一般分成两类,怎么定位(Bounding Box画的准不准)以及怎么分类(Bounding Box内物体判断准不准)。在基础类上做有监督的训练
    • +
    +

    image-20230505233401300

    +
    +

    目标检测中的proposal是指对输入图像中可能包含目标的区域进行预测和筛选,生成一组候选框,即候选区域。这些候选区域通常是在输入图像中的各个位置和尺度上生成的,可以包含目标或不包含目标。目标检测算法会在这些候选框中寻找目标,并进行分类和定位。生成proposal的方法有很多种,常见的包括滑动窗口、选择性搜索、快速RCNN中的候选框网络等。

    +
    +
      +
    • ViLD-text:和CLIP一样,提取图像特征和文本特征,然后点乘算相似度。在基础类上有监督的训练,文本来自物体的类别,所以只是将两种特征进行关联,zero-shot能力较弱。由于是只用基础类,不在基础类的物体直接设为back ground
    • +
    +

    image-20230505234021903

    +
      +
    • ViLD-image:知识蒸馏,将输入的Proposals通过CLIP得到图像特征,然后另一只学习Region Embedding尽可能和CLIP得到的文本特征相近。大大加强了open-vacabulary能力,但是注意输入是M个pre-computed proposals而不是n,但是CLIP使用的ViT-Large做前向过程非常贵,所以就预抽取特征
    • +
    +

    image-20230505235704175

    +
      +
    • ViLD:测试的时候是不会用到右边一支的
    • +
    +

    image-20230506000154178

    +
  • +
  • +

    模型总览图

    +

    image-20230506000321367

    +
  • +
  • +

    GLIP

    +
  • +
  • +

    标题:Grounded Language-Image Pre-training

    +
  • +
  • +

    作者找到一类任务是Vision Grounding,将一句话中的物体在图片中找到,和目标检测类似,但是多一个文本信息,作者发现可以把Detection和Phrase Grounding任务融合起来从而获得了更大的数据集,另外可以使用伪标签等技术可以在没有标注过的图像文本对上生成Bounding Box标签从而扩大数据集数量

    +
  • +
  • +

    背景:Vision Grouding任务和目标检测的任务的联系,目标检测的loss是分类loss+定位loss,Vision Grounding的定位loss是一样,但是分类loss不一样。目标检测的标签是一个或两个词,是one-hot标签,而Vision Grounding是句子

    +

    目标检测的分类Loss:\(O\)是图片每个Bounding Box的特征 \(N\times d\)\(W\)是分类器矩阵,得到\(S\)是logits,最后算一个Loss

    +

    image-20230506002858074

    +

    Vision Grounding的分类Loss:计算图片区域和句子中的word匹配分数\(S_{ground}\)

    +

    image-20230506001157848

    +

    Img通过Encoder得到Region Embedding,Prompt通过Encoder得到文本Embedding,然后算相似度。这块和ViLD-text一样

    +

    接下来的任务就是如何将这两个任务统一起来,只要做一个小小改动即上面时候算是positive match,什么时候是negative match

    +

    作者发现GLIP可以迁移到任何一个目标检测的数据集上,接下来就是看如何扩大数据集

    +
  • +
  • +

    作者既使用Detection数据集又使用Grounding数据集做预训练。Detection用的是Object365,在Object365上做预训练然后在COCO上做微调一般都会非常好;Grounding用的是GoldG,有Bounding Box Annotation。作者还想要更大的数据集,于是引入unlabeled的Cap24M(图像文本对),但是需要知道Bounding Box和Box内物体的信息,所以作者使用伪标签,直接使用小模型(GLIP-T(C))给这些图像文本对做推理打标签(Self-Training)。伪标签一般效果会更好

    +
    +

    Bounding Box Annotation是指在图像或视频中对目标物体进行框选标记的过程,通常用于目标检测、物体识别、跟踪等计算机视觉任务中。这种标记通常用矩形框或正方形框来表示目标的位置和大小。在深度学习中,Bounding Box Annotation是训练物体检测和识别模型的重要步骤之一。对于每个目标,需要标注出其在图像中的位置、大小和类别等信息,以便模型能够从图像中正确地识别和定位目标。

    +
    +
  • +
  • +

    总体框架

    +

    下图Matrix里是监督学习,我知道每个Bounding Box对应的文本,所以可以算相似度的Alignment Loss,另外有Ground Truth可以做Localization Loss。

    +

    Deep Fusion阶段本来是获得了两种Embedding就直接算相似度矩阵,但是这里多加一些层数来使其进行融合,本文使用Cross Attention。这种Deep Fusion可以用到分割中,比如GroupViT有两个分支可以做EarlyFusion

    +

    检测和分割都属于稠密预测,很多方法可以互相借鉴

    +

    image-20230506010406437

    +
  • +
  • +

    GLIP v2: Unifying Localization and VL Understanding

    +
  • +
  • +

    融合更多的任务和更多的数据集,将所有带定位(分割检测)和Vision-Language的任务都融合起来(VQA、Vision Grounding、Vision Caption)

    +
  • +
  • +

    架构:统一框架,融合更多文本任务、数据集、模态

    +

    image-20230506011513345

    +
  • +
+

图像速写

+
    +
  • +

    CLIPasson: Semantically-Aware Object Sketching(SIGGRAPH)

    +
  • +
  • +

    CLIP+毕加索,保持语义信息的物体速写

    +
  • +
  • +

    之前的工作就是data-driven,抽象程度由数据集控制,数据集有如下:

    +

    image-20230506012027855

    +

    但里面最大的数据集也就是QuickDraw,只有300多类

    +
  • +
  • +

    CLIP对物体的语义信息抓取的特别好,同时zero-shot能力很强,文献中提到CLIP抽取的特征特别稳健,不光在自然图像上,于是作者认为可以运用到简笔画上

    +
    +

    CLIP is exceptional at encoding the semantic meaning of visual depictions, regardless of their style

    +

    https://distill.pub/2021/multimodal-neurons

    +
    +
  • +
  • +

    本文可以根据笔画的多少来决定抽象的程度

    +
  • +
  • +

    架构

    +

    每张图是由Sketch组成的(\(S_i\)表示Sketch),每个Sketch是一条贝塞尔曲线,每条曲线由4个点决定

    +

    本文主要的贡献是最初的初始化以及最后的训练,中间的光栅化器是之前的工作。主要思想也是利用CLIP特征的稳健性来进行知识蒸馏,作者认为风格改变不会影响前后两张图的语义信息,所以我需要将这两个特征尽可能接近,所以设计了第一个loss函数 \(L_s\) 即 基于语义的特征;另外还需要几何上的一些限制即 \(L_g\),用ResNet50前几层的图像做几何上的Loss,因为前面的特征图还有长宽概念,所以可以来做几何上的限制,而后面的特征已经只剩下语义特征了。

    +

    image-20230506012728607

    +
  • +
  • +

    作者发现初始化非常重要,所以作者提出基于saliency的初始化方式,使用ViT最后一层多头自注意力取一个加权平均得到saliency map然后看哪些区域更显著,在这些显著的区域行采点。其实就是已经知道物体的边界,在沿着边界画点了

    +
  • +
  • +

    作者还加了一个后处理,每次生成3张简笔画,然后根据\(L_g / L_s\)然后返回最好的画

    +
  • +
  • +

    局限性

    +
      +
    • 图像有背景就比较难做,可能是因为自注意力图上取点比较难,作者的方法是使用U2Net先抠图
    • +
    • 生成是一下子生成的,但是人画图是序列画出的,可以做成自回归
    • +
    • 控制笔画数需要提前指定,但是不同图片需要的抽象程度是不一样的
    • +
    +
  • +
+

视频

+
    +
  • +

    CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval

    +
  • +
  • +

    任务是Video Text Retrieval,CLIP天生适合Retrieve / Ranking / Matching 相关任务,因为CLIP就是算Video和Text的相似性

    +
  • +
  • +

    双塔结构

    +

    图像和文本编码器分开,得到特征之后做点乘得到相似度,扩展性比较好,可以提前将大的数据集的特征先抽取好

    +

    image-20230506121148588

    +

    文本直接放到Transformer得到一个CLS Token,图像多帧依次放入得到多个CLS Token。原来是一个文本特征对应一个图像特征直接做点乘计算相似度,现在是一文本特征对应十个图像特征,本文是empirical study,所以就尝试了各种方法来看哪个效果最好

    +

    image-20230506121201009

    +
      +
    • +

      平均池化(作者称为Parameter Free):简单,但是没有考虑时序信息,例如做下和站起取平均是一样的,接受度最高

      +
    • +
    • +

      LSTM 或 Transformer+Positional Embedding

      +
    • +
    • +

      Early Fusion(作者称为Tight Type),之前的方法是Late Fusion即抽完特征考虑如何融合,这里是一开始就融合,直接用同一个Transformer

      +
    • +
    +
    +

    机器学习中的Video Text Retrieval(视频文本检索)任务是指在视频中检索与文本查询相关的视频片段。具体来说,给定一个查询文本,该任务的目标是找到与该文本相关的视频片段。这些视频片段可以是包含查询文本中的关键词的视频,或者与查询文本语义相似的视频。该任务在视频内容分析、视频搜索和视频推荐等领域具有广泛的应用。

    +

    在机器学习和信息检索中,Recall(召回率)是指在所有相关文档中,被正确检索出来的文档数与所有相关文档总数之比。换句话说,召回率表示了检索系统能够找到多少与查询相关的文档。

    +

    公式表示为:

    +

    Recall = TP / (TP + FN)

    +

    其中,TP表示真正例(被正确检索出来的相关文档数),FN表示假反例(未被检索出来的相关文档数)。

    +

    召回率越高,说明检索系统能够找到更多的相关文档,但同时可能会将一些不相关的文档也检索出来。因此,召回率与准确率(Precision)一起被用来评估检索系统的性能。

    +
    +
  • +
  • +

    实验

    +
      +
    • CLIP提点非常多,迁移能力很强
    • +
    • 少量数据集取平均是最好的,数据量大的时候用后面的方法比较好一些,数据量不大的时候不建议微调。平均其实工作挺好的
    • +
    • Tight Type最差,可能是下游数据集不够多
    • +
    +
  • +
  • +

    Insight

    +
      +
    • CLIP预训练之后再在数据数据集上post-pretrain一下可能迁移效果更好,但是计算代价比较高
    • +
    • 3D Linear Projection效果稍微好一些,融合了时序信息
    • +
    • 无监督训练好的模型参数做下游FineTune的时候会对学习率非常敏感(就像MoCo一样),各个模型能否成功很看学习率的设置
    • +
    +
  • +
  • +

    ActionCLIP: A New Paradigm for Video Action Recognition

    +
  • +
  • +

    视频领域更火的任务:动作识别,其实就是分类任务但是加上额外的时序信息

    +
  • +
  • +

    之前的方法:

    +

    视频通过Video Encoder得到输出,然后和Ground Truth做对比,然后就可以算起loss,但是问题是视频理解的标签不好标,one-hot label比较难代表其全部语义,动作识别的label是一个短语,label space很大,导致遇到新类效果不好。所以最理想是先学一个很好的特征,然后zero-shot或者few-shot去做下游任务是最理想的

    +

    作者提出的方法和CLIP很像,VideoEncoder和CLIP4Clip很像;在batch比较大的时候同一行同一列里可能有多个正样本对

    +

    image-20230506135644684

    +
  • +
  • +

    模型

    +
      +
    • 文本Prompt见(b),就是前缀、完型填空和后缀,和之前的prompt engineering一样
    • +
    • 视觉Prompt
    • +
    • (c) Pre-network Prompt:输入的时候加上时序信息
    • +
    • (d) In-network Prompt:利用Shift概念,在特征图上做各种移动,和Swin的Shift Window类似,增加TSM(temporal shift module),TSM主打zero cost
    • +
    • (e/f/g) Post-network Prompt:和CLIP4Clip一样,如何将视频多个特征融合成一个特征
    • +
    +

    image-20230506140742341

    +
  • +
  • +

    实验

    +
      +
    • pre-train:发现文本随机初始化和CLIP初始化效果相近,所以大家都更关注图像(一般用ViT初始化,用BERT初始化效果就不太好)
    • +
    • prompt
    • +
    • 文本:效果不显著
    • +
    • 图像:有用的就是Post-network,和CLIP4Clip不同,mean pooling效果一般,原因可能是视频数据集非常大,用Transformer来做FineTune效果会更好
    • +
    +
  • +
+

Vision-and-Language

+
    +
  • How Much Can CLIP Benefit Vision-and-Language Tasks?
  • +
  • CLIP本身是多模态,一般大家都是放到别的领域去尝试,但是本文是用CLIP做多模态初始化看效果
  • +
  • 这也是Empirical Study,用CLIP作为视觉编码器的初始化做各种Fine-Tune看效果
  • +
+

Audio

+
    +
  • +

    AudioCLIP: Extending CLIP to Image, Text and Audio

    +
  • +
  • +

    架构:仿照CLIP做对比学习,加入Audio模态

    +

    image-20230506142237201

    +
  • +
+

3D

+
    +
  • +

    PointCLIP: Point Cloud Understanding by CLIP

    +
  • +
  • +

    CLIP学习到了很好的2D特征,作者想迁移到3D

    +
  • +
  • +

    架构:将3D点云投影到2D深度图,由于CLIP支持各种风格,所以这种深度图也能支持。文本prompt改成了point clound depth map of

    +

    image-20230506142739442

    +
  • +
+

其他

+
    +
  • +

    Can Language Understand Depth?

    +
  • +
  • +

    深度估计任务

    +
  • +
  • +

    CLIP对概念理解不太好,因为对比学习不适合学概念,而深度信息就是概念。所以之前做optical flow和depth estimation和主流CV不太一样,往往不做初始化

    +
  • +
  • +

    流程图

    +

    作者将深度估计任务从回归问题看成分类问题,强制将深度分成了几类,和LSeg很像

    +

    image-20230506143649935

    +
    +

    回归问题和分类问题是机器学习中两种不同的问题类型。

    +

    回归问题是指预测连续值的问题,例如房价预测、股票价格预测等。回归问题的目标是预测一个数值,通常是一个实数值。

    +

    分类问题是指将数据分为不同的类别的问题,例如垃圾邮件分类、图像分类等。分类问题的目标是将每个数据点分为一个或多个已知的类别中的一个。

    +

    回归问题和分类问题的区别在于它们的输出类型不同。回归问题的输出是一个连续值,而分类问题的输出是一个或多个离散的类别。此外,回归问题通常涉及到连续的输入变量,而分类问题通常涉及到离散的输入变量。

    +
    +
  • +
+

总结

+

CLIP的使用场景:

+
    +
  • 改动最小,只适用CLIP抽取的特征,加强之前的训练
  • +
  • CLIP做teacher来蒸馏
  • +
  • 不使用CLIP参数,借鉴它多模态对比学习的思想,然后我定义正负样本
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145428219.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145428219.png" new file mode 100644 index 00000000..f538c7e0 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145428219.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145448870.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145448870.png" new file mode 100644 index 00000000..ad100e04 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145448870.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145516061.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145516061.png" new file mode 100644 index 00000000..2ff4e645 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145516061.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145616895.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145616895.png" new file mode 100644 index 00000000..709d8219 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought.assets/image-20230506145616895.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought/index.html" new file mode 100644 index 00000000..b4b7ef5e --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/35-ChainOfThought/index.html" @@ -0,0 +1,4704 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ChainOfThought - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

ChainOfThought

+

标题

+
    +
  • Chain of Thought Prompting Elicits Reasoning in Large Language Models
  • +
  • 科研梗:Let's think step by step,在Prompt中加上这一点就能涨点
  • +
+

背景知识

+
    +
  • +

    Prompt类型

    +
  • +
  • +

    Zero-Shot

    +

    image-20230506145428219

    +
  • +
  • +

    Zero-Shot-CoT

    +

    image-20230506145448870

    +
  • +
  • +

    Manual-CoT:手动构造样例

    +

    image-20230506145516061

    +
  • +
  • +

    Auto-CoT:Self-Training,先用Let's think step by step得到样例输入然后拼接在一起作为样例,然后接输入

    +

    image-20230506145616895

    +
  • +
+

引言

+
    +
  • System-1任务:LLM在分类任务上效果很好,这类很快完成并被人类理解的任务是System-1任务
  • +
  • System-2任务:涉及逻辑数学和常识的推理任务,LLM很难完成。flat scaling curves:System-2任务不随参数量的增加而性能增强
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506153914436.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506153914436.png" new file mode 100644 index 00000000..21dcc1b7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506153914436.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154336010.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154336010.png" new file mode 100644 index 00000000..7bea178a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154336010.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154411112.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154411112.png" new file mode 100644 index 00000000..597d3eaa Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154411112.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154958518.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154958518.png" new file mode 100644 index 00000000..03e748d7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper.assets/image-20230506154958518.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper/index.html" new file mode 100644 index 00000000..0f8e3ae2 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/36-Whisper/index.html" @@ -0,0 +1,4732 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Whisper - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Whisper

+

标题

+
    +
  • Robust Speech Recognition via Large-Scale Weak Supervision
  • +
  • 弱监督:有标号但是质量一般
  • +
  • 省流:OpenAI使用大量数据大量任务训练出来的大模型,zero-shot
  • +
  • 训练材料68万小时
  • +
+

引言

+
    +
  • Wave2Vec使用对比学习,采样大量没有标号的wave之后使用例如挖空等方法做预训练Encoder,然后抽取特征在下游任务上做微调
  • +
  • 作者认为之前的工作使用无监督学习,没有好的解码器,需要做微调,但是微调很花时间同时容易过拟合泛化性不好。所以作者认为编码器已经够好,但是解码器不够好(从wave格式转文字等)
  • +
  • 目前的有监督训练集加起来大概5000小时,但是无监督训练集接近100万小时
  • +
  • 作者提出一个训练集68万小时,多语言且有很多翻译
  • +
+

方法

+
    +
  • +

    数据处理

    +
  • +
  • +

    使用过滤器去除机器生成的label;

    +
  • +
  • 使用其他语音识别软件来判断语音和文本的语言是否一致(如果文本是英语就不判断音频的语言,因为有翻译任务);
  • +
  • 文本去重
  • +
  • +

    先训练一个模型然后去推理,检查正确率低的样本发现很多语音和文本是对不上的,就把这些去掉

    +
  • +
  • +

    架构:就是Transformer,一开始使用卷积来抽取局部特征

    +
  • +
+

image-20230506153914436

+
    +
  • 这个大模型覆盖了多任务,但是会有缺陷,例如有些任务不希望推理成本过大、某个任务性能不好通过训练加强是否会影响其他任务性能。具体多任务包括:
  • +
+

image-20230506154336010

+

不同任务用的是不同token来区别,共用输出层:

+

image-20230506154411112

+

实验

+
    +
  • +

    zero-shot,为了符合某些数据集test的要求,手动做了一些normalize

    +
  • +
  • +

    比较:虽然是LibriSpeech上的WER别的模型已经刷到非常低了,但是迁移到别的数据集错误率非常高,而Whisper的迁移能力很强

    +
  • +
+

image-20230506154958518

+
    +
  • 发现对于中文、韩语、阿拉伯语,虽然数据比较多,但是效果没有那么好
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506160950487.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506160950487.png" new file mode 100644 index 00000000..322a86d1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506160950487.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506162751699.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506162751699.png" new file mode 100644 index 00000000..41b7c0fa Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506162751699.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506164449230.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506164449230.png" new file mode 100644 index 00000000..b95e5536 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506164449230.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506170539853.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506170539853.png" new file mode 100644 index 00000000..e9ff917a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506170539853.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506171229438.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506171229438.png" new file mode 100644 index 00000000..4e541064 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506171229438.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506171937614.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506171937614.png" new file mode 100644 index 00000000..d3c3e8d5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506171937614.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506174603711.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506174603711.png" new file mode 100644 index 00000000..bd500593 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506174603711.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506175219225.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506175219225.png" new file mode 100644 index 00000000..d90801d7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506175219225.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506175745823.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506175745823.png" new file mode 100644 index 00000000..d64a3b50 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506175745823.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506181617784.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506181617784.png" new file mode 100644 index 00000000..e6c3cc8d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506181617784.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506182130178.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506182130178.png" new file mode 100644 index 00000000..9360c1ec Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506182130178.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506220449406.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506220449406.png" new file mode 100644 index 00000000..bcd5d9fa Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506220449406.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506222139821.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506222139821.png" new file mode 100644 index 00000000..7bf9901e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506222139821.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506224238037.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506224238037.png" new file mode 100644 index 00000000..85ce7b1f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506224238037.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506224700805.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506224700805.png" new file mode 100644 index 00000000..6fcd1c24 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506224700805.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506230825441.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506230825441.png" new file mode 100644 index 00000000..ae207f94 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506230825441.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232114938.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232114938.png" new file mode 100644 index 00000000..6a3f18f0 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232114938.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232220650.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232220650.png" new file mode 100644 index 00000000..37e25069 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232220650.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232243306.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232243306.png" new file mode 100644 index 00000000..6cab9acd Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262.assets/image-20230506232243306.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262/index.html" new file mode 100644 index 00000000..c321de4f --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/37-\345\244\232\346\250\241\346\200\201\344\270\262\350\256\262/index.html" @@ -0,0 +1,4905 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 多模态学习 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

多模态学习

+

背景

+
    +
  • 多模态的结构应该偏向c,但是Visual Encoder应该使用ViT去掉之前的目标检测,另外ViT之前使用WPA(Word Patch Alignment,启发于目标检测) Loss训练比较困难,可以换用MLM Loss(Masked Language Modeling)以及ITM Loss(Image Text Match),CLIP使用的是ITC(Image Text Contrastive对比学习),我们可以都用上这三种Loss
  • +
+

image-20230506162751699

+

Encoder架构

+
    +
  • +

    ALBEF

    +
  • +
  • +

    标题:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation

    +
  • +
  • +

    架构:

    +

    图像使用12层Transformer编码器,文本把12层的BERT切成两个部分先6层Encoder然后6层多模态融合,符合:图像Encoder大于文本Encoder;模态融合模型要大

    +

    Loss用的也是上面提到的 MLM / ITM / ITC

    +

    image-20230506164449230

    +
  • +
  • +

    摘要:

    +
      +
    • 作者对目标检测的态度和ViLT不太一样,后者觉得是推理成本大,而本文认为使用预训练的目标检测器直接抽特征,会和文本特征不够align,没有进行end-to-end的训练导致多模态编码器不好学。所以作者提出在Fusion(多模态编码器)之前就先用ITC对比学习进行Align(其实就是CLIP)
    • +
    • 数据从noisy网络上下载的(文本是AltText,搜索引擎上的文本对图像的描述能力不高,这就是noisy web data问题),为了提高学习,作者提出了momentum distillation,自训练,就是用伪标签,作者使用Momentum Model(回顾MoCo)生成伪标签
    • +
    • ALBEF比较亲民,适合做多模态
    • +
    +
  • +
  • +

    方法:

    +
      +
    • +

      图片用的是就是ViT,而文本这边本来可以直接用BERT然后再在后面加个大的多模态Encoder,但是为了保持最优配比,即图像部分模型和多模态模型要大,所以这边就把BERT劈成两半,初始化用的就是BERT

      +
    • +
    • +

      另外有一个Momentum Model,它的参数是旧的ALBEF参数,动量更新,moving average设的很高0.995使之不会很快更新,从而使得产生的特征更加稳定

      +
    • +
    • +

      Align阶段:抽完特征之后和MoCo一模一样,先downsample和normalization,然后将正负样本对比进行第一阶段的学习

      +
    • +
    +

    image-20230506170539853

    +
      +
    • +

      最后ITM其实就是二分类任务,在ALBEF后面加个FC来检查输入文本\(T\)和输入图像\(I\)是否是一对,但是这个任务难度很低,负样本和正样本的区别很大(可能经过ITC),很快就能让准确度提很高,所以这里给负样本加constraint,其实就是选择最接近正样本的负样本,选择的方法是选择同一个batch里在ITC中相似度最高的negative(称之hard negative,即已经非常相似我仍然认为其是negative)

      +
    • +
    • +

      MLM:完型填空,将文本masked之后变成\(T'\),所以会发现该模型要做两次前向过程。多模态学习往往要做多种Loss所以可能要做多次前向过程来得到不同的Loss

      +
    • +
    +

    image-20230506171229438

    +
      +
    • 动量蒸馏:原因是noisy data,文本中描述的不在图像里,图像的物体没有在文本中,导致ITC中negative可能也描述了文本内容(甚至描述的比Ground Truth都好,但是我们依旧认为它是negative),另外MLM完型填空的时候其实可以填很多单词。所以作者认为one-hot label(即一张图一个label)对ITC和MLM不好,作者另外使用一个Momentum Model来得到一些伪标签(非one-hot label,就是Softmax出来的softmax score)。这个Momentum Model是对目前的模型做EMA
    • +
    +

    由于伪标签是Softmax Score,所以算的是KL散度,例如 ITC 的更新:

    +

    image-20230506171937614

    +

    ITM 没有使用动量更新,是因为 ITM 是二分类任务,就是需要知道Ground Truth

    +
  • +
  • +

    实验:测试了五个下游任务,检索(图搜文、文搜图、图搜图、文搜文、看Recall,有R1 R5 R10)、视觉蕴涵Visual Entailment(前后两句话之间的关系,蕴涵矛盾中立,三分类问题)、视觉问答Visual Question Answering(有两种,闭集VQA即选答案,开集VQA即生成答案,用的是闭集VQA)、Visual Reasoning(一个文本能否同时描述一对图片,二分类任务)、Visual Grounding

    +
      +
    • 消融实验:ITC提升巨大,Hard Negative都有提升(Hard Negative在对比学习中很有效),Momentum Model一般(但是研究noisy data中提取特征是有趣的方向)
    • +
    • 图文检索数据集Flickr30K和MSCOCO已经都刷爆了,需要新的数据集,更大或者annotated更好的数据集,或者的视频文本检索数据集
    • +
    +
  • +
  • +

    VLMo: Unified Vision-Language Pre-training with Mixture-of-Modality-Experts

    +
  • +
  • +

    研究动机1:目前主流有两种结构

    +
      +
    • 像CLIP和ALIGN的双塔结构(文本和图像分开,只在上面做个简单的cosine算相似度融合)开销低适合大规模图像文本检索,但是交互比较弱,不适合做难的场景
    • +
    • Fusion就上面的ALBEF,检索等开销非常大
    • +
    • 所以作者希望能够融合这两种架构的优点,所以使用不同的FC产生vision expert / language expert / multi-modality expert
    • +
    • MOE结构(mixture of experts)
    • +
    +
  • +
  • +

    研究动机2:使用的目标函数也是上面三种,需要大量数据,但是当时多模态的数据不多,所以作者使用stagewise pre-training strategy,因为单模态的数据非常多,所以就让vision expert和language expert分别在各自数据集上训练,之后再在多模态上做训练,效果就很好

    +
  • +
  • +

    架构:

    +
  • +
+

每个Block和Transformer Block很像,之是最后用不同的FFN(Feed-forward Network),三个不同的FFN是不share weights,但是自注意力层是share weights(说明自注意力不挑输入形式,适合多模态学习)

+

ITC就是CLIP,ITM是Fusion Encoder形式

+

好处就是灵活

+

image-20230506174603711

+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
+9
> 
+> FFN和FC和MLP都是神经网络的类型,但它们有一些不同之处。
+>
+> FFN(Feedforward Neural Network)是一种前向传播神经网络,其输入只能从输入层到输出层流动,没有反馈路径。常见的FFN包括单层感知机和多层感知机。
+>
+> FC(Fully Connected)是一种全连接层,也称为密集层。在FC层中,每个输入神经元都连接到每个输出神经元,因此它可以学习输入和输出之间的复杂非线性映射。
+>
+> MLP(Multilayer Perceptron)是一种多层感知机,是由多个FC层和激活函数组成的神经网络。它可以用于分类和回归问题,并且可以处理非线性关系。
+>
+
+
+

因此,可以说FFN和FC是MLP的组成部分,MLP包含了多个FC层和激活函数,而FFN是一种特殊的MLP,只包含一个输入层、一个输出层和若干个隐藏层。

+
+
    +
  • 分阶段预训练:
  • +
+

Vision Pre-training使用自己的BEiT(Masked Image Modeling),Language Pre-training用的是Masked Language Modeling,最后VL Pretraining用的是上面提到的三个函数

+

注意哪些是frozen的:一开始全部打开很正常,Language训练阶段注意自注意力层被frozen了直接用 Image 上训练的自注意力层(反过来不行,这个可以探索),最后就都打开了

+

image-20230506175219225

+
    +
  • 未来:
  • +
+

BeiT——VLMo——VL-BeiT——BeiT v2——BeiT v3

+

image-20230506175745823

+

Encoder+Decoder架构

+
    +
  • +

    BLIP:Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

    +
  • +
  • +

    关键词:Bootstrap和Unified。Bootstrap表示从noisy data中训练一个模型然后通过一些方法得到更干净的数据,然后用更干净的数据train出更好的模型;Unified表示应用在多种任务上,包括Understanding任务(Retrieval / VQA / VR / VE)和Generation(Image Captioning生成字幕)生成式任务

    +
  • +
  • +

    研究动机

    +
      +
    • +

      模型:之前的Encoder模型不能运用到生成任务中,而Encoder-Decoder不能做Image-text Retrieval的任务,这个动机和VLMo是一样的

      +
    • +
    • +

      数据:通过数据集变大可以提高效果,但是在Noisy的数据集上预训练还是不好的(suboptimal,不是最优解),作者提出两个模块 caption 生成字幕,Filter删除不匹配的图像文本对

      +
    • +
    +

    image-20230506181617784

    +
  • +
  • +

    背景:之前的ALBEF和VLMo,后者更加简单

    +

    image-20230506182130178

    +
  • +
  • +

    架构

    +

    图像就是一个ViT,文本使用三个模型。不看文本的第三个,其实就是个ALBEF,只是文本Encoder更大且可以共享参数(借鉴VLMo)而不是劈开成两个;生成模型就是第三个文本模型,但是文本不能直接看全部,因为就是要生成这种文本(任务是像GPT一样的LM,不是MLM完形填空),所以使用causal self-attention因果自注意力层,使用相同参数会导致性能下降,因为这是在做不同任务

    +

    prompt在最前面加上了CLS / Encode / Decode

    +

    image-20230506220449406

    +
  • +
  • +

    Captioner-Filter

    +

    网络下载的文本\(T_w\)质量差,而手工标注的\(T_h\)质量较好

    +

    Filter就是将ITC和ITM部分的模型拿过来然后在COCO手工数据集上做Finetune作为Filter,进行数据清洗

    +

    Captioner:作者发现Decoder能力很强,所以就在COCO上做微调然后变成Captioner,然后生成一些图像文本对

    +

    生成Caption很有效

    +

    image-20230506222139821

    +
  • +
  • +

    实验:

    +
      +
    • Captioner更能让模型受益,因为大模型更需要数据
    • +
    +
  • +
  • +

    应用:

    +
      +
    • +

      Stable Diffusion生成Pokeman,有图但没label,用BLIP生成效果很好

      +
    • +
    • +

      LAION COCO数据集:从LAION 4B中取英语然后用一个BLIP两个CLIP做Cap-Filter得到COCO 600M。先用BLIP生成40个Caption,然后CLIP选最好的5个然后再用更大的CLIP选最好的。

      +
    • +
    +

    CLIP做Ranking / Retrieval 效果都挺好

    +

    image-20230506224238037

    +
  • +
  • +

    CoCa: Contrastive Captioners are Image-Text Foundation Models

    +
  • +
  • +

    看标题就知道使用了两种Loss:Contrastive Loss和Captioning Loss

    +
  • +
  • +

    架构:

    +

    和ALBEF很像,但是文本使用的是Decoder

    +

    图像这一支用的是attentional pooling,是可学习的

    +

    文本最后使用captioning loss,所以一开始的self-attention都是casual的(就是masked self-attention)。作者没有使用ITM Loss,是因为之前的工作要Forward很多次,训练时间过长,这里为了只Forward一次,所以输入的文本都是masked。由于模型在几十亿的数据上训练所以怎么masked都可以

    +

    image-20230506224700805

    +
    +

    Casual self-attention layer是一种神经网络层,用于处理序列数据,例如自然语言文本。它是自我注意力机制的一种形式,允许模型在处理序列时关注先前的位置,但不允许模型查看未来的位置。这使得模型可以在处理序列时更好地捕捉上下文信息,同时避免了信息泄漏问题。Casual self-attention layer通常用于Transformer模型中,是其核心组件之一。

    +
    +
  • +
  • +

    效果

    +

    image-20230506230825441

    +
  • +
  • +

    BeiTv3

    +
  • +
  • +

    标题:Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks

    +
  • +
  • +

    多边形图:超越CoCa

    +
  • +
  • +

    Public Dataset,只用一个Loss。所以不是更多Loss做Regularization就更好,需要看各种Loss是否有弥补性,另外就是当模型变大的时候是否需要其他的Loss函数,另外数据量也不是越多越好,CoCa的数据量是几十倍于BeiTv3的,所以数据质量很重要

    +
  • +
  • +

    引言(做多模态必读):Language / Vision / Multimodal 都出现Big Convergence趋势,大模型成为Foundation Model。讨论目前的多模态模型架构,作者认为目前的架构仍然需要根据下游任务做调整,所以作者希望能够进一步实现大一统。作者将图像看做一种foreign language,称为Imglish

    +
  • +
  • +

    架构:就是VLMo,完型填空

    +

    image-20230506232114938

    +

    image-20230506232220650

    +
  • +
+

总结

+

image-20230506232243306

+

目前有两种模型想做更General的框架:

+
    +
  • Language Interface: MetaLM / PaLi,全部转成Text Generation的任务
  • +
  • Generalist Model:通才模型,不根据下游任务加分类头等。Unified-IO / Uniperceiver / Uniperceiver-MOE / Uniperceiver v2
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509173415798.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509173415798.png" new file mode 100644 index 00000000..1e403dc7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509173415798.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509173924338.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509173924338.png" new file mode 100644 index 00000000..e471033f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509173924338.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174239798.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174239798.png" new file mode 100644 index 00000000..2dd30808 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174239798.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174855333.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174855333.png" new file mode 100644 index 00000000..ce870d5d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174855333.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174945945.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174945945.png" new file mode 100644 index 00000000..a360f473 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer.assets/image-20230509174945945.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer/index.html" new file mode 100644 index 00000000..69d21a68 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/38-NeuralCorpusIndexer/index.html" @@ -0,0 +1,4721 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Neural Corpus Indexer - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Neural Corpus Indexer

+

标题

+
    +
  • A Neural Corpus Indexer for Document Retrieval (NCI)
  • +
  • 该文将测试集和训练集有点搞混,导致结果偏高。自己的工作如果效果很好,需要先质疑,有可能发生数据泄漏等问题
  • +
  • 另外有人质疑抄袭 DSI
  • +
+

摘要

+
    +
  • 目前文档检索的算法是基于索引的系统,索引就是每个文档做一个Hash或者是Embedding,但是很难做优化
  • +
  • 我们用端到端的深度学习来统一训练和检索,来提高召回率
  • +
  • seq2seq网络,生成相关文档的id
  • +
+

引言

+
    +
  • +

    retrieval:找到query相关的所有的文档;ranking:给一个更加精确的分数。ranking阶段常常会用深度学习来预测query和文档的相关性,但是这比较贵,所以retrieval阶段需要比较高的召回

    +
  • +
  • +

    文档检索有两种方法:

    +
  • +
  • +

    term-based:倒排索引,高效但是语义搜索能力不强

    +
  • +
  • +

    semantic-based:query和document映射成一个向量,往往使用two-tower模型。然后搜索的时候用近似的K近邻算法,不适合exact match

    +

    image-20230509173415798

    +
  • +
+

算法

+
    +
  • 架构:
  • +
+

image-20230509173924338

+

image-20230509174855333

+

用了个trick,除了Transformer本来的Decoder,这里另外加了AdaptiveDecoder

+

image-20230509174945945

+
    +
  • 生成docid用的是 hierachical k-means,首先先做聚类,如果该类的数量过多就再做聚类。由于使用seq2seq,所以预测的时候先预测2然后再预测3然后再预测3
  • +
+

image-20230509174239798

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230506234928374.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230506234928374.png" new file mode 100644 index 00000000..0bd1551b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230506234928374.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507000045586.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507000045586.png" new file mode 100644 index 00000000..e409d341 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507000045586.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507000327948.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507000327948.png" new file mode 100644 index 00000000..4d9b73f1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507000327948.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507001329941.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507001329941.png" new file mode 100644 index 00000000..7b3ee252 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507001329941.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507002414417.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507002414417.png" new file mode 100644 index 00000000..b95d0688 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507002414417.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507002559514.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507002559514.png" new file mode 100644 index 00000000..60ca7cca Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507002559514.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507010418559.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507010418559.png" new file mode 100644 index 00000000..535b4e1c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507010418559.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507010502466.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507010502466.png" new file mode 100644 index 00000000..29eae20c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT.assets/image-20230507010502466.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT/index.html" new file mode 100644 index 00000000..da9924cf --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/39-InstructGPT/index.html" @@ -0,0 +1,4757 @@ + + + + + + + + + + + + + + + + + + + + + + + + + InstructGPT - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

InstructGPT

+

标题

+
    +
  • Training language models to follow instructions with human feedback
  • +
  • 本文展示如何让语言模型和人类的意图之间做align对齐
  • +
+

摘要

+
    +
  • 主要工作:做两个数据集,一个是用问题和答案来训练模型,另一个是排序数据集做强化学习,结果发现InstructGPT参数量是GPT3的1%但效果更好
  • +
+

引言

+
    +
  • +

    GPT的目标函数是预测下一个词,但是人类希望的是正确且安全地输出,所以作者认为语言模型的目标函数没有align

    +
  • +
  • +

    作者使用RLHF,原因可能是OpenAI是做强化学习出家的

    +
  • +
  • +

    方法

    +
  • +
  • +

    第一阶段:SFT,Supervised FineTune,标注一些对话

    +
  • +
  • +

    第二阶段:类似伪标签,让GPT生成多种输出让用户来选 Beam Search,人类进行答案排序,称为 RM 奖励模型

    +
    +

    Beam Search是一种搜索算法,用于在图形或树形结构中寻找最佳解决方案。它是一种贪心算法,每次扩展搜索树时只保留一定数量的最优解,而不是全部扩展。这个数量称为Beam Width或Beam Size,通常设置为一个较小的常数。

    +

    Beam Search的基本思想是在搜索过程中维护一个集合,该集合包含最有可能的解。这个集合会随着搜索的进行而不断扩大,但是集合中的解的数量不会超过Beam Width。每次扩展搜索树时,会考虑所有可能的扩展,然后选择一些最有可能的解作为下一步的搜索。这些解会被添加到集合中,并且根据它们的得分进行排序。然后,集合中的解就是下一步搜索的候选解。这个过程会一直重复,直到找到一个满足条件的解。

    +

    Beam Search的优点是它能够在短时间内找到一个较好的解决方案,而不需要搜索整个解空间。缺点是它可能会陷入局部最优解,因为它只保留了一部分解。

    +
    +
  • +
  • +

    第三阶段:用一个新的prompt生成output给reward model计算reward,然后提高分数

    +
  • +
+

image-20230506234928374

+

方法

+
    +
  • +

    数据集

    +
  • +
  • +

    首先用人标主的信息实现一个InstructGPT,标准包括:

    +

    image-20230507000045586

    +

    然后放到Playground里,然后收集用户的问题,然后再,过滤掉个人信息,并且训练的时候不使用同一个人文的很多问题(最多200个)

    +
  • +
  • +

    三个dataset:SFT / RM / PPO,第三个数据集没有human label

    +

    image-20230507000327948

    +
  • +
  • +

    模型

    +
  • +
  • +

    SFT:FineTune GPT3,用人工标注的数据,因为只有13K,所以只用了16epoch,但是发现只扫一边就过拟合了,但是这是为了初始化后面的模型,所以过拟合也没太大问题

    +
  • +
  • +

    RM:

    +

    目的是训练另一个模型,拟合人对于prompt+reponse的评价(排序)

    +

    使用6B的模型,从SFT开始去掉最后的Unbedding层(可能就是去除Softmax层,然后直接用线性层投影成一个值,将这个标量输出看作是reward),输入是prompt及其response。作者发现大模型不稳定,所以使用小的模型

    +

    输入是排序而不是一个值,所以需要把顺序变成值,使用Pairwise Ranking Loss,简单的想法就是如果一个response比另一个的排序更高就让它的reward和另一个差更远。这里排序答案数量\(K=9\),因为发现排序读题的时间更长,当\(K\)越大,得到的排序关系就越多;同时下式中\(r_{\theta}\)最贵,但是只用做\(K\)次RM,所以\(K\)越大省更多时间

    +

    image-20230507001329941

    +
  • +
  • +

    RL:PPO是之前OpenAI的工作,就是在下面的目标函数上做梯度下降

    +

    image-20230507002559514

    +

    在强化学习中,模型称为Policy。我们要学习\(\pi_{\phi}^{RL}\),初始化成\(\pi^{SFT}\)\(E_{(x,y)}\)中的\((x,y)\)就是第三个PPO数据集里的prompt \(x\) 及其reponse \(y\)\(y\)是用当前模型 \(\pi_{\phi}^{RL}\) 算出来的),当模型数据更新之后,\(y\)是会改变的(即环境发生变化)。然后将\((x,y)\)丢到RM模型里来算reward分数,我们希望让这个分数最大。

    +

    RM模型其实相当于做一个AI判分,替代了人工判分,本来RLHF阶段应该是\(x\)通过模型得到\(y\)然后停下人工排序然后给分数,再更新模型,这里RM模型直接跳过人工排序步骤(在线)。如果人能直接标出\(y\)那就变成了有监督,可以放到SFT阶段

    +

    但是\(r_{\theta}\)是基于\(\pi^{SFT}\)的,当\(\pi^{RL}\)在训练的时候会让输出\(y\)分布变化,使得\(r\)的分数估算逐渐变得不准,所以第一个中括号中的第二项使得新模型和之前的模型不要跑太远,其实就是KL散度,看两个模型输入同一个\(x\)输出\(y\)的概率值的KL散度(这个就是PPO思想)。最后一项是不光注重RLHF、防止遗忘之前的训练参数、多偏向原始数据,其实就是原始的GPT3的目标函数,加上最后一项称为PPO-ptx

    +
    +

    image-20230507010418559

    +

    image-20230507010502466

    +

    https://datawhalechina.github.io/easy-rl/#/chapter5/chapter5

    +
    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415162939659.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415162939659.png" new file mode 100644 index 00000000..2e1b410c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415162939659.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415164538995.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415164538995.png" new file mode 100644 index 00000000..802fda66 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415164538995.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171112164.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171112164.png" new file mode 100644 index 00000000..0656a270 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171112164.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171333361.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171333361.png" new file mode 100644 index 00000000..d75c042c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171333361.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171948959.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171948959.png" new file mode 100644 index 00000000..e1991d22 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415171948959.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415172312590.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415172312590.png" new file mode 100644 index 00000000..8f3585eb Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415172312590.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415172452059.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415172452059.png" new file mode 100644 index 00000000..57637c4a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415172452059.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415173911286.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415173911286.png" new file mode 100644 index 00000000..f487203f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415173911286.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174420465.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174420465.png" new file mode 100644 index 00000000..09107dfc Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174420465.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174524616.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174524616.png" new file mode 100644 index 00000000..8bd7dbb5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174524616.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174725680.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174725680.png" new file mode 100644 index 00000000..c521608d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415174725680.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175340762.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175340762.png" new file mode 100644 index 00000000..94537eef Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175340762.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175638512.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175638512.png" new file mode 100644 index 00000000..2073f443 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175638512.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175845699.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175845699.png" new file mode 100644 index 00000000..b2b3c4e3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415175845699.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180029968.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180029968.png" new file mode 100644 index 00000000..84cdbe11 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180029968.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180454772.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180454772.png" new file mode 100644 index 00000000..02ea526e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180454772.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180700517.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180700517.png" new file mode 100644 index 00000000..16a204b7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415180700517.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181018835.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181018835.png" new file mode 100644 index 00000000..43dec1e4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181018835.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181046962.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181046962.png" new file mode 100644 index 00000000..f4c4b849 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181046962.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181337390.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181337390.png" new file mode 100644 index 00000000..85ff4df1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181337390.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181725226.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181725226.png" new file mode 100644 index 00000000..4cb5b3b9 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415181725226.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182030220.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182030220.png" new file mode 100644 index 00000000..6c3ee3ab Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182030220.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182041633.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182041633.png" new file mode 100644 index 00000000..986a8ea0 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182041633.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182141653.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182141653.png" new file mode 100644 index 00000000..bf5bbda6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182141653.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182610737.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182610737.png" new file mode 100644 index 00000000..242059d7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182610737.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182929052.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182929052.png" new file mode 100644 index 00000000..bedd963a Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415182929052.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183043860.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183043860.png" new file mode 100644 index 00000000..f1dee877 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183043860.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183404733.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183404733.png" new file mode 100644 index 00000000..be1e0bf8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183404733.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183730296.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183730296.png" new file mode 100644 index 00000000..0aa65bc9 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183730296.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183953260.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183953260.png" new file mode 100644 index 00000000..a8063664 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415183953260.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415184509657.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415184509657.png" new file mode 100644 index 00000000..e154f7c8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415184509657.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415184815444.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415184815444.png" new file mode 100644 index 00000000..c8ec8507 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer.assets/image-20230415184815444.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer/index.html" new file mode 100644 index 00000000..c10b2c3b --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/4-Transformer/index.html" @@ -0,0 +1,4843 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Transformer - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Transformer

+

Abstract

+

image-20230415162939659

+
    +
  • sequence transduction序列转录模型,seq2seq,一段序列生成另一端序列,一般是用encoder加decoder
  • +
  • 本文只适用attention,而不使用CNN和RNN
  • +
+

Conclusion

+
    +
  • 我们只使用了attention
  • +
  • 代码一般是直接放在摘要里的,本文是tensor2tensor
  • +
+

Introduction

+
    +
  • RNN难以并行。时序长的前面的信息可能会丢失
  • +
+

image-20230415164538995

+
    +
  • 纯用attention并行度高
  • +
+

Relation Work

+
    +
  • CNN只能看到序列中的一小部分,而attention能够看到所有的序列。卷积好的地方在于可以做多个输出通道,每个输出通道认为是识别一种特定的模式,本文提出多头的注意力机制
  • +
  • 自注意力机制很重要,但并不是本文第一次提出
  • +
+

Model Architecture

+
    +
  • 首先介绍Encoder和Decoder。编码器是整个句子拿到,而解码器是自回归的,一个词一个词的生成
  • +
+

image-20230415171112164

+
    +
  • 架构图:
  • +
+

左边是编码器右边是解码器,解码器之前的输出作为当前的输入(所以这里最下面写的是output)

+

Nx表示由N个Block构成,每个block里面有一个多头注意力层+前馈神经网络(基本是MLP)并使用ResNet。

+
+

MLP(Multilayer Perceptron,多层感知器)是一种基本的前馈神经网络,由多个全连接层组成。在每个全连接层中,每个神经元都与前一层的所有神经元相连,通过学习权重和偏置,实现对输入数据的非线性映射。

+

MLP通常用于解决分类和回归问题,可以处理非线性数据,具有很强的适应能力和泛化能力。在训练过程中,MLP通过反向传播算法来更新权重和偏置,使得模型可以逐渐逼近真实数据的分布。

+

MLP的网络结构通常包括输入层、隐藏层和输出层。输入层接收原始数据,并将其传递给第一个隐藏层;每个隐藏层通过学习非线性映射,将输入转换为更高层次的特征表示,并将其传递给下一个隐藏层或输出层;输出层根据不同的任务,可以采用不同的激活函数,如sigmoid、softmax等,将特征转换为输出结果。

+

MLP在深度学习中具有重要的地位,是其他深度学习算法的基础。它可以通过堆叠多个隐藏层来构建深层神经网络,从而实现更强大的特征提取和学习能力。同时,MLP还可以与其他深度学习技术相结合,如卷积神经网络和循环神经网络等,构建更加复杂的神经网络模型。

+
+

解码器中多了Masked Multi-head Attention

+

与传统的Encoder-Decoder的架构的区别是Block的架构以及中间从Encoder到Decoder的输入。

+

image-20230415171333361

+
    +
  • Encoder:为了残差的方便,所有的维度都是512,没有做维度的减小或者增加。参数很少,就层数N和维度d。
  • +
+

image-20230415171948959

+
    +
  • +

    LayerNorm与BatchNorm,在变长的情况(文本不是统一长度)不使用BatchNorm

    +

    对于BatchNorm,在train的时候,一般是取小批量里的均值和方差,在预测的时候用的是全局的均值和方差。什么是批标准化 (Batch Normalization) - 知乎 (zhihu.com)。二维情况(每个样本对应一个feature)在下图中BatchNorm是下图左边,LayerNorm的下图右边。

    +

    image-20230415172452059

    +

    三维情况(batch由样本组成,每个样本是seq长度的向量,每个词由一个feature向量来描述,feature长度是d,transformer中是512),蓝色是BatchNorm,黄色是LayerNorm。

    +

    image-20230415173911286

    +

    句子长度是不同的,对于BatchNorm有很多零,导致均值方差抖动大,并且不一定能适合于长句子

    +

    image-20230415174420465

    +

    image-20230415174524616

    +
  • +
  • +

    解码器:其中的masked multi-head attention,输入的时候在\(t\)时间不会看到\(t\)时间之后的输入(注意力机制中是可以看到完整输入的,所以要加masked)

    +
  • +
+

image-20230415174725680

+
    +
  • Attention:注意力函数是从一个query和一系列键值对映射到output的函数,这些query、键值对都是向量,output是对values的加权求和,这些权重可以由query和对应key的关系计算出来(compatibility function相似函数),不同注意力机制有不同的计算方法
  • +
+

image-20230415175340762

+

image-20230415175638512

+

上面黄色和绿色表示query,和蓝色越接近,对应的权重就越大

+
    +
  • Scaled Dot-Product Attention 最简单的注意力函数
  • +
+

将query和key的内积作为相似度(cos),如果为0说明正交。第二段是矩阵运算来加速的方法

+

image-20230415175845699

+

query的数量可能有\(n\)个,key-value的数量是\(m\)个,但是query和key的长度都是\(d_k\)。最后结果每一行都是一个结果

+

image-20230415180029968

+

其他人使用的注意力机制:additive attention(处理query和key不等长的情况)和dot-product attention(和本文相同,除了本文除了\(\sqrt{d_k}\)

+

image-20230415180454772

+

除以这个数的原因是:当\(d_k\)比较大的时候,算出来的加权value值差距较大,经过softmax有些值变成1有些值变成0,所以要除

+

image-20230415180700517

+

上图masked表示对于\(t\)时间的query \(q_t\),应该只看\(k_1,k_2,\dots,k_{t-1}\)。这里的解决方法是:将\(k_t,\dots\)换成非常大的负数,使得通过softmax都是0

+
    +
  • Multi-head Attention:将VKQ先投影到低维\(h\)次做内积然后再连接起来升维。原因:Scaled Dot-Product没有能学的参数(additive attention里有可以学的参数)
  • +
+

image-20230415181018835

+

image-20230415181046962

+

image-20230415181337390

+

Transformer输入输出维度一直是512,这里\(h\)用的是8,所以这里就让投影之后为64维,之后拼起来变成512维

+

实现的时候可以一个矩阵乘法实现

+
    +
  • 注意力的application
  • +
+

image-20230415181725226

+

第一个注意力层:输入\(n\)个(句子中词的数量)长为\(d\)(每个词的feature)的向量。自注意力表示输入同时作为query和key和value。假设不考虑多头,那么会得到\(n\)个长为\(d\)的结果,每个结果都是所有value的加权和,而这个权重里,最大的就是自己和自己的权重

+

image-20230415182030220

+

image-20230415182041633

+

第二个自注意力层:和上面基本一致,除了masked,所以上图中黄色画的线都要置成0

+

image-20230415182610737

+

第三个注意力层:key和value(\(n\)个长为\(d\))来自Encoder,query(\(m\)个长为\(d\))来自Decoder。例如Encoder中Hello和World分别对应一个长为\(d\)的向量即value,那么结果一定是这些value的加权求和,而这权重就是Decoder中query和对应key的相似度,例如“你”可能和"Hello"比较接近则权重更大。

+
    +
  • Feed-Forward Network
  • +
+

就是MLP。特点是“applied to each position separately and identically”。下面\(x\)是512的向量,\(W_1\)将其投影到2048,\(W_2\)将其投影回到512,即单隐藏层的MLP。

+

image-20230415183043860

+
    +
  • 再看架构图
  • +
+

image-20230415183404733

+

下面的红色是attention层,上面是对每个position做MLP(尽管画了多个方块,但是每个position的MLP是相同的)。attention的作用是aggregate汇聚我所有感兴趣的信息,即完成了序列信息的汇聚,所以可以分开MLP

+

image-20230415183730296

+

右边其实和RNN很像,但是用的是attention抽取的序列信息。

+
    +
  • Embeddings and Softmax:编码input和output token,将其映射到\(d\)维。最后乘一个\(\sqrt{d}\),因为维度大了之后,一旦正则,权重值小,所以需要乘以一个数。另外需要加Positional Encoding而这个东西不会因为Norm而变小所以两者需要在相近的scale上,所以乘了这个数
  • +
+

image-20230415183953260

+
    +
  • Positional Encoding
  • +
+

attention没有序信息,句子打乱之后值不会变,这有问题。所以这里将位置1,2,3,4,5...加到句子里面。

+

公式:

+

image-20230415184509657

+

使用上面的公式编码数字,然后加到Embedding之后的向量里。由于是使用sin和cos,这个位置编码是在-1到1之间的,所以上面的embedding要乘一个常数使其大致在-1到1之间

+

Why Self-Attention

+

image-20230415184815444

+
    +
  • 第一组是计算复杂度
  • +
  • 第二列是顺序计算,越少并行度越高
  • +
  • 第三列是信息从一个数据点到另一个数据点要走多远,越小越好。任何一个query可以和key直接做运算,path很短
  • +
+

Training

+
    +
  • 学习率基本不调,使用的是Adam
  • +
  • 使用大量的dropout
  • +
  • label smooth:softmax的置信度设置成0.1,即达到0.1就算是正确
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/40-HELM/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/40-HELM/index.html" new file mode 100644 index 00000000..13d3a63e --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/40-HELM/index.html" @@ -0,0 +1,4663 @@ + + + + + + + + + + + + + + + + + + + + + + + + + HELM - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

HELM

+

标题

+
    +
  • Holistic Evaluation of Language Models 对语言模型的全面评估
  • +
  • 省流:
  • +
  • InstructGPT目前效果最好
  • +
  • 通常是越大越好,在某个领域比较强一般都需要50B以上的模型
  • +
  • 目前模型对Prompt非常敏感
  • +
  • 其他略
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/41-AnthropicLLM/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/41-AnthropicLLM/index.html" new file mode 100644 index 00000000..fbd2f0b3 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/41-AnthropicLLM/index.html" @@ -0,0 +1,4720 @@ + + + + + + + + + + + + + + + + + + + + + + + + + AnthropicLLM - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

AnthropicLLM

+

标题

+
    +
  • Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback
  • +
  • Claude的基础
  • +
+

引言

+
    +
  • 模型参数比较小的时候RLHF会导致精度下降,但是模型大的时候就不会
  • +
  • 提出一个多轮对话数据集
  • +
  • 使用OOD(out of domain)来拒绝奇怪或者有害的输入
  • +
  • 相关工作
  • +
  • LaMDA(Bard):只有监督学习
  • +
  • InstructGPT(ChatGPT):使用了监督学习而Anthropic全部RL(还用到了context distillation,但是这个技术相当于prompt engineering),同时Anthropic使用最大模型作为RM模型,另外Anthropic关注harmlessness
  • +
+

数据收集

+
    +
  • 多轮对话,主要是让人随便提问然后在两个模型输出里选哪个更好
  • +
  • 发现标注结果的agreement比较低
  • +
  • 最后标注了两个数据集:Helpfulness和Harmlessness
  • +
  • 前者是让标注工选择更有帮助的response,后者是让标注工选择更harmful的response,这导致了模型分裂,后面有工作去解决这个问题
  • +
+

方法

+
    +
  • 模型:有点类似InstructGPT
  • +
  • 一开始的初始模型,没有微调过,比较原始
  • +
  • 奖励模型,使用\(k=16\)作为上面模型输出的个数
  • +
  • RLHF微调后的模型
  • +
  • 奖励模型:分成三个阶段
  • +
  • Language Model pre-training
  • +
  • PMP (Preference Model Pretraining):在网络上搜集comparison data(例如点赞等)来训练,学习率是0.1,数据量较大
  • +
  • 使用Human Feedback来微调:数据量较小,学习率为0.01
  • +
  • 以上窗口是1024 token,之后在线模型使用2048 token
  • +
  • RLHF和InstructGPT差不多,也使用PPO,但是发现PPO的惩罚性其实对结果影响可能并不大
  • +
  • 奖励模型 PM 的稳定性问题
  • +
  • 当两个答案都比较好的时候就会出现奖励模型不准的情况
  • +
  • 将数据集分成两半并在每一块上分别训练一个模型,一个是train PM,一个是test PM。然后用train PM去调模型,然后看模型是否在test PM上也能得到更高的分数,如果没有更多提升就表示过度优化了
  • +
  • 发现train PM的大小大的时候,在test PM上得到的分数是随着模型RLHF微调依旧不断上升的
  • +
  • 作者认为 \(\sqrt{D_{KL}}\) 和 Reward(test PM上的分数) 有线性关系(很玄学),作者说可以通过这样计算出想达到什么样的效果需要多少的数据量
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507210024488.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507210024488.png" new file mode 100644 index 00000000..34743c81 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507210024488.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507215855681.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507215855681.png" new file mode 100644 index 00000000..d26d4422 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507215855681.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507220638720.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507220638720.png" new file mode 100644 index 00000000..0bc50627 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507220638720.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221020600.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221020600.png" new file mode 100644 index 00000000..8e359995 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221020600.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221409385.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221409385.png" new file mode 100644 index 00000000..85fc3b45 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221409385.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221905583.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221905583.png" new file mode 100644 index 00000000..9cae0b4f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230507221905583.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230508144143930.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230508144143930.png" new file mode 100644 index 00000000..869fa407 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230508144143930.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230508145120295.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230508145120295.png" new file mode 100644 index 00000000..b9dd1f5e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224.assets/image-20230508145120295.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224/index.html" new file mode 100644 index 00000000..508a94eb --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/42-\345\244\247\346\250\241\345\236\213\346\227\266\344\273\243\347\232\204\347\247\221\347\240\224/index.html" @@ -0,0 +1,4833 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 大模型时代的科研 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

大模型时代的科研

+

方向

+
    +
  • Efficient
  • +
  • PEFT:parameter efficient fine tuning,做大模型的微调
  • +
  • Exising stuff (pretained model) & new directions
  • +
  • 例如使用CLIP做各种应用
  • +
  • Plug-and-play
  • +
  • 即插即用的模块,例如新的目标函数、新的loss和数据增强的方法,在能承受的baseline上做公平对比说明有效性
  • +
  • Dataset, evaluation and survey
  • +
+

Efficient

+
    +
  • +

    Parameter-Efficient Transfer Learning for NLP

    +
  • +
  • +

    Adapter就是一个下采样的FC层+非线性层+上采样的FC层,在模型微调的过程是不会动Transformer Block中的其他模块的参数

    +

    image-20230507215855681

    +
  • +
  • +

    Lora就使用了PFET方法

    +
  • +
  • +

    相关论文:Towards A Unified View of Parameter-Efficient Transfer Learning

    +
  • +
  • +

    文本Prompt相关技术

    +
  • +
  • +

    论文:CoOp(Context Optimization)

    +
  • +
  • +

    标题:Learning to Prompt for Vision-Language Models

    +
  • +
  • +

    image-20230507220638720

    +

    CLIP的分类任务的推理,就是用各种标签(Prompt)和图片算相似度,这种Prompt可以修改格式,从而大幅影响模型的准确率

    +

    人工写死的Prompt是hard prompt,而本文提出soft prompt可学习的prompt,就是一个learnable vector。将模型参数锁住,然后学习这个learnable vector

    +
  • +
  • +

    架构:和CLIP不同的是text的输入是一个可学习的向量

    +

    image-20230507221020600

    +
  • +
  • +

    视觉Prompt相关技术

    +
  • +
  • +

    论文:VPT(Visual-Prompt Tuning)

    +
  • +
  • +

    标题:Visual-Prompt Tuning

    +
  • +
  • +

    架构

    +
      +
    • VPT Shallow,和文本端很像,在输入端加一个learnable prompt且加在原来的patch embedding之前,然后锁住整个模型只学习这两个prompt
    • +
    • VPT deep,每一层都使用prompt
    • +
    +

    image-20230507221409385

    +
  • +
  • +

    AIM: Adapting Image Models for Efficient Video Action Recognition

    +
  • +
  • +

    视频动作识别

    +
  • +
  • +

    之前有两种方法:首先我们都要有一个预训练的Image模型(2D)

    +
      +
    • 时空分开做(2D),在已有的Image模型(2D)上加时序处理模块,例如TSN将视频分成多段然后将视频抽取的特征做加权平均,TimesFormer先做TimeAttention再做SpatialAttention
    • +
    • +

      时空一起做

      +
    • +
    • +

      时空一起做(3D),使用3D网络(输入是3D的,模型也是3D的),例如 I3D 等

      +
    • +
    +
  • +
  • +

    这两种方法成本都比较大,需要在视频数据上做FineTune,但视频数据集很大,数据 IO 有Bottleneck,导致训练时间极长,这些还已经是在预训练模型上FineTune,其他train from scratch的就更耗费时间了

    +

    image-20230507210024488

    +
  • +
  • +

    作者认为强大的图像模型抽取的视频特征已经很强了,同时下游任务数据集不够强可能会导致模型过拟合或灾难性遗忘,所以就打算直接锁住Image Model,然后在上面加Adapters

    +

    本文提出三种Adaptation:

    +
      +
    • Spatial Adaptation:在Self-Attention后面加Adapter,不添加时序理解的能力,只是想把图像特征迁移到视频特征,尽量解决Domain Gap问题,发现这一步已经很有用了,但是缺少时序建模能力,在很多数据集上效果仍不好,比不过full fine tune model
    • +
    • Temporal Adaptation:复用MSA,参数相同且frozen,目的是想让一个MSA学Spatial,一个MSA学Temporal,方法是reshape,可以看到(d)中第一个MSA是在\(T\)上做,第二个是\(N+1\)(sequence length)维度上做自注意力,然后再加两个Adapter,此时性能已经达到Full Fine Tune水平
    • +
    • Joint Adaptation:最后再加一个Adapter去学Spatial Temporal Feature
    • +
    +

    (e)就是一个ViT Block,重复12次得到Vit-Base

    +

    image-20230507221905583

    +
  • +
  • +

    发现如果Image Foundation Model变强,性能也会大幅提高

    +
  • +
+

Exising stuff (pretained model) & new directions

+
    +
  • +

    zero shot > few shot > pretaining

    +
  • +
  • +

    Unsupervised Semantic Segmentation With Self-Supervised Object-Centric Representations

    +
  • +
  • +

    语义分割任务

    +
  • +
  • +

    Self-Supervised:使用预训练好的DINO网络等,不需要额外训练

    +
  • +
  • +

    Object-Centric Representation:比较新的赛道。之前大家关注图像整体层面的特征,这个赛道是提取物体层面的特征,因为人会先观察人再观察物体然后观察人与物体之间的交互。本文关注如何无监督或自监督地学习物体特征。

    +

    首先先用DeepUSPS(给定图片会提取出显著物体的Mask)抽取saliency mask label,如此解决定位问题;然后解决分类问题,将扣出的这些图形之后然后resize成224*224扔给DINO网络,得到representations;然后做无监督的聚类,得到pseudo masks(即能告诉你每个东西是类0或是类1或是类2,只是一个id);有了图像和mask label就可以有监督地训练一个semantic segmentation network(例如DeepLab v3)

    +

    image-20230508145120295

    +
  • +
  • +

    最近该方向卷起来了,因为有CLIP的Language Guided Segmentation

    +
  • +
  • +

    关注一些新的topic包括因果学习、Feedforward Network(FFNet)、In-Context Learning、Chain of Thought Prompting

    +
  • +
+

Plug-and-play

+
    +
  • 可以在ResNet后面加一个Non-Local,或者是一个loss例如Focal Loss,还有数据增强(可以不受限于任务和模态)例如MixUp
  • +
  • 证明某个方法的有效性可以不刷榜(光刷榜还有可能是overfit),只需要证明在多个数据集上有提升有泛化性有合适分析
  • +
  • MixGen: A New Multi-Modal Data Augmentation
  • +
  • 多模态的数据增强
  • +
  • 开题的时候,想的是Cross-Modality Distillation,就是VLMo证明图像和文本可以共享自注意力层,因为文本模型大而图像模型小,所以考虑将文本模型蒸馏成一个图像模型,或者反过来,发现提高很小且成本比较大
  • +
  • 后来发现多模态论文要么觉得数据集太大不需要做数据增强,要么去掉了一些数据增强(主要是Color Jittering和Random Flip,会导致颜色和方向对不上)。作者认为数据增强对CV是很有用的
  • +
  • 为了最大限度的保留信息:
      +
    • 图像:MixUp,即将两张图直接做线性插值,虽然生成的图片很怪但是基本不会丢失信息
    • +
    • 文本:直接将两个文本拼接在一起,不会丢失任何信息
    • +
    +
  • +
  • 审稿人提出意见:预训练的时候多模态数据集很多,但是下游任务数据少,可以考虑在下游任务FineTune时做数据增强。但是作者发现很多下游任务MixGen有点难,比如VQA是一个图像两个文本
  • +
+

Dataset, evaluation and survey

+
    +
  • BigDetection: A Large-scale Benchmark for Improved Object Detector Pre-training
  • +
  • 做数据集不一定贵,本文将三个数据集合到一起
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230508232258097.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230508232258097.png" new file mode 100644 index 00000000..97735593 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230508232258097.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509001121160.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509001121160.png" new file mode 100644 index 00000000..77d2efb4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509001121160.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509002733558.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509002733558.png" new file mode 100644 index 00000000..3192cae2 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509002733558.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509003128130.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509003128130.png" new file mode 100644 index 00000000..9112d49b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509003128130.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509110832346.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509110832346.png" new file mode 100644 index 00000000..898b2e64 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509110832346.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509110938690.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509110938690.png" new file mode 100644 index 00000000..3c34bb75 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509110938690.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509111144787.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509111144787.png" new file mode 100644 index 00000000..16d0c41b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/43-Pathways.assets/image-20230509111144787.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000310404.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000310404.png" new file mode 100644 index 00000000..d582c91f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000310404.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000533519.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000533519.png" new file mode 100644 index 00000000..0bda3e47 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000533519.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000811060.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000811060.png" new file mode 100644 index 00000000..302a86ab Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419000811060.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419001534085.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419001534085.png" new file mode 100644 index 00000000..3438f0c3 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419001534085.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002046017.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002046017.png" new file mode 100644 index 00000000..5f6c2ca6 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002046017.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002435062.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002435062.png" new file mode 100644 index 00000000..706e1380 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002435062.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002955083.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002955083.png" new file mode 100644 index 00000000..92698c7e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419002955083.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003155277.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003155277.png" new file mode 100644 index 00000000..15401d01 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003155277.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003446548.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003446548.png" new file mode 100644 index 00000000..161457a4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003446548.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003806187.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003806187.png" new file mode 100644 index 00000000..c8e6e19e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419003806187.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004022299.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004022299.png" new file mode 100644 index 00000000..0bd38611 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004022299.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004215693.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004215693.png" new file mode 100644 index 00000000..f1dcaa9b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004215693.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004258675.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004258675.png" new file mode 100644 index 00000000..0eb4367c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004258675.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004400996.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004400996.png" new file mode 100644 index 00000000..be998da5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004400996.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004700038.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004700038.png" new file mode 100644 index 00000000..ea0d0b46 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004700038.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004920037.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004920037.png" new file mode 100644 index 00000000..7d9a0f14 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419004920037.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419005127780.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419005127780.png" new file mode 100644 index 00000000..bee1e28f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419005127780.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419005508495.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419005508495.png" new file mode 100644 index 00000000..ec44e16c Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419005508495.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419010328364.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419010328364.png" new file mode 100644 index 00000000..8878dac8 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN.assets/image-20230419010328364.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN/index.html" new file mode 100644 index 00000000..7b0c4774 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/5-GNN/index.html" @@ -0,0 +1,4802 @@ + + + + + + + + + + + + + + + + + + + + + + + + + GNN - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

GNN

+

什么是图

+
    +
  • 我们关心V,E,U的attributes
  • +
+

image-20230419000310404

+
    +
  • 每个V,E,U都可以用一个向量表示
  • +
+

image-20230419000533519

+
    +
  • 图片可以表示成图:相邻的像素都连接起来
  • +
+

image-20230419000811060

+
    +
  • 文本可以表示成边
  • +
+

image-20230419001534085

+
    +
  • +

    哪些问题有图结构的data

    +
  • +
  • +

    图层面任务:例如判断一个图是否有环,可以不使用机器学习即可

    +
  • +
  • +

    顶点层面的任务:两个顶点代表的人决裂之后,其他和他们两个有社交关系的人决定是否和他们一起

    +

    image-20230419002046017

    +
  • +
  • +

    边层面的任务:先对图进行语义分割,然后用图神经网络学习其关系

    +

    image-20230419002435062

    +
  • +
  • +

    机器学习中使用图的挑战

    +
  • +
  • +

    点、边、全局信息都是向量比较好处理,但是连通性如果用邻接矩阵开销就过于大了

    +
  • +
  • +

    邻接矩阵可以有多种表达

    +

    image-20230419002955083

    +
  • +
+

图神经网络

+
    +
  • 定义:重点是perserve graph symmetries。使用的框架是message passing neural network,图进图出,不会修改连通性
  • +
+

image-20230419003155277

+
    +
  • 最简单的CNN:对顶点、边和全局各通过一个MLP构成了GNN的一个层
  • +
+

image-20230419003446548

+
    +
  • +

    最后一层的输出得到预测值

    +
  • +
  • +

    例:对每个顶点做预测。每个顶点都是一个向量,如果做二分类,就通过一个输出维度为2的全连接层,然后加个softmax得到输出

    +

    image-20230419003806187

    +
  • +
  • +

    Pooling,如果某个点没有向量,那么就取它所有相邻边的向量以及全局向量相加,

    +

    image-20230419004022299

    +

    所以如果没有边的向量信息,那么可以用点的向量信息来聚合Pooling。反之亦然

    +

    image-20230419004215693

    +

    image-20230419004258675

    +
  • +
  • +

    网络结构:不同属性经过GNN层得到变化之后的图,然后用聚合操作得到希望预测的属性,然后通过全连接层得到最后的Prediction

    +

    image-20230419004400996

    +
  • +
  • +

    上述结构存在问题,点与点的相邻关系等都没有包含进去

    +
  • +
  • +

    Message passing信息传递

    +
  • +
  • +

    进入MLP之前,输入点相邻的点也要输入到MLP中

    +

    image-20230419004700038

    +
  • +
  • +

    信息传递最简单的是一近邻。

    +

    image-20230419004920037

    +
  • +
  • +

    另外可以不在最后一层做Pooling,可以提前在前面的层先汇聚起来

    +
  • +
  • +

    例子:\(\rho(V_n\rightarrow E_n)\)表示将顶点信息汇聚到边上

    +

    image-20230419005127780

    +
  • +
  • +

    全局信息

    +
  • +
  • +

    某些点相距较远,需要比较长时间才能传递到

    +
  • +
  • +

    加入一个虚拟的点 master node或者叫 context vector

    +

    image-20230419005508495

    +
  • +
+

实验

+

+

相关技术

+
    +
  • +

    采样

    +
  • +
  • +

    CNN中会使用随机采样。GNN中使用的是如下策略

    +

    image-20230419010328364

    +
  • +
  • +

    GNN的假设:图的连通性

    +
  • +
  • +

    GCN:图卷积神经网络,带汇聚的GNN

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419110804572.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419110804572.png" new file mode 100644 index 00000000..aeefa84d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419110804572.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419113115468.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419113115468.png" new file mode 100644 index 00000000..f5ad2b75 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419113115468.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419145639866.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419145639866.png" new file mode 100644 index 00000000..f913966e Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419145639866.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419150614487.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419150614487.png" new file mode 100644 index 00000000..7b70f55f Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419150614487.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419152648063.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419152648063.png" new file mode 100644 index 00000000..4be69bd5 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419152648063.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419153506987.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419153506987.png" new file mode 100644 index 00000000..03006825 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419153506987.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419153744654.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419153744654.png" new file mode 100644 index 00000000..401e3c31 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419153744654.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154242201.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154242201.png" new file mode 100644 index 00000000..8e38506b Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154242201.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154423454.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154423454.png" new file mode 100644 index 00000000..1481e4e1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154423454.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154604580.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154604580.png" new file mode 100644 index 00000000..dded7799 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154604580.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154931129.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154931129.png" new file mode 100644 index 00000000..81061287 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419154931129.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419155228347.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419155228347.png" new file mode 100644 index 00000000..ba252b75 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN.assets/image-20230419155228347.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN/index.html" new file mode 100644 index 00000000..0bade590 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/6-GAN/index.html" @@ -0,0 +1,4800 @@ + + + + + + + + + + + + + + + + + + + + + + + + + GAN - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

GAN

+

Abstract

+

image-20230419110804572

+

Introduction

+
    +
  • 深度学习在生成上的问题
  • +
+
+

深度生成模型的影响较小,这是由于在最大似然估计和相关策略中出现了许多难以近似的概率计算,并且很难利用分段线性单元在生成环境中的优势。我们提出了一种新的生成模型估计过程,可以避开这些困难。

+
+
    +
  • +

    生成模型:造假者;判别模型:警察

    +
  • +
  • +

    生成模型是一个MLP,通过随机噪音生成sample;判别模型也用MLP

    +
  • +
+ +
    +
  • 之前的工作都是构造概率分布函数,然后提供参数供他学习,这些参数通过最大化它的对数似然函数来估计,但是这些计算比较困难。这种方法就是构造一个分布函数,然后计算出具体的均值方差等
  • +
+
+

对数似然函数是一种用于最大似然估计的函数。最大似然估计是一种统计推断方法,用于估计参数值,使得给定观测数据的条件下,该参数下的概率密度函数或概率质量函数最大化。

+

在数学中,给定数据样本集合,对数似然函数是指这个样本集合的概率密度函数或概率质量函数的对数形式,这个函数的值越大,表示该参数估计值越优。

+

通常情况下,对数似然函数的形式是一个关于参数的函数,用参数的估计值代入函数中得到的结果最大化,即是最大似然估计的结果。

+

对数似然函数的使用可以简化计算,因为将似然函数取对数后,可以将连乘变为连加,减少了数值计算的复杂度。此外,对数似然函数还有其它一些优点,如避免数值下溢、易于求导等。

+

生成模型是一种机器学习模型,用于学习样本数据的概率分布函数。与生成模型相对应的是判别模型,判别模型直接从输入到输出映射,不考虑数据的分布情况。

+

生成模型通常基于概率分布函数,用于生成与样本数据类似的新数据。因此,生成模型需要对样本数据的概率分布进行建模,以便生成新的数据。

+

对数似然函数可以被用来评估概率分布函数的质量,因为它是衡量模型对样本数据拟合的常用指标。通常,生成模型使用对数似然函数作为目标函数进行优化,以最大化对数似然函数的值。

+

具体来说,最大化对数似然函数可以使得生成模型的输出更加接近于样本数据的真实分布,从而提高模型的生成能力。此外,对数似然函数的优化通常可以通过梯度下降等优化算法进行,因此,可以使用数值优化方法来求解最优的模型参数,以最大化对数似然函数的值。

+

因此,生成模型通常会构造概率分布函数,并通过最大化对数似然函数来训练模型,以便生成与样本数据类似的新数据。

+
+
    +
  • +

    本文是构造一个模型来近似一个分布,坏处是不知道分布是什么样子

    +
  • +
  • +

    理论基础:对期望的求导等于对f的求导

    +
  • +
+

image-20230419113115468

+

模型

+
    +
  • +

    一个比喻:现在有个游戏,它的画面是800万像素的图像,我要用生成器近似生成出这个游戏。生成器是一个概率分布\(p_g\)(即我们学出来的“假”游戏),800万像素的图片是目标 \(x\),每个像素都来自于这个\(p_g\)。我们首先在一个输入噪音 \(z\)\(z\) 可以是一个100维的向量,其中元素均值为0方差为1的高斯噪音)上定义一个先验的概率 \(p_z(z)\),生成模型就是将 \(z\) 映射成 \(x\)(我认为一个100维的变量就决定了这个游戏逻辑,实际上不知道真实游戏的代码),它有一个可学习的参数 \(\theta_g\),我们可以将生成器定义为 \(G(z;\theta_g)\)。所以每次都随机一个 \(z\) 去看生成的效果。

    +
  • +
  • +

    判别器是MLP到1或0的函数,1表示是真图,0表示假图

    +
  • +
  • +

    所以\(G\)要最小化 \(\log (1-D(G(z)))\),让\(D\)尽量犯错,不让他分辨出来。

    +
  • +
  • +

    目标:\(x\sim p_{data}(x)\) 表示 \(x\) 是采样真实分布,第一项如果 \(D\) 是完美的那么 \(D(x)=1,\log D(x)=0\),否则为负数;第二项,采样噪音,如果 \(D\) 是完美的,那么 \(D(G(z))=0,\log(1-D(G(z)))=0\),否则为负数,所以要 \(\max\limits_{D}\)

    +
  • +
+

image-20230419145639866

+
    +
  • +

    达到均衡就是纳什均衡

    +
  • +
  • +

    例子:下图黑点线\(p_x\)是数据真实分布,绿色线\(p_g\)是生成器的分布,蓝色点线是\(D\)是判别器的分布。图(b)中可以看到接近黑点线的时候,判别器靠近1,接近绿线靠近0,(c)中将绿线往黑点线靠近,使得判别器对两个区分很困难,最后图(d)中判别器永远给出0.5

    +
  • +
+

image-20230419150614487

+
    +
  • 算法:每次迭代(最外层的for-loop)里,先进行\(k\)\(2m\)大小的小批量采样(噪音样本和真实样本各一半),然后对\(D\)进行梯度更新,然后再采样\(m\)的噪音样本对\(G\)进行梯度更新。
  • +
+

这里\(k\)是超参数,如果对\(D\)没有足够好的更新,那么下面一项中\(D\)没有升级,\(G\)的升级就没有意义反正总能糊弄过去;但是如果\(D\)更新的太完美,就会导致结果为0,没有梯度

+

判断收敛比较难。

+

image-20230419152648063

+
    +
  • 问题:一开始\(G\)很弱,很容易将\(D\)训练到完美,导致梯度消失,可以考虑最大化\(\log D(G(z))\),但是\(\log 0\)会有数学上的问题,后来会有改进
  • +
+

image-20230419153506987

+

理论

+
    +
  • 下图中\(p\)表示概率分布(0到1的值),如果最后\(p_{data}=p_{g}\)那么\(D^*_G=\frac12\),二分类器区分两个分布的很好的办法
  • +
+

image-20230419153744654

+
    +
  • 概率论期望的求解: + $$ + E_{x\sim p}f(x)=\int_xp(x)f(x)dx + $$ + image-20230419154242201
  • +
+

注意:\(g(z)=x\)

+

image-20230419154423454

+

\(a\log(y)+b\log (1-y)\)求导即可得最大值,它是凸函数

+
    +
  • 求出 \(\max\limits_{D}\)
  • +
+

image-20230419154604580

+
    +
  • 再求 \(\min\limits_{G}\)
  • +
+

首先要学习一下 KL 散度(暂时不会),\(KL(p||q)=E_{x\sim p}\log\frac{p(x)}{q(x)}\),表示在知道 \(p\) 的情况下至少要多少比特才能将 \(q\) 描述出来

+

两个KL散度可以拼成JS散度,KL散度是非对称的,JS散度是对称的

+

image-20230419154931129

+
    +
  • +

    有人说因为GAN使用了对称散度所以训练简单,未来还有工作用更简单的目标函数

    +
  • +
  • +

    证明二:

    +
  • +
+

image-20230419155228347

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230415181337390.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230415181337390.png" new file mode 100644 index 00000000..85ff4df1 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230415181337390.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419162022593.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419162022593.png" new file mode 100644 index 00000000..7ce13428 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419162022593.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419162213213.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419162213213.png" new file mode 100644 index 00000000..adf2aee7 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419162213213.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419173130718.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419173130718.png" new file mode 100644 index 00000000..8af071f4 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419173130718.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419173145702.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419173145702.png" new file mode 100644 index 00000000..f4c4b849 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419173145702.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419174547413.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419174547413.png" new file mode 100644 index 00000000..54ba9203 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419174547413.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419190843619.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419190843619.png" new file mode 100644 index 00000000..c62d6ce2 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT.assets/image-20230419190843619.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT/index.html" new file mode 100644 index 00000000..c472e97f --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/7-BERT/index.html" @@ -0,0 +1,4773 @@ + + + + + + + + + + + + + + + + + + + + + + + + + BERT - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

BERT

+

标题

+
    +
  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  • +
  • 重点是Bidirectional 双向
  • +
  • BERT全称 Bidirectional Encoder Representations from Transformers
  • +
+

Abstract

+
    +
  • 工作来源于ELMo,这个是芝麻街中的人物,而BERT是其中另一个人物。后来芝麻街中的人物都被用了个遍
  • +
  • BERT和GPT的区别是GPT只用了右侧信息,而BERT用了左右侧信息。ELMo是用RNN,下游任务需要微调架构,但BERT泛用性强
  • +
  • 在11个任务中实现SOTA。介绍了绝对优势(正确率)和相对优势(正确率的提升)
  • +
+

导言

+
    +
  • +

    目前使用预训练模型到下游任务的有两种思路

    +
  • +
  • +

    feature-based

    +

    例如ELMo,将预训练表示作为额外的特征输入到模型中。使用了双向信息但是用的是老的RNN

    +
    +

    预训练模型中的feature-based指的是使用预训练模型的中间层(通常是最后一层)的输出作为特征来进行下游任务。这些特征通常被称为“预训练特征”或“表示”。

    +

    预训练模型通过在大规模未标注数据上进行预训练来学习通用的特征表示,这些表示可以被用于各种下游任务,如文本分类、命名实体识别、情感分析等。在使用预训练模型进行下游任务时,可以将预训练模型的中间层输出作为输入特征,然后将这些特征提供给下游模型,如传统的机器学习算法或者其他神经网络模型,以完成具体的任务。

    +
    +
  • +
  • +

    fine-tuning

    +

    例如GPT,微调参数。只用了单向信息。

    +
  • +
  • +

    这两种方法都使用相同的目标函数,并且是单向的

    +
  • +
  • +

    很多语言任务并不一定是从左看到右,文本两个方向的信息都有用

    +
  • +
  • +

    BERT思路:用mask掩码盖住部分文本做完型填空,可以看左右的信息;另外还训练了判断两个给定句子在原文中是否相邻

    +
  • +
+

模型

+
    +
  • 预训练:没有标号的数据;微调:有标号的数据
  • +
+

image-20230419162022593

+
    +
  • 对Transformer进行了调参
  • +
+

image-20230419162213213

+
    +
  • 参数量的计算:最下面是嵌入层,字典为30K大小变成model大小为H。然后多头对query/key/value各有一个矩阵,矩阵大小为\(H*H\)(论文中写的\(d_{model}*d_v*head\),而\(d_v*head=d_{model}\)),然后再变回去需要一个\(H*H\)。上面全连接层是\(H*(4H)\)\((4H)*H\)。然后有\(L\)个transformer block
  • +
+

image-20230419173130718

+

image-20230419173145702

+

image-20230415181337390

+
    +
  • +

    BERT输入是一个句子或者句子对(例如答案和回答作为一对输入),称为sequence。而Transformer是一个sequence对,因为encoder和decoder各需要一个sequence。

    +
  • +
  • +

    切词的方法是WordPiece。如果按空格切词,那么会导致嵌入层的参数量过大

    +
  • +
+
+

WordPiece是一种用于自然语言处理中的分词方法,它将单词拆分成较小的子词或标记,这些子词或标记被称为WordPieces。WordPiece模型在训练过程中会根据语料库的频率和语言模型选择最优的WordPieces,这样可以更好地处理未知词汇和罕见词汇。WordPiece已被广泛应用于机器翻译、语音识别和文本分类等任务中。

+

以英语单词"unbelievable"为例,使用WordPiece分词方法可以将其拆分成较小的子词或标记,如下所示:

+

un- ##be- ##liev- ##able

+

其中,"##"表示这是一个WordPiece的一部分。这样,单词"unbelievable"就被拆分成了四个WordPieces,这些WordPieces可以更好地处理未知词汇和罕见词汇,从而提高自然语言处理的效果。

+
+
    +
  • BERT在句子最前面加上了一个[CLS]的特殊标记表示Classification,在两个句子中间加上了[SEP]。将每个词都embed之后然后输入BERT,得到输出\(C,T_1,\dots,T_N,T_{[SEP]},T_1',\dots,T_M'\),然后再接输出层。
  • +
+

image-20230419162022593

+
+

嵌入层(Embedding Layer)是深度学习模型中的一种常见层类型,用于将离散的输入数据(如单词、类别等)转换为连续的向量表示。它的作用类似于字典,将每个离散数据映射到一个唯一的向量,从而使得数据可以被神经网络处理。嵌入层的输出向量是根据输入数据在训练过程中学习到的,因此可以捕捉到数据之间的语义关系,例如相似性和相关性。在自然语言处理、推荐系统等领域中,嵌入层是非常常用的。

+
+
    +
  • 嵌入层的实现:
  • +
+

image-20230419174547413

+
    +
  • Task1:Masked LM(MLM)
  • +
+

对WordPiece生成的词元,有15%的概率随机替换成一个掩码\([MASK]\),让BERT来预测。而微调的时候没有这个掩码,可能会导致一些问题(不匹配)。解决方法:对于15%选中token。有时候并不是真的替换这个词为\([MASK]\)(80%概率),剩下10%替换成一个随机token,剩下10%不变。

+
    +
  • Task2:Next Sentence Prediction (NSP)
  • +
+

两种情况,A和B是相邻的,标上IsNext;A和B不相邻,标上NotNext。这能提高QA和推理的效果

+

image-20230419190843619

+
    +
  • 微调BERT
  • +
+

不能像Transformer一样做机器翻译

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419200814392.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419200814392.png" new file mode 100644 index 00000000..d1e3266d Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419200814392.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419205157435.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419205157435.png" new file mode 100644 index 00000000..fbedb481 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419205157435.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419205512253.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419205512253.png" new file mode 100644 index 00000000..01ab5e31 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT.assets/image-20230419205512253.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT/index.html" new file mode 100644 index 00000000..004a8395 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/8-ViT/index.html" @@ -0,0 +1,4814 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ViT - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

ViT

+

标题

+
    +
  • An Image is Worth 16x16 Words: Transformers for Image Recognition at scale
  • +
  • 这里是16x16表示的是图片可以看成16x16的patch组成的整体
  • +
+

摘要

+
    +
  • 单卡TPUv3训练需要2500天
  • +
+

引言

+
    +
  • NLP领域一般是在大规模数据集上做预训练,然后在特定领域的小数据集上做微调
  • +
  • Transformer处理的是序列,因为要做序列元素两两运算,所以复杂度是\(O(n^2)\),所以序列一般不会很长,BERT使用512长度,图片这里不能直接将2D拉成1D,需要降低序列长度
  • +
  • 之前的工作有:
  • +
  • CNN和自注意力结合:在Res50最后一层的特征图加上attention,最后一层这个时候只有14*14了;
  • +
  • 替换掉整个CNN:孤立自注意力,取局部窗口;轴注意力,分别在高度和宽度上做一次自注意力。没有硬件优化,比较慢,所以模型比较小
  • +
  • ViT是将图片的小patch通过全连接层得到一个linear embeddings,然后作为输入给Transformer,图片块当做是单词
  • +
  • 有监督监督
  • +
  • 结果:在没有强的约束的时候,在中等数据集上和同等大小的ResNet相比并不好,这是可预期的,因为Transformer没有CNN的归纳偏置 inductive biases(先验知识,提前的假设)
  • +
  • CNN的归纳偏置是locality和translation equivariance(后者是\(f(g(x))=g(f(x))\),这里\(g\)是平移,\(f\)是卷积)
  • +
  • 当有足够数据预训练的时候效果就好(相当于要更多数据来学出这些归纳偏置)
  • +
+

结论

+
    +
  • 在CV领域用标准的Transformer
  • +
  • 除了图片切割和位置编码用到了图像特有的归纳偏置,其他都没有,好处是对vision领域不需要有很多了解即可
  • +
  • 其他CV任务也可以用包括分割和识别。后来做了ViT-FRCNN和SETR,Swin Transformer
  • +
  • 自监督有用,但和无监督还是差很多
  • +
  • 还能做的更大,后来提出ViT-G,刷ImageNet到90分以上
  • +
+

相关工作

+
    +
  • 写的非常详细,此处略
  • +
+

ViT模型

+
    +
  • +

    整体架构图

    +
  • +
  • +

    加入位置编码

    +
  • +
  • 最后有很多输出结果,这里学习BERT,在最前面加一个[CLS]标记也就是下图中的0*,然后看这个token的最后结果,当做整个模型的输出
  • +
+

image-20230419200814392

+
    +
  • +

    上面的全连接层称为 \(E\),维度是 768*768(图片原大小是224*224,切成16*16方格得到14*14个patch即196,768是16*16*3是每个patch的大小)

    +
  • +
  • +

    每张图片(共196张)变成768长度的向量,前面再加一个CLS,得到Transformer输入长度197*768

    +
  • +
  • +

    位置编码也是768长度的向量,然后相,而不是拼接

    +
  • +
  • +

    位置编码选用1D和2D发现效果类似

    +
  • +
  • +

    CLS的使用

    +
  • +
  • +

    在Res50中,最后得到一个14*14的特征图,然后会通过一个GAP(Global Average Pooling)得到一个向量来分类,为什么ViT不做GAP而用CLS?

    +
  • +
  • +

    通过实验发现这两个方法都可以,但是作者是Transformer原教旨主义

    +
  • +
  • +

    位置编码

    +
  • +
  • +

    1D位置编码

    +
  • +
  • 2D位置编码,横纵坐标分别编码成768/2的长度然后拼接起来
  • +
  • 相对位置编码,用相对位置
  • +
  • +

    通过结果发现以上三种效果类似

    +
  • +
  • +

    微调

    +
  • +
  • +

    预训练好的模型不太好调输入图片的尺寸,一旦图片增大序列长度就会增大(patch大小不变),虽然基本能用,但是提前训练的位置编码就没用了。

    +
  • +
  • 解决上述方法是用插值,但是只是权宜之计
  • +
+

实验

+
    +
  • +

    自监督效果还可以,后来MAE使用自监督来训练ViT效果非常好

    +
  • +
  • +

    命名方法:

    +
  • +
+

image-20230419205157435

+

ViT-L16表示,ViT-Large模型且patch size是16*16

+
    +
  • +

    和CNN大模型比,分数都很高,而Transformer训练成本相对低一些

    +
  • +
  • +

    最重要的图:在小的数据集上ViT不如ResNet,在大数据集上相近

    +
  • +
+

image-20230419205512253

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE.assets/image-20230419210902471.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE.assets/image-20230419210902471.png" new file mode 100644 index 00000000..9a3772fc Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE.assets/image-20230419210902471.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE.assets/image-20230419212720557.png" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE.assets/image-20230419212720557.png" new file mode 100644 index 00000000..689e4712 Binary files /dev/null and "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE.assets/image-20230419212720557.png" differ diff --git "a/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE/index.html" "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE/index.html" new file mode 100644 index 00000000..de1bfeb7 --- /dev/null +++ "b/JY_HU/AI/\350\267\237\346\235\216\346\262\220\345\255\246AI/9-MAE/index.html" @@ -0,0 +1,4748 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MAE - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

MAE

+

image-20230419210902471

+

标题

+
    +
  • 标题:Masked Autoencoders Are Scalable Vision Learners
  • +
  • 东西快就是Efficient,东西大就是Scalable
  • +
  • Auto表示标号和样本来自同一个东西,在语言领域基本都是auto,但是在CV领域比较难做到auto,因为一般是另外标注的内容,而本文标号就是图片本身
  • +
  • 标题是一句浓缩后的结论比较客观,适合当标题
  • +
+

摘要

+
    +
  • MAE的方法很简单:随机盖住一些块,然后重建它们
  • +
  • 两个核心设计
  • +
  • 非对称的编码器和解码器设计:编码器只对可见的patch做编码(能大幅加速计算),解码器能重构图片
  • +
  • 当输入图片mask的比例很高的时候,比如75%的时候,可以迫使模型去学习更有意义的特征
  • +
+

关键图

+
    +
  • +

    架构图

    +
  • +
  • +

    这里Encoder画的比Decoder高,表示计算量主要在Encoder这里

    +
  • +
+

image-20230419212720557

+

导言

+
    +
  • 在Vision和Language领域Masked Autoencoder不同的原因
  • +
  • CNN中的掩码就是将部分像素置为特定值,但是卷积对边界并不敏感,这已经被ViT解决了
  • +
  • 两者的信息密度不同。语言高度语义化,但图片中有很多冗余甚至可以通过插值还原,方法就是高比例
  • +
  • 解码器的role不同。在语言中decoder只要一个全连接层就可以了,但是vision中就比较困难
  • +
+

MAE模型

+
    +
  • 非对称结构:编码器只看到可见的块,解码器能看到
  • +
  • 解码器可以看到
  • +
  • encoded visible patches:编码器对可见部分的浅表示
  • +
  • mask tokens:可以学习的向量
  • +
  • 解码器也是一个Transformer,所以也需要给mask token加入位置信息(但是从编码器来的token没说要不要加入位置信息)
  • +
  • 解码器最后一层是一个线性层,输出可能是256维向量然后reshap成16*16
  • +
  • 损失函数MSE
  • +
  • 做正则化效果更好(均值变成0,方差变成1)
  • +
+

实验

+
    +
  • 使用ViT,之前说ViT必须要使用很大的数据集才有好的效果,但是其实加入一些正则项也能使结果变好,在ImageNet-1K的数据集上也能实现
  • +
  • MAE对数据增强不敏感,随机crop效果就很好
  • +
  • 随机采样效果最好
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JY_HU/assets/1.jpg b/JY_HU/assets/1.jpg new file mode 100644 index 00000000..e9399eb4 Binary files /dev/null and b/JY_HU/assets/1.jpg differ diff --git a/JY_HU/assets/f79b764f05e06fb90e8b137d0dd9930.jpg b/JY_HU/assets/f79b764f05e06fb90e8b137d0dd9930.jpg new file mode 100644 index 00000000..cff2cc0b Binary files /dev/null and b/JY_HU/assets/f79b764f05e06fb90e8b137d0dd9930.jpg differ diff --git a/JY_HU/assets/image-20231119162719305.png b/JY_HU/assets/image-20231119162719305.png new file mode 100644 index 00000000..dbb0f8ed Binary files /dev/null and b/JY_HU/assets/image-20231119162719305.png differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/29d35a5c5fe58d9bf0fca3801ca7b87.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/29d35a5c5fe58d9bf0fca3801ca7b87.jpg" new file mode 100644 index 00000000..adf83679 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/29d35a5c5fe58d9bf0fca3801ca7b87.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/5a386e299f6b1898583bde4baa99924.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/5a386e299f6b1898583bde4baa99924.jpg" new file mode 100644 index 00000000..31567876 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/5a386e299f6b1898583bde4baa99924.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/7eb9b8e5f5fc8254447e9037f6e6d78.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/7eb9b8e5f5fc8254447e9037f6e6d78.jpg" new file mode 100644 index 00000000..f616444c Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/7eb9b8e5f5fc8254447e9037f6e6d78.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/88de407694937ab9b7229e2e7c209c9.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/88de407694937ab9b7229e2e7c209c9.jpg" new file mode 100644 index 00000000..44e05a2f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/88de407694937ab9b7229e2e7c209c9.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/997090e09b9f3e3613ab268b3c31d9c.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/997090e09b9f3e3613ab268b3c31d9c.jpg" new file mode 100644 index 00000000..4c85c77a Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/997090e09b9f3e3613ab268b3c31d9c.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/ab0813d675846185759fb80dcfa561c.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/ab0813d675846185759fb80dcfa561c.jpg" new file mode 100644 index 00000000..e5d6ff87 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/ab0813d675846185759fb80dcfa561c.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/articles-max-0215-eeweb-lgs-09.webp" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/articles-max-0215-eeweb-lgs-09.webp" new file mode 100644 index 00000000..607508f0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/articles-max-0215-eeweb-lgs-09.webp" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/b0c5307b1b37dca2540ae790c17fd62.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/b0c5307b1b37dca2540ae790c17fd62.jpg" new file mode 100644 index 00000000..d0932670 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/b0c5307b1b37dca2540ae790c17fd62.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/e74d6aa998504cd101036702b84f377.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/e74d6aa998504cd101036702b84f377.jpg" new file mode 100644 index 00000000..f294f401 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/e74d6aa998504cd101036702b84f377.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/fa3f5f60902ea7ca5f4fdf119f78e99.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/fa3f5f60902ea7ca5f4fdf119f78e99.jpg" new file mode 100644 index 00000000..08aae030 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/fa3f5f60902ea7ca5f4fdf119f78e99.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201554458.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201554458.png" new file mode 100644 index 00000000..c10b5dac Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201554458.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201822638.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201822638.png" new file mode 100644 index 00000000..a1d68890 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201822638.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201906942.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201906942.png" new file mode 100644 index 00000000..a1d68890 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120201906942.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120202158410.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120202158410.png" new file mode 100644 index 00000000..55a6b83e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20231120202158410.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20240101172710178.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20240101172710178.png" new file mode 100644 index 00000000..85020b86 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/image-20240101172710178.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/sym_50_counter.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/sym_50_counter.png" new file mode 100644 index 00000000..35915a2e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/assets/sym_50_counter.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/verilog/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/verilog/index.html" new file mode 100644 index 00000000..d63e6e71 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/verilog/index.html" @@ -0,0 +1,4858 @@ + + + + + + + + + + + + + + + + + + + + + + + + + verilog 常见语法问题 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Verilog中 reg和wire 用法和区别以及always和assign的区别

+

1、从仿真角度来说,HDL语言面对的是编译器,相当于使用软件思路,此时:

+
Text Only
1
+2
+3
wire对应于连续赋值,如assign;
+
+reg对应于过程赋值,如always,initial;
+
+

2、从综合角度,HDL语言面对的是综合器,相当于从电路角度来思考,此时:

+
Text Only
1
+2
+3
+4
+5
+6
+7
 wire型变量综合出来一般情况下是一根导线。
+
+ reg变量在always中有两种情况:
+
+     (1)always @(a or b or c)形式的,即不带时钟边沿的,综合出来还是组合逻辑;
+
+     (2)always @(posedge clk)形式的,即带有边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
+
+

3、设计中,输入信号一般来说不能判断出上一级是寄存器输出还是组合逻辑输出,对于本级来说,就当成一根导线,即wire型。而输出信号则由自己来决定是reg还是组合逻辑输出,wire和reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是reg输出,这比较稳定、扇出能力好。

+

4、Verilog中何时要定义成wire型?

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
情况一:assign语句
+
+   例如:
+
+           reg   a,b;
+
+           wire  out;
+
+           ......
+
+          assign   out = a & b;
+
+  如果把out定义成reg型,对不起,编译器报错!
+
+

情况二:元件实例化时必须用wire型

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
     例如:
+
+      wire   dout;
+
+     ram   u_ram
+
+   (
+
+    ....
+
+   .out(dout);
+
+   )
+
+  wire为无逻辑连线,wire本身不带逻辑性,所以输入什么就的输出什么。所以如果用always语句对wire变量赋值,对不起,编译器报错。
+
+  那么你可能会问,  assign    c = a & b;   不是对wire的赋值吗?
+
+  并非如此,综合时是将  a & b综合成 a、b经过一个与门,而c是连接到与门输出线,真正综合出来的是与门&,不是c。
+
+

5、何时用reg、何时用wire?

+
Text Only
1
+2
+3
+4
+5
+6
+7
 大体来说,reg和wire类似于C、C++的变量,但若此变量要放在begin...end之内,则该变量只能是reg型;在begin...end之外,则用wire型;
+
+ 使用wire型时,必须搭配assign;reg型可以不用。
+
+ input、output、inout预设值都是wire型。
+
+ 在Verilog中使用reg型,并不表示综合出来就是暂存器register:在组合电路中使用reg,组合后只是net;在时序电路中使用reg,合成后才是以Flip-Flop形式表示的register触发器。
+
+

6、reg和wire的区别:

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
 reg型数据保持最后一次的赋值,而wire型数据需要持续的驱动。wire用在连续赋值语句assign中;reg用于always过程赋值语句中。
+
+在连续赋值语句assign中,表达式右侧的计算结果可以立即更新到表达式的左侧,可以理解为逻辑之后直接连接了一条线,这个逻辑对应于表达式的右侧,这条线对应于wire;
+
+ 在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,这个变量可以声明成reg型,根据触发条件的不同,过程语句可以建模不同的硬件结构:
+
+(1)如果这个条件是时钟上升沿或下降沿,那硬件模型就是一个触发器,只有是指定了always@(posedge or negedge)才是触发器。
+
+(2)如果这个条件是某一信号的高低电平,那这个硬件模型就是一个锁存器。
+
+(3)如果这个条件是赋值语句右侧任意操作数的变化,那这个硬件模型就是一个组合逻辑。
+
+

7、过程赋值语句always@和连续赋值语句assign的区别:

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
(1)wire型用于assign的赋值,always@块下的信号用reg型。这里的reg并不是真正的触发器,只有敏感列表内的为上升沿或下降沿触发时才综合为触发器。
+
+(2)另一个区别,举例:
+
+      wire     a;
+      reg      b;
+     assign     a = 1'b0;
+     always@(*)
+             b = 1'b0;
+
+     上面例子仿真时a将会是0,但是b的状态是不确定的。因为Verilog规定,always@(*)中的*指的是该always块内的所有输入信号的变化为敏感列表,就是说只有当always@(*)块内输入信号发生变化,该块内描述的信号才会发生变化。
+
+    像always@(*)  b= 1'b0; 中由于1‘b0是个常数,一直没有变化,由于b的足组合逻辑输出,所有复位时没有明确的值--即不确定状态,又因为always@(*)块内没有敏感信号变化,此时b信号一直保持不变,即不确定是啥,取决于b的初始状态。
+
+

以下为个人书写规范,方便个人统一格式,与行业规范有所不符

+
Verilog
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
module name (   //input 
+            clk,
+        rst,
+        datain1,
+        datain2,
+        //output 
+            dataout1,
+        dataout2
+);
+
+input clk,rst;
+input [7:0] datain1, datain2;
+
+output reg [7:0] dataout1;//若不是wire型可以在output后直接声明为reg类型;
+output [7:0] dataout2;//可以不用声明为wire;output [7:0] wire dataout2与此相同
+
+always@ (posedge clk or negedge rst)
+begin
+    if(~rst)//~为按位取反,!为逻辑取反
+        begin
+        dataout1 <= 8'd0;
+        end
+    else
+        begin
+    dataout1 <= datain1 + datain2;  
+        end
+end
+
+assign dataout2 = dataout1 + 8'd1;
+
+endmodule 
+
+
    +
  • Verilog中input和output默认类型为wire类型,若不声明为reg统一为wire类型,输入信号只能为wire型,而输出信号可以为wire,也可以为reg;输出类型可以为reg但是并不是所有的reg型都被编译为寄存器,因为只要在always@里进行赋值必须使用reg类型,例如:
  • +
+
Verilog
1
+2
+3
+4
+5
+6
+7
+8
reg a ;
+reg b;
+always@ * begin
+  if (<condition>) begin
+    a = tmp ;
+    b = a ;
+  end
+end
+
+

在这段代码中a是不会综合出寄存器的,而b却会,原因在于a是中间变量,就是一条线,所以综合出来的不是寄存器,而是一条线。而在condtion不满足的情况下b要保值,所以b会综合成寄存器。(引用BruceX的回答)

+

6t

+
    +
  • 使用always赋值时一般使用非阻塞赋值(<=)为时序逻辑,一般不使用阻塞赋值(=)但语法正确,为组合逻辑。无论使用哪种赋值方式,赋值号左边必须为reg类型。
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241 notes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241 notes/index.html" new file mode 100644 index 00000000..f8c4681d --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241 notes/index.html" @@ -0,0 +1,4725 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 数逻笔记 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

数字逻辑设计 notes

+

SOP:sum of minterms

+

对函数求complement

+

Implicant: squares in the map

+

product term obtained by combining adjacent squares in the map into a rectangle with the number of squares a power of 2.

+

A Prime Implicant is a product term obtained by combining the maximum possible number of adjacent squares in the map into a rectangle with the number of squares a power of 2.

+

A prime implicant is called an Essential Prime Implicant if it is the only prime implicant that covers (includes) one or more minterms.

+

简单来说就是如果没有这个圈有的格子就包裹不进去,就是 essential prime implicant

+

1.3 implicant +蕴含项其实就是我们文章最开始提到的“圈”,每一种可能的圈就是一个蕴含项

+

在这里插入图片描述

+

上图中就有7个一次蕴含项,6个二次蕴含项和1个四次蕴含项,共计14个蕴含项

+

1.4 prime implicant +质蕴含项就是不能与其它蕴含项合并的蕴含项,在1.3中,我们发现四次蕴含项中有4个二次蕴含项,那么它们就不是质蕴含项

+

在这里插入图片描述

+

可以看到上图中的每一个圈都不能和其它圈合并,所以上图有共计4个质蕴含项

+

1.5 essential prime implicant +实质本源蕴含项中必须含有至少一个没被包含在其它蕴含项中的项,而且不能被更大的圈包裹

+

在这里插入图片描述

+

上图中有三个实质本源蕴含项,而我们找到最简SOP的方式就是找到所有的实质本源蕴含项

+

cost criteria

+

Literal cost L

+

gate input cost G

+

gate input cost with NOTs GN

+

propagation delay \(t_{pd} = max{(t_{PLH},t_{PHL})}\)

+

\(t_{PHL}\)

+

propagation : 传输

+

分为transport delay 和 inertia delay(有rejection time属性)

+

image-20231015200001435

+

image-20231015200046111

+

三个串联?四个可以吗

+

74LS00与非门传输延迟测量:3个74LS00门串联,4个可以吗?

+

\((\overline{A B})\)

+

image-20231017153245413

+

2-12怎么化简

+

4位全加器的延时较长

+

因此采用carry look ahead adder

+

16位加法器使用4个CLA串联

+

64位 组超前进位

+

将G0~3, P0~3传给下一层?

+

C4 = G3 +P3G2 + P3P2G1+P3P2P1G0+P3P2P1P0C0

+

​ = G0~3 + P0~3*C0

+

C8 = G4~7 + P4~7*C4

+

同理,C12 = G8~11+ P8~11*C8

+

C16 = G12~15+ P12~15*C12

+

依赖关系和4位的CLA相似

+

Carry Lookahead Adder in VHDL and Verilog with Full-Adders

+

小测1 复习

+

1、逻辑表达式化简:

+

\(A+\overline{A}B=(A+B)(A+\overline{A})=A+B\)

+

\(逻辑表达式可重复使用\)

+

2、门代价计算:

+

3、卡诺图化简

+

4变量的卡诺图,16个格子,圈的大小为8->1个变量

+

image-20231113230459090

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\225\260\351\200\273\345\256\236\351\252\214/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\225\260\351\200\273\345\256\236\351\252\214/index.html" new file mode 100644 index 00000000..e9dca37e --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\225\260\351\200\273\345\256\236\351\252\214/index.html" @@ -0,0 +1,4662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 实验过程 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

数逻实验过程笔记

+

image-20231120201822638

+

发现只要是在这个文件结构下的图片都会正常显示

+

因为实际上typora编辑器的设置中拷贝图片时会将assets会单独复制一份

+

image-20231120201554458

+

然而,拷贝后进行缩放,就是改为了html格式,就不能够正常渲染?

+

image-20231120201906942

+

image-20231120202158410

+

发现mkdocs在渲染导出HTML时是会将除了md格式的所有东西都拷贝一份到自己的目录下面的

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\234\237\346\234\253\345\244\215\344\271\240/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\234\237\346\234\253\345\244\215\344\271\240/index.html" new file mode 100644 index 00000000..4e3089a3 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/1 \346\225\260\345\255\227\351\200\273\350\276\221\350\256\276\350\256\241/\346\234\237\346\234\253\345\244\215\344\271\240/index.html" @@ -0,0 +1,4862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 期末复习 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Digital Design final exam

+

对应的英文名词

+

上课ppt,重点章节回放,guahao实验指导网页,小测ppt,

+

时钟空翻问题

+

D锁存器

+

和时钟长度有关、D锁存器延时有关

+

Triggered SR 主从触发器

+

一次性采样问题

+

小的毛刺,干扰

+

英文电子书pdf搜索找到名词,中文纸质书理解

+

BCD码,gray code 余三码

+

SOP,POS 最大项,最小项,卡诺图化简,

+

高阻输出 三态门和传输门

+

多级电路,二级电路

+

门输入成本?gate input cost

+

PLD: programmable logic devices

+

PLD includes ROM,PAL,PLA

+

ROM:与门固定,或门阵列可编程

+

PAL:或门固定,与门阵列可编程

+

997090e09b9f3e3613ab268b3c31d9c

+

29d35a5c5fe58d9bf0fca3801ca7b87

+

ab0813d675846185759fb80dcfa561c

+

PLA:与门和或门均可编程

+

CPLD, FPGA, *LUT

+

第二章 组合逻辑电路 +布尔代数(Boolean)的概念

+
    +
  • 变量与真值的关系,二值逻辑和门
  • +
  • 三种基本运算:与或非 +查蔬篇法则与电路符号,基本运算公式、规则、反演, +基本逻辑电路与其逻辑特性
  • +
  • +

    与、或门的开、关门特点,异或的同相、反相性质 +逻辑函数的化简.

    +
  • +
  • +

    公式化简、最小项,最大项、卡诺图化简、蕴涵项,任意项。 不同函数形式的变换及与最小项的关系 +函数的五种表示形式

    +
  • +
  • 真值表、逻辑解析式、波形图、卡诺图、逻辑电路图 +高阻输出(三态门,传输门)。
  • +
+

功能模块化设计

+

译码器和与或门

+

encoder&decoder

+

多路复用器(加反相器?)

+

加减法器:算数函数:+-*,增量函数及运算

+

补码运算

+

半加器及全加器电路设计

+

多位全加器,全减器设计 异或门

+

超前进位

+

进位传递与延迟,进位函数:generate,Gi,propagate

+

ALU设计

+

触发器 JK,SR, D

+

一次性采样问题

+

主从触发器和边沿触发器

+

脉冲触发器

+

SR 锁存器 R=1 S=0 复位 Q=0, R=0,S=1 置位 Q=1,

+

\(\overline{S}\overline{R}\) 锁存器 $$$$$$$$$

+

D 锁存器

+

模三累加器

+

输出只依赖状态

+

输出画到弧线上面

+

脉冲(主从)触发器

+

边沿触发器 edge triggered 有一次性采样问题?

+

J-K T flip-flops

+

状态图化简注意未定义状态利用态进行化简

+

所谓setup time就是在negedge或posedge发生前信号要有稳定的一段时间

+

所谓hold time就是在negedge或posedge发生后信号要有稳定的一段时间

+

mealy 状态是抽象的数字编号(000,001,010........111// 0,1,2,3,4,5),状态转移曲线上画的是input/output

+

current state到next state的状态转移就是从一个圆圈到下一个圆圈

+

moore 圆圈里画的是状态/输出,因为输出仅仅和当前的状态有关,不依赖于输入,输入仅仅影响状态转移,所以画在状态转移曲线上

+

电路延时分析

+

时序问题

+

锁存器与触发器 +S-R锁存器的原理、特征表、特征方程,内部电路分析,不确定状态的原因及出现条件 +D锁存器、D触发器的原理、特征表、特征方程 +内部电路分析JK触发器、T触发器的行为、特征表、特征方程 +霍荣馨答势盗菌触发的概念,脉冲触发的一次性采样行为的原因 +锁存器和触发器的时序,建立时间、保持时间、传输延时等时序成分

+

各种触发器的图形符号

+

纹波计数器

+

低位的进位输出到高位的计数EN端口

+

和同步计数器

+

存储器基础:

+

地址线重合选择

+

计算所需内存位数

+

猝发读写?

+

SRAM和DRAM的区别在于:123

+
    +
  • 存储原理:SRAM的存储单元采用稳定的触发器结构,不需要进行定期刷新操作,而DRAM的电容逐渐漏电,数据需要定期刷新以保持其正确性。
  • +
  • 访问速度:SRAM的访问速度非常快,因为数据存储在触发器中,可以立即读取和写入,而DRAM的访问速度相对较慢,因为数据存储在电容中,需要经过访问晶体管的操作。
  • +
  • 价格:SRAM比DRAM更快,但是更昂贵,而DRAM则更便宜但速度较慢。
  • +
  • 存储方式:SRAM使用更多的电路来存储每个位,而DRAM使用一个电容器和一个晶体管来存储每个位。
  • +
  • +

    寻址方式:DRAM需要通过行地址和列地址来寻址,而SRAM则只需要一个地址就可以了。

    +
  • +
  • +

    Refresh Controller and Refresh Counter(刷新控制器和刷新计数器):

    +
  • +
  • 问题解释: 这提到了DRAM中的刷新机制。在DRAM中,由于存储单元的电荷逐渐泄漏,需要定期进行刷新,以防止数据丢失。
  • +
  • 解答: 刷新控制器和刷新计数器协同工作,定期刷新存储器中的数据,确保其稳定性。
  • +
  • Read and Write Operations(读和写操作):
  • +
  • 问题解释: 提到了DRAM的读和写操作,以及应用行地址和列地址的方式。
  • +
  • 解答: 读操作涉及从存储单元中读取数据,写操作涉及向存储单元写入数据。行地址指定了所选行,列地址指定了所选列。这种分解地址的方式有助于定位到具体的存储单元。
  • +
  • Why is the address split?(为什么地址要拆分?):
  • +
  • 问题解释: 问为什么需要将地址拆分成行地址和列地址。
  • +
  • 解答: 地址拆分有助于提高存储器的定位精度。行地址用于选择特定行,而列地址用于选择行中的具体元素。这种拆分有助于提高DRAM的寻址效率。
  • +
  • Why is the row address applied first?(为什么首先应用行地址?):
  • +
  • 问题解释: 询问为什么在操作中首先应用行地址。
  • +
  • 解答: 行地址的应用确定了所需的行,这是存储单元的大致位置。在确定了行后,列地址用于选择行中的具体元素。这种顺序有助于提高地址的定位效率。
  • +
+

SRAM和DRAM的区别:

+
    +
  • SRAM(静态随机存取存储器):
  • +
  • 由触发器(flip-flops)构成,不需要定期刷新。
  • +
  • 读写速度较快,但成本较高,密度较低。
  • +
  • 通常用于高性能缓存。
  • +
  • DRAM(动态随机存取存储器):
  • +
  • 由电容和晶体管构成,需要定期刷新以防止数据丢失。
  • +
  • 读写速度相对较慢,但成本较低,密度较高。
  • +
  • 通常用于主存储器。
  • +
+

总体而言,SRAM适用于需要高性能和不需要频繁刷新的场景,而DRAM适用于需要高密度存储和较低成本的场景。

+

画出状态机所对应的电路图:

+

mealy状态机的下一状态由当前状态和输入决定

+

可以画很多条竖线

+

counter 计数器的实现

+

接口定义:输入EN,clk,输出Q0-Q3,CO 四个D flip-flop

+

ripple counter是asynchronous counter,是 将一个不断自反的 FF 的输出直接或间接作为下一个 FF 的时钟脉冲。由于形成一次脉冲需要一对 0&1,所以前一个 FF 取反两次才能引起下一个 FF 取反一次,如果下一个 FF 是在上一个 FF 的输出从 10 时触发,那两个 FF 的变化刚好对应于二进制自增的进位规律:(0,0)(0,1)(1,0)(1,1)(0,0),...

+

ring counter是移位寄存器的代表,

+

4-bit “synchronous(同步)”计数器,分为serial gating 和 parallel gating,区别在于逻辑门之间的延时parallel gating小一些

+

4-bit binary counter with parallel load 就是将LD信号和LD非信号输入,LD非信号和clk与一下,使得LD==1时就不count,直接并行输入数据

+

BCD counter就是在Q0和Q3都为1时(数到9的时候)要回到0,那么LD=1时并行输入0,且LD信号就是Q0andQ3

+

radix = 50/256 counter 需要使用两块74LS161芯片(16进制adder,同步四位2进制计数器)连接实现,一般clk信号是直接接入的,而CTp和CTt信号可以作为使能,使用异步清零(CR非)来实现mod N计数器,异步清零不是通过LD新的数来实现的,异步清零和clk是同等地位的信号(always @posedge clk or negedge CRn begin)

+

下图输出50(0011 0010)时重置

+

img

+

arbitrary counter需要使用状态图和状态机实现

+

adder subtracter

+

半加器,全加器

+

half adder的逻辑就是S = X非Y+Y非X,C = XY

+

full adder考虑了低位向高位进位的操作: S = X,Y,Ci-1三者奇数个为1,决定当前位,Ci = XY+Ci-1*( X非Y+Y非X)决定当前位给出的进位,通常使用异或门,S是三个亦或, X非Y+Y非X是X异或Y

+

full adder可由两个half adder叠加搭建

+

4-bit ripple adder的过程就是正常加法进位的过程

+

5a386e299f6b1898583bde4baa99924

+

4位加法器的抽象表示

+

image-20240101172710178

+

4位加减法器的抽象表示,S是运算符

+

7eb9b8e5f5fc8254447e9037f6e6d78

+

register cell design

+

针对无移位操作的寄存器cell 设计:

+

Give two register transfer operations (R1 unchanged except for the following cases):

+

C1: R1<-- R1 + R2

+

(~C1)C2: R1<--R1 - 1

+

Use two 4-bits registers, one 4-bit adder, and other necessary gates to implement the above operations.

+

source register的值作为输入和控制信号一并接到D FF的输入端,D FF的输出端接给destination register

+

LD = C1+C1非 = 1

+

Di = C1(R1+R2)+非C1(R1-1)

+

有移位操作的寄存器cell

+

shared logic

+

即只涉及输入的控制信号,不涉及当前状态的逻辑值组合可以被重复利用

+

化简的方法:一般两个操作数,两个寄存器设为Ai,Bi,状态记作At,Bt,下一状态为At+1,Bt+1,当前的寄存器的值

+

还是用卡诺图化简的

+

serial transfer and microoperations

+

serial transfer就是像主从触发器一样接起来,n位需要n个上升沿才能传输完毕

+

serial addition与4位carry adder的直接实现是space and time的tradeoff

+

fa3f5f60902ea7ca5f4fdf119f78e99

+

8-1 multiplexer可以实现任意3输入的逻辑函数

+

8-1 multiplexer由3-8 decoder先将3位的控制信号译码成8个单独的信号,再在8个信号中选一个

+

e74d6aa998504cd101036702b84f377

+

b0c5307b1b37dca2540ae790c17fd62

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/15-16-middle/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/15-16-middle/index.html" new file mode 100644 index 00000000..8aabb6f4 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/15-16-middle/index.html" @@ -0,0 +1,4889 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 15-16 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

15-16年期中考试试卷

+

+ + + + 浙江大学2015-16秋冬《数据结构基础》期中模拟练习 +
+ +

+

+ + +
浙江大学2015-16秋冬《数据结构基础》期中模拟练习
开始时间01/01/2016 8:00:00 AM
结束时间01/18/2038 8:00:00 AM
答题时长90分钟
考生
得分43
总分104

判断题得分:8总分:10
R1-1

N(logN)2N(logN)^2 is O(N2)O(N^2).

+
(2分)
评测结果答案正确(2 分)
R1-2

If the postorder and inorder traversal sequences of a binary tree are the same, then none of the nodes in the tree has a right child.

+
(2分)
评测结果答案正确(2 分)
R1-3

The best "worst-case time complexity" for any algorithm that sorts by comparisons only must be O(NlogN)O(NlogN).

+
(2分)
评测结果答案正确(2 分)
R1-4

If the most commonly used operations are to visit a random position and to insert and delete the last element in a linear list, then sequential storage works the fastest.

+
(2分)
评测结果答案正确(2 分)
R1-5

Given the input sequence onto a stack as {1, 2, 3, ..., NN}. If the first output is ii, then the jj-th output must be ji1j-i-1.

+
(2分)
评测结果答案错误(0 分)
单选题得分:30总分:64
R2-1

Given a tree of degree 4. Suppose that the numbers of nodes of degrees 2, 3 and 4 are 4, 2 and 1, respectively. Then the number of leaf nodes must be:

+
(6分)
评测结果答案错误(0 分)
R2-2

Suppose that an array of size m is used to store a circular queue. If the front position is front and the current size is size, then the rear element must be at:

+
(6分)
评测结果答案错误(0 分)
R2-3

Insert {5, 2, 7, 3, 4, 1, 6} one by one into an initially empty min-heap. The preorder traversal sequence of the resulting tree is:

+
(6分)
评测结果答案正确(6 分)
R2-4

Among the following methods, which one's time complexity is always O(NlogN)O(NlogN), no matter what the initial condition is?

+
(3分)
评测结果答案错误(0 分)
R2-5

Suppose that the height of a binary tree is hh (the height of a leaf node is defined to be 1), and it has only the nodes of degrees 0 and 2. Then the minimum and maximum possible total numbers of nodes are:

+
(6分)
评测结果答案错误(0 分)
R2-6

Suppose that the level-order traversal sequence of a min-heap is {1, 3, 2, 5, 4, 7, 6}. Use the linear algorithm to adjust this min-heap into a max-heap. The inorder traversal sequence of the resulting tree is:

+
(6分)
评测结果答案正确(6 分)
R2-7

To delete p from a doubly linked list, we must do:

+
(6分)
评测结果答案正确(6 分)
R2-8

If on the 9th level of a complete binary tree (assume that the root is on the 1st level) there are 100 leaf nodes, then the maximum number of nodes of this tree must be:

+
(6分)
评测结果答案正确(6 分)
R2-9

The array representation of a disjoint set containing numbers 0 to 8 is given by { 1, -4, 1, 1, -3, 4, 4, 8, -2 }. Then to union the two sets which contain 6 and 8 (with union-by-size), the index of the resulting root and the value stored at the root are:

+
(6分)
评测结果答案错误(0 分)
R2-10

For a binary search tree, in which order of traversal that we can obtain a non-decreasing sequence?

+
(3分)
评测结果答案正确(3 分)
R2-11

Given input { 321, 156, 57, 46, 28, 7, 331, 33, 34, 63 }. Which one of the following is the result after the 1st run of the Least Signification Digit (LSD) radix sort?

+
(4分)
评测结果答案错误(0 分)
R2-12

Which one of the following relations is correct about the extra space taken by heap sort, quick sort and merge sort?

+
(3分)
评测结果答案错误(0 分)
R2-13

Given the pushing sequence of a stack as {1, 2, 3, 4, 5}. If the first number being popped out is 4, then the last one out must be:

+
(3分)
评测结果答案正确(3 分)
程序填空题得分:0总分:10
R5-1

The function is to increase the value of the integer key at position P by a positive amount D in a max-heap H.

+
void IncreaseKey( int P, int D, PriorityQueue H )
+{
+   int i, key;
+   key = H->Elements[P] + D;
+   for ( i = (3分); H->Elements[i/2] < key; i/=2 )
+      (3分);
+   H->Elements[i] = key;
+}
+
序号结果测试点得分
0编译错误0
1未作答0
评测结果多种错误(0 分)
函数题得分:5总分:20
R6-1
No Greater Than X in BST
(20分)

You are supposed to output, in decreasing order, all the elements no greater than X in a binary search tree T.

+

Format of function:

+
void Print_NGT( Tree T,  int X );
+

where Tree is defined as the following:

+
typedef struct TreeNode *Tree;
+struct TreeNode {
+    int Element;
+    Tree  Left;
+    Tree  Right;
+};
+

The function is supposed to use Output(X) to print X.

+

Sample program of judge:

+
#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct TreeNode *Tree;
+struct TreeNode {
+    int Element;
+    Tree  Left;
+    Tree  Right;
+};
+
+Tree BuildTree(); /* details omitted */
+void Output( int X ); /* details omitted */
+
+void Print_NGT( Tree T,  int X );
+
+int main()
+{
+    Tree T;
+    int X;
+
+    T = BuildTree();
+    scanf("%d", &X);
+    Print_NGT( T, X );
+    printf("End\n");
+
+    return 0;
+}
+
+/* Your function will be put here */
+
+

Sample Output 1 (for the tree shown in Figure 1):

+

+
91 90 85 81 80 55 End
+

Sample Output 2 (for the tree shown in Figure 2):

+

+
End
+
编译器
GCC
代码
void Print_NGT( Tree T,  int X ) {
+    return;
+}
编译器输出
a.c: In function ‘BuildTree’:
+a.c:33:6: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
+      scanf("%d", &n);
+      ^~~~~~~~~~~~~~~
+a.c:35:10: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
+          scanf("%d", &x);
+          ^~~~~~~~~~~~~~~
+a.c: In function ‘main’:
+a.c:52:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
+     scanf("%d", &X);
+     ^~~~~~~~~~~~~~~
测试点结果测试点得分耗时内存
0答案错误04.00 ms312 KB
1答案正确34.00 ms432 KB
2答案错误04.00 ms336 KB
3答案正确24.00 ms352 KB
4答案错误04.00 ms384 KB
评测结果部分正确(5 分)
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/16-17-middle/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/16-17-middle/index.html" new file mode 100644 index 00000000..2ad7c6e9 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/16-17-middle/index.html" @@ -0,0 +1,4843 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 16-17 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

16-17年期中考试试卷

+

+ + + + 浙江大学2016-17秋冬《数据结构基础》期中模拟练习 +
+ +

+

+ + +
浙江大学2016-17秋冬《数据结构基础》期中模拟练习
开始时间01/01/2016 8:00:00 AM
结束时间01/18/2038 8:00:00 AM
答题时长45分钟
考生
得分17
总分100

判断题得分:12总分:15
R1-1

In a binary search tree, the keys on the same level from left to right must be in sorted (non-decreasing) order.

+
(3分)
评测结果答案正确(3 分)
R1-2

For a sequentially stored linear list of length NN, the time complexities for query and insertion are O(1)O(1) and O(N)O(N), respectively.

+
(3分)
评测结果答案正确(3 分)
R1-3

2N2^N and NNN^N have the same speed of growth.

+
(3分)
评测结果答案错误(0 分)
R1-4

In a directed graph, the sum of the in-degrees must be equal to the sum of the out-degrees of all the vertices.

+
(3分)
评测结果答案正确(3 分)
R1-5

If keys are pushed onto a stack in the order {1, 2, 3, 4, 5}, then it is impossible to obtain the output sequence {3, 4, 1, 2, 5}.

+
(3分)
评测结果答案正确(3 分)
单选题得分:0总分:65
R2-1

Suppose that an array of size m is used to store a circular queue. If the front position is front and the current size is size, then the rear element must be at:

+
(5分)
评测结果答案错误(0 分)
R2-2

The result of performing three DeleteMin operations in the min-heap {1,3,2,6,7,5,4,15,14,12,9,10,11,13,8} is:

+
(5分)
评测结果答案错误(0 分)
R2-3

In a complete binary tree with 1102 nodes, there must be __ leaf nodes.

+
(6分)
评测结果答案错误(0 分)
R2-4

Use Dijkstra algorithm to find the shortest paths from 1 to every other vertices. In which order that the destinations must be obtained?

+

+
(5分)
评测结果答案错误(0 分)
R2-5

Given a directed graph G=(V, E) where V = {v1, v2, v3, v4, v5, v6} and E = {<v1,v2>, <v1,v4>, <v2,v6>, <v3,v1>, <v3,v4>, <v4,v5>, <v5,v2>, <v5,v6>}. Then the topological order of G is:

+
(5分)
评测结果答案错误(0 分)
R2-6

In a weighted graph, if the length of the shortest path from b to a is 10, and there exists an edge of weight 3 between c and b, then how many of the following statements is/are TRUE?

+
    +
  1. The length of the shortest path from c to a must be 13.
  2. +
  3. The length of the shortest path from c to a must be 7.
  4. +
  5. The length of the shortest path from c to a must be no greater than 13.
  6. +
  7. The length of the shortest path from c to a must be no less than 7.
  8. +
+
(6分)
评测结果答案错误(0 分)
R2-7

The array representation of a disjoint set is given by { 4, 6, 5, 2, -3, -4, 3 }. If the elements are numbered from 1 to 7, the resulting array after invoking Union(Find(7),Find(1)) with union-by-size and path-compression is:

+
(5分)
评测结果答案错误(0 分)
R2-8

Given a quadtree(四叉树) with 3 nodes of degree 2, 2 nodes of degree 3, 4 nodes of degree 4. The number of leaf nodes in this tree is __.

+
(5分)
评测结果答案错误(0 分)
R2-9

What is a critical path in an AOE network?

+
(5分)
评测结果答案错误(0 分)
R2-10

Insert { 6, 9, 12, 3, 4, 8 } one by one into an initially empty binary search tree. The post-order traversal sequence of the resulting tree is:

+
(6分)
评测结果答案错误(0 分)
R2-11

To insert s after p in a doubly linked circular list, we must do:

+
(6分)
评测结果答案错误(0 分)
R2-12

If an undirected graph G = (V, E) contains 7 vertices. Then to guarantee that G is connected in any cases, there has to be at least ____ edges.

+
(6分)
评测结果答案错误(0 分)
程序填空题得分:5总分:20
R5-1

The function is to lower the value of the integer key at position P by a positive amount D in a min-heap H.

+
void DecreaseKey( int P, int D, PriorityQueue H )
+{
+   int i, key;
+   key = H->Elements[P] - D;
+   for ( i = (5分); H->Elements[i/2] > key; i/=2 )
+      (5分);
+   H->Elements[i] = key;
+}
+
评测结果未作答(0 分)
R5-2

Please fill in the blanks in the program which performs Find as a Union/Find operation with path compression.

+
SetType Find ( ElementType X, DisjSet S )
+{   
+   ElementType root, trail, lead;
+
+   for ( root = X; S[root] > 0; (5分) ) ;  
+   for ( trail = X; trail != root; trail = lead ) {
+      lead = S[trail] ;   
+      (5分);   
+   } 
+   return root;
+}
+
序号结果测试点得分
0答案正确5
1未作答0
评测结果部分正确(5 分)
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/17-18-middle/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/17-18-middle/index.html" new file mode 100644 index 00000000..c26bad41 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/17-18-middle/index.html" @@ -0,0 +1,4861 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 17-18 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

17-18年期中考试试卷

+

+ + + + 浙江大学2017-18秋冬《数据结构基础》期中模拟练习 +
+ +

+

+ + +
浙江大学2017-18秋冬《数据结构基础》期中模拟练习
开始时间01/01/2016 8:00:00 AM
结束时间01/18/2038 8:00:00 AM
答题时长45分钟
考生
得分27
总分100

判断题得分:9总分:15
R1-1

If keys are pushed onto a stack in the order {1, 2, 3, 4, 5}, then it is impossible to obtain the output sequence {3, 4, 1, 2, 5}.

+
(3分)
评测结果答案正确(3 分)
R1-2

For a sequentially stored linear list of length NN, the time complexities for deleting the first element and inserting the last element are O(1)O(1) and O(N)O(N), respectively.

+
(3分)
评测结果答案错误(0 分)
R1-3

The sum of the degrees of all the vertices in a connected graph must be an even number.

+
(3分)
评测结果答案正确(3 分)
R1-4

In a binary search tree, the keys on the same level from left to right must be in sorted (non-decreasing) order.

+
(3分)
评测结果答案正确(3 分)
R1-5

N2logNN^2 logN and NlogN2N logN^2 have the same speed of growth.

+
(3分)
评测结果答案错误(0 分)
单选题得分:18总分:65
R2-1

How many leaf node does a complete binary tree with 2435 nodes have?

+
(6分)
评测结果答案正确(6 分)
R2-2

The result of performing three DeleteMin operations in the min-heap {1,3,2,6,7,5,4,15,14,12,9,10,11,13,8} is:

+
(5分)
评测结果答案错误(0 分)
R2-3

The array representation of a disjoint set is given by { 4, 6, 5, 2, -3, -4, 3 }. If the elements are numbered from 1 to 7, the resulting array after invoking Union(Find(7),Find(1)) with union-by-size and path-compression is:

+
(5分)
评测结果答案错误(0 分)
R2-4

Insert { 6, 9, 12, 3, 4, 8 } one by one into an initially empty binary search tree. The post-order traversal sequence of the resulting tree is:

+
(6分)
评测结果答案错误(0 分)
R2-5

In-order traversal of a binary tree can be done iteratively. Given the stack operation sequence as the following:

+
push(1), push(2), push(3), pop(), push(4), pop(), pop(), push(5), pop(), pop(), push(6), pop()
+

Which one of the following statements is TRUE?

+
(6分)
评测结果答案正确(6 分)
R2-6

The recurrent equations for the time complexities of programs P1 and P2 are:

+
    +
  • P1: T(1)=1T(1)=1, T(N)=T(N/2)+1T(N)=T(N/2)+1;
  • +
  • P2: T(1)=1T(1)=1, T(N)=2T(N/2)+1T(N)=2T(N/2)+1;
  • +
+

Then the best conclusion about their time complexities is:

+
(5分)
评测结果答案错误(0 分)
R2-7

From the given graph shown by the figure, how many different topological orders can we obtain?

+

+
(5分)
评测结果答案错误(0 分)
R2-8

If an undirected graph G = (V, E) contains 7 vertices. Then to guarantee that G is connected in any cases, there has to be at least ____ edges.

+
(6分)
评测结果答案错误(0 分)
R2-9

To delete p from a doubly linked list, we must do:

+
(6分)
评测结果答案正确(6 分)
R2-10

Which of the following statements is TRUE about topological sorting?

+
(5分)
评测结果答案错误(0 分)
R2-11

Given a quadtree(四叉树) with 4 nodes of degree 2, 4 nodes of degree 3, 3 nodes of degree 4. The number of leaf nodes in this tree is __.

+
(5分)
评测结果答案错误(0 分)
R2-12

Suppose that an array of size m is used to store a circular queue. If the front position is front and the current size is size, then the rear element must be at:

+
(5分)
评测结果答案错误(0 分)
程序填空题得分:0总分:20
R5-1

The function is to find the K-th largest element in a list A of N elements. The function BuildMinHeap(H, K) is to arrange elements H[1] ... H[K] into a min-heap. Please complete the following program.

+
ElementType FindKthLargest ( int A[], int N, int K )
+{   /* it is assumed that K<=N */
+    ElementType *H;
+    int i, next, child;
+
+    H = (ElementType *)malloc((K+1)*sizeof(ElementType));
+    for ( i=1; i<=K; i++ ) H[i] = A[i-1];
+    BuildMinHeap(H, K);
+
+    for ( next=K; next<N; next++ ) {
+        H[0] = A[next];
+        if ( H[0] > H[1] ) {
+            for ( i=1; i*2<=K; i=child ) {
+                child = i*2;
+                if ( child!=K && (5分) ) child++;
+                if ( (5分) )
+                    H[i] = H[child];
+                else break;
+            }
+            H[i] = H[0];
+        }
+    }
+    return H[1];
+}
+
+
序号结果测试点得分
0编译错误0
1未作答0
评测结果多种错误(0 分)
R5-2

Please fill in the blanks in the program which performs Find as a Union/Find operation with path compression.

+
SetType Find ( ElementType X, DisjSet S )
+{   
+   ElementType root, trail, lead;
+
+   for ( root = X; S[root] > 0; (5分) ) ;  
+   for ( trail = X; trail != root; trail = lead ) {
+      lead = S[trail] ;   
+      (5分);   
+   } 
+   return root;
+}
+
序号结果测试点得分
0编译错误0
1未作答0
评测结果多种错误(0 分)
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/18-19-middle/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/18-19-middle/index.html" new file mode 100644 index 00000000..bf55efbe --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/18-19-middle/index.html" @@ -0,0 +1,4942 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 18-19 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

18-19年期中考试试卷

+

+ + + + 浙江大学2018-19秋冬《数据结构基础》期中模拟练习 +
+ +

+

+ + +
浙江大学2018-19秋冬《数据结构基础》期中模拟练习
开始时间01/01/2016 8:00:00 AM
结束时间01/18/2038 8:00:00 AM
答题时长90分钟
考生
得分19
总分100

判断题得分:12总分:15
R1-1

2N2^N and NNN^N have the same speed of growth.

+
(3分)
评测结果答案错误(0 分)
R1-2

If keys are pushed onto a stack in the order {1, 2, 3, 4, 5}, then it is impossible to obtain the output sequence {3, 4, 1, 2, 5}.

+
(3分)
评测结果答案正确(3 分)
R1-3

If there are less than 20 inversions in an integer array, then Insertion Sort will be the best method among Quick Sort, Heap Sort and Insertion Sort.

+
(3分)
评测结果答案正确(3 分)
R1-4

For a sequentially stored linear list of length NN, the time complexities for query and insertion are O(1)O(1) and O(N)O(N), respectively.

+
(3分)
评测结果答案正确(3 分)
R1-5

In a binary search tree, the keys on the same level from left to right must be in sorted (non-decreasing) order.

+
(3分)
评测结果答案正确(3 分)
单选题得分:5总分:64
R2-1

The recurrent equations for the time complexities of programs P1 and P2 are:

+
    +
  • P1: T(1)=1T(1)=1, T(N)=T(N/2)+1T(N)=T(N/2)+1;
  • +
  • P2: T(1)=1T(1)=1, T(N)=2T(N/2)+1T(N)=2T(N/2)+1;
  • +
+

Then the best conclusion about their time complexities is:

+
(5分)
评测结果答案错误(0 分)
R2-2

To delete p from a doubly linked list, we must do:

+
(5分)
评测结果答案错误(0 分)
R2-3

Given input {15, 9, 7, 8, 20, -1, 4}. If the result of the 1st run of Shell sort is {15, -1, 4, 8, 20, 9, 7}, then the initial increment must be:

+
(5分)
评测结果答案错误(0 分)
R2-4

In-order traversal of a binary tree can be done iteratively. Given the stack operation sequence as the following:

+
push(1), push(2), push(3), pop(), push(4), pop(), pop(), push(5), pop(), pop(), push(6), pop()
+

Which one of the following statements is TRUE?

+
(5分)
评测结果答案错误(0 分)
R2-5

How many leaf node does a complete binary tree with 2435 nodes have?

+
(5分)
评测结果答案错误(0 分)
R2-6

Suppose that an array of size m is used to store a circular queue. If the head pointer front and the current size variable size are used to represent the range of the queue instead of front and rear, then the maximum capacity of this queue can be:

+
(5分)
评测结果答案错误(0 分)
R2-7

Given input { 4321, 56, 57, 46, 28, 7, 331, 33, 234, 63 }. Which one of the following is the result after the 1st run of the Least Signification Digit (LSD) radix sort?

+
(5分)
评测结果答案正确(5 分)
R2-8

Given a quadtree(四叉树) with 4 nodes of degree 2, 4 nodes of degree 3, 3 nodes of degree 4. The number of leaf nodes in this tree is __.

+
(5分)
评测结果答案错误(0 分)
R2-9

For an in-order threaded binary tree, if the pre-order and in-order traversal sequences are B E A C F D and A E C B D F respectively, which pair of nodes' left links are both threads?

+
(4分)
评测结果答案错误(0 分)
R2-10

The result of performing three DeleteMin operations in the min-heap {1,3,2,12,6,4,8,15,14,9,7,5,11,13,10} is:

+
(5分)
评测结果答案错误(0 分)
R2-11

For the quicksort implementation with the left pointer stops at an element with the same key as the pivot during the partitioning, but the right pointer does not stop in a similar case, what is the running time when all keys are equal?

+
(5分)
评测结果答案错误(0 分)
R2-12

Among the following sorting methods, which ones will be slowed down if we store the elements in a linked structure instead of a sequential structure?

+
    +
  1. Insertion sort; 2. Selection Sort; 3. Bubble sort; 4. Shell sort; 5. Heap sort
  2. +
+
(5分)
评测结果答案错误(0 分)
R2-13

Insert { 3, 8, 9, 1, 2, 6 } one by one into an initially empty binary search tree. The post-order traversal sequence of the resulting tree is:

+
(5分)
评测结果答案错误(0 分)
程序填空题得分:0总分:15
R5-1

The function is to find the K-th smallest element in a list A of N elements. The function BuildMaxHeap(H, K) is to arrange elements H[1] ... H[K] into a max-heap. Please complete the following program.

+
ElementType FindKthSmallest ( int A[], int N, int K )
+{   /* it is assumed that K<=N */
+    ElementType *H;
+    int i, next, child;
+
+    H = (ElementType *)malloc((K+1)*sizeof(ElementType));
+    for ( i=1; i<=K; i++ ) H[i] = A[i-1];
+    BuildMaxHeap(H, K);
+
+    for ( next=K; next<N; next++ ) {
+        H[0] = A[next];
+        if ( H[0] < H[1] ) {
+            for ( i=1; i*2<=K; i=child ) {
+                child = i*2;
+                if ( child!=K && (3分) ) child++;
+                if ( (3分) )
+                    H[i] = H[child];
+                else break;
+            }
+            H[i] = H[0];
+        }
+    }
+    return H[1];
+}
+
+
序号结果测试点得分
0编译错误0
1未作答0
评测结果多种错误(0 分)
R5-2

The function is to sort the list { r[1] … r[n] } in non-decreasing order. Unlike selection sort which places only the minimum unsorted element in its correct position, this algorithm finds both the minimum and the maximum unsorted elements and places them into their final positions.

+
void  sort( list r[], int n )  
+{
+   int i, j, mini, maxi;
+
+   for (i=1; i<n-i+1; i++) {
+      mini = maxi = i;
+      for( j=i+1; (3分); ++j ){
+         if( (3分) ) mini = j; 
+         else if(r[j]->key > r[maxi]->key) maxi = j;
+      }
+      if( mini != i ) swap(&r[mini], &r[i]);
+      if( maxi != n-i+1 ){
+         if( (3分) ) swap(&r[mini], &r[n-i+1]);
+         else swap(&r[maxi], &r[n-i+1]);
+      }
+   }
+} 
+
评测结果未作答(0 分)
函数题得分:2总分:6
R6-1
No Less Than X in BST
(6分)

You are supposed to output, in decreasing order, all the elements no less than X in a binary search tree T.

+

Format of function:

+
void Print_NLT( Tree T,  int X );
+

where Tree is defined as the following:

+
typedef struct TreeNode *Tree;
+struct TreeNode {
+    int Element;
+    Tree  Left;
+    Tree  Right;
+};
+

The function is supposed to use Output(X) to print X.

+

Sample program of judge:

+
#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct TreeNode *Tree;
+struct TreeNode {
+    int Element;
+    Tree  Left;
+    Tree  Right;
+};
+
+Tree BuildTree(); /* details omitted */
+void Output( int X ); /* details omitted */
+
+void Print_NLT( Tree T,  int X );
+
+int main()
+{
+    Tree T;
+    int X;
+
+    T = BuildTree();
+    scanf("%d", &X);
+    Print_NLT( T, X );
+    printf("End\n");
+
+    return 0;
+}
+
+/* Your function will be put here */
+
+

Sample Output 1 (for the tree shown in Figure 1):

+
92 91 90 85 81 80 End
+
+
+ +Figure 1 +
+ +

Sample Output 2 (for the tree shown in Figure 2):

+
End
+
+
+ +Figure 2 +
编译器
GCC
代码
void Print_NLT( Tree T,  int X ) {
+    return;
+}
编译器输出
a.c: In function ‘BuildTree’:
+a.c:33:6: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
+      scanf("%d", &n);
+      ^~~~~~~~~~~~~~~
+a.c:35:10: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
+          scanf("%d", &x);
+          ^~~~~~~~~~~~~~~
+a.c: In function ‘main’:
+a.c:52:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
+     scanf("%d", &X);
+     ^~~~~~~~~~~~~~~
测试点结果测试点得分耗时内存
0答案错误05.00 ms316 KB
1答案正确14.00 ms384 KB
2答案错误05.00 ms356 KB
3答案正确14.00 ms324 KB
4答案错误05.00 ms400 KB
评测结果部分正确(2 分)
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/19-20-middle/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/19-20-middle/index.html" new file mode 100644 index 00000000..2504ff73 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/exams/19-20-middle/index.html" @@ -0,0 +1,4915 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 19-20 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

19-20年期中考试试卷

+

+ + + + 浙江大学2019-20秋冬《数据结构基础》期中模拟练习(45分钟) +
+ +

+

+ + +
浙江大学2019-20秋冬《数据结构基础》期中模拟练习(45分钟)
开始时间01/01/2016 8:00:00 AM
结束时间01/18/2038 8:00:00 AM
答题时长45分钟
考生
得分38
总分100

判断题得分:12总分:15
R1-1

NlogN\sqrt{N}logN is O(N)O(N).

+
(3分)
评测结果答案正确(3 分)
R1-2

In Union/Find algorithm, if Unions are done by size, the depth of any node must be no more than N/2N/2, but not O(logN)O(logN).

+
(3分)
评测结果答案错误(0 分)
R1-3

If a linear list is represented by a 1-dimensional array, the addresses of the elements in the memory must be consecutive.

+
(3分)
评测结果答案正确(3 分)
R1-4

ADT is the abbreviation for Abstract Data Type in the textbook of data structures.

+
(3分)
评测结果答案正确(3 分)
R1-5

In a directed graph, the sum of the in-degrees must be equal to the sum of the out-degrees of all the vertices.

+
(3分)
评测结果答案正确(3 分)
单选题得分:26总分:60
R2-1

If a binary search tree of NN nodes is also a complete binary tree, then among the following, which one is FALSE?

+
(5分)
评测结果答案正确(5 分)
R2-2

The following figure shows the AOE network of a project with 8 activities. The earliest and the latest start times of the activity d are __, respectively.

+

GRE19-5.jpg

+
(5分)
评测结果答案正确(5 分)
R2-3

list.jpg

+

Which one of the following is the data structure that is best represented by the above picture?

+
(1分)
评测结果答案正确(1 分)
R2-4

For a sequentially stored linear list of length NN, the time complexities for query and insertion are:

+
(5分)
评测结果答案错误(0 分)
R2-5

If graph G is NOT connected and has 27 edges, then it must have at least ____ vertices.

+
(5分)
评测结果答案错误(0 分)
R2-6

A full tree of degree 3 is a tree in which every node other than the leaves has 3 children. How many leaves does a full tree of degree 3 have if it has 127 nodes?

+
(5分)
评测结果答案正确(5 分)
R2-7

Since the speed of a printer cannot match the speed of a computer, a buffer is designed to temperarily store the data from a computer so that later the printer can retrieve data in order. Then the proper structure of the buffer shall be a:

+
(5分)
评测结果答案正确(5 分)
R2-8

Let nn be a non-negative integer representing the size of input. The time complexity of the following piece of code is:

+
x = 0;
+while ( n >= (x+1)*(x+1) )
+    x = x+1;
+
(5分)
评测结果答案错误(0 分)
R2-9

From the given graph shown by the figure, how many different topological orders can we obtain?

+

+
(5分)
评测结果答案正确(5 分)
R2-10

If besides finding the shortest path from S to every other vertices, we also need to count the number of different shortest paths, we can modify the Dijkstra algorithm in the following way: add an array count[] so that count[V] records the number of different shortest paths from S to V. Then count[V] shall be initialized as:

+
(5分)
评测结果答案错误(0 分)
R2-11

Given the shape of a binary tree shown by the figure below. If its postorder traversal sequence is { e, a, c, b, d, f }, then the node on the same level of b must be:

+

mt1.JPG

+
(5分)
评测结果答案错误(0 分)
R2-12

The array representation of the disjoint sets is given by {2, –4, 2, 3, -3, 5, 6, 9, -2}. Keep in mind that the elements are numbered from 1 to 9. After invoking Union(Find(4), Find(6)) with union-by-size, which elements will be changed in the resulting array?

+
(4分)
评测结果答案错误(0 分)
R2-13

Given the popping sequence of a stack as {1, 2, 3, 4, 5}. Among the following, the impossible pushing sequence is:

+
(5分)
评测结果答案错误(0 分)
程序填空题得分:暂无总分:25
R5-1

The function Dijkstra is to find the shortest path from Vertex S to every other vertices in a given Graph. The distances are stored in dist[], and path[] records the paths. The MGraph is defined as the following:

+
typedef struct GNode *PtrToGNode;
+struct GNode{
+    int Nv;  /* Number of vertices */
+    int Ne;  /* Number of edges    */
+    WeightType G[MaxVertexNum][MaxVertexNum]; /* adjacency matrix */
+};
+typedef PtrToGNode MGraph;
+
void Dijkstra( MGraph Graph, int dist[], int path[], Vertex S )
+{
+    int collected[MaxVertexNum];
+    Vertex V, W;
+
+    for ( V=0; V<Graph->Nv; V++ ) {
+        dist[V] = Graph->G[S][V];
+        path[V] = -1;
+        collected[V] = false;
+    }
+    dist[S] = 0;
+    collected[S] = true;
+
+    while (1) {
+        V = FindMinDist( Graph, dist, collected );
+        if ( V==ERROR ) break;
+        collected[V] = true;
+        for( W=0; W<Graph->Nv; W++ )
+            if ( collected[W]==false && Graph->G[V][W]<INFINITY ) {
+                if ( (4分) ) {
+                    dist[W] = (3分);
+                    path[W] = (3分);
+                }
+            }
+    } /* end while */
+}
+
R5-2

The function is to return the reverse linked list of L, with a dummy header.

+
List Reverse( List L )
+{
+    Position Old_head, New_head, Temp;
+    New_head = NULL;
+    Old_head = L->Next;
+
+    while ( Old_head )  {
+        Temp = Old_head->Next;
+        (3分);  
+        New_head = Old_head;  
+        Old_head = Temp; 
+    }
+    (3分);
+    return L;
+}
+
R5-3

Please fill in the blanks in the program which deletes a given element at position p from a max-heap H.

+
Deletion ( PriorityQueue H,  int p )  /* delete the element H->Elements[p] */
+{
+   ElementType temp;
+   int child;
+
+   temp = H-> Elements[ H->Size-- ];
+   if ( temp > H->Elements[p] ) {
+      while ( (p != 1) && (temp > H->Elements[p/2]) ) { 
+         (3分);
+         p /= 2;
+      } 
+   }
+   else {
+      while( (child = 2*p) <= H->Size) {
+         if ( child != H->Size && (3分) )
+            child ++;
+         if ( (3分) ) {
+            H->Elements[p] = H->Elements[child];
+            p = child;
+         }
+         else
+            break;
+      }
+   }
+   H->Elements[p] = temp;
+}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/labs&hw/FDS Lab&hw review/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/labs&hw/FDS Lab&hw review/index.html" new file mode 100644 index 00000000..1da2980a --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/labs&hw/FDS Lab&hw review/index.html" @@ -0,0 +1,4990 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Labs&hw review - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

FDS Lab&hw review

+

来看看什么是逆天奇才

+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#define MAX_N 500
+#define INF 100000000
+int visited[MAX_N] = {0};
+int parent[MAX_N] = {-1};
+
+char* names[MAX_N];      // 存储所有的节点名
+int graph[MAX_N][MAX_N]; // 邻接矩阵,graph[start[3]][end[3]]表示从start到end的边
+
+void print_matrix(int count);
+int bfs(int start, int end, int count);
+int solve(int source, int sink, int count);
+
+int find(char *name, int num)
+{
+    for (int i = 0; i < num; i++)
+    {
+        if (names[i] != NULL && strcmp(names[i], name) == 0)
+        {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+int main()
+{
+    char* source=malloc(sizeof(char) * 3);
+    char* destination=malloc(sizeof(char) * 3);
+    int num;
+    scanf("%s %s %d", source, destination, &num);
+    for(int i=0;i<MAX_N;i++)
+    names[i]=(char*)malloc(sizeof(char) * 3);
+
+    names[0] = source;
+    names[1] = destination;
+    int count = 1;
+    for (int i = 0; i < num; i++)
+    {
+        char* start=malloc(sizeof(char) * 3);
+        char* end=malloc(sizeof(char) * 3);
+        int capacity;
+        scanf("%s %s %d", start, end, &capacity);
+        if (find(start, num))
+        {
+            count++;
+            names[count]= start;
+        }
+        if (find(end, num))
+        {
+            count++;
+            names[count] = end;
+        }
+        // 找到start和end在names中的下标
+        int start_index = 0, end_index = 0;
+        for (int j = 0; j < num; j++)
+        {
+            if (names[j]!= NULL && strcmp(names[j], start) == 0)
+            {
+                start_index = j;
+            }
+            if (names[j] != NULL && strcmp(names[j], end) == 0)
+            {
+                end_index = j;
+            }
+        }
+        graph[start_index][end_index] = capacity;
+    }
+    //print_matrix(count);
+    // 用队列实现广度优先搜索,找到一条路径后,将这条路径上的所有边的容量减去这条路径上所有边容量的最小值
+    // 用一个数组记录每个节点的前驱节点,找到一条路径后,从终点开始,沿着前驱节点回溯,找到一条路径
+    // 同时添加一条反向边,容量和所有边容量的最小值相同,这样就可以找到下一条路径
+    int res =  solve(0, 1, count);
+    printf("%d\n", res);
+
+}
+
+void print_matrix(int count)
+{
+    // graph[i][j]表示从i到j的边,
+    for (int i = 0; i <= count; i++)
+    {
+        printf("%4s ", names[i]);
+    }
+    printf("\n");
+    for (int i = 0; i <= count; i++)
+    {
+        for (int j = 0; j <= count; j++)
+        {
+            printf("%4d ", graph[i][j]);
+        }
+        printf("\n");
+    }
+    printf("count:%d\n", count);
+}
+
+typedef struct
+{
+    int front;
+    int rear;
+    int list[MAX_N];
+} queue;
+typedef queue *queue_ptr;
+
+void enqueue(int data, queue_ptr queue)
+{
+    queue->list[queue->rear++] = data;
+}
+
+int dequeue(queue_ptr queue)
+{
+    if (queue->front == queue->rear)
+        return -1;
+    int data = queue->list[queue->front++];
+    return data;
+}
+
+int is_empty(queue_ptr queue)
+{
+    if (queue->front == queue->rear)
+        return 1;
+    else
+        return 0;
+}
+
+int bfs(int start, int end, int count)
+{
+    queue_ptr bfs_queue = (queue_ptr)malloc(sizeof(queue));
+    bfs_queue->front = 0;
+    bfs_queue->rear = 0;
+    // 使用visited数组记录已经访问过的节点,visited[i] = 1表示节点i已经访问过,初始化为0
+    for (int i = 0; i <= count; i++)
+    {
+        visited[i] = 0;
+        parent[i] = -1; // parent[i]表示节点i的前驱节点
+    }
+    enqueue(start, bfs_queue);
+    while (!is_empty(bfs_queue))
+    {
+        int current = dequeue(bfs_queue);
+        for (int i = 0; i <= count; i++)
+        {
+            if (!visited[i] && graph[current][i] > 0)
+            {
+                parent[i] = current;
+                visited[i] = 1;
+                enqueue(i, bfs_queue);
+                // 如果有边
+                if (i == end)
+                    return 1; // 找到了
+            }
+        }
+    }
+    return 0;
+}
+
+int solve(int source, int sink, int count)
+{
+    int maxFlow = 0;
+
+    while (bfs(source, sink, count))
+    {
+        int pathFlow = INF;
+
+        // 寻找增广路径上的最小流量
+        for (int v = sink; v != source; v = parent[v])
+        {
+            int u = parent[v];
+            pathFlow = (pathFlow < graph[u][v]) ? pathFlow : graph[u][v];
+        }
+
+        // 更新增广路径上的流量
+        for (int v = sink; v != source; v = parent[v])
+        {
+            int u = parent[v];
+            graph[u][v] -= pathFlow;
+            graph[v][u] += pathFlow;
+        }
+
+        maxFlow += pathFlow;
+    }
+
+    return maxFlow;
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/labs&hw/coding-thoughts/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/labs&hw/coding-thoughts/index.html" new file mode 100644 index 00000000..2adbdebf --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/labs&hw/coding-thoughts/index.html" @@ -0,0 +1,4719 @@ + + + + + + + + + + + + + + + + + + + + + + + + + coding-thoughts - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

coding-thoughts

+ +

coding-thoughts

+

少用全局变量

+

全局初始化时

+

qsort用法

+

qsort 是C语言标准库中的一个函数,用于对数组进行快速排序。它的声明如下:

+
Text Only
1
+2
void qsort
+(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
+
+
    +
  • base:指向要排序的数组的指针。
  • +
  • nmemb:数组中元素的数量。
  • +
  • size:每个元素的大小(以字节为单位)。
  • +
  • compar:比较函数的指针,用于定义排序顺序。
  • +
+

比较函数 compar 应该接受两个参数,每个参数是数组中的一个元素,函数返回一个整数表示它们的相对顺序。返回值的含义如下:

+
    +
  • 如果返回值小于0,则表示第一个参数小于第二个参数。
  • +
  • 如果返回值等于0,则表示两个参数相等。
  • +
  • 如果返回值大于0,则表示第一个参数大于第二个参数。
  • +
+

下面是一个简单的例子,演示如何使用 qsort 对整数数组进行升序排序:

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
#include <stdio.h>
+#include <stdlib.h>
+
+int compare(const void *a, const void *b) {
+    return (*(int *)a - *(int *)b);
+}
+
+int main() {
+    int array[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
+    int size = sizeof(array) / sizeof(array[0]);
+
+    qsort(array, size, sizeof(int), compare);
+
+    printf("Sorted array: ");
+    for (int i = 0; i < size; i++) {
+        printf("%d ", array[i]);
+    }
+
+    return 0;
+}
+
+

在这个例子中,compare 函数用于升序排序整数数组。你可以根据需要修改比较函数来改变排序的顺序或者适应不同类型的数据。

+

先写出int compare(const void *a,const void *b).

+

ab进行类型强转,如果是整形就改为(int*)a,最后访问时要加*,*(int*)a,否则访问的是指针的地址

+

如果是结构体如edge,则改为(edge*)a->weight,这整个是访问的元素

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/8.2\346\213\223\346\211\221\346\216\222\345\272\217/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/8.2\346\213\223\346\211\221\346\216\222\345\272\217/index.html" new file mode 100644 index 00000000..699db624 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/8.2\346\213\223\346\211\221\346\216\222\345\272\217/index.html" @@ -0,0 +1,4778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + toplogical sorting - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

拓扑排序注意点

+

Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project. +Input Specification:

+

Each input file contains one test case. Each case starts with a line containing two positive integers N (<=100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N-1), and M, the number of activities. +Then M lines follow, each gives the description of an activity. For the i-th activity, three non-negative numbers are given: S[i], E[i], and L[i], where S[i] is the index of the starting check point, E[i] of the ending check point, and L[i] the lasting time of the activity. The numbers in a line are separated by a space. +Output Specification: +For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output "Impossible*

+

example:

+

9 12

+

0 1 6

+

0 2 4

+

0 3 5

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_N 100
+
+typedef struct {
+    int start;
+    int end;
+    int duration;
+} Activity;
+
+int earliest_completion_time(int N, int M, Activity activities[]) {
+    int graph[MAX_N][MAX_N] = {0};
+    int in_degree[MAX_N] = {0};
+    int earliest_start_time[MAX_N] = {0};
+    int queue[MAX_N];
+    int front = 0, rear = 0;
+
+    for (int i = 0; i < M; i++) {
+        graph[activities[i].start][activities[i].end] = activities[i].duration;
+        in_degree[activities[i].end]++;
+    }
+
+    for (int i = 0; i < N; i++) {
+        if (in_degree[i] == 0) {
+            queue[rear++] = i;
+        }
+    }
+
+    while (front < rear) {
+        int current = queue[front++];
+
+        for (int neighbor = 0; neighbor < N; neighbor++) {
+            if (graph[current][neighbor] > 0) {
+                in_degree[neighbor]--;
+                earliest_start_time[neighbor] =               
+                    max(earliest_start_time[neighbor],
+                        earliest_start_time[current] + graph[current][neighbor])
+
+                if (in_degree[neighbor] == 0) {
+                    queue[rear++] = neighbor;
+                }
+            }
+        }
+    }
+
+    for (int i = 0; i < N; i++) {
+        if (in_degree[i] > 0) {
+            return -1; // Graph contains a cycle, scheduling is not possible
+        }
+    }
+
+    int max_completion_time = 0;
+    for (int i = 0; i < N; i++) {
+        if (earliest_start_time[i] > max_completion_time) {
+            max_completion_time = earliest_start_time[i];
+        }
+    }
+
+    return max_completion_time;
+}
+
+int main() {
+    int N, M;
+    scanf("%d %d", &N, &M);
+
+    Activity activities[MAX_N];
+
+    for (int i = 0; i < M; i++) {
+        scanf("%d %d %d", &activities[i].start, &activities[i].end, &activities[i].duration);
+    }
+
+    int result = earliest_completion_time(N, M, activities);
+
+    if (result == -1) {.......
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/BFS\345\222\214DFS\347\232\204\347\220\206\350\247\243/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/BFS\345\222\214DFS\347\232\204\347\220\206\350\247\243/index.html" new file mode 100644 index 00000000..a3575375 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/BFS\345\222\214DFS\347\232\204\347\220\206\350\247\243/index.html" @@ -0,0 +1,4827 @@ + + + + + + + + + + + + + + + + + + + + + + + + + BFS/DFS - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

BFS:

+
    +
  1. 拓扑排序及其改进
  2. +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
/*Test an AOV for feasibility, and generate a topological order if possible*/
+void Topsort( Graph G )
+{   
+ int Counter;
+    Vertex V, W;
+    for ( Counter = 0; Counter < NumVertex; Counter++ ) 
+    {
+     V = FindNewVertexOfDegreeZero( );
+     if ( V == NotAVertex ) //确认图中无环?
+        {
+         Error ( Graph has a cycle );   
+            break;  
+        }
+     TopNum[ V ] = Counter; /* or output V */
+     for ( each W adjacent to V )
+         Indegree[ W ]––; //对所有前置选课要求有V的课程,在修之前必须修完的课少了一门
+    }
+}
+
+

$$ + T=O(|V|^2+|E|) = O(|V|^2) + $$

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
//改进策略是先将所有入度为0的节点都入队,每次从这个0入度队列中弹出一个节点,图中与之相邻的节点入度--,
+//如果减到0就入队
+void Topsort( Graph G )
+{   
+ Queue Q;
+    int Counter = 0;
+    Vertex V, W;
+    Q = CreateQueue( NumVertex );  
+    MakeEmpty( Q );
+    for ( each vertex V )
+     if ( Indegree[ V ] == 0 ) Enqueue( V, Q );
+    while ( !IsEmpty( Q ) ) 
+    {
+     V = Dequeue( Q );
+     TopNum[ V ] = ++Counter; /* assign next */
+     for ( each W adjacent to V )
+         if (––Indegree[ W ] == 0 ) Enqueue( W, Q );
+    }  /* end-while */
+    if ( Counter != NumVertex )
+ Error( Graph has a cycle );
+    DisposeQueue( Q ); /* free memory */
+}
+
+

$$ + T=O(|V|+|E|) + $$

+
+

\(注意E的范围 最小 V 最大 |V|^2\)

+

DFS

+

回溯算法(Backtracking)和深度优先搜索算法(DFS)之间存在关系,但它们有一些主要的不同之处。

+
    +
  1. 定义
  2. +
  3. DFS算法是一种图遍历算法,通常用于搜索图或树的所有节点。在DFS中,我们从一个节点开始,然后尽可能深入,直到不能再深入为止,然后回溯到上一个节点,继续深入其他未探索的分支。
  4. +
  5. 回溯算法是一种更一般的算法范式,通常用于解决组合优化问题,例如八皇后问题、0-1背包问题等。回溯算法试图在搜索过程中通过尝试不同的选择来找到问题的解,如果当前的选择不能导致解,就回溯到之前的状态,然后尝试其他的选择。
  6. +
  7. 应用领域
  8. +
  9. DFS算法主要应用于图和树的遍历,查找路径或寻找特定节点。
  10. +
  11. 回溯算法更通用,可以用于解决一些组合优化问题,其中需要在可能的解空间中搜索并找到问题的解。
  12. +
  13. 目标
  14. +
  15. DFS算法的主要目标是尽可能深入地搜索,查找目标节点或路径。
  16. +
  17. 回溯算法的主要目标是通过尝试不同的选择,找到问题的解。在搜索过程中,可能需要多次回溯到之前的状态。
  18. +
  19. 状态维护
  20. +
  21. DFS算法通常通过栈(递归调用栈或显式栈)来维护状态,记录当前路径和访问状态。
  22. +
  23. 回溯算法通过递归调用来维护状态,尝试不同的选择,并在需要时回溯到之前的状态。
  24. +
+

尽管有这些不同,DFS算法实际上可以看作是回溯算法的一种特例,因为回溯算法也可以使用深度优先搜索的方式进行实现。在许多情况下,这两个术语可以交替使用,具体取决于上下文和问题的特性

+
C
1
+2
+3
+4
+5
+6
+7
/*a generalization of preorder traversal*/
+void DFS(Vertex V)
+{   
+    visited[ V ] = true;  /*mark this vertex to avoid cycles*/
+    for ( each W adjacent to V )
+        if ( !visited[ W ] ) DFS( W );
+} /*T = O(|E|+|V|) as long as adjacency lists are used*/
+
+
Java
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
class Solution {
+    List<List<Integer>> res = new LinkedList<>();
+/* 主函数,输入一组不重复的数字,返回它们的全排列 */
+List<List<Integer>> permute(int[] nums) {
+    // 记录「路径」
+    LinkedList<Integer> track = new LinkedList<>();
+    // 「路径」中的元素会被标记为 true,避免重复使用
+    boolean[] used = new boolean[nums.length];
+
+
+    backtrack(nums, track, used);
+    return res;
+
+}
+
+// 路径:记录在 track 中
+// 选择列表:nums 中不存在于 track 的那些元素(used[i] 为 false)
+// 结束条件:nums 中的元素全都在 track 中出现
+void backtrack(int[] nums, LinkedList<Integer> track, boolean[] used) {
+    // 触发结束条件
+    if (track.size() == nums.length) {
+        res.add(new LinkedList(track));
+        return;
+    }
+
+
+    for (int i = 0; i < nums.length; i++) {
+        // 排除不合法的选择
+        if (used[i]) {
+            // nums[i] 已经在 track 中,跳过
+            continue;
+        }
+        // 做选择
+        track.add(nums[i]);
+        used[i] = true;
+        // 进入下一层决策树
+        backtrack(nums, track, used);
+        // 取消选择
+        track.removeLast();
+        used[i] = false;
+    }
+
+}
+    }
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/FDS-notes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/FDS-notes/index.html" new file mode 100644 index 00000000..0f003d8b --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/FDS-notes/index.html" @@ -0,0 +1,6222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + FDS-notes - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

FDS-notes-2023

+

注意复习:填空题,以下内容均可能作为填空

+

zigzag.jpg

+

+

四种遍历顺序

+

层序 1 11 5 12 17 8 20 15

+

中序 12 11 20 17 1 15 8 5

+

前序 1 11 12 17 20 5 8 15

+

后序 12 20 17 11 15 8 5 1

+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
level-order(Tree T){
+    //注意level-order使用了while,是enqueue
+    enqueue(T)
+    while(queue is not empty){
+        print(T = dequeue())
+        enqueue(T->left)
+        enaueue(T->right)
+    }
+}
+
+//以下为错误的层序遍历做法!
+void zigzag_levelorder(tree_ptr tree, int rev, queue_ptr queue)
+{
+    enqueue(tree, queue);
+    while (is_empty(queue) == 0)
+    {
+        tree_ptr T = dequeue(queue);
+        visit(T); // 打印出这层的节点
+        // 在此处调整顺序
+        if (rev == 0)
+        {
+            rev = 1;
+            zigzag_levelorder(T->left, rev, queue);//应该改为enqueue~~
+            zigzag_levelorder(T->right, rev, queue);
+        }
+        else
+        {
+            rev = 0;
+            zigzag_levelorder(T->right, rev, queue);
+            zigzag_levelorder(T->left, rev, queue);
+        }
+    }
+}
+//zigzag-levelorder hw4真是多金
+int zigzag_levelorder(tree_ptr tree, queue_ptr queue)
+{
+    // zigzag的层序遍历
+    int level = 0;
+    enqueue(tree, queue);
+    while (is_empty(queue) == 0)
+    {
+        int len = queue->rear - queue->front;
+        if (level % 2)
+        {
+            for (int i = queue->front; i < queue->front + len; i++)
+            {
+                printf(" %d", queue->list[i]->data);
+            }
+        }
+        else
+        {
+            for (int i = queue->front + len - 1; i >= queue->front; i--)
+            {
+                if (level == 0)
+                    printf("%d", queue->list[i]->data);
+                else
+                    printf(" %d", queue->list[i]->data);
+            }
+        }
+        //到此为止,往上:打印,也就是visit
+        //往下,enqueue
+        for (int i = queue->front; i < queue->front + len; i++)
+        {
+            if (queue->list[i]->left != NULL)
+                enqueue(queue->list[i]->left, queue);
+            if (queue->list[i]->right != NULL)
+                enqueue(queue->list[i]->right, queue);
+        }
+        queue->front = queue->front + len;
+        level++;
+    }
+}
+
+
+
+in-order(Tree T){
+    if(T){
+        pre-order(T->left)
+        print(T);
+        pre-order(T->right)
+    }
+}
+
+in-order-iterative(Tree_ptr Tree){
+    //写成iterative的形式,使用栈模拟
+    //先将最左边一条全部进栈,弹出栈顶节点(离叶子层较近的节点)后右节点进栈
+    stack S = init_stack();
+    while(1){
+        while(Tree->left!=NULL)S.push(Tree = Tree->left);
+        Tree = S.pop();
+        if(Tree == NULL)break; //直到stack弹空,退出while循环
+        print(Tree->data);
+        Tree = Tree->right;
+    }
+
+}
+
+pre-order(Tree T){
+    if(T){
+        print(T);
+        pre-order(T->left)
+        pre-order(T->right)
+    }
+}
+
+post-order(Tree T){
+    if(T){
+        post-order(T->left)
+        post-order(T->right)
+        print(T);
+    }
+}
+
+

前序的第一个元素和后序的最后一个元素为根节点

+

中序从左到右,实际上的根节点将数组分成了完整的两个部分,因此只要确定当前的根节点,就能找出左、右子树的区间

+

中序遍历+后序遍历建树:week-4-hw

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
//由中序遍历和后序遍历建立上面的树:
+//中序遍历:12 11 20 17 1 15 8 5 
+//后序遍历:12 20 17 11 15 8 5 1
+//index =             4   
+//11为新树的根节点
+
+tree_ptr build_tree(int *in_order, int *post_order, int n)
+{
+    if (n <= 0 || in_order == NULL || post_order == NULL || n > MAX_NODE_NUM)
+        return NULL;
+    tree_ptr root = (tree_ptr)malloc(sizeof(tree_node));
+    root->data = post_order[n - 1];
+    int index = 0;
+    for (int i = 0; i < n; i++)
+    {
+        if (in_order[i] == post_order[n - 1]) //中+后:取后序区间的最后一个元素,在中序中找到
+            index = i;                        //该元素的index,传入下面的递归
+    }
+    // 把中序序列分成两部分,左边的是左子树,右边的是右子树
+    // 此处 in_order + index + 1 忘记+1,导致只有左枝的左子树建成了右子树
+    root->left = build_tree(in_order, post_order, index);
+    // in_order/post_order的[0~index-1],共index个数
+    root->right = build_tree(in_order + index + 1, post_order + index, n - index - 1);
+    // in_order/post_order的[index+1~n-1],共n-1-(index+1)+1 = n-1-index个数
+    //左右加起来为n-1个数,刚好少了根节点
+    return root;
+}
+
+

形象一点:一遍过后:

+

中序 (左子树:12 11 20 17 )【1】 (右子树:15 8 5)

+

后序 (12 20 17 11)( 15 8 5)【1】

+

两遍后:

+

中序 ((12) 11 (20 17) )【1】 ((15 8 ){5}())

+

后序 ((12) (20 17) {11})( (15 8) {5})【1】

+

前序遍历+中序遍历建树:lab2

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
tree_ptr build_tree(int *pre_order, int pre_left, int pre_right, int *in_order, int in_left, int in_right)
+{
+    // 先序遍历建树,先处理根节点,再处理左子树,再处理右子树
+    if (pre_left > pre_right || in_left > in_right)
+    {
+        return NULL;
+    }
+    int k;
+    for (k = in_left; k <= in_right; k++)
+    {
+        // 找到根节点在中序遍历中的位置
+        if (in_order[k] == abs(pre_order[pre_left]))
+        {
+            break;
+        }
+    }
+    int num_left = k - in_left; // 左子树的节点数
+    tree_ptr root = (tree_ptr)malloc(sizeof(tree_node));
+    root->data = abs(pre_order[pre_left]);
+    root->color = red_or_black(pre_order[pre_left]);
+    root->left = build_tree(pre_order, pre_left + 1, pre_left + num_left, in_order, in_left, k - 1); //除开pre_order[0](根节点),左树的区间[pre_left+1,pre_left+num_left-1]
+    root->right = build_tree(pre_order, pre_left + num_left + 1, pre_right, in_order, k + 1, in_right);
+    return root;
+}
+
+

中序 (12 11 20 17) 【1】 (15 8 5)

+

前序【1】 (11 12 17 20)( 5 8 15)

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
//自己写写 BST ADT,看看有什么问题
+- SearchTree  MakeEmpty( SearchTree T ){
+    T->left = NULL;
+    T->right = NULL;
+    T->
+  }
+- Position  Find( ElementType X, SearchTree T ){
+    //查找元素,从T开始找,返回指向该节点的position,一个node*
+    if(T==NULL)return NULL;//没有找到
+    if(T->data == X)return T;
+    if(T->->data< X){
+        Find(T->right);
+    }
+    else if(T->data > X){
+        Find(T->left);
+    }
+
+}
+
+- Position  FindMin( SearchTree T ){
+    //找最小元素
+    if(T==NULL)return NULL;//当前树不存在
+    else{
+        if(T->left!=NULL){
+            FindMin(T->left)
+        }
+    }
+    return T;
+    /*别用while:while(T->left!=NULL){
+        T = T->left;
+        FindMin(T);
+    }
+    return T;*/
+}
+- Position  FindMax( SearchTree T ){
+    //同上
+    while(T->right!=NULL){
+        T = T->right;
+        FindMax(T);
+    }
+    return T;
+}
+- SearchTree  Insert( ElementType X, SearchTree T ){
+    //二叉树的正确插入顺序
+    if(T==NULL){
+        node* new_node = (node*)malloc(sizeof(node));
+        T->data = X;
+        T->left = NULL;
+        T->right = NULL;
+        return T;
+    }
+    if(T->data>X){
+        Insert(X,T->left);
+    }
+    else if(T->data<X){
+        Insert(X,T->right);
+    }
+    return T;
+}
+- SearchTree  Delete( ElementType X, SearchTree T ){
+    //删除某元素,是在查找的基础上
+    SearchTree pos = FindMax(X,T);
+    //分类讨论,若pos的度为0/1/2
+    if(pos==NULL)return;
+    else if(pos->left = NULL && pos->right){
+        pos = pos->right
+    }
+    else if(pos->right = NULL && pos->left){
+        pos = pos->left
+    }
+    else{
+        //度为2,用左子树的最大节点替换当前pos指向的根节点
+        SearchTree pos_right_max = FindMax(pos->right)
+        pos->data = pos_right_max->data;
+        Delete(pos->data,pos->right);
+        return pos;
+    }
+}
+- ElementType  Retrieve( Position P ){
+    return P->data;
+}
+
+

双端队列 double-ended queue,简称Deque

+

链表实现

+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
#include <stdio.h>
+#include <stdlib.h>
+
+// 定义双端队列节点结构
+struct Node {
+    int data;
+    struct Node* next;
+};
+
+// 定义双端队列结构
+struct Deque {
+    struct Node* front;  // 队头指针
+    struct Node* rear;   // 队尾指针
+};
+
+// 创建一个新的双端队列
+struct Deque* createDeque() {
+    struct Deque* deque = (struct Deque*)malloc(sizeof(struct Deque));
+    deque->front = NULL;
+    deque->rear = NULL;
+    return deque;
+}
+//**************************
+// 在队头插入元素,脑袋要有那个三角形,先将新节点指向front指向的node,然后再将front移到新节点上
+//front想象成一个数据域为黑,只有指针的dummy node
+//且总是先将新节点各参数赋值完毕后再进行串联
+//**************************
+void insertFront(struct Deque* deque, int data) {
+    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
+    newNode->data = data;
+    newNode->next = deque->front;
+    deque->front = newNode;
+    if (deque->rear == NULL) {
+        deque->rear = newNode;
+    }
+}
+
+// 在队尾插入元素,若rear==NULL 则说明deque为空,此时与front有关,否则只需处理rear指针
+void insertRear(struct Deque* deque, int data) {
+    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
+    newNode->data = data;
+    newNode->next = NULL;
+    if (deque->rear == NULL) {
+        deque->front = newNode;
+        deque->rear = newNode;
+    } else {
+        deque->rear->next = newNode;
+        deque->rear = newNode;
+    }
+}
+
+// 从队头删除元素,注意无论是从队头/队尾删除时,先要保证头/尾指针不是NULL,在删除完后还要判断是否删掉了
+//deque中的最后一个元素,如果是则要将front和rear都赋值为NULL
+void deleteFront(struct Deque* deque) {
+    if (deque->front != NULL) {
+        struct Node* temp = deque->front;
+        deque->front = deque->front->next;
+        free(temp);
+        if (deque->front == NULL) {
+            deque->rear = NULL;
+        }
+    }
+}
+
+// 从队尾删除元素
+void deleteRear(struct Deque* deque) {
+    if (deque->rear != NULL) {
+        if (deque->front == deque->rear) {
+            free(deque->front);
+            deque->front = NULL;
+            deque->rear = NULL;
+        } else {
+            struct Node* temp = deque->front;
+            while (temp->next != deque->rear) {
+                temp = temp->next;
+            }
+            free(deque->rear);
+            deque->rear = temp;//temp向后遍历的过程,易出填空题
+            deque->rear->next = NULL;
+        }
+    }
+}
+
+// 检查双端队列是否为空
+int isEmpty(struct Deque* deque) {
+    return (deque->front == NULL);
+}
+
+// 打印双端队列中的元素
+void printDeque(struct Deque* deque) {
+    struct Node* current = deque->front;
+    while (current != NULL) {
+        printf("%d ", current->data);
+        current = current->next;
+    }
+    printf("\n");
+}
+
+// 主函数
+int main() {
+    struct Deque* deque = createDeque();
+
+    insertFront(deque, 1);
+    insertRear(deque, 2);
+    insertFront(deque, 3);
+
+    printDeque(deque);
+
+    deleteFront(deque);
+    printDeque(deque);
+
+    insertRear(deque, 4);
+    printDeque(deque);
+
+    deleteRear(deque);
+    printDeque(deque);
+
+    return 0;
+}
+
+

数组实现

+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_SIZE 100
+
+// 定义双端队列结构
+struct Deque {
+    int arr[MAX_SIZE];
+    int front;
+    int rear;
+};
+
+// 创建一个新的双端队列
+struct Deque* createDeque() {
+    struct Deque* deque = (struct Deque*)malloc(sizeof(struct Deque));
+    deque->front = -1;
+    deque->rear = -1;
+    return deque;
+}
+
+// 在队头插入元素
+void insertFront(struct Deque* deque, int data) {
+    if (deque->front == -1) {
+        deque->front = 0;
+        deque->rear = 0;
+        deque->arr[deque->front] = data;
+    } else if (deque->front > 0) {
+        deque->arr[--deque->front] = data;
+    } else {
+        printf("Deque is full (front).\n");
+    }
+}
+
+// 在队尾插入元素
+void insertRear(struct Deque* deque, int data) {
+    if (deque->rear == -1) {
+        deque->front = 0;
+        deque->rear = 0;
+        deque->arr[deque->rear] = data;
+    } else if (deque->rear < MAX_SIZE - 1) {
+        deque->arr[++deque->rear] = data;
+    } else {
+        printf("Deque is full (rear).\n");
+    }
+}
+
+// 从队头删除元素
+void deleteFront(struct Deque* deque) {
+    if (deque->front != -1) {
+        if (deque->front == deque->rear) {
+            deque->front = -1;
+            deque->rear = -1;
+        } else {
+            deque->front++;
+        }
+    } else {
+        printf("Deque is empty (front).\n");
+    }
+}
+
+// 从队尾删除元素
+void deleteRear(struct Deque* deque) {
+    if (deque->rear != -1) {
+        if (deque->front == deque->rear) {
+            deque->front = -1;
+            deque->rear = -1;
+        } else {
+            deque->rear--;
+        }
+    } else {
+        printf("Deque is empty (rear).\n");
+    }
+}
+
+// 检查双端队列是否为空
+int isEmpty(struct Deque* deque) {
+    return (deque->front == -1);
+}
+
+// 打印双端队列中的元素
+void printDeque(struct Deque* deque) {
+    if (isEmpty(deque)) {
+        printf("Deque is empty.\n");
+        return;
+    }
+
+    printf("Front: %d, Rear: %d\n", deque->front, deque->rear);
+    printf("Elements: ");
+    for (int i = deque->front; i <= deque->rear; i++) {
+        printf("%d ", deque->arr[i]);
+    }
+    printf("\n");
+}
+
+// 主函数
+int main() {
+    struct Deque* deque = createDeque();
+
+    insertFront(deque, 1);
+    insertRear(deque, 2);
+    insertFront(deque, 3);
+
+    printDeque(deque);
+
+    deleteFront(deque);
+    printDeque(deque);
+
+    insertRear(deque, 4);
+    printDeque(deque);
+
+    deleteRear(deque);
+    printDeque(deque);
+
+

循环队列

+

链表实现

+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
#include <stdio.h>
+#include <stdlib.h>
+
+// 定义循环队列节点结构
+struct Node {
+    int data;
+    struct Node* next;
+};
+
+// 定义循环队列结构
+struct CircularQueue {
+    struct Node* front;
+    struct Node* rear;
+};
+
+// 创建一个新的循环队列
+struct CircularQueue* createCircularQueue() {
+    struct CircularQueue* queue = (struct CircularQueue*)malloc(sizeof(struct CircularQueue));
+    queue->front = NULL;
+    queue->rear = NULL;
+    return queue;
+}
+
+// 入队操作
+void enqueue(struct CircularQueue* queue, int data) {
+    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
+    newNode->data = data;
+    newNode->next = NULL;
+    if (queue->rear == NULL) {
+        queue->front = newNode;
+        queue->rear = newNode;
+        newNode->next = newNode; // 链接到自身以构成循环
+    } else {
+        newNode->next = queue->front;
+        queue->rear->next = newNode;
+        queue->rear = newNode;
+    }
+}
+
+// 出队操作
+int dequeue(struct CircularQueue* queue) {
+    if (queue->front == NULL) {
+        printf("Queue is empty.\n");
+        return -1; // 队列为空时返回-1
+    }
+    int data = queue->front->data;
+    struct Node* temp = queue->front;
+    if (queue->front == queue->rear) {
+        queue->front = NULL;
+        queue->rear = NULL;
+    } else {
+        queue->front = queue->front->next;
+        queue->rear->next = queue->front;
+    }
+    free(temp);
+    return data;
+}
+
+// 检查循环队列是否为空
+int isEmpty(struct CircularQueue* queue) {
+    return (queue->front == NULL);
+}
+
+// 打印循环队列中的元素
+void printCircularQueue(struct CircularQueue* queue) {
+    struct Node* current = queue->front;
+    if (current == NULL) {
+        printf("Circular Queue is empty.\n");
+        return;
+    }
+    do {
+        printf("%d ", current->data);
+        current = current->next;
+    } while (current != queue->front);
+    printf("\n");
+}
+
+// 主函数
+int main() {
+    struct CircularQueue* queue = createCircularQueue();
+
+    enqueue(queue, 1);
+    enqueue(queue, 2);
+    enqueue(queue, 3);
+    enqueue(queue, 4);
+
+    printCircularQueue(queue);
+
+    dequeue(queue);
+    dequeue(queue);
+
+    printCircularQueue(queue);
+
+    enqueue(queue, 5);
+    printCircularQueue(queue);
+
+    dequeue(queue);
+    dequeue(queue);
+    dequeue(queue);
+    dequeue(queue);
+
+    printCircularQueue(queue);
+
+    return 0;
+}
+
+

数组实现

+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_SIZE 100
+
+// 定义循环队列结构
+struct CircularQueue {
+    int arr[MAX_SIZE];
+    int front;
+    int rear;
+};
+
+// 创建一个新的循环队列
+struct CircularQueue* createCircularQueue() {
+    struct CircularQueue* queue = (struct CircularQueue*)malloc(sizeof(struct CircularQueue));
+    queue->front = -1;
+    queue->rear = -1;
+    return queue;
+}
+
+// 入队操作
+void enqueue(struct CircularQueue* queue, int data) {
+    if ((queue->rear + 1) % MAX_SIZE == queue->front) {
+        printf("Queue is full.\n");
+        return;
+    }
+    if (queue->front == -1) {
+        queue->front = 0;
+        queue->rear = 0;
+        queue->arr[queue->rear] = data;
+    } else {
+        queue->rear = (queue->rear + 1) % MAX_SIZE;
+        queue->arr[queue->rear] = data;
+    }
+}
+
+// 出队操作
+int dequeue(struct CircularQueue* queue) {
+    if (queue->front == -1) {
+        printf("Queue is empty.\n");
+        return -1;
+    }
+    int data = queue->arr[queue->front];
+    if (queue->front == queue->rear) {
+        queue->front = -1;
+        queue->rear = -1;
+    } else {
+        queue->front = (queue->front + 1) % MAX_SIZE;
+    }
+    return data;
+}
+
+// 检查循环队列是否为空
+int isEmpty(struct CircularQueue* queue) {
+    return (queue->front == -1);
+}
+
+// 打印循循环队列中的元素
+void printCircularQueue(struct CircularQueue* queue) {
+    if (isEmpty(queue)) {
+        printf("Circular Queue is empty.\n");
+        return;
+    }
+
+    int i = queue->front;
+    do {
+        printf("%d ", queue->arr[i]);
+        i = (i + 1) % MAX_SIZE;
+    } while (i != (queue->rear + 1) % MAX_SIZE);
+    printf("\n");
+}
+
+// 主函数
+int main() {
+    struct CircularQueue* queue = createCircularQueue();
+
+    enqueue(queue, 1);
+    enqueue(queue, 2);
+    enqueue(queue, 3);
+    enqueue(queue, 4);
+
+    printCircularQueue(queue);
+
+    dequeue(queue);
+    dequeue(queue);
+
+    printCircularQueue(queue);
+
+    enqueue(queue, 5);
+    printCircularQueue(queue);
+
+    dequeue(queue);
+    dequeue(queue);
+    dequeue(queue);
+    dequeue(queue);
+
+    printCircularQueue(queue);
+
+    return 0;
+}
+
+

双向循环链表

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
#include <stdio.h>
+#include <stdlib.h>
+
+// 定义双向循环链表节点结构
+struct Node {
+    int data;
+    struct Node* next;
+    struct Node* prev;
+};
+
+// 创建一个新的双向循环链表
+struct Node* createDoublyCircularLinkedList(int data) {
+    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
+    newNode->data = data;
+    newNode->next = newNode;
+    newNode->prev = newNode;
+    return newNode;
+}
+
+// 在双向循环链表的末尾插入节点
+void insertAtEnd(struct Node** head, int data) {
+    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
+    newNode->data = data;
+    newNode->next = (*head);
+    newNode->prev = (*head)->prev;
+    (*head)->prev->next = newNode;
+    (*head)->prev = newNode;
+}
+
+// 打印双向循环链表的元素
+void printDoublyCircularLinkedList(struct Node* head) {
+    if (head == NULL) {
+        printf("Empty Doubly Circular Linked List\n");
+        return;
+    }
+
+    struct Node* current = head;
+    do {
+        printf("%d ", current->data);
+        current = current->next;
+    } while (current != head);
+    printf("\n");
+}
+
+// 主函数
+int main() {
+    struct Node* head = createDoublyCircularLinkedList(1);
+
+    insertAtEnd(&head, 2);
+    insertAtEnd(&head, 3);
+
+    printf("Doubly Circular Linked List: ");c 
+    printDoublyCircularLinkedList(head);
+
+    return 0;
+}
+
+

二分法的细节加细节 你真的应该搞懂!!!_二分算法-CSDN博客

+

折半查找判定树——(快速判断某棵树是否为折半查找判定树)_折半查找树_叫我蘑菇先生的博客-CSDN博客

+

对任意无序序列可建立完全二叉查找树

+

先对序列排序,排序后得到升序序列为中序遍历顺序

+

已知父节点i,可求出子节点下标2i和 2i+1

+
C
1
+2
+3
+4
+5
+6
+7
+8
void make_tree(int* tree, int* a,int n,int p,int* i){
+    if(p>n||p<1||(*i)>n){
+        return;
+    }
+    make_tree(tree,a,n,p*2,i);
+    tree[p] = a[(*i)++];
+    make_tree(tree,a,n,p*2+1,i);
+}
+
+

直接找到越界为止

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/FDS\346\234\237\346\234\253\345\244\215\344\271\240/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/FDS\346\234\237\346\234\253\345\244\215\344\271\240/index.html" new file mode 100644 index 00000000..091e82fd --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/FDS\346\234\237\346\234\253\345\244\215\344\271\240/index.html" @@ -0,0 +1,5067 @@ + + + + + + + + + + + + + + + + + + + + + + + + + FDS期末复习 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

FDS final exam

+

84ffb54557a629f2db54dcf3a5f59be

+

程序填空:排序

+

编程题:图,树

+

背答案没用 要理解 现推

+

基础的能够实现

+

ppt(书)>作业,lab做过的题>刷新题

+

ppt的每一个角落

+
    +
  1. mergesort
  2. +
  3. shellsort
  4. +
  5. 四种树遍历非递归实现
  6. +
  7. 并查集 path compression,union find,根据实现看定义
  8. +
  9. +
  10. +
+

1.算法分析

+

1.O(N)是上界,Ω(N)为下界,Θ(N)为常数倍

+

2.注意循环的条件,以及N^2^还是N^N^,还是N*N

+

比较 \(N^{1.5}和NlogN\)

+

2.列表

+

1.链表中的二分法复杂度大于O(NlogN)

+

2.sequentially stored linear list这个是顺序存储的线性表,就是和数组差不多,不是链表。链表:linked list

+

multilists

+

polynomial adt

+

链表相关操作,考填空

+

3.栈和队列

+

array implementation of stack

+

非递归实现,写一写

+

topological sort 指定使用stack实现

+

balancing symbol

+

模拟入栈,出栈序列

+

infix inorder traversal的非递归实现

+

1.prefix和infix和postfix是树的三种遍历方式,变量在叶子结点,而运算符号在非叶子结点。

+

index->postfix:遇到字母直接输出,遇到符号:要求栈顶的优先级是最高的,如果不能满足,就出栈,直到满足为止。然后该符号入栈。

+

括号的优先级栈外最高,栈内最低。遇到右括号,出栈直到左括号

+

2.问不可能的弹出序列,问栈至少多大,都模拟一下栈即可。注意出栈以后可以在该元素的旁边写数字表示入栈,不是在上方。

+

3.Circle queue:出入队列操作以后,有可能出现尾节点小于头节点的情况。但是它们之间的差不会大于n。尾节点其实是n+尾节点的位置。因此计算个数的时候就加回去。

+

Circle queue最多可以容纳的元素是数组的大小-1个元素。

+

circlular queue?装满,满和空是无法区分的?

+

4.树

+

how to convert general tree into binary tree

+

expression tree evaluation

+

preorder和postorder在完全二叉树情况下可以建树

+

inorder序列must/may

+

1.树的深度优先遍历:

+

a.将当前结点的左结点压入栈,直到没有左节点。

+

b.弹出一个点,将这个点的右节点压入栈,

+

c.重复b直到遍历完成

+

2.树的广度优先遍历:

+

a.当前结点所有孩子入队列。

+

b.弹出一个,将孩子入队列,直到队列空

+

3.有关树的计算:

+

已知degree为1,2的点有几个这种,需要用公式:\(∑degree=2e\),但是degree定义不同,需要+1,求和后需要-1,因为根节点没有父节点。

+

如果有两个degree的点个数不知道,直接当作0就可以。必须能够约掉,否则算不出来。

+

(与叶节点相关的计算)

+

4.前中后层序遍历及互相转化,根据任意两个序列还原整棵树

+

image-20240108154020659

+

5.搜索树

+

给一个序列。把bst建出来

+

construct BST recursively

+

节点下标关系

+

建堆

+

建并查集return s[x]=find(s[x],S)

+

1.根据形态还原树

+

2.插入、删除

+

insertion deletion

+

3.有关二叉树的遍历:

+

T(N)=2T(N/2)+1,解一下是O(N)

+

后序遍历:必须最后一个是根,前面必须有一个序列完全小于根,后面一个序列完全大于根。然后再在子序列里找。

+

3.已知BST节点个数,求孩子个数:

+

节点为\(1 + 2 + 2 2 + . . . 2 k + m = 2 k + 1 − 1 + m = n 1+2+2^2+...2^k+m=2^{k+1}-1+m=n1+2+2 +2 + +...2 +k + +m=2 +k+1 + −1+m=n\)

+

m是最下面一层的孩子。最下面一层的孩子的的一半+完整的k阶二叉树的孩子个数就是总孩子个数。

+

4.二叉树最方便的方法就是画一个特例验证

+

5.二叉搜索树不一定是完全的,因此和二分查找是不一样的。二分查找相当于在完全二叉树里找

+

6.二叉搜索的时间复杂度为:T(N)=T(N/2)+1,如果不是二分,则是N/K,但是复杂度还是O(NlogN)

+

7.二叉树7,9同级,则8一定共同的祖先,但是不一定是共同的父结点。

+

6.堆

+

下标问题:从0开始还是从1开始

+

heapsort从1开始的

+

下标性质比较重要

+

1.建堆是从低N/2个元素开始,一个一个往前走,每个执行precdown。precdown是指将该结点和最小的孩子比较,如果大于最小的孩子,则交换,直到小于所有的孩子。

+

2.建堆最大比较2N-2次

+

1. 第一个叶子节点的序号是多少

+

2.大根堆和小根堆的线性转化方式

+

3.根节点和叶子节点下标线性表示计算

+

4.模拟建堆

+

image-20240108153910563

+

7.并查集

+

复杂度是多少

+

union-by-size 因为每个节点

+

\(O(log_2N+1)\)

+
    +
  • [Lemma] Let T be a tree created by union-by-size with N nodes, then \(height(T)\leq\lfloor\log_2N\rfloor+1\).
  • +
+

Proved by induction. Each element can have its set name changed at most \(\log_2N\) times.

+
    +
  • Time complexity of \(N\) Union and \(M\) Find operations is now \(O(N+M\log_2N)\).
  • +
+

N union and M find (M>N):对于有path compression和union by rank的算法,

+

\(T(M,N)=M\alpha(M,N)=Mlog^*(N)\)

+

kruskal为什么是ElogE

+

akammen

+

8.图和拓扑排序

+

邻接表和邻接矩阵,怎么看入度出度多少

+

横着看竖着看

+

adjacency multilists?

+

AOE和AOV的变换

+

定义

+

边(Edge)

+

顶点(Vertex)

+

度:相连边的个数,不同与树的子节点数(少 1)。

+

\(∑ d e g r e e = 2 e\)是对所有的图都成立,和是否联通没有关系

+

表示

+

二维数组:表示边的方向、权。

+

无向:使用单一数组,多重链表(共用存储,用多链串起每个元素)

+

有向:邻接链表,十字链表(共用存储,分别用两链串起出入)

+

关键信息在顶点(AOV,Activity On Vertex)

+

邻接结构:多重邻接?

+

拓扑排序:如何确认图中是否有环?

+

9 最短路和网络流

+

无权图最短路:BFS

+

单源最短路问题,即选出一个原点,其他所有点到这个原点的最小距离,并找出获得这个最小距离需要走哪条路

+

两种BFS求无权图最短路的写法,一种是外面一个遍历所有节点的循环,维护一个curdist变量对每个点都判断,若距离=curdist,则更新与该节点相邻的所有节点的dist为curdist+1,如果图退化为线性的则复杂度为\(O(N^2)\)

+

一种维护了一个队列,也就是BFS最经典的结构,先将原点入队,......直到队空,复杂度降为\(O(|V|+|E|)\)

+

有权图最短路:dijkstra

+

每次在unknown的节点中找一个dist最小的节点加入known数组中,更新与之相邻的所有节点的dist,当所有节点都在known中时终止

+

有很多更新动作:走一条跳数更多的路径可能最后更短

+

每次找dist的动作:线性扫描 复杂度为\(O(|V^2|+|E|)\), 对稠密图好,由于\(V<E<V^2\)

+

邻接矩阵,邻接表实现,复杂度

+

维护堆:

+
    +
  • +

    堆优化

    +
  • +
  • +

    Keep distances in a priority queue and call DeleteMin to find the smallest unknown distance vertex.——\(O(\log|V|)\)

    +
  • +
  • +

    更新的处理方法

    +
  • +
  • +

    Method 1 : DecreaseKey——\(O(\log|V|)\)

    +

    \(T=O(|V|\log|V|+|E|\log|V|)=O(|E|\log|V|)\)

    +
  • +
  • +

    Method 2 : insert W with updated Dist into the priority queue

    +

    Must keep doing DeleteMin until an unknown vertex emerges

    +

    \(T=O(|E|\log|V|)\) but requires \(|E|\) DeleteMin with |E| space

    +
  • +
  • +

    Good if the graph is sparse

    +
  • +
+

有负权边时计算最短路的算法

+

复杂度:\(O(|V|×|E|)\)?

+

combine the update move of weighted graph and the queue of unweighted

+

循环V-1轮,遍历每条边E,看看对于已经访问过的节点(dist!=INT_MAX)是否能继续更新与之相邻节点的dist

+

V-1轮对于遍历每条边更新是肯定够的,就算是考虑退化为一条单链表,也只需要V-1次

+

判断有负权环的条件是,如果在第V-1次迭代后,还能继续松弛,则说明有负权环

+

使用队列实现,对于出现了更新的顶点,都将其入队,每个顶点最多入队V次,而非发现时的一次,使用邻接表时复杂度为\(O(|V|×|E|)\),比dijkstra的\(O(|E|\log|V|)\)高非常多

+

任意顶点第V+1出队时终止while循环

+

AOE 要求是无环图,能够使用两次拓扑排序

+

activity on edges,边是重点动作,顶点只是指示该动作完成了,像一个检查点

+

拓扑排序复杂度:\(O(|E|+|V|)\)

+

从v到w的边的松弛度:\(LC[w]-EC[v]-C_{w,v}\)

+

由松弛时间(slack time)==0的路径构成的通路为critical path

+

在AOE网络中有一个源头顶点和目的顶点。 从源头顶点开始,执行各边上事件的行动,到目的顶点完成为止,所需的时间为所有事件完成的时间总花费。 AOE完成所需的时间是由一条或数条关键路径(Critical Path)所控制的。 所谓关键路径,就是AOE有向图从源头顶点到目的顶点之间,所需花费时间最长的一条有方向性的路径。 当有一条以上的路径时间相等并且都是最长,则这些路径都称为此AOE有向图的关键路径。

+

All-Pairs Shortest Path Problem

+

The all-pairs shortest path problem is the determination of the shortest graph distances between every pair of vertices in a given graph. The problem can be solved using V applications of Dijkstra's algorithm or all at once using the Floyd-Warshall algorithm.

+

Dijkstra算法重复用V次可达\(O(∣V∣^3 )\),优先级队列实现的话可以简化至\(O(|V|×|E|×log|V|)\)

+

对于稀疏图比较好

+
C
1
+2
+3
+4
+5
warshallFloyd() //1起点数组,对于稠密图比较好
+    for k = 1 to |V|
+        for i = 1 to |V|
+            for j = 1 to |V|
+                A[i][j] = min(A[i][j], A[i][k] + A[k][j])
+
+

网络流

+

手动算网络流要小心:模拟最大流,计算残余网络(residual graph)

+

过程: Gf是最终流的情况,Gr是剩余容量的情况,开始Gf=0,Gr=原图

+
    +
  1. 在Gr图中找出任意一条增长通路(使用无权最短路算法)
  2. +
  3. 选取这条路上的最小流量,在Gr中减去这条边,并加上等大小的反向边
  4. +
  5. 更新Gr,去除0流量的边
  6. +
+

注意是在残余网络中添加反方向的边

+

Analysis

+
    +
  • +

    An augmenting path can be found by an unweighted shortest path algorithm.

    +
  • +
  • +

    \(T=O(f×|E|)\) where \(f\) is the maximum flow.

    +
  • +
  • +

    Always choose the augmenting path that allows the largest increase in flow

    +
  • +
  • +

    对Dijkstra算法进行单线(single-line)修改来寻找增长通路

    +
  • +
  • \(cap_{max}\)为最大边容量
  • +
  • \(O(|E|\log cap_{max})\)条增长通路将足以找到最大流,对于增长通路的每次计算需要\(O(|E|\log|V|)\)时间
  • +
+

$$ + T=T_{augmentation}\times T_{find_a_path}\ + =O(|E|\log cap_{max})\times O(|E|\log|V|)\ + =O(|E|^2\log|V|\log cap_{max})\ + dijkstra算法,邻接表+堆的实现复杂度为O(|E|log|V|) + $$

+
    +
  • +

    Always choose the augmenting path that has the least number of edges

    +
  • +
  • +

    使用无权最短路算法来寻找增长路径

    +
  • +
+

$$ + T=T_{augmentation}\times T_{find_a_path}\ + =O(|E||V|)\times O(|E|)\ + =O(|E|^2|V|) + $$

+
+

Note :

+
    +
  • If every \(v \notin \{ s, t \}\) has either a single incoming edge of capacity 1 or a single outgoing edge of capacity 1, then time bound is reduced to \(O( |E| |V|^{1/2} )\).
  • +
  • The min-cost flow problem is to find, among all maximum flows, the one flow of minimum cost provided that each edge has a cost per unit of flow.
  • +
+
+

10.最小生成树

+

kruskal 使用并查集?

+

prim和kruskal \(|E|log|V|, Elog|E|?\)

+

最小生成树

+

n 节点连通且无回路:n-1 条边

+

Prim 算法(点扩展):适合稠密图

+

由某点开始扩展树,选取最小路径,类 Dijkstra

+

Kruskal 算法(边加入):适合

+

将边从小到大排序,每次取出最小边,不构成回路则放入。使用事先排序或堆。使用并查集优化环路判别

+

1.找一下特殊的情况,比如3个点的情况?

+

2.判定最小生成树是否唯一:

+

权值相同的必须都添加(不能构成环)

+

1.对图中的每一条边,扫描其他边,如果存在相同权值的边,则对此边做标记。

+

2.然后使用Kruskal(或者prim)算法求出最小生成树。

+

3.如果这时候的最小生成树没有包含未被标记的边,即可判定最小生成树唯一。如果包含了标记的边,那么依次去掉这些边,再求最小生成树,如果求得的最小生成树的权值和原来的最小生成树的权值相同,即可判断最小生成树不唯一。

+

11.DFS及其应用

+

递归,访问所有未标记已访问的相邻顶点

+

遍历非连通图:对每个节点,若未标记已访问,调用深度优先遍历。可由此获得 Component 数

+

为获得唯一顺序,考试将使用图的具体表示进行考察

+

DAG(有向无环):

+

求强连通分量的个数

+

双连通->桥点(针对图的种类不同?)

+

双连通问题

+

articulation point 判断:

+

image-20240108161405191

+
    +
  1. +

    根节点有两个子节点,则一定是关节点

    +
  2. +
  3. +

    不是根节点的点,至少有一个叶子节点,且不能够往下通过背向边(back edge)回到父亲

    +
  4. +
+

image-20240108155334001

+

欧拉回路问题 特殊路径:欧拉路径和Hamilton路径

+

一笔画问题(边不重复)

+

欧拉遍历:不重复遍历所有边,要求图有两个节点度奇数,则从一奇数回到另一奇数

+

欧拉回路:不重复遍历所有边并回到起点,要求所有节点度为偶数。

+

其他:哈密顿回路(点不重复)

+

优先考虑是否是联通的。比如成环的一定是强联通,但是不联通的就错。如果边的度数为偶,但是没说是联通图,则不是欧拉图

+

12.排序

+

shell sort's increment 的决定因素

+

shell’s increments

+

shell 增量:for ( Increment = N / 2; Increment > 0; Increment /= 2 )

+

image-20240115222229124

+

最差\(O(N^2)\),平均\(O(nlogn)\)

+

hibbard 增量 \(h_k=2^k-1\)最差\(O(N^{3/2})\),平均\(O(N^{5/4})\)

+

sedgewick 增量 最差 \(O(N^{4/3})\),平均\(O(N^{7/6})\)

+

堆排序不用外部维护,可以原地排序,mergesort是唯一外部排序

+

1.排序复杂度:

+

归并:归并:O(N),总复杂度:O(NlogN)

+

快排:平均和一般情况:O(BNlogN),最坏O(N^2)

+

堆排:O(NlogN)

+

image-20240115222023514

+

插入:O(N^2)

+

桶排:O(N+M),M为桶数

+

所有排序最坏情况必须为O(N)

+

2.Heap和quick不用额外空间,Merge需要O(N)空间,外部排序

+

image-20240115221939264

+

通常需要\(O(N)\)复杂度的额外空间

+

During the sorting, processing every element which is not yet at its final position is called a "run". Which of the following cannot be the result after the second run of quicksort? +A.5, 2, 16, 12, 28, 60, 32, 72

+

B.2, 16, 5, 28, 12, 60, 32, 72

+

C.2, 12, 16, 5, 28, 32, 72, 60

+

D.5, 2, 12, 28, 16, 32, 72, 60

+

每一个run可以确定一个pivot的位置,两次递归可以确定1+2=3个。

+

但是要注意,如果在末尾的pivot使得递归只在之前进行,所以也可以

+

操作方法,对应专有名词

+

insertion sort

+

shell sort

+

merge sort

+

quick sort

+

bucket sort

+

13.哈希表

+

loading factor?

+

loading density

+

probing methods

+

collision / overflow

+

如果冲突太多还不如树,树至少有logN

+

double hashing 和 rehashing是不一样

+

模拟哈希

+

冲突处理

+

散列函数

+

字符串:转换为 32 进制整数,与散列表大小取模。

+

image-20240116110917859

+

如果是empty,则key没有定义,先判断会出错。

+

假设探测步数i不超过TS/2+1步,即假设表<50%。这时CurrentPos+2i-1 <= 2TS-1,所以可以用减法。

+

冲突解决

+
    +
  1. +

    分离连接法(桶)

    +
  2. +
  3. +

    开放地址法

    +
  4. +
+

线性探测:线性向下查找空位。

+

二次探测:

+

必须tablesize=prime,使用二次探测,则

+

解决查找不存在映射的效率,因不成功搜索需要查找至空位,而平方可较快地避开聚集。

+

在删除时需要使用标记,使得查找可以在标记位置继续,而插入也可以正常工作。

+

14.历年题错题

+

2021-2022

+

quicksort shellsort 的步长

+

double hashing和quadratic probing的关系

+

kruskal

+

15.坑

+

二叉查找树子树所有元素对父节点大小关系均相同,因此判断是否为二叉查找序列可按顺序更新允许的最小值和最大值。

+

堆排序使用最大堆。

+

快速排序空间复杂度非 O(1),而是堆栈引入的 O(NlogN)~O(N)。

+

由广度优先遍历构建二叉树:寻找根(前序前,后序后),确定两子树,递归。

+

由元素构建二叉查找树:按图形确定树根和两子树,递归。

+

单向列表导致尾部不能直接删除

+

入/出堆栈/队列须判断空/满

+

队列 Front 可指在队列头前一以使当 Front Rear 重合时队列为满

+

中缀表达式转后缀表达式,数字直接输出,符号:当已知符号优先级大于等于当前符号已知出栈,之后当前符号入栈。括号处理:左括号在栈外优先级最高(直接入栈),在栈内优先级最低(不出栈),只在遇到右括号时弹出。

+

二叉树:n0=n2+1,叶子数为双儿子父亲数加一。

+

二叉查找树插入、删除实现使用返回值式递归,函数总是返回参数节点的元素(可能改变),调用者将该节点用返回值覆盖。

+

d堆:父节点位于 [(i + d − 2) / d],儿子节点在 (i − 1)d + 2, ..., id + 1.

+

森林:根节点右兄弟为其他根节点

+

开放地址法二次探测要求表大小为素数且最多有 [表的大小/2] (向下取整)个位置被占用。

+

DAG:Directed Acyclic Graph

+

无环连通图为树

+

稳定性 +稳定的排序 +冒泡排序 O(n2) +插入排序 O(n2) +桶排序 O(n);需要O(k)额外空间 +归并排序 O(n log n);需要O(n)额外空间 +原地归并排序 O(n2) +基数排序 O(n·k);需要O(n)额外空间

+

不稳定的排序 +选择排序 O(n2) +希尔排序(shell sort)—O(n log2 n)如果使用最佳的现在版本 +堆排序(heap sort)—O(n log n) +快速排序(quick sort)—O(n log n)期望时间, O(n2)最坏情况;对于大的、乱数列表一般相信是最快的已知排序

+

平均时间复杂度由高到低为: +冒泡排序O(n2) +选择排序O(n2) +插入排序O(n2) +希尔排序O(n1.25) +堆排序O(n log n) +归并排序O(n log n) +快速排序O(n log n) +基数排序O(n)

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (3).png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (3).png" new file mode 100644 index 00000000..d4e10d76 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (3).png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4)-1700729444540-3-1701491107092-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4)-1700729444540-3-1701491107092-1.png" new file mode 100644 index 00000000..5f707d0d Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4)-1700729444540-3-1701491107092-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4)-1700729444540-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4)-1700729444540-3.png" new file mode 100644 index 00000000..5f707d0d Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4)-1700729444540-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4).png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4).png" new file mode 100644 index 00000000..5f707d0d Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (4).png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (5).png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (5).png" new file mode 100644 index 00000000..02122337 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (5).png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (7).png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (7).png" new file mode 100644 index 00000000..cc30b966 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (7).png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (9).png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (9).png" new file mode 100644 index 00000000..8a3da769 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-23 (9).png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-26.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-26.png" new file mode 100644 index 00000000..4755d7f7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/2023-11-26.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/337cbfb0-a7b2-4500-9664-318e9ffc870e.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/337cbfb0-a7b2-4500-9664-318e9ffc870e.jpg" new file mode 100644 index 00000000..16a4579e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/337cbfb0-a7b2-4500-9664-318e9ffc870e.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1-1705661650903-3-1705665977647-29.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1-1705661650903-3-1705665977647-29.jpg" new file mode 100644 index 00000000..671cd960 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1-1705661650903-3-1705665977647-29.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1-1705661650903-3.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1-1705661650903-3.jpg" new file mode 100644 index 00000000..671cd960 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1-1705661650903-3.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1.jpg" new file mode 100644 index 00000000..671cd960 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be-1705661423110-1.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be.jpg" new file mode 100644 index 00000000..671cd960 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/84ffb54557a629f2db54dcf3a5f59be.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231123171418423.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231123171418423.png" new file mode 100644 index 00000000..ccf6623f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231123171418423.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231202122526693.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231202122526693.png" new file mode 100644 index 00000000..56e0dcbe Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231202122526693.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231202122603384.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231202122603384.png" new file mode 100644 index 00000000..125e62ac Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20231202122603384.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1-1705661659067-7-1705665977647-32.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1-1705661659067-7-1705665977647-32.png" new file mode 100644 index 00000000..bebf17d7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1-1705661659067-7-1705665977647-32.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1-1705661659067-7.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1-1705661659067-7.png" new file mode 100644 index 00000000..bebf17d7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1-1705661659067-7.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1.png" new file mode 100644 index 00000000..bebf17d7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563-1704699552409-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563.png" new file mode 100644 index 00000000..bebf17d7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108153910563.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3-1705661656146-5-1705665977647-30-1705666906758-47.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3-1705661656146-5-1705665977647-30-1705666906758-47.png" new file mode 100644 index 00000000..1a83ad73 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3-1705661656146-5-1705665977647-30-1705666906758-47.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3-1705661656146-5.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3-1705661656146-5.png" new file mode 100644 index 00000000..1a83ad73 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3-1705661656146-5.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3.png" new file mode 100644 index 00000000..1a83ad73 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659-1704699622915-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659.png" new file mode 100644 index 00000000..1a83ad73 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108154020659.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9-1705665365200-15-1705665977648-34.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9-1705665365200-15-1705665977648-34.png" new file mode 100644 index 00000000..3f3c7dfb Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9-1705665365200-15-1705665977648-34.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9-1705665365200-15.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9-1705665365200-15.png" new file mode 100644 index 00000000..3f3c7dfb Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9-1705665365200-15.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9.png" new file mode 100644 index 00000000..3f3c7dfb Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5-1705661667700-9.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5.png" new file mode 100644 index 00000000..3f3c7dfb Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001-1704700416139-5.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001.png" new file mode 100644 index 00000000..3f3c7dfb Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108155334001.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11-1705665362808-13-1705665977647-31.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11-1705665362808-13-1705665977647-31.png" new file mode 100644 index 00000000..347c9f78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11-1705665362808-13-1705665977647-31.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11-1705665362808-13.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11-1705665362808-13.png" new file mode 100644 index 00000000..347c9f78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11-1705665362808-13.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11.png" new file mode 100644 index 00000000..347c9f78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191-1705661670233-11.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191.png" new file mode 100644 index 00000000..347c9f78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240108161405191.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200341954.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200341954.png" new file mode 100644 index 00000000..77be01e0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200341954.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200526600.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200526600.png" new file mode 100644 index 00000000..4aeb547f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200526600.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200548883.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200548883.png" new file mode 100644 index 00000000..85a9ce2c Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200548883.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200621620-1705320732483-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200621620-1705320732483-1.png" new file mode 100644 index 00000000..362a5272 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200621620-1705320732483-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200621620.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200621620.png" new file mode 100644 index 00000000..362a5272 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115200621620.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264-1705665370353-19-1705665977648-36.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264-1705665370353-19-1705665977648-36.png" new file mode 100644 index 00000000..203356e4 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264-1705665370353-19-1705665977648-36.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264-1705665370353-19.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264-1705665370353-19.png" new file mode 100644 index 00000000..203356e4 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264-1705665370353-19.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264.png" new file mode 100644 index 00000000..203356e4 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115221939264.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222023514-1705665977648-35.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222023514-1705665977648-35.png" new file mode 100644 index 00000000..64b898d6 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222023514-1705665977648-35.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222023514.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222023514.png" new file mode 100644 index 00000000..64b898d6 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222023514.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3-1705665367895-17-1705665977648-33.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3-1705665367895-17-1705665977648-33.png" new file mode 100644 index 00000000..feb9e1c0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3-1705665367895-17-1705665977648-33.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3-1705665367895-17.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3-1705665367895-17.png" new file mode 100644 index 00000000..feb9e1c0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3-1705665367895-17.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3.png" new file mode 100644 index 00000000..feb9e1c0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124-1705328551243-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124.png" new file mode 100644 index 00000000..feb9e1c0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240115222229124.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5-1705665374762-21-1705665977648-37.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5-1705665374762-21-1705665977648-37.png" new file mode 100644 index 00000000..f401da78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5-1705665374762-21-1705665977648-37.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5-1705665374762-21.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5-1705665374762-21.png" new file mode 100644 index 00000000..f401da78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5-1705665374762-21.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5.png" new file mode 100644 index 00000000..f401da78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859-1705374559407-5.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859.png" new file mode 100644 index 00000000..f401da78 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/image-20240116110917859.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-3554e8997059b1b41ae95a3e47ffd8b5_r.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-3554e8997059b1b41ae95a3e47ffd8b5_r.jpg" new file mode 100644 index 00000000..7184d59c Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-3554e8997059b1b41ae95a3e47ffd8b5_r.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-7845939f2c3d8ca4de7d859b085210b7_r.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-7845939f2c3d8ca4de7d859b085210b7_r.jpg" new file mode 100644 index 00000000..f9e62721 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-7845939f2c3d8ca4de7d859b085210b7_r.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-abeac41c041deb327ed4dd41a0747ad2_r.jpg" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-abeac41c041deb327ed4dd41a0747ad2_r.jpg" new file mode 100644 index 00000000..253cae0e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/assets/v2-abeac41c041deb327ed4dd41a0747ad2_r.jpg" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/labuladong/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/labuladong/index.html" new file mode 100644 index 00000000..1d9c647e --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/labuladong/index.html" @@ -0,0 +1,4975 @@ + + + + + + + + + + + + + + + + + + + + + + + + + labuladong - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Leetcode刷题笔记

+

int **graph,int graphsize表示graph二维数组有多少行

+

int* graphcolsize表示每行有多少列

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ *     int val;
+ *     struct TreeNode *left;
+ *     struct TreeNode *right;
+ * };
+ */
+bool isValidBST(struct TreeNode* root) {
+    if(root==NULL)return true;
+    if(root->left&&root->left->val>=root->val)return false;
+    if(root->right&&root->right->val<=root->val)return false;
+    if(isValidBST(root->left)&&isValidBST(root->right))return true;
+    else{
+        return false;
+    }
+}
+
+

验证二叉搜索树:用中序遍历

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ *     int val;
+ *     struct TreeNode *left;
+ *     struct TreeNode *right;
+ * };
+ */
+
+bool isBSTUtil(struct TreeNode* root, long min, long max) {
+    if (root == NULL) {
+        return true;
+    }
+
+    if (root->val <= min || root->val >= max) {
+        return false;
+    }
+
+    return isBSTUtil(root->left, min, root->val) && isBSTUtil(root->right, root->val, max);
+}
+
+bool isValidBST(struct TreeNode* root) {
+    return isBSTUtil(root, LONG_MIN, LONG_MAX);
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
int count=0;
+int a[20000];
+bool isValidBST(struct TreeNode* root) {
+    in_order(root);
+    if(count==1)return true;
+    for(int i=0;i<count-1;i++){
+        if(a[i]>a[i+1])return false;
+    }
+    return true;
+}
+
+void in_order(struct TreeNode* root){
+    if(root==NULL)return;
+    in_order(root->left);
+    a[count++]=root->val;
+    in_order(root->right);
+}
+
+

230

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
int count;
+int kthSmallestUtil(struct TreeNode* root, int k) {
+    if (root == NULL) {
+        return -1; 
+    }
+    int leftResult = kthSmallestUtil(root->left, k);
+    if (leftResult != -1) {
+        return leftResult;
+    }
+    count++;
+    if (count == k) {
+        return root->val; // Found the kth smallest element
+    }
+
+    return kthSmallestUtil(root->right, k);
+}
+
+int kthSmallest(struct TreeNode* root, int k) {
+    count = 0;
+    return kthSmallestUtil(root, k);
+}
+
+

797. 所有可能的路径

+

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序

+

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

+

分治思想:

+

回溯注重边的选择,撤销在for循环内

+

和DFS一样,先看是否走通了一条路径/走到头了一条路径

+

如果没有,就将当前位置相邻的下一层所有的可能性都遍历一遍

+

二叉树的重要性

+

举个例子,比如两个经典排序算法 快速排序归并排序,对于它俩,你有什么理解?

+

如果你告诉我,快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历,那么我就知道你是个算法高手了

+

为什么快速排序和归并排序能和二叉树扯上关系?我们来简单分析一下他们的算法思想和代码框架:

+

快速排序的逻辑是,若要对 nums[lo..hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo..p-1] 都小于等于 nums[p],且 nums[p+1..hi] 都大于 nums[p],然后递归地去 nums[lo..p-1]nums[p+1..hi] 中寻找新的分界点,最后整个数组就被排序了。

+

快速排序的代码框架如下:

+
Java
1
+2
+3
+4
+5
+6
+7
+8
+9
void sort(int[] nums, int lo, int hi) {
+    /****** 前序遍历位置 ******/
+    // 通过交换元素构建分界点 p
+    int p = partition(nums, lo, hi);
+    /************************/
+
+    sort(nums, lo, p - 1);
+    sort(nums, p + 1, hi);
+}
+
+

先构造分界点,然后去左右子数组构造分界点,你看这不就是一个二叉树的前序遍历吗?

+

再说说归并排序的逻辑,若要对 nums[lo..hi] 进行排序,我们先对 nums[lo..mid] 排序,再对 nums[mid+1..hi] 排序,最后把这两个有序的子数组合并,整个数组就排好序了。

+

归并排序的代码框架如下:

+
Java
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
// 定义:排序 nums[lo..hi]
+void sort(int[] nums, int lo, int hi) {
+    int mid = (lo + hi) / 2;
+    // 排序 nums[lo..mid]
+    sort(nums, lo, mid);
+    // 排序 nums[mid+1..hi]
+    sort(nums, mid + 1, hi);
+
+    /****** 后序位置 ******/
+    // 合并 nums[lo..mid] 和 nums[mid+1..hi]
+    merge(nums, lo, mid, hi);
+    /*********************/
+}
+
+

先对左右子数组排序,然后合并(类似合并有序链表的逻辑),你看这是不是二叉树的后序遍历框架?另外,这不就是传说中的分治算法嘛,不过如此呀。

+

如果你一眼就识破这些排序算法的底细,还需要背这些经典算法吗?不需要。你可以手到擒来,从二叉树遍历框架就能扩展出算法了。

+

说了这么多,旨在说明,二叉树的算法思想的运用广泛,甚至可以说,只要涉及递归,都可以抽象成二叉树的问题。

+
Java
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
class Solution {
+    List<List<Integer>> res = new LinkedList<>();
+/* 主函数,输入一组不重复的数字,返回它们的全排列 */
+List<List<Integer>> permute(int[] nums) {
+    // 记录「路径」
+    LinkedList<Integer> track = new LinkedList<>();
+    // 「路径」中的元素会被标记为 true,避免重复使用
+    boolean[] used = new boolean[nums.length];
+
+    backtrack(nums, track, used);
+    return res;
+}
+
+// 路径:记录在 track 中
+// 选择列表:nums 中不存在于 track 的那些元素(used[i] 为 false)
+// 结束条件:nums 中的元素全都在 track 中出现
+void backtrack(int[] nums, LinkedList<Integer> track, boolean[] used) {
+    // 触发结束条件
+    if (track.size() == nums.length) {
+        res.add(new LinkedList(track));
+        return;
+    }
+
+    for (int i = 0; i < nums.length; i++) {
+        // 排除不合法的选择
+        if (used[i]) {
+            // nums[i] 已经在 track 中,跳过
+            continue;
+        }
+        // 做选择
+        track.add(nums[i]);
+        used[i] = true;
+        // 进入下一层决策树
+        backtrack(nums, track, used);
+        // 取消选择
+        track.removeLast();
+        used[i] = false;
+    }
+}
+    }
+
+
C
1
+2
+3
+4
+5
+6
+7
/*a generalization of preorder traversal*/
+void DFS(Vertex V)
+{   
+    visited[ V ] = true;  /*mark this vertex to avoid cycles*/
+    for ( each W adjacent to V )
+        if ( !visited[ W ] ) DFS( W );
+} /*T = O(|E|+|V|) as long as adjacency lists are used*/
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/midterm/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/midterm/index.html" new file mode 100644 index 00000000..43cfb078 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/midterm/index.html" @@ -0,0 +1,5729 @@ + + + + + + + + + + + + + + + + + + + + + + + + + midterm - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

midterm

+

1.易错复杂度分析

+
    +
  1. 建堆(不是一个个插入)的算法:\(O(N)\):对i=n/2到1的所有节点都pecolate down
  2. +
+

原因:对于高度为h,有\(2^{h+1}-1\)个节点的完全二叉树,节点的高度之和为\(2^{h+1}-h-1\)

+
    +
  1. +

    N union + M find \(O(N+Mlog_2N)\) union by size,因为find大于等于union

    +
  2. +
  3. +

    循环链表 To delete p from a doubly linked list, we must do:

    +
  4. +
+

p->prior->next = p->next;p->next->prior=p->prior

+
    +
  1. 链表 增、删\(O(1)\),查\(O(N)\) (有序)数组增、删\(O(N)\),查\(O(1)\)
  2. +
+

指针比较多,注意调试不要打印或者访问NULL的某个属性,避免越界等段错误

+

因此所有的find percolate insert都先判断是否为NULL节点,再访问节点的left/right

+

堆下标从1开始

+

2.堆

+

从二叉树中删除节点:

+

先找到元素,找到NULL则说明要删除的元素不存在

+

再看有几个子节点,若0或1个则直接替换(用Null)替换也可

+

若有两个则用左子树中的最大节点或右子树中最小的节点替换,替换过程中只先改变根节点的数值,再执行delete那个底下的重复节点

+

插入新元素

+

插在最后,向上percolate,注意percolate up自然是不用比较大小的,down需要比较大小

+
+

Percolate

+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
void PercolateUp(int p, PriorityQueue H)
+{
+    int i;
+    for (i = p; i > 1;){
+        if( H->Elements[i / 2] > H->Elements[i]){
+             ElementType temp = H->Elements[i/2];
+             H->Elements[i/2] = H->Elements[i];
+             H->Elements[i] = temp;
+              i = i/2;
+        }
+        else break;
+    }
+}
+void PercolateDown(int p, PriorityQueue H)
+{
+    int i, Child;
+    for (i = p; i * 2 <= H->Size; i = Child)
+    {
+        Child = i * 2;
+        if (Child != H->Size && H->Elements[Child + 1] < H->Elements[Child])
+            Child++;
+        if (H->Elements[i] > H->Elements[Child]){
+             ElementType temp = H->Elements[Child];
+             H->Elements[Child] = H->Elements[i];
+             H->Elements[i] = temp;
+        }
+    }
+}
+
+

弹出最小值(DeleteMin)并维护堆的性质:

+

用最后一个元素替换堆顶元素,并进行minHeapify

+

minHeapify过程,就是percolate down的过程

+

递归传递的参数为堆指针和当前节点的下标i,首先计算出左右节点下标(2i,2i+1),比较左右节点选出较小值与根节点交换,递归持续进行到越界或最小值就是i结束。

+

3.栈、队列

+

image-20231202122526693

+

image-20231202122603384

+

4.链表

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
List Reverse( List L ){
+    //原地翻转链表,不申请新的空间,只需要一个临时变量,一个指针
+    Position p = L->Next; //p用于保存当前节点
+    if(p==NULL)return L; //如果链表为空,直接返回
+    Position q = p->Next; //q用于保存p的下一个节点,防止断链
+    Position temp; //temp用于保存q的下一个节点,防止断链
+    p->Next = NULL; //将头节点的next置空,否则会出现循环链表
+    while(q!=NULL){
+        temp = q->Next;
+        q->Next = p;
+        p = q;
+        q = temp;
+    }
+    L->Next = p;
+    return L;
+}
+
+

5.并查集:

+

naive implementaion:

+
C
1
+2
+3
+4
union(r1,r2):
+    S[r2]=r1  //将r2指向r1
+//问题:r1,r2必须都是root,因此在执行上面之前要先find
+=> union(find(node1),find(node2))
+
+

最坏情况复杂度达到\(O(N^2)\)!!!!

+

union-by-size:总是使较小的树成为较大的树的子树

+
    +
  • [Lemma] Let T be a tree created by union-by-size with N nodes, then \(height(T)\leq\lfloor\log_2N\rfloor+1\).
  • +
+

Proved by induction. Each element can have its set name changed at most \(\log_2N\) times.

+
    +
  • +

    Time complexity of \(N\) Union and \(M\) Find operations is now \(O(N+M\log_2N)\).

    +
  • +
  • +

    原因:被链接的树的大小至少翻倍

    +
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
/* Assumes Rootl and Root2 are roots*/
+void SetUnion(DisjSet S, SetType Root1, SetType Root2)
+{
+    if (S[Root1] <= S[Root2])
+    {
+        S[Root1] += S[Root2];
+        S[Root2] = Root1;
+    }
+    else
+    {
+        S[Root2] += S[Root1];
+        S[Root1] = Root2;
+    }
+}
+
+

union-by-height:只有当两颗相同深度的树合并时才要求增加树的深度?

+
    +
  • Always change the shallow tree
  • +
  • 保证所有的树的深度最多是\(O(logN)\)
  • +
+

使用S[root]保存树的深度的相反数,都是负数,绝对值越大越深

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
/* Assumes Rootl and Root2 are roots*/
+void SetUnion(DisjSet S, SetType Root1, SetType Root2)
+{
+    if ( S[Root2] < S[Root1])  /*Root2 is deeper set*/
+        S[Root1] = Root2;      /*Make Root2 new root*/
+    else
+    {
+        if (S[Root1] == S[Root2])  /*Same height*/
+            S[Root1]--;
+        S[Root2] = Root1;
+    }
+}
+
+

find with path-compression akamen-algorithm

+

普通的find

+
C
1
+2
+3
+4
+5
SetType Find(ElementType X, DisjSet S)
+{
+    for ( ; S[X]>0; X=S[X]);
+    return X;
+}
+
+

带路径压缩的find:

+
C
1
+2
+3
+4
+5
+6
+7
SetType Find( ElementType X, DisjSet S )
+{
+    if ( S[ X ] <= 0 )    
+        return X;
+    else 
+        return S[ X ] = Find( S[ X ], S );
+}
+
+

这两种是一样的

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
int find_parent(ptr_disjset S, int x)
+{
+    // find with path compression
+    if (x == S->parent[x])
+        return x;
+    else
+    {
+        S->parent[x] = find_parent(S, S->parent[x]);
+        return S->parent[x];
+    }
+}
+
+

递归改写为迭代形式的find,相当于遍历两遍

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
SetType Find( ElementType X, DisjSet S )
+{   
+    ElementType root, trail, lead;
+    for ( root = X; S[ root ] > 0; root = S[ root ] );  /* find the root */
+    for ( trail = X; trail != root; trail = lead )
+    {
+        lead = S[ trail ];   
+        S[ trail ] = root;   
+    }  /* collapsing */
+    return root;
+}
+
+

6.树:二叉树,搜索树

+

zigzagging on a tree

+

zigzag.jpg

+
C
1
+2
+3
+4
sample input:
+8
+12 11 20 17 1 15 8 5  左中右 中序  
+12 20 17 11 15 8 5 1  左右中 后序  后序的最后一个节点为根节点
+
+
C
1
+2
sample output:
+1 11 5 8 17 12 20 15
+
+
C
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#define MAX_NODE_NUM 60
+
+typedef struct tree_node
+{
+    int data;
+    struct tree_node *left;
+    struct tree_node *right;
+} tree_node;
+typedef tree_node *tree_ptr;
+
+typedef struct
+{
+    int front;
+    int rear;
+    tree_ptr list[MAX_NODE_NUM];
+} tree_queue;
+typedef tree_queue *queue_ptr;
+
+void enqueue(tree_ptr tree, queue_ptr queue)
+{
+    if (tree == NULL)
+        return; // 空树不入队
+    queue->list[queue->rear++] = tree;
+}
+
+tree_ptr dequeue(queue_ptr queue)
+{
+    if (queue->front == queue->rear)
+        return NULL; // 队列为空时返回NULL
+    tree_ptr tree_node = queue->list[queue->front++];
+    return tree_node;
+}
+
+tree_ptr build_tree(int *in_order, int *post_order, int n)
+{
+    if (n <= 0 || in_order == NULL || post_order == NULL || n > MAX_NODE_NUM)
+        return NULL;
+    tree_ptr root = (tree_ptr)malloc(sizeof(tree_node));
+    root->data = post_order[n - 1];
+    int index = 0;
+    for (int i = 0; i < n; i++)
+    {
+        if (in_order[i] == post_order[n - 1])
+            index = i;
+    }
+    // 把中序序列分成两部分,左边的是左子树,右边的是右子树
+    // 此处 in_order + index + 1 忘记+1,导致只有左枝的左子树建成了右子树
+    root->left = build_tree(in_order, post_order, index);
+    root->right = build_tree(in_order + index + 1, post_order + index, n - index - 1);
+    return root;    //build_tree的最后一个参数是子树的节点数,左子树是0~index-1共index个节点,右子树是n-index-1个节点,从index开始到n-1共(n-1)-index+1-1(除去根节点)=n-index-1个节点
+
+    中序 左子树12 11 20 17 )【1 右子树15 8 5
+    后序 12 20 17 11)( 15 8 5)【1
+        i+5post_order+4,n-index-1
+}
+
+int is_empty(queue_ptr queue)
+{
+    if (queue->front == queue->rear)
+        return 1;
+    else
+        return 0;
+}
+/*
+void print_tree(tree_ptr tree){
+    //打印顺序为根左右
+    if(tree == NULL)return;
+    printf("%d ", tree->data);
+    if(tree->left != NULL)print_tree(tree->left);
+    if(tree->right != NULL)print_tree(tree->right);  
+}
+*/
+typedef struct
+{
+    int data[MAX_NODE_NUM];
+    int pointer;
+} sequence;
+typedef sequence *sequence_ptr;
+
+int zigzag_levelorder(tree_ptr tree, queue_ptr queue)
+{
+    // zigzag的层序遍历
+    int level = 0;
+    enqueue(tree, queue);
+    while (is_empty(queue) == 0)
+    {
+        int len = queue->rear - queue->front;
+        if (level % 2)
+        {
+            for (int i = queue->front; i < queue->front + len; i++)
+            {
+                printf(" %d", queue->list[i]->data);
+            }
+        }
+        else
+        {
+            for (int i = queue->front + len - 1; i >= queue->front; i--)
+            {
+                if (level == 0)
+                    printf("%d", queue->list[i]->data);
+                else
+                    printf(" %d", queue->list[i]->data);
+            }
+        }
+        for (int i = queue->front; i < queue->front + len; i++)
+        {
+            if (queue->list[i]->left != NULL)
+                enqueue(queue->list[i]->left, queue);
+            if (queue->list[i]->right != NULL)
+                enqueue(queue->list[i]->right, queue);
+        }
+        queue->front = queue->front + len;
+        level++;
+    }
+}
+
+int main()
+{
+    // zigzag 层序遍历,在每一行输出时打印出逆序的
+    int n;
+    scanf("%d", &n);
+    // The second line gives the inorder sequence
+    // and the third line gives the postorder sequence
+    /*  1. 根据后序序列的最后一个元素建立根结点;
+        2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
+        3. 在后序序列中确定左右子树的后序序列;
+        4. 由左子树的后序序列和中序序列建立左子树;
+        5. 由右子树的后序序列和中序序列建立右子树。*/
+    int in_order[MAX_NODE_NUM] = {0};
+    int post_order[MAX_NODE_NUM] = {0};
+    for (int i = 0; i < n; i++)
+        scanf("%d", &in_order[i]);
+    for (int i = 0; i < n; i++)
+        scanf("%d", &post_order[i]);
+
+    tree_ptr tree = build_tree(in_order, post_order, n);
+    // 把树打印出来看看
+    // print_tree(tree);
+
+    queue_ptr queue = (queue_ptr)malloc(sizeof(tree_queue));
+    queue->front = 0;
+    queue->rear = 0;
+    zigzag_levelorder(tree, queue);
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
int Isomorphic( Tree T1, Tree T2 ){
+    //左右子树互换,每层的东西应该是相同的
+    //层序遍历?只要递归实现一下即可
+    if(!T1&&!T2)return 1;
+    else if(!T1&&T2||!T2&&T1)return 0;
+    if(T1->Element!=T2->Element)return 0;
+    int ans1 = Isomorphic(T1->Left,T2->Left);
+    int ans2 = Isomorphic(T1->Right,T2->Left);
+    int ans3 = Isomorphic(T1->Left,T2->Right);
+    int ans4 = Isomorphic(T1->Right,T2->Right);
+    return ans1&&ans4||ans2&&ans3;
+
+
+}
+
+

insertion sequence序列不同,构建出的二叉树形状可能有多种

+

2023-11-23 (9)

+

建立二叉搜索树的顺序

+

先判断当前节点是否为NULL,若是,则建立新节点(data = x,left=right=NULL)

+

若不是,则递归向下,若大于当前,则Insert(x,tree->left),小于前,则Insert(x,tree->right)

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
SearchTree Insert( ElementType X, SearchTree T ) 
+{ 
+    if ( T == NULL ) /* Create and return a one-node tree */ 
+    { 
+        T = malloc( sizeof( struct TreeNode ) ); 
+        if ( T == NULL ) 
+            FatalError( "Out of space!!!" ); 
+        else 
+        { 
+            T->Element = X; 
+            T->Left = T->Right = NULL; 
+        } 
+    }  /* End creating a one-node tree */
+    else  /* If there is a tree */
+        if ( X < T->Element ) 
+            T->Left = Insert( X, T->Left ); 
+        else 
+            if ( X > T->Element ) 
+                T->Right = Insert( X, T->Right ); 
+        /* Else X is in the tree already; we'll do nothing */ 
+    return  T;   /* Do not forget this line!! */ 
+}
+
+

作业错题

+

环形队列 数组实现

+

Suppose that an array of size m is used to store a circular queue. If the front position is front and the current size is size, then the rear element must be at:

+
Text Only
A.front+size
+
+
Text Only
B.(front+size)%m
+
+
Text Only
C.(front+size-1)%m  this one
+
+
Text Only
D.front+size-1
+
+

2023-11-23 (5)

+

image-20231123171418423

+

disjoint sets

+

2023-11-23 (7)

+
HW3: 栈最多容纳M个数,数字1~N依次入栈,而出栈顺序任意,验证给定的序列是否为出栈序列
+

对于某个序列,如3,2,1,7,5,6,4,栈的大小为5

+

预设flag=1,假设是合法出栈序列

+

初始化栈顶指针为-1,先将1入栈,因为1一定是第一个入栈,使用i记录下一个将要入栈的元素

+

栈顶不能超过M,且还未遍历完(使用\(num[j]\)保存如果是合法出栈序列即将出栈的元素)

+

\(栈顶元素==num[j]\)则弹出,\(j\)向后遍历

+

若到最后栈不为空则error

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#define MAXSIZE 1000
+
+int main()
+{
+    int M, N, K;
+    scanf("%d %d %d", &M, &N, &K);
+    // M为栈的最大容量,N为入栈的数字个数,K为需要判断的出栈序列的个数
+    int i, j, k;
+    int num[MAXSIZE];
+    int flag, current;
+    // 枚举出栈顺序,然后模拟出栈过程,如果出现不合法的情况,就直接跳出循环,输出NO
+    for (i = 0; i < K; i++)
+    {
+        for (j = 0; j < N; j++)
+        {
+            scanf("%d", &num[j]);
+        }
+        flag = test(num, M, N); // 传入出栈序列,栈的最大容量,入栈数字的个数
+        if (flag == 0)
+            printf("NO\n");
+        else
+            printf("YES\n");
+    }
+}
+
+int test(int *num, int M, int N)
+{
+    int stack[MAXSIZE] = {0};
+    int flag = 1;
+    int top = -1;
+    int i = 0, j = 0;   // i为入栈序列,j为出栈序列的下标
+    stack[++top] = ++i; // 先将1入栈
+    while (top < M && j < N)
+    // 栈不满且出栈序列还未遍历完
+    {
+        if (top != -1 && stack[top] == num[j])
+        // 栈不为空且栈顶元素等于出栈序列的当前元素,则出栈,且j向后遍历
+        {
+            top--;
+            j++;
+        }
+        else
+        {
+            stack[++top] = ++i;
+        }
+    }
+    if (top != -1)
+        flag = 0; // 栈不为空,说明出栈序列不合法
+    return flag;
+}
+
+

polish

+

infix操作

+

2023-11-26

+

C

+

计算机只能在将中缀表达式转换为前缀或后缀表达式后才能进行运算

+

计算机在计算后缀表达式时只需从左到右线性扫描,遇到操作数压入栈,遇到运算符则依次取出栈顶的两个操作数计算后将结果重新压回栈中。

+

因此将中缀表达式转换为前缀或后缀表达式比较关键

+

一般使用两个栈进行此操作,在转换时不进行运算,只是将运算符和操作数重新排列

+

最后输出时一般是倒序输出

+

注意,只有S1栈顶运算符优先级小于当前运算符时,才将当前运算符压入S1,否则直接压入中间结果栈S2

+

S2不叫操作数栈,因为最后结果从S2中逆序输出得到

+

img

+

img

+

倒序输出为ABC+*DEF+/-

+

操作数顺序不会变化,一定是叶子节点

+

二分查找+1-1问题处理

+

img

+
    +
  • 左、中、右索引的分配。
  • +
  • 循环或递归终止条件。
  • +
  • 后处理的必要性
  • +
+

模板1相当于 左闭右闭区间 left=0,right=length-1,

+

模板2相当于 左闭右开区间 left=0,right=length,

+

模板3相当于 左开右开区间 left=-1,right=length/ left=0,right=length-1,

+

2和3找的是\(>=\)target的第一个数

+

模板 #1 (left <= right):

+
    +
  • 二分查找的最基础和最基本的形式。
  • +
  • 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。
  • +
  • 不需要后处理,因为每一步中,你都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。
  • +
+

模板 #2 (left < right):

+
    +
  • 一种实现二分查找的高级方法。
  • +
  • 查找条件需要访问元素的直接右邻居。
  • +
  • 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
  • +
  • 保证查找空间在每一步中至少有 2 个元素。
  • +
  • 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。
  • +
+

模板 #3 (left + 1 < right):

+
    +
  • 实现二分查找的另一种方法。
  • +
  • 搜索条件需要访问元素的直接左右邻居。
  • +
  • 使用元素的邻居来确定它是向右还是向左。
  • +
  • 保证查找空间在每个步骤中至少有 3 个元素。
  • +
  • 需要进行后处理。 当剩下 2 个元素时,循环 / 递归结束。 需要评估其余元素是否符合条件。
  • +
+

K-th largest Num

+

在N个元素的数组中找第K大的数:

+

N个元素的前K个先做minHeapify,后面的元素依次插入堆的对应位置:

+

方法:insert,如果比H[1](堆顶元素,下标从1开始)小,则不插入堆中,因为堆顶就是第K个大的数

+

若比H[1]大,则percolate down,沿途子节点向上替换父节点,也就是H[1]被替换

+

将余下的K+1~N个元素全部判断并插入后,最终堆顶元素就是N个数中第K大的数

+

期中考试刷题

+

15-16

+

No Greater Than X in BST

+

(20分)

+

You are supposed to output, in decreasing order, all the elements no greater than X in a binary search tree T.

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct TreeNode *Tree;
+struct TreeNode {
+    int Element;
+    Tree  Left;
+    Tree  Right;
+};
+
+Tree BuildTree(); /* details omitted */
+void Output( int X ); /* details omitted */
+
+void Print_NGT( Tree T,  int X );
+
+int main()
+{
+    Tree T;
+    int X;
+
+    T = BuildTree();
+    scanf("%d", &X);
+    Print_NGT( T, X );
+    printf("End\n");
+
+    return 0;
+}
+
+/* Your function will be put here */
+void Print_NGT( Tree T,  int X ){
+
+}
+
+

midterm correction

+

image-20240115200341954

+

image-20240115200526600

+

image-20240115200548883

+

image-20240115200621620

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/recite/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/recite/index.html" new file mode 100644 index 00000000..d70c7f30 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/recite/index.html" @@ -0,0 +1,4691 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 记忆部分 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

记忆部分

+ +

默写内容

+

树:delete(BST),insert(BST)

+

堆:deletemin,minheapify,percolate(up/down),

+

栈:infix->prefix/postfix, evaluate postfix

+
C
1
+2
+3
+4
+5
+6
+7
+8
+9
char* in_to_pre(){
+    char *s1 = (char*)malloc(sizeof(char)*MAX_N);
+    char *s2 = (char*)malloc(sizeof(char)*MAX_N);
+    int top1 = -1; int top2 = -1;
+    s1[top1++] = in_fix[0];
+    for(int i=1;i<num;i++){
+        if()
+    }
+}
+
+
C
1
+2
+3
+4
+5
+6
void PercolateDown(int p, PriorityQueue H){
+    //p应该是什么
+}
+void PercolateUp(int p, PriorityQueue H){
+    for(int i=p;H->elements[i]<H->elements[i/2];i=i/2)
+}
+
+
C
minHeapify
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
void Unweighted( Table T )
+{   
+    /* T is initialized with the source vertex S given */
+    Queue Q;
+    Vertex V, W;
+    Q = CreateQueue( NumVertex );
+    MakeEmpty( Q );
+    Enqueue( S, Q ); /* Enqueue the source vertex */
+    while ( !IsEmpty( Q ) ) 
+    {
+        V = Dequeue( Q );
+        T[ V ].Known = true; /* not really necessary */
+        for ( each W adjacent to V )
+            if ( T[ W ].Dist == Infinity ) 
+            {
+                T[ W ].Dist = T[ V ].Dist + 1;
+                T[ W ].Path = V;
+                Enqueue( W, Q );
+            } /* end-if Dist == Infinity */
+    } /* end-while */
+    DisposeQueue( Q ); /* free memory */
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\344\272\214\345\217\211\346\240\221\347\256\227\346\263\225\345\244\215\344\271\240/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\344\272\214\345\217\211\346\240\221\347\256\227\346\263\225\345\244\215\344\271\240/index.html" new file mode 100644 index 00000000..21f04759 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\344\272\214\345\217\211\346\240\221\347\256\227\346\263\225\345\244\215\344\271\240/index.html" @@ -0,0 +1,4655 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 二叉树 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

二叉树

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
public int countNodes(TreeNode root) {
+    TreeNode l = root, r = root;
+    // 记录左、右子树的高度
+    int hl = 0, hr = 0;
+    while (l != null) {
+        l = l.left;
+        hl++;
+    }
+    while (r != null) {
+        r = r.right;
+        hr++;
+    }
+    // 如果左右子树的高度相同,则是一棵满二叉树
+    if (hl == hr) {
+        return (int)Math.pow(2, hl) - 1;
+    }
+    // 如果左右高度不同,则按照普通二叉树的逻辑计算
+    return 1 + countNodes(root.left) + countNodes(root.right);
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\345\210\244\345\256\232\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221\346\230\257\345\220\246\345\224\257\344\270\200/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\345\210\244\345\256\232\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221\346\230\257\345\220\246\345\224\257\344\270\200/index.html" new file mode 100644 index 00000000..f516700d --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\345\210\244\345\256\232\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221\346\230\257\345\220\246\345\224\257\344\270\200/index.html" @@ -0,0 +1,4929 @@ + + + + + + + + + + + + + + + + + + + + + + + + + MST-uniqueness - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Uniqueness of MST

+

Given any weighted undirected graph, there exists at least one minimum spanning tree (MST) if the graph is connected. Sometimes the MST may not be unique though. Here you are supposed to calculate the minimum total weight of the MST, and also tell if it is unique or not.

+

Input Specification:

+

Each input file contains one test case. Each case starts with a line containing 2 numbers N (≤ 500), and M, which are the total number of vertices, and the number of edges, respectively. Then M lines follow, each describes an edge by 3 integers:

+
Text Only
V1 V2 Weight
+
+

where V1 and V2 are the two ends of the edge (the vertices are numbered from 1 to N), and Weight is the positive weight on that edge. It is guaranteed that the total weight of the graph will not exceed 230.

+

Output Specification:

+

For each test case, first print in a line the total weight of the minimum spanning tree if there exists one, or else print No MST instead. Then if the MST exists, print in the next line Yes if the tree is unique, or No otherwise. There there is no MST, print the number of connected components instead.

+

Sample Input 1:

+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
5 7
+1 2 6
+5 1 1
+2 3 4
+3 4 3
+4 1 7
+2 4 2
+4 5 5
+
+

Sample Output 1:

+
Text Only
1
+2
11
+Yes
+
+

Sample Input 2:

+
Text Only
1
+2
+3
+4
+5
+6
4 5
+1 2 1
+2 3 1
+3 4 2
+4 1 2
+3 1 3
+
+

Sample Output 2:

+
Text Only
1
+2
4
+No
+
+

Sample Input 3:

+
Text Only
1
+2
+3
+4
+5
+6
5 5
+1 2 1
+2 3 1
+3 4 2
+4 1 2
+3 1 3
+
+

Sample Output 3:

+
Text Only
1
+2
No MST
+2
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
#include <stdio.h>
+#include <stdlib.h>
+#define MAX_EDGE_NUM 200000
+#define MAX_NODE_NUM 1000
+typedef struct
+{
+    int start, end, weight;
+    int isTreeEdge; //判断是否是生成树的一部分
+} Edge;
+
+Edge edges[MAX_EDGE_NUM];//倒数第二个测试点一直不行
+int n, m, father[MAX_NODE_NUM];
+
+int find_parent(int x)
+{
+    if (x == father[x]) //如果找到了父节点(节点指向自身)
+        return x;
+    int a = find_parent(father[x]);
+    father[x] = a; //找到之后就直接指向父节点、
+    return a;
+}
+
+int compareEdges(const void *a, const void *b)
+{
+    return ((Edge *)a)->weight - ((Edge *)b)->weight;
+}
+
+int main()
+{
+    scanf("%d %d", &n, &m);//n为总节点数,m为总边数
+
+    for (int i = 0; i < m; ++i)
+    {
+        scanf("%d %d %d", &edges[i].start, &edges[i].end, &edges[i].weight);
+        edges[i].isTreeEdge = 0;
+    }
+    qsort(edges, m, sizeof(Edge), compareEdges);//使用快排
+
+    for (int i = 1; i <= n; ++i)
+        father[i] = i; //初始化为自身
+
+    int total_MST_weight = 0, k_edges = 0, j = 0;
+    int flag = 1;
+
+    for (int i = 0; i < m; i = j)
+    {
+        for (j = i; j < m && edges[j].weight == edges[i].weight; ++j)
+            if (find_parent(edges[j].start) != find_parent(edges[j].end))
+                edges[j].isTreeEdge = 1;//直接一次性将所有边长相等的边都找出来了
+
+        for (int k = i; k < j; ++k)
+        {
+            int start = find_parent(edges[k].start), end = find_parent(edges[k].end);
+            if (start != end) //若不属于一个集合
+            {
+                total_MST_weight += edges[k].weight;
+                father[start] = end;
+                ++k_edges;
+            }
+            else if (edges[k].isTreeEdge)//start和end属于一个集合,且这条边是将要加入的边中权重相同小的那组
+            //所以有多种选择,生成树不唯一
+                flag = 0; 
+        }
+    }
+
+    if (k_edges == n - 1)
+        printf("%d\n%s", total_MST_weight, flag ? "Yes" : "No");
+    else
+        printf("No MST\n%d", n - k_edges); //打印联通分量的个数
+
+    return 0;
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\345\210\244\346\226\255\346\230\257\345\220\246\346\234\211Euler Circuit/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\345\210\244\346\226\255\346\230\257\345\220\246\346\234\211Euler Circuit/index.html" new file mode 100644 index 00000000..e5279759 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\345\210\244\346\226\255\346\230\257\345\220\246\346\234\211Euler Circuit/index.html" @@ -0,0 +1,4845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + euler circuit - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

判断是否有Euler Circuit,打印一条路径

+

注意circuit是回路,要回去到起点的,euler tour可以不用回到起点,但经过每条边

+

判断是否存在欧拉回路主要就是看有没有度为奇数的边

+

A.判断欧拉通路是否存在的方法

+

有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。

+

无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。

+

B.判断欧拉回路是否存在的方法

+

有向图:图连通,所有的顶点出度=入度。

+

无向图:图连通,所有顶点都是偶数度。

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
int isEulerCircuit(Graph *graph) {
+    visited[i]=0;//设置visited数组为全0
+
+    int oddDegreeCount = 0;
+
+    for (int i = 0; i < graph->vertices; i++) {
+        if ((i == 0 && isValidEdge(graph, i, i + 1)) || (i > 0 && isValidEdge(graph, i, i - 1)))
+            eulerDFS(graph, i, visited);
+
+        for (int j = 0; j < graph->vertices; j++) {
+            if (!visited[j] && isValidEdge(graph, i, j)) {
+                oddDegreeCount++;
+                eulerDFS(graph, j, visited);
+            }
+        }
+    }
+
+    free(visited);
+
+    return oddDegreeCount == 0;
+}
+void eulerDFS(Graph *graph, int vertex, int *visited) {
+    visited[vertex] = 1;
+
+    for (int i = 0; i < graph->vertices; i++) {
+        if (graph->adjacencyMatrix[vertex][i] && !visited[i]) {
+            printf("%d -> %d\n", vertex, i);
+            eulerDFS(graph, i, visited);
+        }
+    }
+}
+int isValidEdge(Graph *graph, int u, int v) {
+    int countU = 0, countV = 0;
+
+    for (int i = 0; i < graph->vertices; i++) {
+        if (graph->adjacencyMatrix[u][i])
+            countU++;
+        if (graph->adjacencyMatrix[v][i])
+            countV++;
+    }
+
+    if (countU == 1)
+        return 1;
+    if (countV == 1)
+        return 1;
+
+    return 0;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
#include<cstdio>
+#include<stdio.h>
+#include<cstring>
+#include<algorithm>
+#define MAX 2010
+using namespace std;
+int maps[MAX][MAX];
+int in[MAX];
+int t[MAX];
+int flag;
+int k;
+int Max,Min;
+int DFS(int x)
+{
+    int i;
+    for(i=Min;i<=Max;i++)
+    {
+        if(maps[x][i])///从任意一个与它相连的点出发
+        {
+            maps[x][i]--;///删去遍历完的边
+            maps[i][x]--;
+            DFS(i);
+        }
+    }
+    t[++k]=x;///记录路径,因为是递归所有倒着记
+}
+int main()
+{
+    int n,i,x,y;
+    Max=-9999;
+    Min=9999;
+    flag=0;
+    scanf("%d",&n);
+    for(i=1;i<=n;i++)
+    {
+        scanf("%d%d",&x,&y);
+        maps[x][y]++;
+        maps[y][x]++;
+        Max=max(x,max(y,Max));
+        Min=min(x,min(y,Min));
+        in[x]++;
+        in[y]++;
+    }
+    for(i=Min;i<=Max;i++)
+    {
+        if(in[i]%2)///存在奇度点,说明是欧拉通路
+        {
+            flag=1;
+            DFS(i);
+            break;
+        }
+    }
+    if(!flag)///全为偶度点,从标号最小的开始找
+    {
+        DFS(Min);
+    }
+    for(i=k;i>=1;i--)
+    {
+        printf("%d\n",t[i]);
+    }
+    return 0;
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\346\243\200\346\265\213\350\264\237\346\235\203\347\216\257-\346\261\202\346\234\200\345\260\217\350\267\257\345\276\204/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\346\243\200\346\265\213\350\264\237\346\235\203\347\216\257-\346\261\202\346\234\200\345\260\217\350\267\257\345\276\204/index.html" new file mode 100644 index 00000000..b472b86d --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\346\243\200\346\265\213\350\264\237\346\235\203\347\216\257-\346\261\202\346\234\200\345\260\217\350\267\257\345\276\204/index.html" @@ -0,0 +1,4752 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 负权环检测 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

求有负值边的图的最短路

+

若图中有负权环路,则会产生无穷循环,最短路不存在

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
void bellmanFord(struct Graph* graph, int src) {
+    int V = graph->V;
+    int E = graph->E;
+    int* dist = (int*)malloc(V * sizeof(int));
+
+    // 初始化距离数组
+    for (int i = 0; i < V; i++) {
+        dist[i] = INT_MAX;
+    }
+    dist[src] = 0;
+
+    // 松弛操作
+    for (int i = 1; i <= V - 1; i++) {
+        //V-1轮对于遍历每条边更新是肯定够的,就算是考虑退化为一条单链表,也只需要V-1次
+        for (int j = 0; j < E; j++) {
+            int u = graph->edge[j].src;
+            int v = graph->edge[j].dest;
+            int weight = graph->edge[j].weight;
+            if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
+                dist[v] = dist[u] + weight;
+            }
+        }
+    }
+
+    // 检测负权环
+    for (int i = 0; i < E; i++) {
+        int u = graph->edge[i].src;
+        int v = graph->edge[i].dest;
+        int weight = graph->edge[i].weight;
+        if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
+            //判断有负权环的条件是,如果在第V-1次迭代后,还能继续松弛,则说明有负权环
+            //因为最短路最多有E-1条边
+            printf("图中包含负权环,无法求解最短路径。\n");
+            free(dist);
+            return;
+        }
+    }
+
+    // 打印最短路径
+    printf("顶点\t距离源点的最短路径\n");
+    for (int i = 0; i < V; i++) {
+        printf("%d\t%d\n", i, dist[i]);
+    }
+
+    free(dist);
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
void WeightedNegative( Table T )
+{
+    Queue Q;
+    Vertex V, W;
+    Q = CreateQueue (NumVertex );  
+    MakeEmpty( Q );
+    Enqueue( S, Q ); /*Enqueue the source vertex*/
+    while ( !IsEmpty( Q ) ) 
+    {
+        V = Dequeue( Q );
+        for ( each W adjacent to V )
+        if ( T[ V ].Dist + Cvw < T[ W ].Dist ) 
+        {
+            T[ W ].Dist = T[ V ].Dist + Cvw;
+            T[ W ].Path = V;
+            if ( W is not already in Q )
+                Enqueue( W, Q );
+        } /*end-if update*/
+    } /*end-while */
+    DisposeQueue( Q ); /*free memory*/
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\346\261\202\345\274\272\350\277\236\351\200\232\345\210\206\351\207\217\347\232\204Tarjan\347\256\227\346\263\225/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\346\261\202\345\274\272\350\277\236\351\200\232\345\210\206\351\207\217\347\232\204Tarjan\347\256\227\346\263\225/index.html" new file mode 100644 index 00000000..fac75b4e --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\346\261\202\345\274\272\350\277\236\351\200\232\345\210\206\351\207\217\347\232\204Tarjan\347\256\227\346\263\225/index.html" @@ -0,0 +1,4787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + tarjan - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

tarjan

+ +

求强连通分量的Tarjan算法

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
tarjan(u)
+{
+    dfn[u]=low[u]=++Index                      
+    stack.push(u)                              
+    for each (u, v) in E                       
+        if (v is not visted)              
+            tarjan(v)                  
+            low[u] = min(low[u], low[v])
+        else if (v in S)                   
+            low[u] = min(low[u], dfn[v])
+    if (dfn[u] == low[u])                     
+        repeat
+            v = stack.pop                
+            print v
+        until (u== v)
+}
+
+

在这里插入图片描述

+

在这里插入图片描述

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
1 tarjan(u)
+2 {
+3    dfn[u]=low[u]=++Index                      
+4    stack.push(u)                              
+5    for each (u, v) in E                       
+6        if (v is not visted)              
+7            tarjan(v)     //节点7执行tarjan时, 执行了第10行,将low更新为4        
+8            low[u] = min(low[u], low[v]) //然后返回节点6,还是执行第10行(此时7已经visited)
+9        else if (v in S)                   
+10            low[u] = min(low[u], dfn[v]) //因此6的low也变成了4
+11    if (dfn[u] == low[u])             //6的递归父亲是5,直到执行到5才将栈中所有这个强联通分量   
+12        repeat                        //的所有元素弹出
+13            v = stack.pop                
+14            print v
+15        until (u== v) 
+16}
+
+

在这里插入图片描述

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
int instack[MaxVertices];
+int stack[MaxVertices];
+int dfn[MaxVertices],low[MaxVertices];
+int stackLen;
+int index;
+
+int min(int a,int b)
+{
+    return a<b?a:b;
+}
+
+void tarjan(Graph G,Vertex vert, void (*visit)(Vertex V))
+{
+    dfn[vert] = low[vert] = ++index;
+    stack[stackLen++] = vert;
+    instack[vert] = 1;
+    for(PtrToVNode vnode = G->Array[vert];vnode;vnode=vnode->Next)
+    {
+        Vertex other = vnode->Vert;
+        if(dfn[other] == 0)
+        {
+            tarjan(G,other,visit);
+            low[vert] = min(low[vert],low[other]);
+        }
+        else if(instack[other])
+        {
+            low[vert] = min(low[vert],dfn[other]);
+        }
+    }
+
+    if(dfn[vert] == low[vert])
+    {
+        while(stack[stackLen-1]!=vert)//why while(dfn[Vert]!=low[vert]) does not work?
+        {
+            Vertex top = stack[stackLen-1];
+            stackLen--;
+            instack[top]=0;
+            visit(top);
+        }
+        stackLen--;
+        instack[vert]=0;
+        visit(vert);
+        printf("\n");
+    }
+}
+
+void StronglyConnectedComponents( Graph G, void (*visit)(Vertex V) )
+{
+    for(int i=0;i<G->NumOfVertices;i++)
+    {
+        if(dfn[i] == 0)
+            tarjan(G,i,visit);
+    }
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\351\202\273\346\216\245\345\233\276\347\232\204\351\201\215\345\216\206/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\351\202\273\346\216\245\345\233\276\347\232\204\351\201\215\345\216\206/index.html" new file mode 100644 index 00000000..8e6ecba2 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/mynotes/\351\202\273\346\216\245\345\233\276\347\232\204\351\201\215\345\216\206/index.html" @@ -0,0 +1,4701 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 邻接表遍历 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

邻接表遍历

+ +
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
#include <stdio.h>
+#include <stdlib.h>
+
+typedef enum {false, true} bool;
+#define MaxVertexNum 10  /* maximum number of vertices */
+typedef int Vertex;      /* vertices are numbered from 0 to MaxVertexNum-1 */
+
+typedef struct AdjVNode *PtrToAdjVNode; 
+struct AdjVNode{
+    Vertex AdjV;
+    PtrToAdjVNode Next;
+};
+
+typedef struct Vnode{
+    PtrToAdjVNode FirstEdge; // AdjList[i] 是节点i开始的邻接表,firstedge是指向AdjVNode的指针
+} AdjList[MaxVertexNum];  //AdjList: adjacency list 邻接表
+
+typedef struct GNode *PtrToGNode;
+struct GNode{  
+    int Nv;
+    int Ne;
+    AdjList G;
+};
+typedef PtrToGNode LGraph;
+
+LGraph ReadG(); /* details omitted */
+
+void ShortestDist( LGraph Graph, int dist[], Vertex S );
+
+int main()
+{
+    int dist[MaxVertexNum];
+    Vertex S, V;
+    LGraph G = ReadG();
+
+    scanf("%d", &S);
+    ShortestDist( G, dist, S );
+
+    for ( V=0; V<G->Nv; V++ )
+        printf("%d ", dist[V]);
+
+    return 0;
+}
+
+/* Your function will be put here */
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK01/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK01/index.html" new file mode 100644 index 00000000..04f6f61d --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK01/index.html" @@ -0,0 +1,5034 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 课程定位 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 1

+

1 Algorithm Analysis

+

[Definition] An algorithm is a finite set of instructions that, if followed, accomplishes a particular task. In addition, all algorithms must satisfy the following criteria.

+
    +
  1. +

    Input : There are zero or more quantities that are externally supplied.

    +
  2. +
  3. +

    Output : At least one quantity is produced.

    +
  4. +
  5. +

    Definiteness : Each instruction is clear and unambiguous.

    +
  6. +
  7. +

    Finiteness : the algorithm terminates after finite number of steps

    +
  8. +
  9. +

    Effectiveness : basic enough to be carried out ; feasible

    +
  10. +
  11. +

    A program does not have to be finite. (eg. an operation system)

    +
  12. +
  13. +

    An algorithm can be described by human languages, flow charts, some programming languages, or pseudocode.

    +
  14. +
+

[Example] Selection Sort : Sort a set of \(n\geq1\) integers in increasing order

+
Text Only
1
+2
+3
+4
for (i = 0; i < n; i++){
+    Examine list[i] to list[n-1] and suppose that the smallest integer is at list[min];
+    Interchange list[i] and list[min];
+}
+
+
+

1.1 What to Analyze

+
    +
  • +

    Machine and compiler-dependent run times.

    +
  • +
  • +

    Time and space complexities : machine and compiler independent.

    +
  • +
  • +

    Assumptions:

    +
  • +
+
+
    +
  1. +

    instructions are executed sequentially 顺序执行

    +
  2. +
  3. +

    each instruction is simple, and takes exactly one time unit

    +
  4. +
  5. integer size is fixed and we have infinite memory
  6. +
+
+
    +
  • \(T_{avg}(N)\, and\, T_{worst}(N)\) : the average and worst case time complexities as functions of input size \(N\)
  • +
+

[Example] Matrix addition

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
void add(int a[][MAX_SIZE],
+         int b[][MAX_SIZE],
+         int c[][MAX_SIZE],
+         int rows, int cols) 
+{
+    int i, j;
+    for (i=0; i<rows; i++)/*rows+1*/
+        for (j=0;j<cols;j++)/*rows(cols+1)*/
+            c[i][j] = a[i][j]+b[i][j];/*rows*cols*/
+}
+
+
\[ +T(rows, cols) = 2rows\times cols + 2rows+1 +\]
+
    +
  • 非对称
  • +
+

[Example] Iterative function for summing a list of numbers

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
float sum (float list[], int n)
+{  /*add a list of numbers*/
+    float tempsum = 0; /*count = 1*/
+    int i;
+    for (i=0; i<n; i++)
+        /*count++*/
+        tempsum  += list[i]; /*count++*/
+    /*count++ for last excutaion of for*/
+   return tempsum; /*count++*/
+}
+
+
\[ +T_{sum}(n)=2n+3 +\]
+

[Example] Recursive function for summing a list of numbers

+
C
1
+2
+3
+4
+5
+6
+7
float rsum (float list[], int n)
+{/*add a list of numbers*/
+    if (n) /*count++*/
+        return rsum(list, n-1) + list[n-1];
+        /*count++*/
+    return 0; /*count++*/
+}
+
+
\[ +T_{rsum}(n)=2n+2 +\]
+

But it takes more time to compute each step.

+
+

1.2 Asymptotic Notation(\(O,\Omega,\Theta,o\))

+
    +
  • predict the growth ; compare the time complexities of two programs ; asymptotic(渐进的) behavior
  • +
+

[Definition] \(T(N)=O(f(N))\) if there are positive constants \(c\) and \(n_0\) such that \(T(N)\leq c\cdot f(N)\) for all \(N\geq n_0\).(upper bound)

+

[Definition] \(T(N)=\Omega(g(N))\) if there are positive constants \(c\) and \(n_0\) such that \(T(N)\geq c\cdot f(N)\) for all \(N\geq n_0\).(lower bound)

+

[Definition] \(T(N)=\Theta(h(N))\) if and only if \(T(N)=O(h(N))\) and \(T(N)=\Omega(h(N))\).

+

[Definition] \(T(N)=o(p(N))\) if \(T(n)=O(p(N))\) and \(T(N)\neq\Theta(p(N))\).

+
    +
  • +

    \(2N+3=O(N)=O(N^{k\geq1})=O(2^N)=\ldots\) take the smallest \(f(N)\)

    +
  • +
  • +

    \(2^N+N^2=\Omega(2^N)=\Omega(N^2)=\Omega(N)=\Omega(1)=\ldots\) take the largest \(g(N)\)

    +
  • +
  • +

    Rules of Asymptotic Notation

    +
  • +
+
+
    +
  1. If \(T_1(N)=O(f(N))\) and \(T_2=O(g(N))\), then
  2. +
+

(1) \(T_1(N)+T_2(N)=max(O(f(N)),O(g(N)))\)

+

(2) \(T_1(N)*T_2(N)=O(f(N)*g(N))\)

+
    +
  1. +

    \(T(N)\)是一个\(k\)次多项式,则\(T(N)=\Theta(N^k)\)

    +
  2. +
  3. +

    \(log_kN=O(N)\) for any constant \(k\) (logarithms grow very slowly)

    +
  4. +
+
+

1-1

+

1-2

+

[Example] Matrix addition

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
void add(int a[][MAX_SIZE],
+         int b[][MAX_SIZE],
+         int c[][MAX_SIZE],
+         int rows, int cols) 
+{
+    int i, j;
+    for (i=0; i<rows; i++)
+        for (j=0;j<cols;j++)
+            c[i][j] = a[i][j]+b[i][j];
+}
+
+
\[ +T(rows,cols)=\Theta(rows\cdot cols) +\]
+

General Rules

+
+
    +
  • +

    For loops : The running time of a for loop is at most the running time of the statements inside the for loop (including tests) times the number of iterations.

    +
  • +
  • +

    Nested for loops : The total running time of a statement inside a group of nested loops is the running time of the statements multiplied by the product of the sizes of all the for loops.

    +
  • +
  • +

    Consecutive statements : These just add (which means that the maximum is the one that counts).

    +
  • +
  • +

    If/else : For the fragment + if ( Condition ) S1; + else S2;

    +
  • +
+

The running time is never more than the running time of the test plus the larger of the running time of S1 and S2.

+

1-3

+
    +
  • Recursions :
  • +
+

[Example] Fibonacci number + $$ + Fib(0)=Fib(1)=1, Fib(n)=Fib(n-1)+Fib(n-2) + $$

+
C
1
+2
+3
+4
+5
+6
+7
lont int Fib (int N) /*T(N)*/
+{
+    if (N<=1) /*O(1)*/
+        return 1; /*O(1)*/
+    else
+        return Fib(N-1)+Fib(N-2);
+}      /*O(1)*//*T(N-1)*//*T(N-2)*/
+
+

$$ + T(N)=T(N-1)+T(N-2)+2\geq Fib(N)\ + \left(\frac{3}{2} \right)^n\leq Fib(N)\leq\left(\frac{5}{3}\right)^n + $$

+

时间复杂度:\(O(2^N)\) \(T(N)\) grows exponentially

+

空间复杂度:\(O(N)\)

+

\(O(N)\)

+
+

\(O(N)\)

+
\[T(N)\]
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK02/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK02/index.html" new file mode 100644 index 00000000..f6f00435 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK02/index.html" @@ -0,0 +1,5470 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 复杂度分析 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 2

+

1.3 Compare the Algorithms

+

[Example] 最大子序列和

+

Algorithm 1

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
int  MaxSubsequenceSum ( const int A[ ],  int  N ) 
+{ 
+    int ThisSum, MaxSum, i, j, k; 
+    MaxSum = 0;   /* initialize the maximum sum */
+    for( i = 0; i < N; i++ )  /* start from A[ i ] */
+        for( j = i; j < N; j++ ) {   /* end at A[ j ] */
+            ThisSum = 0; 
+            for( k = i; k <= j; k++ ) 
+                ThisSum += A[ k ];  /* sum from A[ i ] to A[ j ] */
+            if ( ThisSum > MaxSum ) 
+                MaxSum = ThisSum;  /* update max sum */
+        }  /* end for-j and for-i */
+    return MaxSum; 
+}
+
+
\[ +T(N)=O(N^3) +\]
+

Algotithm 2

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
int  MaxSubsequenceSum ( const int A[ ],  int  N ) 
+{ 
+    int ThisSum, MaxSum, i, j; 
+    MaxSum = 0;   /* initialize the maximum sum */
+    for( i = 0; i < N; i++ ) {   /* start from A[ i ] */
+        ThisSum = 0; 
+        for( j = i; j < N; j++ ) {   /* end at A[ j ] */
+            ThisSum += A[ j ];  /* sum from A[ i ] to A[ j ] */
+            if ( ThisSum > MaxSum ) 
+                MaxSum = ThisSum;  /* update max sum */
+        }  /* end for-j */
+    }  /* end for-i */
+    return MaxSum; 
+} 
+
+
\[ +T(N)=O(N^2) +\]
+

Algorithm 3 Divide and Conquer 分治法

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
static int MaxSubSum(const int A[ ], int Left, int Right)
+{
+    int MaxLeftSum, MaxRightSum;
+    int MaxLeftBorderSum, MaxRightBorderSum;
+    int LeftBorderSum, RightBorderSum;
+    int Center, i;
+
+    if (Left == Right)
+        if (A[Left] > 0)
+            return A[Left];
+        else
+            return 0;
+
+    Center = (Left + Right) / 2;
+    MaxLeftSum = MaxSubSum(A, Left, Center);
+    MaxRightSum = MaxSubSum(A, Center + 1, Right);
+
+    MaxLeftBorderSum = 0;
+    LeftBorderSum = 0;
+    for (i = Center; i >= Left; i--)
+    {
+        LeftBorderSum += A[i];
+        if (LeftBorderSum > MaxLeftBorderSum)
+            MaxLeftBorderSum = LeftBorderSum;
+    }
+
+    MaxRightBorderSum = 0;
+    RightBorderSum = 0;
+    for (i = Center+1; i <= Right; i++)
+    {
+        RightBorderSum += A[i];
+        if (RightBorderSum > MaxRightBorderSum)
+            MaxRightBorderSum = RightBorderSum;
+    }
+
+    return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
+}
+
+int MaxSubsequenceSum(const int A[ ], int N)
+{
+    return MaxSubSum(A, 0, N - 1);
+}
+
+

$$ +\because T(N)=2T(\frac N2)+cN\quad T(1)=O(1)\ +T(\frac N2)=2T(\frac N {2^2})+c\frac N2\ +\cdots\ +T(1)=2T(\frac N{2^k})+c\frac N{2^{k-1}}\ +\therefore T(N)=2^kT(\frac N{2^k})+kcN=N\cdot O(1)+cN\log N +$$ +Algorithm 4 On-line Algorithm 在线算法

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
int MaxSubsequenceSum( const int  A[ ],  int  N ) 
+{ 
+    int ThisSum, MaxSum, j; 
+    ThisSum = MaxSum = 0; 
+    for ( j = 0; j < N; j++ ) { 
+        ThisSum += A[ j ]; 
+        if ( ThisSum > MaxSum ) 
+            MaxSum = ThisSum; 
+        else if ( ThisSum < 0 ) 
+            ThisSum = 0;
+    }  /* end for-j */
+    return MaxSum; 
+} 
+
+
\[ +T(N)=O(N) +\]
+
    +
  • A[ ] is scanned once only. 扫描一次,无需存储(处理streaming data)
  • +
  • 在任意时刻,算法都能对它已经读入的数据给出子序列问题的正确答案(其他算法不具有这个特性)
  • +
+
+

1.4 Logrithms in the Running Time

+
    +
  • 如果一个算法用常数时间将问题的大小削减为其一部分(通常是1/2),那么该算法就是\(O(logN)\)
  • +
+ +
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
int BinarySearch ( const ElementType A[ ], ElementType X, int N ) 
+{ 
+    int  Low, Mid, High; 
+    Low = 0;  High = N - 1; 
+    while ( Low <= High ) { 
+        Mid = ( Low + High ) / 2; 
+        if ( A[ Mid ] < X ) 
+            Low = Mid + 1; 
+        else 
+            if ( A[ Mid ] > X ) 
+                High = Mid - 1; 
+            else 
+                return  Mid; /* Found */ 
+    }  /* end while */
+    return  NotFound; /* NotFound is defined as -1 */ 
+} 
+
+
\[ +T_{worst}(N)=O(\log N) +\]
+

[Example] Euclid’s Algorithm

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
int Gcd(int M, int N)
+{
+    int Rem;
+
+    while (N > 0)
+    {
+        Rem = M % N;
+        M = N;
+        N = Rem;
+    }
+    return M;
+}
+
+

[Example] Efficient exponentiation

+
C
1
+2
+3
+4
+5
+6
+7
long int Pow(long int X, int N)
+{
+    if (N == 0) return 1;
+    if (N == 1) return X;
+    if (IsEven(N)) return Pow(X*X, N/2);/*return Pow(X, N/2)*Pow(X, N/2) affects the efficiency*/
+    else return Pow(X*X, N/2)*X; /*return Pow(X, N-1)*X is the same*/
+}
+
+
+

1.5 Checking Your Analysis

+

Method 1

+

When \(T(N)=O(N)\), check if \(T(2N)/T(N)\approx2\)

+

When \(T(N)=O(N^2)\), check if \(T(2N)/T(N)\approx4\)

+

When \(T(N)=O(N^3)\), check if \(T(2N)/T(N)\approx8\)

+

Method 2

+

When \(T(N)=O(f(N))\), check if $\lim\limits_{N\rightarrow\infty}\frac{T(N)}{f(N)}\approx C $

+
+

2 LIst, Stacks and Queues

+

2.1 Abstract Data Type(ADT) 抽象数据类型

+

[Definition] Data Type = {Objects} and {Operations}

+

[Definition] An Abstract Data Type(ADT) is a data type that is organized in such a way that the specification on the objects and specification of the operations on the objects are separated from the representation of the objects and the implementation on the operations.

+
+

2.2 The List ADT

+
    +
  • Objects : N items
  • +
  • Operations
  • +
  • Finding the length
  • +
  • Printing
  • +
  • Making an empty
  • +
  • Finding
  • +
  • Inserting
  • +
  • Deleting
  • +
  • Finding next
  • +
  • Finding previous
  • +
+

Simple Array implementation of Lists

+
    +
  • +

    Sequential mapping 连续存储,访问快

    +
  • +
  • +

    Find_Kth take \(O(1)\) time.

    +
  • +
  • +

    MaxSize has to be estimated.

    +
  • +
  • +

    Insertion and Deletion not only take \(O(N)\) times, but also involve a lot of data movements which takes time.

    +
  • +
+

2-3

+

Query 查询

+

Linked Lists

+
    +
  • +

    Location of nodes may change on differrent runs.

    +
  • +
  • +

    Insertion 先连后断

    +
  • +
  • +

    Deletion 先连后释放

    +
  • +
  • +

    频繁malloc和free系统开销较大

    +
  • +
  • +

    Finding take \(O(N)\) times.

    +
  • +
+
C
1
+2
+3
+4
+5
/*Return true if L is empty*/
+int IsEmpty(List L)
+{
+  return L->Next == NULL;
+}
+
+
C
1
+2
+3
+4
+5
+6
/*Return true if P is the last position in list L*/
+/*Parameter L is unused in this implementation*/
+int IsLast(Position P, List L)
+{
+  return P->Next == NULL;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
/*Return Position of X in L; NULL if not found*/
+Position Find(Element X, List L)
+{
+  Position P;
+
+  P = L->Next;
+  while (P != NULL && P->Element != X) P = P->Next;
+
+  return P;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
/*Delete first occurence of X from a list*/
+/*Assume use of a header node*/
+void Delete(ElementType X, List L)
+{
+  Position P, TmpCell;
+
+  P = FindPrevious(X, L);
+
+  if (!IsLast(P, L))
+  {
+      TmpCell = P->Next;
+      P->Next = TmpCell->Next;
+      free(TmpCell);
+  }
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
/*If X is not found, then Next field of returned*/
+/*Assumes a header*/
+Position FindPrevious(ElementType X, List L)
+{
+  Position P;
+
+  P = L;
+  while (P->Next != NULL && P->Next->Element != X) P = P->Next;
+
+  return P;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
/*Insert (after legal position P)*/
+/*Header implementation assumed*/
+/*Parameter L is unused in this implementation*/
+void Insert(ElementType X, List L, Position P)
+{
+  Position TmpCell;
+
+  TmpCell = malloc(sizeof(struct Node));
+  if (TmpCell == NULL) FatalError("Out of space!")
+
+  TmpCell->Element = X;
+  TmpeCell->Next = P->Next;
+  P->Next = TmpCell;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
void DeleteList(List L)
+{
+  Position P, Tmp;
+
+  P = L->Next;
+  L->Next = NULL;
+  while (P != NULL)
+  {
+      Tmp = P->Next;
+      free(P);
+      P = Tmp;
+  }
+}
+
+

Doubly Linked Circular Lists

+
    +
  • Finding take \(O(\frac N 2)\) times.
  • +
+

2-1

+

The correct answer is D.

+

Two Applications

+
    +
  1. +

    The Polynomial ADT

    +
  2. +
  3. +

    Objects :

    +
  4. +
  5. +

    Operations :

    +
  6. +
  7. Finding degree
  8. +
  9. Addition
  10. +
  11. Subtraction
  12. +
  13. +

    Multiplication

    +
  14. +
  15. +

    Differentiation

    +
  16. +
  17. +

    [Representation 1]

    +
  18. +
+
C
1
+2
+3
+4
typedef struct {
+  int CoeffArray [ MaxDegree + 1 ] ;
+  int HighPower;
+}  *Polynomial ; 
+
+
C
1
+2
+3
+4
+5
+6
+7
+8
/*将多项式初始化为零*/
+void ZeroPolynomial(Polynomial Poly)
+{
+  int i;
+  for(i = O; i <= MaxDegree; i++)
+      Poly->CoeffArray[ i ] = O;
+  Poly->HighPower = O;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
/*两个多项式相加*/
+void AddPolynomial(const Polynomial Poly1, const Polynomial Poly2, Polynomial PolySum)
+{
+    int i;
+
+    ZeroPolynomial(PolySum);
+  PolySum->HighPower = Max(Poly1->HighPower, Poly2->HighPower);
+
+    for (i = PolySum->HighPower; i >= O; i--)
+      PolySum->CoeffArray[ i ] = Poly1->CoeffArray[ i ] + Poly2->CoeffArray[ i ];
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
void MultPolynomial(const Polynomial Poly1, const Polynomial Poly2, Polynomial PolyProd)
+{
+    int i, j;
+
+    ZeroPolynomial (PolyProd);
+  PolyProd->HighPower = Poly1->HighPower + Poly2->HighPower;
+
+    if(PolyProd->HighPower > MaxDegree)
+      Error("Exceeded array size");
+  else
+      for(i = O; i <= Poly1->HighPower; i++)
+          for(j = O; j <= Poly2->HighPower; j++)
+              PolyProd->CoeffArray[ i + j ] += Poly1->CoeffArray[ i ] * Poly2->CoeffArray[ j ];
+}
+
+
    +
  • [Representation 2]
  • +
+
C
1
+2
+3
+4
+5
+6
+7
typedef struct poly_node *poly_ptr;
+struct poly_node{
+    int Coefficient;  /* assume coefficients are integers */
+    int Exponent;
+    poly_ptr Next;
+};
+typedef poly_ptr a;    /* nodes sorted by exponent */
+
+
    +
  • +

    只存储非零项

    +
  • +
  • +

    Multilists

    +
  • +
+

Cursor Implementation of Linked Lists(no pointer)

+

2-2

+
+

#blender エイサー・パルマタム || Acer Palmatum - selescha.arts的插画 - pixiv

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK03/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK03/index.html" new file mode 100644 index 00000000..3cbc0dc4 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK03/index.html" @@ -0,0 +1,5083 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 链表/栈/队列 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 3

+

1、栈的链表实现,push,pop和top语句

+

2、

+

2.3 The Stack ADT

+
    +
  • Last-In-First-Out (LIFO)
  • +
  • Objects : A finite ordered list with zero or more elements.
  • +
  • Operations :
  • +
  • IsEmpty
  • +
  • CreatStack
  • +
  • DisposeStack
  • +
  • MakeEmpty
  • +
  • Push
  • +
  • Top
  • +
  • Pop
  • +
  • A Pop(or Top) on an empty stack in an error in the stack ADT.
  • +
  • Push on a full stack is an implementation error but not an ADT error.
  • +
+

Linked List Implementation (with a header node)

+

3-1

+
    +
  • The calls to malloc and free are expensive. Simply keep another stack as a recycle bin.
  • +
+
C
1
+2
+3
+4
int IsEmpty(Stack S)
+{
+  return S->Next == NULL;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
Stack CreateStack(void)
+{
+  Stack S;
+  S = malloc(sizeof(struct Node));
+  if (S == NULL)
+      Fatal Error("Out of space!");
+  S->Next == NULL;
+  MakeEmpty(S);
+  return S;
+}
+
+void MakeEmpty(Stack S)
+{
+  if (S == NULL)
+      Error("Must use CreateStack first");
+  else
+      while(!IsEmpty(S)) Pop(S);
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
void Push(ElementType X, Stack S)
+{
+  PtrToNode TmpCell;
+  TmpCell = malloc(sizeof(struct Node));
+  if (TmpCell == NULL)
+      Fatal Error("Out of space!") ;
+  else
+  {
+      TmpCell->Element = X;
+      TmpCe11->Next = S->Next;
+      S->Next = TmpCell;
+  }
+}
+
+
C
1
+2
+3
+4
+5
+6
+7
ElementType Top(Stack S)
+{
+  if(!IsEmpty(S))
+      return S->Next->Element;
+  Error("Empty stack") ;
+  return O; /* Return value used to avoid warning*/
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
void Pop(Stack s)
+{
+  PtrToNode FirstCell;
+  if(IsEmpty(S))
+      Error("Empty stack") ;
+  else
+  {
+      FirstCe11 = S->Next;
+      S->Next = S->Next->Next;
+      free(FirstCe11);
+  }
+}
+
+

Array Implementation of Stacks

+
C
1
+2
+3
+4
+5
+6
struct StackRecord {
+    int Capacity;          /* size of stack */
+    int TopOfStack;        /* the top pointer */
+    /* ++ for push, -- for pop, -1 for empty stack */
+    ElementType *Array;    /* array for stack elements */
+}; 
+
+
    +
  • +

    The stack model must be well encapsulated(封装). That is, no part of your code, except for the stack routines, can attempt to access the Array or TopOfStack variable.

    +
  • +
  • +

    Error check must be done before Push or Pop (Top).

    +
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
Stack CreateStack(int MaxElements)
+{
+  Stack S;
+  if(MaxElements < MinStackSize)
+  Error("Stack size is too small") ;
+  S = malloc(sizeof(struct StackRecord));
+  if (S == NULL)
+      Fatal Error("Out of space!!!") ;
+
+  S->Array = malloc(sizeof(ElementType) * MaxElements) ;
+  if(S->Array = NULL)
+      Fatal Error("Out of space!!!");
+  S->Capacity = MaxElements;
+  MakeEmpty(S) ;
+  return S;
+}
+
+
C
1
+2
+3
+4
+5
+6
+7
+8
void DisposeStack(Stack S)
+{
+  if(S != NULL)
+  {
+      free(S->Array);
+      free(S);
+  }
+}
+
+
C
1
+2
+3
+4
int IsEmpty(Stack S)
+{
+  return S->TopOfStack == EmptyTOS;
+}
+
+
C
1
+2
+3
+4
void MakeEmpty(Stack S)
+{
+  S->TopOfStack = EmptyTOS;
+}
+
+
C
1
+2
+3
+4
+5
+6
+7
void Push(ElementType X, Stack S)
+{
+  if (IsFull(S))
+      Error("Full stack");
+  else
+      S->Array[ ++S->TopOfStack ] = X;
+}
+
+
C
1
+2
+3
+4
+5
+6
+7
ElementType Top(Stack S)
+{
+  if(! IsEmpty(S))
+      return S->Array[ S->TopOfStack ];
+  Error("Empty stack") ;
+  return O; /* Return value used to avoid warning*/
+}
+
+
C
1
+2
+3
+4
+5
+6
+7
void Pop(Stack S)
+{
+  if(IsEmpty(S))
+      Error("Empty stack") ;
+  else
+      S->TopOfStack--;
+}
+
+
C
1
+2
+3
+4
+5
+6
+7
ElementType TopAndPop(Stack S)
+{
+  if(!Is Empty(S))
+      return S->Array[ S->TopOfStack-- ];
+  Error("Empty stack");
+  return O; /* Return value used to avoid warnin */
+}
+
+

Application

+
    +
  1. Balancing Symbols
  2. +
+

检查括号是否平衡

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
Algorithm  {
+    Make an empty stack S;
+    while (read in a character c) {
+        if (c is an opening symbol)
+            Push(c, S);
+        else if (c is a closing symbol) {
+            if (S is empty)  { ERROR; exit; }
+            else  {  /* stack is okay */
+                if  (Top(S) doesn’t match c)  { ERROR, exit; }
+                else  Pop(S);
+            }  /* end else-stack is okay */
+        }  /* end else-if-closing symbol */
+    } /* end while-loop */ 
+    if (S is not empty)  ERROR;
+}
+
+
    +
  1. +

    Postfix Evaluation 后缀表达式

    +
  2. +
  3. +

    Infix to Postfix Conversion

    +
  4. +
  5. +

    读到一个操作数时立即把它放到输出中

    +
  6. +
  7. 读到一个操作符时从栈中弹出栈元素直到发现优先级更低的元素为止,再将操作符压入栈中
  8. +
  9. The order of operands is the same in infix and postfix.
  10. +
  11. Operators with higher precedence appear before those with lower precedence.
  12. +
  13. Never pop a ’(‘ from the stack except when processing a ‘)’.
  14. +
  15. When ‘(’ is not in the stack, its precedence is the highest; but when it is in the stack, its precedence is the lowest.
  16. +
  17. +

    Exponentiation associates right to left.

    +
  18. +
  19. +

    Function Calls (System Stack)

    +

    3-2

    +
    +

    Note : Recursion can always be completely removed. Non recursive programs are generally faster than equivalent recursive programs. However, recursive programs are in general much simpler and easier to understand.

    +
    +
  20. +
+
+

2.4 The Queue ADT

+
    +
  • First-In-First-Out (FIFO)
  • +
  • Objects : A finite ordered list with zero or more elements.
  • +
  • Operations :
  • +
  • IsEmpty
  • +
  • CreatQueue
  • +
  • DisposeQueue
  • +
  • MakeEmpty
  • +
  • Enqueue
  • +
  • Front
  • +
  • Dequeue
  • +
+

Array Implementation of Queues

+
C
1
+2
+3
+4
+5
+6
+7
struct QueueRecord {
+    int Capacity ;       /* max size of queue */
+    int Front;           /* the front pointer */
+    int Rear;            /* the rear pointer */
+    int Size;            /* Optional - the current size of queue */
+    ElementType *Array;  /* array for queue elements */
+ }; 
+
+

Circular Queue :

+

3-33-4

+
    +
  • The maximum capacity of this queue is 5.
  • +
+
+

Note : Adding a Size field can avoid wasting one empty space to distinguish “full” from “empty”.

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK04/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK04/index.html" new file mode 100644 index 00000000..028514a6 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK04/index.html" @@ -0,0 +1,4993 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 树的定义与遍历 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 4

+

3 Trees

+

大纲:

+

树的定义是递归的,有根节点和从其出发的有向边,连向所有的子树

+

树的性质,n个节点n-1条边有根节点

+

二叉树:

+

树的遍历 四种遍历顺序,层序遍历

+

3.1 Preliminaries

+

[Definition] A tree is a collection of nodes. The collection can be empty; otherwise, a tree consists of (1) a distinguished node r, called the root; (2) and zero or more nonempty (sub)trees, each of whose roots are connected by a directed edge from r.

+
    +
  • +

    Subtrees must not connect together. Therefore every node in the tree is the root of some subtree.

    +
  • +
  • +

    There are N-1 edges in a tree with N nodes

    +
  • +
+

Terminologies

+
+
    +
  • degree of a node : 结点的子树个数
  • +
  • degree of a tree : 结点的度的最大值
  • +
  • parent : 有子树的结点
  • +
  • children : the roots of the subtrees of a parent
  • +
  • siblings : children of the same parent
  • +
  • leaf(terminal node) : a node with degree 0(no children)
  • +
  • path from \(n_1\) to \(n_k\) : a unique sequence of nodes \(n_1,n_2,\cdots,n_k\) such that \(n_i\) is the parent of \(n_{i+1}\) for \(1\leq i<k\)
  • +
  • length of path : 路径上边的条数
  • +
  • depth of \(n_i\) : 从根结点到\(n_i\)结点的路径的长度(\(Depth(root)=0\))
  • +
  • height of \(n_i\) : 从\(n_i\)结点到叶结点的最长路径的长度(\(Height(leaf)=0\))
  • +
  • height/depth of a tree : 根结点的高度/最深的叶结点的深度
  • +
  • ancestors of a node : 从此结点到根结点的路径上的所有结点
  • +
  • descendants of a node : 此结点的子树中的所有结点
  • +
+
+

List Representation

+
    +
  • The size of each node depends on the number of branches.
  • +
+

4-2

+

The correct answer is T.

+

FirstChild-NextSibling Representation

+

4-1

+
    +
  • The representation is not unique since the children in a tree can be of any order.
  • +
+
+

3.2 Binary Trees

+

[Definition] A binary tree is a tree in which no node can have more than two children.

+

Tree Traversals (visit each node exactly once)

+

线性复杂度\(O(n)\),因为每个节点只访问一次

+

遍历不改变操作数的顺序

+

visit(可以是print)

+
    +
  1. Preorder Traversal 先处理根节点,再处理左右节点,因此preorder中第一个遍历到的为根节点
  2. +
+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
+9
void preorder( tree_ptr tree )
+{ 
+    if( tree )   
+    {
+        visit ( tree );
+        for (each child C of tree )
+            preorder ( C );
+    }
+}
+
+
    +
  1. Postorder Traversal先处理左右子树,根节点最后返回,因此postorder中根节点最后返回
  2. +
+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
+9
void postorder( tree_ptr tree )
+{  
+ if( tree )   
+ {
+        for (each child C of tree )
+         postorder ( C );
+        visit ( tree );
+    }
+}
+
+
    +
  1. Levelorder Traversal 层序遍历,使用一个queue
  2. +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
void levelorder( tree_ptr tree )
+{   
+ enqueue ( tree );
+    while (queue is not empty) 
+    {
+        visit ( T = dequeue ( ) );
+        for (each child C of T )
+            enqueue ( C );
+    }
+}
+
+
    +
  1. Inorder Traversal 返回顺序为左、根、右,中序遍历最为关键
  2. +
+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
+9
void inorder( tree_ptr  tree )
+{  
+     if( tree )   
+ {
+     inorder ( tree->Left );
+         visit ( tree->Element );
+         inorder ( tree->Right );
+   }
+}
+
+

Iterative Program : 使用自己定义的栈替换系统的栈,实现中序遍历

+

leftmost 的左节点和rightmost的右节点都是NULL

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
void iter_inorder( tree_ptr tree )
+{ 
+ Stack  S = CreateStack( MAX_SIZE );
+ for ( ; ; )  
+ {
+     for ( ; tree; tree = tree->Left )
+         Push ( tree, S );
+         tree = Top ( S );  
+         Pop( S );
+         if ( !tree ) break;
+         visit ( tree->Element );
+         tree = tree->Right; 
+    }
+}
+
+

4-3

+

Threaded Binary Trees

+
    +
  • +

    A full binary tree with \(n\) nodes has \(2n\) links, and \(n+1\) of them are NULL.

    +
  • +
  • +

    Replace the NULL links by “threads” which will make traversals easier.

    +
  • +
+

Rules :

+
+
    +
  • If Tree->Left is null, replace it with a pointer to the inorder predecessor(中序前驱) of Tree.
  • +
  • leftmost的left指针由于没有中序前驱(中序遍历中最先返回的节点),所以指向head node
  • +
  • If Tree->Right is null, replace it with a pointer to the inorder successor(中序后继) of Tree.
  • +
  • 同理,rightmost的right由于没有中序后继(中序遍历中最后返回的节点),所以也指向head node
  • +
  • There must not be any loose threads. Therefore a threaded binary tree must have a head node of which the left child points to the first node.(右节点指针指向自身)
  • +
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
typedef struct ThreadedTreeNode *PtrToThreadedNode;
+typedef struct PtrToThreadedNode ThreadedTree;
+typedef struct ThreadedTreeNode 
+{
+    int LeftThread;        /* if it is TRUE, then Left */
+    ThreadedTree Left;     /* is a thread, not a child ptr.*/
+    ElementType Element;
+    int RightThread;       /* if it is TRUE, then Right */
+    ThreadedTree Right;    /* is a thread, not a child ptr.*/
+}
+
+
    +
  • 线索化的实质就是将二叉链表中的空指针改为指向前驱或后继的线索。由于前驱和后继信息只有在遍历该二叉树时才能得到,所以,线索化的过程就是在遍历的过程中修改空指针的过程。
  • +
+

4-4

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
int maxDepth(struct TreeNode* root) {
+    // 空树的深度为0
+    if (root == NULL) {
+        return 0;
+    }
+
+    // 分别计算左右子树的深度
+    int leftDepth = maxDepth(root->left);
+    int rightDepth = maxDepth(root->right);
+
+    // 返回左右子树深度的较大值加1
+    return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
+}
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK05/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK05/index.html" new file mode 100644 index 00000000..e1791906 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK05/index.html" @@ -0,0 +1,4957 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 二叉搜索树 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 5

+
    +
  • In a tree, the order of children does not matter. But in a binary tree, left child and right child are different.
  • +
+

Properties of Binary Trees

+
+
    +
  • The maximum number of nodes on level \(i\) is \(2^{i-1},i\geq1\).
  • +
  • The maximum number of nodes in a binary tree of depth \(k\) is \(2^k-1,k\geq1\).
  • +
  • For any nonempty binary tree, \(n_0 = n_2 + 1\) where \(n_0\) is the number of leaf nodes and \(n_2\) is the number of nodes of degree 2.
  • +
+

proof: 假设该二叉树总共有n个结点(\(n =n_0+n_1+n_2\)),则该二叉树总共会有n-1条边,度为2的结点会延伸出两条边,

+

同理,度为1的结点会延伸出一条边,则可列公式:$n-1 = 2n_2 + n_1 $,

+

合并两个式子可得:\(2n_2 + n_1 +1 =n_0 + n_1 + n_2\) ,则计算可知 \(n_0=n_2+1\)

+
+
+

3.3 Binary Search Trees

+

[Definition] A binary search tree is a binary tree. It may be empty. If it is not empty, it satisfies the following properties:

+
    +
  • 每个结点有一个互不不同的值
  • +
  • 若左子树非空,则左子树上所有结点的值均小于根结点的值
  • +
  • 若右子树非空,则右子树上所有结点的值均大于根结点的值
  • +
  • 左、右子树也是是一棵二叉查找树
  • +
+

ADT

+
    +
  • Objects : A finite ordered list with zero or more elements.
  • +
  • Operations :
  • +
  • SearchTree MakeEmpty( SearchTree T )
  • +
  • Position Find( ElementType X, SearchTree T )
  • +
  • Position FindMin( SearchTree T )
  • +
  • Position FindMax( SearchTree T )
  • +
  • SearchTree Insert( ElementType X, SearchTree T )
  • +
  • SearchTree Delete( ElementType X, SearchTree T )
  • +
  • ElementType Retrieve( Position P )
  • +
+

Implementations

+
    +
  1. Find
  2. +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
Position Find( ElementType X, SearchTree T ) 
+{ 
+ if ( T == NULL ) 
+     return NULL;  /* not found in an empty tree */
+    if ( X < T->Element )  /* if smaller than root */
+        return Find( X, T->Left );  /* search left subtree */
+    else 
+     if ( X > T->Element )  /* if larger than root */
+         return  Find( X, T->Right );  /* search right subtree */
+        else   /* if X == root */
+         return  T;  /* found */
+} 
+
+
    +
  • \(T(N)=S(N)=O(d)\) where \(d\) is the depth of X
  • +
+

Iterative program :

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
Position Iter_Find( ElementType X, SearchTree T ) 
+{ 
+ while ( T )
+ {
+     if ( X == T->Element )  
+         return T;  /* found */
+        if ( X < T->Element )
+            T = T->Left; /*move down along left path */
+        else
+             T = T-> Right; /* move down along right path */
+    }  /* end while-loop */
+    return NULL;   /* not found */
+} 
+
+
    +
  1. FindMin
  2. +
+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
Position FindMin( SearchTree T ) 
+{ 
+ if ( T == NULL )   
+     return NULL; /* not found in an empty tree */
+    else 
+        if ( T->Left == NULL ) return T;  /* found left most */
+        else return FindMin( T->Left );   /* keep moving to left */
+} 
+
+
    +
  1. FindMax
  2. +
+
Text Only
1
+2
+3
+4
+5
+6
+7
Position FindMax( SearchTree T ) 
+{ 
+ if ( T != NULL ) 
+     while ( T->Right != NULL )   
+         T = T->Right;   /* keep moving to find right most */
+    return T;  /* return NULL or the right most */
+} 
+
+
    +
  1. Insert
  2. +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
SearchTree Insert( ElementType X, SearchTree T ) 
+{ 
+    if ( T == NULL ) /* Create and return a one-node tree */ 
+    { 
+     T = malloc( sizeof( struct TreeNode ) ); 
+     if ( T == NULL ) 
+         FatalError( "Out of space!!!" ); 
+     else 
+     { 
+         T->Element = X; 
+         T->Left = T->Right = NULL; 
+     } 
+    }  /* End creating a one-node tree */
+    else  /* If there is a tree */
+         if ( X < T->Element ) 
+         T->Left = Insert( X, T->Left ); 
+     else 
+         if ( X > T->Element ) 
+             T->Right = Insert( X, T->Right ); 
+     /* Else X is in the tree already; we'll do nothing */ 
+    return  T;   /* Do not forget this line!! */ 
+}
+
+
    +
  • 内存越界后不会马上报错,在下一次free或malloc时会失败
  • +
  • Handle duplicated keys
  • +
  • +

    \(T(N)=O(d)\)

    +
  • +
  • +

    Delete

    +
  • +
  • +

    Delete a leaf node : Reset its parent link to NULL

    +
  • +
  • Delete a degree 1 node : Replace the node by its single child
  • +
  • Delete a degree 2 node : 用左子树最大值结点或右子树最小值结点替换
  • +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
SearchTree Delete( ElementType X, SearchTree T ) 
+{    
+ Position TmpCell; 
+    if ( T == NULL ) Error( "Element not found" ); 
+    else if ( X < T->Element )  /* Go left */ 
+     T->Left = Delete( X, T->Left ); 
+    else if ( X > T->Element )  /* Go right */ 
+     T->Right = Delete( X, T->Right ); 
+ else  /* Found element to be deleted */ 
+     if ( T->Left && T->Right ) {  /* Two children */ 
+     /* Replace with smallest in right subtree */ 
+         TmpCell = FindMin( T->Right ); 
+         T->Element = TmpCell->Element; 
+         T->Right = Delete( T->Element, T->Right );  } /* End if */
+     else 
+     {  /* One or zero child */ 
+         TmpCell = T; 
+         if ( T->Left == NULL ) /* Also handles 0 child */ 
+             T = T->Right; 
+         else if ( T->Right == NULL )  
+             T = T->Left; 
+         free( TmpCell );  
+      }  /* End else 1 or 0 child */
+      return  T; 
+}
+
+
    +
  • \(T(N)=O(d)\)
  • +
+
+

Note : If there are not many deletions, then lazy deletion may be employed: add a flag field to each node, to mark if a node is active or is deleted. Therefore we can delete a node without actually freeing the space of that node. If a deleted key is reinserted, we won’t have to call malloc again.

+
+
    +
  1. +

    Average-Case Analysis

    +
  2. +
  3. +

    The average depth over all nodes in a tree is \(O(logN)\) on the assumption that all trees are equally likely.

    +
  4. +
  5. \(n\)个元素存入二叉搜索树,树的高度将由插入序列决定
  6. +
+

5-1

+

The correct answer is A.

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK06/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK06/index.html" new file mode 100644 index 00000000..d331624f --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK06/index.html" @@ -0,0 +1,5137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 优先队列(heap) - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 6

+

4 堆 Priority Queues (Heaps)

+

4.1 ADT Model

+
    +
  • Objects :A finite ordered list with zero or more elements.
  • +
  • Operations :
  • +
  • PriorityQueue Initialize( int MaxElements );
  • +
  • void Insert( ElementType X, PriorityQueue H );
  • +
  • ElementType DeleteMin( PriorityQueue H );
  • +
  • ElementType FindMin( PriorityQueue H );
  • +
+
+

4.2 Implementations

+

Array

+
    +
  • +

    Insertion — add one item at the end ~\(\Theta(1)\)

    +
  • +
  • +

    Deletion — find the largest / smallest key ~\(\Theta(n)\)

    +
  • +
+

​ remove the item and shift array ~\(O(n)\)

+

Linked List

+
    +
  • +

    Insertion — add to the front of the chain ~\(\Theta(1)\)

    +
  • +
  • +

    Deletion — find the largest / smallest key ~\(\Theta(n)\)

    +
  • +
+

​ remove the item ~\(\Theta(1)\)

+
    +
  • Never more deletions than insertions
  • +
+

Ordered Array

+
    +
  • Insertion — find the proper position ~\(O(\log n)\)
  • +
+

​ shift array and add the item ~\(O(n)\)

+
    +
  • Deletion — remove the first / last item ~\(\Theta(1)\)
  • +
+

Ordered Linked List

+
    +
  • Insertion — find the proper position ~\(O(n)\)
  • +
+

​ add the item ~\(\Theta(1)\)

+
    +
  • Deletion — remove the first / last item ~\(\Theta(1)\)
  • +
+

Binary Search Tree

+
    +
  • Both insertion and deletion will take \(O(\log N)\) only.
  • +
  • Only delete the the minimum element, always delete from the left subtrees.
  • +
  • Keep a balanced tree
  • +
  • But there are many operations related to AVL tree that we don't really need for a priority queue.
  • +
+
+

4.3 Binary Heap

+

Structure Property

+

[Definition] A binary tree with \(n\) nodes and height \(h\) is complete if its nodes correspond to the nodes numbered from \(1\) to \(n\) in the perfect binary tree of height \(h\).

+
    +
  • +

    A complete binary tree of height \(h\) has between \(2^h\) and \(2^{h+1}-1\) nodes.

    +
  • +
  • +

    \(h=\lfloor\log N\rfloor\)

    +
  • +
  • +

    Array Representation : BT[n + 1] ( BT[0] is not used)

    +
  • +
+

6-1

+

[Lemma]

+
    +
  1. \(index\,of\,parent(i)=\left\{ + \begin{array}{rcl} + \lfloor i/2\rfloor && {i\neq1}\\ + None && {i=1}\\ + \end{array} \right.\)
  2. +
  3. \(index\,of\,left\_child(i)=\left\{ + \begin{array}{rcl} + 2i && {2i\leq n}\\ + None && {2i>n}\\ + \end{array} \right.\)
  4. +
  5. \(index\,of\,right\_child(i)=\left\{ + \begin{array}{rcl} + 2i+1 && {2i+1\leq n}\\ + None && {2i+1>n}\\ + \end{array} \right.\)
  6. +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
PriorityQueue Initialize( int MaxElements ) 
+{ 
+    PriorityQueue H; 
+    if ( MaxElements < MinPQSize ) 
+        return Error( "Priority queue size is too small" ); 
+    H = malloc(sizeof( struct HeapStruct )); 
+    if ( H == NULL ) 
+        return FatalError( "Out of space!!!" ); 
+    /* Allocate the array plus one extra for sentinel */ 
+    H->Elements = malloc(( MaxElements + 1 ) * sizeof( ElementType )); 
+    if ( H->Elements == NULL ) 
+        return FatalError( "Out of space!!!" ); 
+    H->Capacity = MaxElements; 
+    H->Size = 0; 
+    H->Elements[0] = MinData;  /* set the sentinel */
+    return H; 
+}
+
+

Heap Order Property

+

[Definition] A min tree is a tree in which the key value in each node is no larger than the key values in its children (if any). A min heap is a complete binary tree that is also a min tree.

+
    +
  • We can declare a max heap by changing the heap order property.
  • +
+

Basic Heap Operations

+
    +
  1. Insertion
  2. +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
/*H->Element[ 0 ] is a sentinel that is no larger than the minimum element in the heap.*/ 
+void Insert( ElementType X, PriorityQueue H ) 
+{ 
+ int i; 
+    if ( IsFull( H )) 
+    { 
+     Error( "Priority queue is full" ); 
+     return; 
+    } 
+    for ( i = ++H->Size; H->Elements[ i/2 ] > X; i /= 2 ) 
+     H->Elements[ i ] = H->Elements[ i/2 ]; /*Percolate up, faster than swap*/
+    H->Elements[ i ] = X; 
+}
+
+

$$ + T(N)=O(\log N) + $$

+
    +
  1. DeleteMin
  2. +
+

C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
ElementType DeleteMin( PriorityQueue H ) 
+{ 
+    int i, Child; 
+    ElementType MinElement, LastElement; 
+    if ( IsEmpty( H ) ) 
+    { 
+        Error( "Priority queue is empty" ); 
+        return H->Elements[ 0 ];   
+    } 
+    MinElement = H->Elements[ 1 ];  /*Save the min element*/
+    LastElement = H->Elements[ H->Size-- ];  /*Take last and reset size*/
+    for ( i = 1; i * 2 <= H->Size; i = Child )  /*Find smaller child*/ 
+    {
+        Child = i * 2; 
+        if (Child != H->Size && H->Elements[Child+1] < H->Elements[Child]) 
+             Child++;     
+        if ( LastElement > H->Elements[ Child ] )   /*Percolate one level*/ 
+             H->Elements[ i ] = H->Elements[ Child ]; 
+        else     
+         break;   /*Find the proper position*/
+    } 
+    H->Elements[ i ] = LastElement; 
+    return MinElement; 
+}
+
+$$ +T(N)=O(\log N) +$$ +

Other Heap Operations

+
    +
  • +

    查找除最小值之外的值需要对整个堆进行线性扫描

    +
  • +
  • +

    DecreaseKey — Percolate up

    +
  • +
  • +

    IncreaseKey — Percolate down

    +
  • +
  • +

    Delete

    +
  • +
  • +

    BuildHeap

    +
  • +
+

将N 个关键字以任意顺序放入树中,保持结构特性,再执行下滤

+
C
1
+2
for (i = N/2; i > 0; i--)
+ PercolateDown(i);
+
+

$$ + T(N)=O(N) + $$

+

[Theorem] For the perfect binary tree of height \(h\) containing \(2^{h+1}-1\) nodes, the sum of the heights of the nodes is \(2^{h+1}-1-(h+1)\).

+

image-20210125151728720

+
+

4.4 Applications of Priority Queues

+

Heap Sort

+

查找一个序列中第k小的元素

+

The function is to find the K-th smallest element in a list A of N elements. The function BuildMaxHeap(H, K) is to arrange elements H[1] ... H[K] into a max-heap.

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
ElementType FindKthSmallest ( int A[], int N, int K )
+{   /* it is assumed that K<=N */
+    ElementType *H;
+    int i, next, child;
+
+    H = (ElementType*)malloc((K+1)*sizeof(ElementType));
+    for ( i = 1; i <= K; i++ ) H[i] = A[i-1];
+    BuildMaxHeap(H, K);
+
+    for ( next = K; next < N; next++ ) {
+        H[0] = A[next];
+        if ( H[0] < H[1] ) {
+            for ( i = 1; i*2 <= K; i = child ) {
+                child = i*2;
+                if ( child != K && H[child+1] > H[child] ) child++;
+                if ( H[0] < H[child] )
+                    H[i] = H[child];
+                else break;
+            }
+            H[i] = H[0];
+        }
+    }
+    return H[1];
+}
+
+
+

4.5 \(d\)-Heaps — All nodes have \(d\) children

+

Note :

+
+
    +
  • DeleteMin will take \(d-1\) comparisons to find the smallest child. Hence the total time complexity would be \(O(d \log_d N)\).
  • +
  • 2 or /2 is merely *a bit shift**, but *d or /d is not.
  • +
  • When the priority queue is too large to fit entirely in main memory, a d-heap will become interesting.
  • +
+
+

6-2

+

image-20210125070700824

+

正确答案是4,注意“in the process”

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK07/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK07/index.html" new file mode 100644 index 00000000..fbccb8f7 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK07/index.html" @@ -0,0 +1,5150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 并查集 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 7

+

5 The Disjoint Set

+

5.1 Equivalence Relations

+ +

[Definition] A relation, ~, over a set, S, is said to be an equivalence relation over S if it is symmetric, reflexive, and transitive over S.

+

[Definition] Two members x and y of a set S are said to be in the same equivalence class if x ~ y.

+

关系的几种类型 +自反关系(reflexive) +设 R是 A上的一个二元关系,若对于 A中的每一个元素 a, (a,a)都属于 R,则称 R为自反关系。

+

非自反关系(irreflexive) +设R是A上的关系。若对所有a∈A,均有(a,a)∈ R,则称R是A上的一个自反关系

+

对称关系(symmetric) +集合A上的二元关系R,对任何a,b∈A,当aRb时有bRa

+

非对称关系(asymmetric) +集合A上的二元关系R,对任何a,b∈A,当aRb时有bR a

+

反对称关系(antisymmetric)

+

img

+
+

5.2 The Dynamic Equivalence Problem

+
    +
  • Given an equivalence relation ~, decide for any a and b if a ~ b
  • +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
Algorithm: (Union/Find)
+{
+  /* step 1: read the relations in */
+    Initialize N disjoint sets;
+    while ( read in a ~ b )
+    {
+      if ( !(Find(a) == Find(b)) )  /*Dynamic(on-line)*/
+          Union the two sets;
+    } /* end-while */
+    /* step 2: decide if a ~ b */
+    while ( read in a and b )
+        if ( Find(a) == Find(b) )
+          output( true );
+        else   
+          output( false );
+}
+
+
    +
  • Elements of the sets : \(1,2,3,\cdots,N\)
  • +
  • Sets : \(S_1,S_2,\cdots\,and\,S_i\bigcap S_j=\emptyset\,(if\quad i\neq j)\)
  • +
  • +

    Operations :

    +
  • +
  • +

    Union( \(i, j\) ) = Replace \(S_i\) and \(S_j\) by \(S=S_i\bigcup S_j\)

    +
  • +
  • Find( \(i\) ) = Find the set \(S_k\) which contains the element \(i\)
  • +
+
+

5.3 Basic Data Structure

+

Union( \(i, j\) )

+
    +
  • +

    Make \(S_i\) a subtree of \(S_j\), or vice versa, that is to set the parent pointer of one of the roots to the other root.

    +
  • +
  • +

    Implementation 1 :

    +
  • +
+

7-1

+
    +
  • +

    Implementation 2 :

    +
  • +
  • +

    The elements are numbered from 1 to N, hence they can be used as indices of an array.

    +
  • +
  • +

    S[ element ] = the element’s parent

    +
  • +
  • +

    Note : S[ root ] = 0 and set name = root index

    +
  • +
  • 数组初始化全部为0
  • +
+
C
1
+2
+3
+4
void SetUnion(DisjSet S, SetType Rt1, SetType Rt2)
+{
+  S[Rt2] = Rt1;
+}
+
+

Find( \(i\) )

+
    +
  • Implementation 1 :
  • +
+

7-2

+
    +
  • Implementation 2 :
  • +
+
C
1
+2
+3
+4
+5
SetType Find(ElementType X, DisjSet S)
+{
+  for ( ; S[X]>0; X=S[X]);
+  return X;
+}
+
+

Analysis

+
    +
  • Union and find are always paired. Thus we consider the performance of a sequence of union-find operations.
  • +
+

7-3

+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
+9
Algorithm using union-find operations:
+{  
+    Initialize Si = { i }  for  i = 1, ..., 12 ;
+    for ( k = 1; k <= 9; k++ )  /* for each pair i R j */
+    {
+        if ( Find( i ) != Find( j ) )
+            SetUnion( Find( i ), Find( j ) );
+    }
+}
+
+
    +
  • Worst case : \(T(N)=\Theta(N^2)\)
  • +
+
+

5.4 Smart Union Algorithms

+

Union-by-Size

+
    +
  • +

    Always change the smaller tree

    +
  • +
  • +

    S[Root] = -size, initialized to be -1

    +
  • +
  • +

    [Lemma] Let T be a tree created by union-by-size with N nodes, then \(height(T)\leq\lfloor\log_2N\rfloor+1\).

    +
  • +
+

Proved by induction. Each element can have its set name changed at most \(\log_2N\) times.

+
    +
  • Time complexity of \(N\) Union and \(M\) Find operations is now \(O(N+M\log_2N)\).
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
/* Assumes Rootl and Root2 are roots*/
+void SetUnion(DisjSet S, SetType Root1, SetType Root2)
+{
+    if (S[Root1] <= S[Root2])
+    {
+        S[Root1] += S[Root2];
+        S[Root2] = Root1;
+    }
+    else
+    {
+        S[Root2] += S[Root1];
+        S[Root1] = Root2;
+    }
+}
+
+

Union-by-Height

+
    +
  • Always change the shallow tree
  • +
  • 保证所有的树的深度最多是\(O(logN)\)
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
/* Assumes Rootl and Root2 are roots*/
+void SetUnion(DisjSet S, SetType Root1, SetType Root2)
+{
+    if ( S[Root2] < S[Root1])  /*Root2 is deeper set*/
+        S[Root1] = Root2;      /*Make Root2 new root*/
+    else
+    {
+        if (S[Root1] == S[Root2])  /*Same height*/
+            S[Root1]--;
+        S[Root2] = Root1;
+    }
+}
+
+
+

5.5 Path Compression

+
    +
  • 从X到Root的路径上的每一个结点都使它的父结点变成Root
  • +
+
C
1
+2
+3
+4
+5
+6
+7
SetType Find( ElementType X, DisjSet S )
+{
+    if ( S[ X ] <= 0 )    
+        return X;
+    else 
+        return S[ X ] = Find( S[ X ], S );
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
SetType Find( ElementType X, DisjSet S )
+{   
+    ElementType root, trail, lead;
+    for ( root = X; S[ root ] > 0; root = S[ root ] );  /* find the root */
+    for ( trail = X; trail != root; trail = lead )
+    {
+        lead = S[ trail ];   
+        S[ trail ] = root;   
+    }  /* collapsing */
+    return root;
+}
+
+
    +
  • Note : Not compatible with union-by-height since it changes the heights. Just take “height” as an estimated rank.
  • +
+
+

5.6 Worst Case for Union-by-Rank and Path Compression

+

[Lemma] Let \(T(M,N)\) be the maximum time required to process an intermixed sequence of \(M\geq N\) finds and \(N-1\) unions, then \(k_1M\alpha(M,N)\leq T(M,N)\leq k_2M\alpha(M,N)\) for some positive constants \(k_1\) and \(k_2\).

+
    +
  • Ackermann’s Function + $$ + A(i,j)=\left{ + \begin{array}{rcl} + 2^j && {i=1,j\geq1}\ + A(i-1,2) && {i\geq2,j=1}\ + A(i-1,A(i,j-1)) && {i\geq2,j\geq2}\ + \end{array} \right. + $$
  • +
+

$$ + A(2,4)=2^{2^{2^{2^2}}}=2^{65536} + $$

+
    +
  • \(\alpha(M,N)=min\{i\geq1|A(i,\lfloor M/N\rfloor)>\log N\}\leq O(\log^*N)\leq4\)
  • +
+

\(\log^*N\) (inverse Ackermann function) = number of times the logarithm is applied to \(N\) until the result \(\leq1\).

+
+

要求时间复杂度证明

+

5.7 Conclusion

+

一共有五种算法,注意看清题设

+
    +
  • +

    No smart union

    +
  • +
  • +

    Union-by-size

    +
  • +
  • +

    Union-by-height

    +
  • +
  • +

    Union-by-size + Path Compression

    +
  • +
  • +

    Union-by-height + Path Compression

    +
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK08/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK08/index.html" new file mode 100644 index 00000000..cff33315 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK08/index.html" @@ -0,0 +1,5154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 图表示与拓扑排序 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 8

+

6 Graph Algorithms

+

6.1 Definitions

+
    +
  • \(G( V, E )\) where \(G\) = graph, \(V = V( G )\) = finite nonempty set of vertices, and \(E = E( G )\) = finite set of edges.
  • +
+

Undirected graph

+
    +
  • \(( v_i , v_j ) = ( v_j , v_i )\) = the same edge.
  • +
+

Directed graph(diagraph)

+

8-1

+

Restrictions

+
    +
  • Self loop is illegal.
  • +
  • Multigraph is not considered.
  • +
+

Complete graph

+
    +
  • A graph that has the maximum number of edges.
  • +
+

image-20210124163038265

+

Adjacent

+

image-20210124163324744

+

image-20210124163301833

+

Subgraph

+
\[ +G'\subset G=V(G')\subseteq V(G) \&\& E(G')\subseteq E(G) +\]
+

Path

+
    +
  • Path(\(\subset G\)) from \(v_p\) to \(v_q\) = \(\{v_p,v_{i1},v_{i2},\cdots,v_{in},v_q\}\) such that \((v_p,v_{i1}),(v_{i1},v_{i2}),\cdots,(v_{in},v_q)\) belong to \(E(G)\)
  • +
+

Length of a path

+
    +
  • number of edges on the path
  • +
+

Simple path

+
    +
  • \(v_{i1},v_{i2},\cdots,v_{in}\) are distinct.
  • +
+

Cycle

+
    +
  • simple path with \(v_p=v_q\)
  • +
+

Connected

+
    +
  • \(v_i\) and \(v_j\) in an undirected \(G\) are connected if there is a path from \(v_i\) to \(v_j\) (and hence there is also a path from \(v_j\) to \(v_i\))
  • +
  • An undirected graph \(G\) is connected if every pair of distinct \(v_i\) and \(v_j\) are connected
  • +
+

(Connected) Component of an undirected G

+
    +
  • the maximal connected subgraph
  • +
+

Tree

+
    +
  • a graph that is connected and acyclic(非循环的)
  • +
+

DAG

+
    +
  • a directed acyclic graph
  • +
+

Strongly connected directed graph G

+
    +
  • For every pair of \(v_i\) and \(v_j\) in \(V( G )\), there exist directed paths from \(v_i\) to \(v_j\) and from \(v_j\) to \(v_i\).
  • +
  • If the graph is connected without direction to the edges, then it is said to be weakly connected
  • +
+

Strongly connected component

+
    +
  • the maximal subgraph that is strongly connected
  • +
+

Degree

+
    +
  • +

    number of edges incident to v

    +
  • +
  • +

    For a directed G, we have in-degree and out-degree.

    +
  • +
  • +

    Given G with \(n\) vertices and \(e\) edges, then + $$ + e=(\sum_{i=0}^{n-1}d_i)/2\quad where\quad d_i=degree(v_i) + $$

    +
  • +
+
+

6.2 Representation of Graphs

+

Adjacency Matrix

+

image-20210124163641976

+
+

Note : If G is undirected, then adj_mat[][] is symmetric. Thus we can save space by storing only half of the matrix.

+
+

image-20210123194735917

+
    +
  • +

    This representation wastes space if the graph has a lot of vertices but very few edges.

    +
  • +
  • +

    To find out whether or not \(G\) is connected, we’ll have to examine all edges. In this case \(T\) and \(S\) are both \(O( n^2 )\).

    +
  • +
+

Adjacency Lists

+
    +
  • Replace each row by a linked list
  • +
+

image-20210124164723362

+
+

Note : The order of nodes in each list does not matter.

+
+
    +
  • For undirected \(G\), \(S\) = \(n\) heads + \(2e\) nodes = \((n+2e)\) ptrs + \(2e\) ints
  • +
  • Degree(i) = number of nodes in graph[i](if \(G\) is undirected)
  • +
  • \(T\) of examine \(E(G)\) = \(O(n+e)\)
  • +
+

image-20210124165346405

+

Adjacency Multilists

+

image-20210124164607434

+
    +
  • Sometimes we need to mark the edge after examine it, and then find the next edge.
  • +
+

Weighted Edges

+
    +
  • adj_mat [ i ] [ j ] = weight
  • +
  • adjacency lists / multilists : add a weight field to the node
  • +
+
+

6.3 Topological Sort 拓扑排序 不是一种严格意义的排序算法

+

AOV activity on vertices Network 有向无环图

+
    +
  • digraph \(G\) in which \(V( G )\) represents activities and \(E( G )\) represents precedence relations
  • +
  • Feasible AOV network must be a directed acyclic graph(DAG).
  • +
  • \(i\) is a predecessor of \(j\) = there is a path from \(i\) to \(j\)
  • +
  • \(i\) is an immediate predecessor of \(j\) = \(< i, j > \in E( G )\). Then \(j\) is called a successor(immediate successor) of \(i\)
  • +
+

Partial order

+
    +
  • a precedence relation which is both transitive and irreflexive
  • +
+
+

Note : If the precedence relation is reflexive, then there must be an \(i\) such that \(i\) is a predecessor of \(i\). That is, \(i\) must be done before \(i\) is started. Therefore if a project is feasible, it must be irreflexive.

+
+

[Definition] A topological order is a linear ordering of the vertices of a graph such that, for any two vertices, \(i\), \(j\), if \(i\) is a predecessor of \(j\) in the network then \(i\) precedes \(j\) in the linear ordering.

+
+

Note : The topological orders may not be unique for a network.

+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
/*Test an AOV for feasibility, and generate a topological order if possible*/
+void Topsort( Graph G )
+{   
+    int Counter;
+    Vertex V, W;
+    for ( Counter = 0; Counter < NumVertex; Counter++ ) 
+    {
+        V = FindNewVertexOfDegreeZero( );
+        if ( V == NotAVertex ) //确认图中无环?
+        {
+            Error ( Graph has a cycle );   
+            break;  
+        }
+        TopNum[ V ] = Counter; /* or output V */
+        for ( each W adjacent to V )
+            Indegree[ W ]––; //对所有前置选课要求有V的课程,在修之前必须修完的课少了一门
+    }
+}
+
+
\[ +T=O(|V|^2+|E|) = O(|V|^2) +\]
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
/*Improvment:Keep all the unassigned vertices of degree 0 in a special box (queue or stack)*/
+void Topsort( Graph G )
+{   
+    Queue Q;
+    int Counter = 0;
+    Vertex V, W;
+    Q = CreateQueue( NumVertex );  
+    MakeEmpty( Q );
+    for ( each vertex V )
+        if ( Indegree[ V ] == 0 ) Enqueue( V, Q );
+    while ( !IsEmpty( Q ) ) 
+    {
+        V = Dequeue( Q );
+        TopNum[ V ] = ++Counter; /* assign next */
+        for ( each W adjacent to V )
+            if (––Indegree[ W ] == 0 ) Enqueue( W, Q );
+    }  /* end-while */
+    if ( Counter != NumVertex )
+    Error( Graph has a cycle );
+    DisposeQueue( Q ); /* free memory */
+}
+
+
\[ +T=O(|V|+|E|) +\]
+
+

\(注意E的范围 最小 V 最大 |V|^2\)

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK09/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK09/index.html" new file mode 100644 index 00000000..2203ecb9 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK09/index.html" @@ -0,0 +1,5131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 最短路算法/AOE - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 9

+

6.4 Shortest Path Algorithms

+

Given a digraph \(G = ( V, E )\), and a cost function \(c( e )\) for \(e \in E( G )\).

+

The length of a path \(P\) from source to destination is \(\sum_{e_i\subset P} c(e_i)\)(also called weighted path length).

+

Single-Source Shortest-Path Problem

+

Given as input a weighted graph, \(G = ( V, E )\), and a distinguished vertex \(s\), find the shortest weighted path from \(s\) to every other vertex in \(G\).

+
+

Note: If there is no negative-cost cycle, the shortest path from \(s\) to \(s\) is defined to be zero.

+
+
Unweighted Shortest Path
+
    +
  • Breadth-first search 广度优先遍历
  • +
+

Implementation :

+
    +
  • Table[ i ].Dist ::= distance from \(s\) to \(v_i\) /* initialized to be \(\infin\) except for \(s\) */
  • +
  • Table[ i ].Known ::= 1 if \(v_i\) is checked; or 0 if not
  • +
  • Table[ i ].Path ::= for tracking the path /* initialized to be 0 */
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
void Unweighted( Table T )
+{   
+    int CurrDist;
+    Vertex V, W;
+    for ( CurrDist = 0; CurrDist < NumVertex; CurrDist++ ) 
+    {
+        for ( each vertex V )
+            if ( !T[ V ].Known && T[ V ].Dist == CurrDist ) 
+            {
+                T[ V ].Known = true;
+                for ( each W adjacent to V )
+                    if ( T[ W ].Dist == Infinity ) 
+                    {
+                        T[ W ].Dist = CurrDist + 1;
+                        T[ W ].Path = V;
+                    } /* end-if Dist == Infinity */
+            } /* end-if !Known && Dist == CurrDist */
+    }  /* end-for CurrDist */
+}
+
+

The worst case :

+

9-1 +$$ +T(N)=O(|V|^2) +$$ +Improvement :

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
void Unweighted( Table T )
+{   
+    /* T is initialized with the source vertex S given */
+    Queue Q;
+    Vertex V, W;
+    Q = CreateQueue( NumVertex );
+    MakeEmpty( Q );
+    Enqueue( S, Q ); /* Enqueue the source vertex */
+    while ( !IsEmpty( Q ) ) 
+    {
+        V = Dequeue( Q );
+        T[ V ].Known = true; /* not really necessary */
+        for ( each W adjacent to V )
+            if ( T[ W ].Dist == Infinity ) 
+            {
+                T[ W ].Dist = T[ V ].Dist + 1;
+                T[ W ].Path = V;
+                Enqueue( W, Q );
+            } /* end-if Dist == Infinity */
+    } /* end-while */
+    DisposeQueue( Q ); /* free memory */
+}
+
+
\[ +T=O(|V|+|E|) +\]
+
Weighted Shorted Path
+
Dijkstra’s Algorithm
+
    +
  • Let S = { \(s\) and \(v_i\)’s whose shortest paths have been found }
  • +
  • For any \(u\notin S\), define distance [ u ] = minimal length of path { \(s\rightarrow(v_i\in S)\rightarrow u\) }. If the paths are generated in non-decreasing order, then :
  • +
  • the shortest path must go through only \(v_i\in S\)
  • +
  • Greedy Method : \(u\) is chosen so that distance[ u ] = min{ \(w \notin S\) | distance[ w ] } (If \(u\) is not unique, then we may select any of them)
  • +
  • if distance[\(u_1\)] < distance[\(u_2\)] and add \(u_1\) into \(S\), then distance [ \(u_2\) ] may change. If so, a shorter path from \(s\) to \(u_2\) must go through \(u_1\) and distance [ \(u_2\) ] = distance [ \(u_1\) ] + length(< \(u_1\), \(u_2\)>).
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
typedef int Vertex;
+struct TableEntry
+{
+    List Header; /*Adjacency list*/
+    int Known;
+    DistType Dist;
+    Vertex Path;
+};
+/*Vertices are numbered from 0*/
+#define NotAVertex (-1)
+typedef struct TableEntry Table[ NumVertex ];
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
void InitTable(Vertex Start, Graph G, Table T)
+{ 
+    int i;
+    ReadGraph(G, T); /* Read graph somehow */
+    for(i = 0; i < NumVertex; i++)
+    {
+        T[ i ].Known = False;
+        T[ i ].Dist = Infinity;
+        T[ i ].Path = NotAVertex;
+    }
+    T[ Start ].dist = O;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
/*Print shortest path to V after Dijkstra has run*/
+/*Assume that the path exists*/
+void PrintPath(Vertex V, Table T)
+{
+    if (T[ V ].Path != NotAVertex)
+    {
+        PrintPath(T[ V ].Path, T);
+        printf(" to") ;
+    }
+    printf("%v", V) ; /* %v is pseudocode * /
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
void Dijkstra( Table T )
+{ 
+    Vertex V, W;
+    for ( ; ; ) 
+    {
+        V = smallest unknown distance vertex;
+        if ( V == NotAVertex ) break; 
+        T[ V ].Known = true;
+        for ( each W adjacent to V )
+            if ( !T[ W ].Known ) 
+                if ( T[ V ].Dist + Cvw < T[ W ].Dist ) 
+                {
+                    Decrease( T[ W ].Dist to T[ V ].Dist + Cvw );
+                    T[ W ].Path = V;
+                } /* end-if update W */
+    } /* end-for( ; ; ) */
+}
+
+
Implementation 1
+
    +
  • Simply scan the table to find the smallest unknown distance vertex.——\(O(|V|)\)
  • +
  • Good if the graph is dense
  • +
+
\[ +T=O(|V|^2+|E|) +\]
+
Implementation 2
+
    +
  • +

    堆优化

    +
  • +
  • +

    Keep distances in a priority queue and call DeleteMin to find the smallest unknown distance vertex.——\(O(\log|V|)\)

    +
  • +
  • +

    更新的处理方法

    +
  • +
  • +

    Method 1 : DecreaseKey——\(O(\log|V|)\)

    +

    \(T=O(|V|\log|V|+|E|\log|V|)=O(|E|\log|V|)\)

    +
  • +
  • +

    Method 2 : insert W with updated Dist into the priority queue

    +

    Must keep doing DeleteMin until an unknown vertex emerges

    +

    \(T=O(|E|\log|V|)\) but requires \(|E|\) DeleteMin with |E| space

    +
  • +
  • +

    Good if the graph is sparse

    +
  • +
+
Improvements
+
    +
  • Pairing heap
  • +
  • Fibonacci heap
  • +
+
Graphs with Negative Edge Costs
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
void WeightedNegative( Table T )
+{
+    Queue Q;
+    Vertex V, W;
+    Q = CreateQueue (NumVertex );  
+    MakeEmpty( Q );
+    Enqueue( S, Q ); /*Enqueue the source vertex*/
+    while ( !IsEmpty( Q ) ) 
+    {
+        V = Dequeue( Q );
+        for ( each W adjacent to V )
+        if ( T[ V ].Dist + Cvw < T[ W ].Dist ) 
+        {
+            T[ W ].Dist = T[ V ].Dist + Cvw;
+            T[ W ].Path = V;
+            if ( W is not already in Q )
+                Enqueue( W, Q );
+        } /*end-if update*/
+    } /*end-while */
+    DisposeQueue( Q ); /*free memory*/
+}
+
+
+

Note : Negative-cost cycle will cause indefinite loop

+
+
\[ +T=O(|V|\times|E|) +\]
+
Acyclic Graphs
+
    +
  • If the graph is acyclic, vertices may be selected in topological order since when a vertex is selected, its distance can no longer be lowered without any incoming edges from unknown nodes.
  • +
  • \(T=O(|E|+|V|)\) and no priority queue is needed.
  • +
+
AOE(Activity on Edge) Networks
+

image-20210124185420522

+

image-20210124185541801

+

image-20210124185508683

+

All-Pairs Shortest Path Problem

+
    +
  • For all pairs of \(v_i\) and \(v_j\) ( \(i\neq j\) ), find the shortest path between.
  • +
+
Method 1
+
    +
  • Use single-source algorithm for \(|V|\) times.
  • +
  • \(T=O(|V|^3)\), works fast on sparse graph.
  • +
+
Method 2
+
    +
  • 动态规划
  • +
  • \(O(|V|^3)\) algorithm given in Chapter 10, works faster on dense graphs.
  • +
+

DS WEEK08.md

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK10/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK10/index.html" new file mode 100644 index 00000000..18407187 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK10/index.html" @@ -0,0 +1,4938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 网络流问题/MST - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 10

+

6.5 Network Flow Problems

+

image-20201206175230349

+
    +
  • Determine the maximum amount of flow that can pass from \(s\) to \(t\).
  • +
+
+

Note : Total coming in (\(v\)) = Total going out (\(v\)) where \(v \notin \{ s, t \}\)

+
+

A Simple Algorithm

+
    +
  • 流图\(G_f\)表示算法的任意阶段已经达到的流,开始时\(G_f\)的所有边都没有流,算法终止时\(G_f\)包含最大流
  • +
  • 残余图(residual graph)\(G_r\)表示对于每条边还能添加上多少流,\(G_r\)的边叫做残余边(residual edge)
  • +
+
+

Step 1 : Find any path from \(s\) to \(t\) in \(G_r\) , which is called augmenting path(增长通路).

+

Step 2 : Take the minimum edge on this path as the amount of flow and add to \(G_f\).

+

Step 3 : Update \(G_r\) and remove the 0 flow edges.

+

Step 4 : If there is a path from \(s\) to \(t\) in \(G_r\) then go to Step 1, or end the algorithm.

+
+
    +
  • Step 1中初始选择的路径可能使算法不能找到最优解,贪心算法行不通
  • +
+

A solution

+
    +
  • allow the algorithm to undo its decisions
  • +
  • For each edge \(( v, w )\) with flow \(f_{v, w}\) in \(G_f\), add an edge \(( w, v )\) with flow \(f_{v, w}\) in \(G_r\) .
  • +
+
+

Note : The algorithm works for \(G\) with cycles as well.

+
+
[Proposition] If the edge capabilities are rational numbers, this algorithm always terminate with a maximum flow.
+

Analysis

+
    +
  • +

    An augmenting path can be found by an unweighted shortest path algorithm.

    +
  • +
  • +

    \(T=O(f|E|)\) where \(f\) is the maximum flow.

    +
  • +
  • +

    Always choose the augmenting path that allows the largest increase in flow

    +
  • +
  • +

    对Dijkstra算法进行单线(single-line)修改来寻找增长通路

    +
  • +
  • \(cap_{max}\)为最大边容量
  • +
  • \(O(|E|\log cap_{max})\)条增长通路将足以找到最大流,对于增长通路的每次计算需要\(O(|E|\log|V|)\)时间
  • +
+

$$ + T=T_{augmentation}\times T_{find_a_path}\ + =O(|E|\log cap_{max})\times O(|E|\log|V|)\ + =O(|E|^2\log|V|\log cap_{max}) + $$

+
    +
  • +

    Always choose the augmenting path that has the least number of edges

    +
  • +
  • +

    使用无权最短路算法来寻找增长路径

    +
  • +
+

$$ + T=T_{augmentation}\times T_{find_a_path}\ + =O(|E||V|)\times O(|E|)\ + =O(|E|^2|V|) + $$

+
+

Note :

+
    +
  • If every \(v \notin \{ s, t \}\) has either a single incoming edge of capacity 1 or a single outgoing edge of capacity 1, then time bound is reduced to \(O( |E| |V|^{1/2} )\).
  • +
  • The min-cost flow problem is to find, among all maximum flows, the one flow of minimum cost provided that each edge has a cost per unit of flow.
  • +
+
+
+

6.6 Minimum Spanning Tree

+
[Definition] A spanning tree of a graph \(G\) is a tree which consists of \(V(G)\) and a subset of \(E(G)\)
+
+

Note :

+
    +
  • The minimum spanning tree is a tree since it is acyclic, the number of edges is \(|V|-1\)
  • +
  • It is minimum for the total cost of edges is minimized.
  • +
  • It is spanning because it covers every vertex.
  • +
  • A minimum spanning tree exists if \(G\) is connected.
  • +
  • Adding a non-tree edge to a spanning tree, we obtain a cycle.
  • +
+
+
Greedy Method
+

Make the best decision for each stage, under the following constrains :

+
+
    +
  • we must use only edges within the graph
  • +
  • we must use exactly \(|V|-1\) edges
  • +
  • we may not use edges that would produce a cycle
  • +
+
+
    +
  1. +

    Prim’s Algorithm

    +
  2. +
  3. +

    在算法的任一时刻,都可以看到一个已经添加到树上的顶点集,而其余顶点尚未加到这棵树中

    +
  4. +
  5. +

    算法在每一阶段都可以通过选择边\((u, v)\),使得\((u,v)\)的值是所有\(u\) 在树上但\(v\)不在树上的边的值中的最小者,而找出一个新的顶点并把它添加到这棵树中

    +
  6. +
  7. +

    Kruskal’s Algorithm

    +
  8. +
  9. +

    连续地按照最小的权选择边,,并且当所选的边不产生环时就把它作为取定的边

    +
    Text Only
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    void Kruskal( Graph G )
    +{   
    +   T = { };
    +    while ( T contains less than |V|-1 edges && E is not empty ) 
    +    {
    +        choose a least cost edge (v, w) from E;  /*DeleteMin*/
    +        delete (v, w) from E;
    +        if ( (v, w) does not create a cycle in T )     
    +           add (v, w) to T;  /*Union/Find*/
    +        else     
    +           discard (v, w);
    +    }
    +    if ( T contains fewer than |V|-1 edges )
    +       Error( “No spanning tree” );
    +}
    +
    +
    C
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    void Kruskal(Graph G)
    +{
    +   int EdgesAccepted;
    +   DisjSet S;
    +   PriorityQueue H;
    +   Vertex U, V;
    +   SetType Uset, Vset;
    +   Edge E;
    +
    +   Initialize(S);
    +   ReadGraphIntoHeapArray(G, H);
    +   BuildHeap(H);
    +
    +   EdgesAccepted = 0;
    +   while(EdgesAccepted < NumVertex-1)
    +   {
    +       E = DeleteMin(H); /*E = (U,V)*/
    +       Uset = Find(U, S);
    +       Vset = Find(V, S);
    +       if(Uset != Vset)
    +       {
    +           /*Accept the edge*/
    +           EdgesAccepted++;
    +           SetUnion(S, USet, VSet);
    +       }
    +   }
    +}
    +
    +

    $$ + T=O(|E|\log|E|) + $$

    +

    image-20210124214008496

    +
    +
  10. +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK11/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK11/index.html" new file mode 100644 index 00000000..4d939e24 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK11/index.html" @@ -0,0 +1,5149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + DFS/联通分量/插排/交换排序下界 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 11

+ +
C
1
+2
+3
+4
+5
+6
+7
/*a generalization of preorder traversal*/
+void DFS(Vertex V)
+{   
+    visited[ V ] = true;  /*mark this vertex to avoid cycles*/
+    for ( each W adjacent to V )
+        if ( !visited[ W ] ) DFS( W );
+} /*T = O(|E|+|V|) as long as adjacency lists are used*/
+
+

Undirected Graphs

+
C
1
+2
+3
+4
+5
+6
+7
+8
+9
void ListComponents(Graph G)
+{   
+    for ( each V in G ) 
+        if ( !visited[ V ] ) 
+        {
+            DFS( V );
+            printf("\n");
+        }
+}
+
+

与回溯(backtrack)比较:

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
void backtrack(){
+    //terminal condition:
+    if(reached the end){
+        //触发了结束条件,return
+        res.add(track);
+        return;
+    }
+    for(every neighbor next to this node){
+        if(!visited[i]){//排除不合法的选择
+            visited[i]=true;
+            track.add(i);
+            backtrack(i);
+            track.remove(i);
+            visited[i]=false;
+        }
+    }
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
int dfs[MaxVertexNum];
+
+void DFS(LGraph Graph, int cur){
+    dfs[cur]=1;
+    for(PtrToAdjVNode node=Graph->G[cur].FirstEdge;node;node=node->Next){
+        int w = node->AdjV;
+        if(!dfs[w])DFS(Graph,w);
+    }
+}
+
+int CountConnectedComponents( LGraph Graph ){
+    int count = 0;
+    for(int i=0;i<Graph->Nv;i++)dfs[i]=0;
+    for(int i=0;i<Graph->Nv;i++){
+        if(!dfs[i]){
+            DFS(Graph,i); count++;
+    }
+    }
+    return count;
+}
+
+

Undirected Graphs

+

Biconnectivity

+
    +
  • \(v\) is an articulation point if \(G'=DeleteVertex(G, v)\) has at least 2 connected components.
  • +
  • \(G\) is a biconnected graph if \(G\) is connected and has no articulation points.
  • +
  • A biconnected component is a maximal biconnected subgraph.
  • +
+

image-20201207194401819

+

image-20201207194413257

+
+

Note : No edges can be shared by two or more biconnected components. Hence \(E(G)\) is partitioned by the biconnected components of \(G\).

+
+

Finding the biconnected components of a connected undirected \(G\) :

+
+
    +
  • Use depth first search to obtain a spanning tree of \(G\)
  • +
+

image-20201208110403641

+

image-20201208110506092

+
    +
  • Depth first number(\(Num\)) 先序编号
  • +
  • Back edges(背向边) = \((u,v)\notin\) tree and \(u\) is an ancestor of \(v\).
  • +
+
+

Note : If \(u\) is an ancestor of \(v\), then \(Num(u)<Num(v)\).

+
+
    +
  • Find the articulation points in \(G\)
  • +
  • The root is an articulation point if it has at least 2 children.
  • +
  • Any other vertex \(u\) is an articulation point if \(u\) has at least 1 child, and it is impossible to move down at least 1 step and then jump up to \(u\)‘s ancestor
  • +
+
+
    +
  • 对于深度优先搜索生成树上的每一个顶点\(u\),计算编号最低的顶点,称之为\(Low(u)\) + $$ + Low(u)=\min{Num(u),\min{Low(w)|w\,is\,a\,child\,of\,u},\min{Num(w)|(u,w)\,is\,a\,back\,edge}} + $$
  • +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
/*Assign Num and compute Parents*/
+void AssignNum(Vertex V)
+{
+    Vertex W;
+    Num[V] = Counter++;
+    Visited[V] = True;
+    for each W adjacent to V
+        if(!Visited[W])
+        {
+            Parent[W] = V;
+            AssignNum(W);
+        }
+}
+
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
/*Assign Low; also check for articulation points*/
+void AssignLow(Vertex V)
+{
+    Vertex W;
+    Low[V] = Num[V]; /*Rule 1*/
+    for each W adjacent to V
+    {
+        if(Num[W] > Num[V]) /*Forward edge*/
+        {
+            Assignlow(W);
+            if(Low[W] >= Num[V])
+                printf("%v is an articulation point\n", v);
+            Low[V] = Min(Low[V], Low[W]); /*Rule 3*/
+        }
+        else
+            if (Parent[V] != W) /*Back edge*/
+                Low[V] = Min(Low[V], Num[W]); /*Rule 2*/
+    }
+}
+
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
void FindArt(Vertex V)
+{
+    Vertex W;
+    Visited[V] = True;
+    Low[V] = Num[V] = Counter++; /*Rule 1*/
+    for each W adjacent to V
+    {
+        if(!Visited[W]) /*Forward edge*/
+        {
+            Parent[W] = V;
+            FindArt(W);
+            if(Low[W] >= Num[V])
+                printf("%v is an articulation point\n", v);
+            Low[V] = Min(Low[V], Low[W]); /*Rule 3*/
+        }
+        else
+            if(Parent[ V ] != W) /*Back edge*/
+                Low[V] = Min(Low[V], Num[W]); /*Rule 2*/
+    }
+}
+
+

Euler Circuits

+
[Proposition] An Euler circuit is possible only if the graph is connected and each vertex has an even degree.
+
[Proposition] An Euler tour is possible if there are exactly two vertices having odd degree. One must start at one of the odd-degree vertices.
+
+

Note:

+
    +
  • The path should be maintained as a linked list.
  • +
  • For each adjacency list, maintain a pointer to the last edge scanned.
  • +
  • \(T=O(|E|+|V|)\)
  • +
+
+
+

7 Sorting

+

7.1 Preliminaries

+
C
void X_Sort (ElementType A[], int N)
+
+
    +
  • N must be a legal integer.
  • +
  • Assume integer array for the sake of simplicity.
  • +
  • ‘>’ and ‘<’ operators exist and are the only operations allowed on the input data.
  • +
  • Consider internal sorting only. The entire sort can be done in main memory.
  • +
+
+

7.2 Insertion Sort

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
void Insertion(ElementType A[], int N)
+{ 
+    int j, P; 
+    ElementType Tmp; 
+
+    for ( P = 1; P < N; P++ ) 
+    { 
+        Tmp = A[ P ];  /*the next coming card*/
+        for ( j = P; j > 0 && A[ j - 1 ] > Tmp; j-- ) 
+            A[ j ] = A[ j - 1 ]; 
+            /*shift sorted cards to provide a position for the new coming card*/
+        A[ j ] = Tmp;  /*place the new card at the proper position*/
+    }/*end for-P-loop*/
+}
+
+
    +
  • +

    The worst case : Input A[ ] is in reverse order + $$ + T(N)=O(N^2) + $$

    +
  • +
  • +

    The best case : Input A[ ] is in sorted order + $$ + T(N)=O(N) + $$

    +
  • +
+
+

7.3 A Lower Bound for Simple Sorting Algorithms

+

[Definition] An inversion in an array of numbers is any ordered pair\((i,j)\) having the property that \(i<j\) but \(A[i]>A[j]\)

+
    +
  • +

    Swapping two adjacent elements that are out of place removes exactly one inversion.

    +
  • +
  • +

    \(T(N,I)=O(I+N)\) where \(I\) is the number of inversions in the original array.

    +
  • +
+

[Theorem] The average number of inversions in an array of \(N\) distinct numbers is \(N(N-1)/4\)

+

[Theorem] Any algorithm that sorts by exchanging adjacent elements requires \(\Omega(N^2)\) time on average

+
+
C
1
+2
+3
+4
+5
+6
typedef struct node {
+    int data;
+    struct node* left;
+    struct node* right;
+} node;
+typedef struct node* Tree;
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK12/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK12/index.html" new file mode 100644 index 00000000..e856c8e0 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK12/index.html" @@ -0,0 +1,4984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + shell/heap/merge sort - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 12

+

7.4 Shellsort

+

image-20201214133747061

+
    +
  • Define an increment sequence \(h_1 < h_2 < \cdots < h_t ( h_1 = 1 )\)
  • +
  • +

    Define an \(h_k\)-sort at each phase for \(k = t, t - 1,\cdots, 1\)

    +
  • +
  • +

    最后一轮就是Insertion Sort

    +
  • +
+
+

Note : An \(h_k\)-sorted file that is then \(h_{k-1}\)-sorted remains \(h_k\)-sorted.

+
+

Shell’s Increment Sequence

+
\[ +h_t=\lfloor N/2\rfloor,h_k=\lfloor h_{k+1}/2\rfloor +\]
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
void Shellsort( ElementType A[ ], int N ) 
+{ 
+    int i, j, Increment; 
+    ElementType Tmp; 
+    for ( Increment = N / 2; Increment > 0; Increment /= 2 )  /*h sequence */
+        for ( i = Increment; i < N; i++ ) 
+        { /* insertion sort */
+            Tmp = A[ i ]; 
+            for ( j = i; j >= Increment; j -= Increment ) 
+                if( Tmp < A[ j-Increment ] )
+                    A[ j ] = A[ j-Increment ]; 
+                else 
+                    break; 
+            A[ j ] = Tmp;
+        } /* end for-I and for-Increment loops */
+}
+
+
    +
  • [Theorem] The worst-case running time of Shellsort, using Shell’s increments, is \(\Theta( N^2 )\).
  • +
+

Hibbard's Increment Sequence

+
\[ +h_k=2^k-1 +\]
+
    +
  • [Theorem] The worst-case running time of Shellsort, using Hibbard's increments, is \(\Theta( N^{3/2} )\).
  • +
+

Conjecture

+
    +
  • \(T_{avg – Hibbard} ( N ) = O ( N^{5/4} )\)
  • +
  • Sedgewick’s best sequence is \(\{1, 5, 19, 41, 109, \cdots \}\) in which the terms are either of the form \(9\times4^i – 9\times2^i + 1\) or + \(4^i – 3\times2^i + 1\). \(T_{avg} ( N ) = O ( N^{7/6} )\) and \(T_{worst}( N ) = O( N^{4/3} )\).
  • +
+

Conclusion

+
    +
  • Shellsort is a very simple algorithm, yet with an extremely complex analysis.
  • +
  • It is good for sorting up to moderately large input (tens of thousands).
  • +
+
+

7.5 Heapsort

+

Algorithm1

+
C
1
+2
+3
+4
+5
+6
+7
+8
void Heapsort( int N ) 
+{
+    BuildHeap( H );
+    for ( i = 0; i < N; i++ ) 
+        TmpH[ i ] = DeleteMin( H );
+    for ( i = 0; i < N; i++ ) 
+        H[ i ] = TmpH[ i ];
+}
+
+
\[ +T(N)=O(N\log N) +\]
+
    +
  • The space requirement is doubled.
  • +
+

Algorithm2

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
void Heapsort( ElementType A[ ], int N ) 
+{
+    int i; 
+    for ( i = N / 2; i >= 0; i-- ) /*BuildHeap*/ 
+        PercDown( A, i, N );
+    for ( i = N - 1; i > 0; i-- ) 
+    { 
+        Swap( &A[ 0 ], &A[ i ] ); /*DeleteMax*/ 
+        PercDown( A, 0, i ); 
+    } 
+}
+
+
    +
  • [Theorem] The average number of comparisons used to heapsort a random permutation of N distinct items is \(2N\log N-O(N\log\log N)\).
  • +
+
+

Note : Although Heapsort gives the best average time, in practice it is slower than a version of Shellsort that uses Sedgewick’s increment sequence.

+
+
+

7.6 Mergesort

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
void MSort( ElementType A[ ], ElementType TmpArray[ ], int Left, int Right ) 
+{   
+    int Center; 
+    if ( Left < Right ) 
+    {  /*if there are elements to be sort*/
+        Center = (Left+Right)/2; 
+        MSort(A, TmpArray, Left, Center);   /*T(N/2)*/
+        MSort(A, TmpArray, Center+1, Right);    /*T(N/2)*/
+        Merge(A, TmpArray, Left, Center+1, Right);  /*O(N)*/
+    } 
+} 
+
+void Mergesort( ElementType A[ ], int N ) 
+{   
+    ElementType *TmpArray;  /*need O(N) extra space*/
+    TmpArray = malloc(N*sizeof(ElementType)); 
+    if (TmpArray != NULL) 
+    { 
+        MSort(A, TmpArray, 0, N-1); 
+        free(TmpArray); 
+    } 
+    else FatalError("No space for tmp array!!!"); 
+}
+
+
    +
  • If a TmpArray is declared locally for each call of Merge, then \(S(N) = O(N\log N)\).
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
/*Lpos = start of left half, Rpos = start of right half*/ 
+void Merge( ElementType A[ ], ElementType TmpArray[ ], int Lpos, int Rpos, int RightEnd ) 
+{   
+    int i, LeftEnd, NumElements, TmpPos; 
+    LeftEnd = Rpos-1; 
+    TmpPos = Lpos; 
+    NumElements = RightEnd-Lpos+1; 
+    while( Lpos <= LeftEnd && Rpos <= RightEnd ) /*main loop*/ 
+        if ( A[ Lpos ] <= A[ Rpos ] ) 
+            TmpArray[ TmpPos++ ] = A[ Lpos++ ]; 
+        else 
+            TmpArray[ TmpPos++ ] = A[ Rpos++ ]; 
+    while( Lpos <= LeftEnd ) /*Copy rest of first half*/ 
+        TmpArray[ TmpPos++ ] = A[ Lpos++ ]; 
+    while( Rpos <= RightEnd ) /*Copy rest of second half*/ 
+        TmpArray[ TmpPos++ ] = A[ Rpos++ ]; 
+    for( i = 0; i < NumElements; i++, RightEnd-- ) 
+        /*Copy TmpArray back*/ 
+        A[ RightEnd ] = TmpArray[ RightEnd ]; 
+}
+
+

Analysis

+
\[ +T(1)=O(1)\\ +T(N)=2T(\frac{N}{2})+O(N)\\ +\frac{T(N)}{N}=\frac{T(\frac{N}{2})}{\frac{N}{2}}+1\\ +\cdots\\ +\frac{T(\frac{N}{2^{k-1}})}{\frac{N}{2^{k-1}}}=\frac{T(1)}{1}+1\\ +T(N)=O(N+N\log N) +\]
+
+

Note : Mergesort requires linear extra memory, and copying an array is slow. It is hardly ever used for internal sorting, but is quite useful for external sorting.

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK13/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK13/index.html" new file mode 100644 index 00000000..4c8430eb --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK13/index.html" @@ -0,0 +1,5250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + queue bucket radix sort - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 13

+

qsort非递归实现,自然语言描述(ppt第一页),qsort程序填空

+

不要只注意i++,j--

+

7.7 Quicksort

+
    +
  • the fastest known sorting algorithm in practice
  • +
+

Algorithm

+
Text Only
1
+2
+3
+4
+5
+6
+7
+8
void Quicksort( ElementType A[ ], int N )
+{
+    if (N < 2) return;
+    pivot = pick any element in A[ ]; 
+    Partition S = { A[ ] \ pivot } into two disjoint sets:
+        A1 = { a in S | a <= pivot } and A2 = { a in S | a >= pivot };
+    A = Quicksort(A1, N1) and { pivot } and Quicksort(A2, N2);
+}
+
+
    +
  • The pivot is placed at the right place once and for all.
  • +
  • 要研究的问题是如何选取枢纽元和如何划分
  • +
+

Picking the Pivot

+
A Wrong Way
+
    +
  • Pivot = A[ 0 ]
  • +
  • The worst case : A[ ] is presorted, quicksort will take \(O(N^2)\) time to do nothing
  • +
+
A Safe Maneuver
+
    +
  • Pivot = random select from A[ ]
  • +
  • random number generation is expensive
  • +
+
Median-of-Three Partitioning
+
    +
  • Pivot = median(left, center, right)
  • +
  • Eliminates the bad case for sorted input and actually reduces the running time by about 5%.
  • +
+

Partitioning Strategy

+
    +
  • \(i\)\(j\)的左边时,我们将\(i\)右移,移过那些小于枢纽元的元素,并将\(j\)左移,移过那些大于枢纽元的元素
  • +
  • \(i\)\(j\)停止时,\(i\)指向一个大元素而\(j\)指向一个小元素,如果\(i\)\(j\)的左边,那么将这两个元素互换
  • +
  • 重复该过程直到\(i\)\(j\)彼此交错为止
  • +
  • 划分的最后一步是将枢纽元与\(i\)所指向的元素交换
  • +
  • 如果\(i\)\(j\)遇到等于枢纽元的键值,就让\(i\)\(j\)都停止,因为若都不停止\(T(N)=O(N^2)\)
  • +
  • There will be many dummy swaps, but at least the sequence will be partitioned into two equal-sized subsequences.
  • +
  • 元素与枢纽元素相等时指针也要停下。这样看起来做了额外的交换,但是可以保证在输入元素全部相等的情况下每次会将输入数组切分成一半。如果相等时指针不停下,快速排序就会在有大量重复元素的输入时复杂度退化为O(n^2)(i直接到了最后)
  • +
+

Small Arrays

+
    +
  • Quicksort is slower than insertion sort for small \(N(\leq 20)\).
  • +
  • Cutoff when \(N\) gets small and use other efficient algorithms (such as insertion sort).
  • +
+

Implementation

+
C
1
+2
+3
+4
+5
+6
+7
void Quicksort( ElementType A[ ], int N ) 
+{ 
+    Qsort( A, 0, N-1 ); 
+    /*A:the array*/
+    /*0:Left index*/
+    /*N–1:Right index*/
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
/* Return median of Left, Center, and Right */ 
+/* Order these and hide the pivot */ 
+ElementType Median3( ElementType A[ ], int Left, int Right ) 
+{
+    int Center = ( Left+Right )/2; 
+    if ( A[ Left ] > A[ Center ] ) 
+        Swap( &A[ Left ], &A[ Center ] ); 
+    if ( A[ Left ] > A[ Right ] ) 
+        Swap( &A[ Left ], &A[ Right ] ); 
+    if ( A[ Center ] > A[ Right ] ) 
+        Swap( &A[ Center ], &A[ Right ] ); 
+    /*Invariant: A[ Left ] <= A[ Center ] <= A[ Right ]*/ 
+    Swap( &A[ Center ], &A[ Right-1 ] ); /*Hide pivot*/ 
+    /*only need to sort A[ Left+1 ] … A[ Right–2 ]*/
+    return A[ Right-1 ];  /*Return pivot*/ 
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
void Qsort( ElementType A[ ], int Left, int Right ) 
+{
+    int i, j; 
+    ElementType Pivot; 
+    if ( Left + Cutoff <= Right ) 
+    {   /*if the sequence is not too short*/
+        Pivot = Median3( A, Left, Right );  /*select pivot*/
+        i = Left;     
+        j = Right  1;  /*why not set Left+1 and Right-2?*/
+        for( ; ; ) 
+        { 
+            while ( A[ ++i ] < Pivot ) { }  /*scan from left,不能是=号,如果是<=在所有元素相等时就直接扫描到最后一个元素了,相当于N^2*/
+            while ( A[ --j ] > Pivot ) { }  /*scan from right*/
+            if ( i < j ) 
+                Swap( &A[ i ], &A[ j ] );  /*adjust partition*/
+            else break;  /*partition done*/
+        } 
+        Swap( &A[ i ], &A[ Right-1 ] ); /*restore pivot */ 
+        Qsort( A, Left, i-1 );    /*recursively sort left part*/
+        Qsort( A, i+1, Right );   /*recursively sort right part*/
+    }  /*end if - the sequence is long*/
+    else /*do an insertion sort on the short subarray*/ 
+        InsertionSort( A+Left, Right-Left+1 );
+}
+
+
+

Note : If set i = Left+1 and j = Right-2, there will be an infinite loop if A[i] = A[j] = pivot.

+

如果出现arr[i]=arr[j]=pivot情况,for循环将进入死循环,因为每次检查到arr[i]=pivot和arr[j]=pivot就会终止循环,并且i<j,相互交换,还都是pivot,无法终止。

+

​ 一个改进的方法就是,我们在每次swap之后,修改i和j的值,对i自加,对j自减,这种操作是可行的,因为当前i和j元素交换,满足i元素小于等于pivot,j元素大于等于pivot。改进如下:

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
   i = left + 1;  // 一开始就将i置为left+1
+        j = right - 2; // 一开始就将j置为right-2
+
+        for (;;)
+        {
+            while (arr[i] < pivot)
+            {
+                ++i;
+            }
+            while (arr[j] > pivot)
+            {
+                --j;
+            }
+            if (i < j)
+            {
+                swap(arr[i], arr[j]);
+                ++i; // 修改i
+                --j; // 修改j
+            }
+            else
+            {
+                break;
+            }
+        }
+
+
+

Analysis

+
\[ +T(N)=T(i)+T(N-i-1)+cN +\]
+
    +
  • +

    \(i\) is the number of the elements in \(S_1\).

    +
  • +
  • +

    The Worst Case + $$ + T(N)=T(N-1)+cN + $$

    +
  • +
+

$$ + T(N-1)=T(N-2)+c(N-1) + $$

+

$$ + \cdots + $$

+

$$ + T(2)=T(1)+2c + $$

+

$$ + T(N)=T(1)+c\sum^N_{i=2}i=O(N^2) + $$

+
    +
  • The Best Case + $$ + T(N)=2T(N/2)+cN + $$
  • +
+

$$ + \frac{T(N)}{N}=\frac{T(N/2)}{N/2}+c + $$

+

$$ + \frac{T(N/2)}{N/2}=\frac{T(N/4)}{N/4}+c + $$

+

$$ + \cdots + $$

+

$$ + \frac{T(2)}{2}=\frac{T(1)}{1}+c + $$

+

$$ + \frac{T(N)}{N}=\frac{T(1)}{1}+c\log N\frac{T(N)}{N}=\frac{T(1)}{1}+c\log N + $$

+

$$ + T(N)=cN\log N+N=O(N\log N) + $$

+
    +
  • +

    The Average Case

    +
  • +
  • +

    Assume the average value of \(T( i )\) for any \(i\) is \(\frac{1}{N}\left[\sum^{N-1}_{j=0}T(j)\right]\) + $$ + T(N)=\frac{2}{N}\left[\sum^{N-1}_{j=0}T(j)\right]+cN + $$

    +
  • +
+

$$ + NT(N)=2\left[\sum^{N-1}_{j=0}T(j)\right]+cN^2 + $$

+

$$ + (N-1)T(N-1)=2\left[\sum^{N-2}_{j=0}T(j)\right]+c(N-1)^2 + $$

+

$$ + NT(N)-(N-1)T(N-1)=2T(N-1)+2cN-c + $$

+

$$ + NT(N)=(N+1)T(N-1)+2cN + $$

+

$$ + \frac{T(N)}{N+1}=\frac{T(N-1)}{N}+\frac{2c}{N+1} + $$

+

$$ + \frac{T(N-1)}{N}=\frac{T(N-2)}{N-1}+\frac{2c}{N} + $$

+

$$ + \cdots + $$

+

$$ + \frac{T(2)}{3}=\frac{T(1)}{2}+\frac{2c}{3} + $$

+

$$ + \frac{T(N)}{N+1}=\frac{T(1)}{2}+2c\sum^{N+1}_{i=3}\frac{1}{i} + $$

+

$$ + T(N)=O(N\log N) + $$

+

Quickselect

+
    +
  • 查找第\(K\)最大(最小)元
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
/*Places the kth sma11est element in the kth position*/
+/*Because arrays start at 0, this will be index k-1*/
+void Qselect(ElementType A[ ], int k, int Left, int Right)
+{
+    int i, j;
+    ElementType Pivot;
+
+    if (Left + Cutoff <= Right)
+    {
+        Pivot = Median3(A, Left, Right);
+        i = Left; 
+        j = Right-1;
+        for( ; ; )
+        {
+            while(A[ ++i ] < Pivot){ }
+            while(A[ --j ] > Pivot){ }
+            if(i < j)
+                Swap(&A[ i ], &A[ j ]);
+            else
+                break;
+        }
+        Swap(&A[ i ], &A[ Right-1 ]); /*Restore pivot*/
+
+        if(k <= i)
+            Qselect(A, k, Left, i-1);
+        else if (k > i+1)
+            Qselect(A, k, i+1, Right);
+    }
+    else /*Doan insertion sort on the subarray*/
+        InsertionSort(A+Left, Right-Left+1);
+}
+
+

image-20210125115951471

+

正确答案是D

+
+

7.8 Sorting Large Structures

+
    +
  • Swapping large structures can be very much expensive.
  • +
  • Add a pointer field to the structure and swap pointers instead – indirect sorting. Physically rearrange the structures at last if it is really necessary.
  • +
  • Table Sort
  • +
+
+

7.9 A General Lower Bound for Sorting

+

[Theorem] Any algorithm that sorts by comparisons only must have a worst case computing time of \(\Omega(N\log N)\).

+
    +
  • When sorting \(N\) distinct elements, there are \(N!\) different possible resu lts.
  • +
  • Thus any decision tree must have at least \(N!\) leaves.
  • +
  • If the height of the tree is \(k\), then \(N! \leq 2^{k-1}\rarr k\geq\log(N!)+1\)
  • +
  • Since \(N!\geq (N/2)^{N/2}\) and \(\log_2N!\geq(N/2)\log_2(N/2) = \Theta(N\log_2N )\)
  • +
  • Therefore \(T(N)=k\geq c\cdot N\log_2 N\)
  • +
+
+

7.10 Bucket Sort

+

image-20201221203533117

+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
Algorithm
+{
+    initialize count[ ];
+    while(read in a student’s record)
+        insert to list count[stdnt.grade];
+    for(int i = 0; i < M; i++) 
+    {
+        if(count[i]) output list count[i];
+    }
+}
+
+
\[ +T(N,M)=O(M+N) +\]
+
+

7.11 Radix Sort

+

image-20201221203826847

+

image-20201221203950519

+
    +
  • \(T=O(P(N+B))\) where \(P\) is the number of passes, \(N\) is the number of elements to sort, and \(B\) is the number of buckets.
  • +
+

MSD(Most Significant Digit) Sort and LSD(Least Significant Digit) Sort

+

image-20210102211456822

+

image-20210102211604977

+

image-20210102211647809

+
+
    +
  • 稳定的排序算法:冒泡排序、插入排序、归并排序、基数排序
  • +
  • 不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK14/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK14/index.html" new file mode 100644 index 00000000..e5b0a44c --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK14/index.html" @@ -0,0 +1,4981 @@ + + + + + + + + + + + + + + + + + + + + + + + + + hasing linear probing separate chaining - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 14

+

8 Hashing

+

8.1 General Idea

+

image-20210102212103035

+

Symbol Table ADT

+
    +
  • Objects : A set of name-attribute pairs, where the names are unique
  • +
  • Operations :
  • +
  • SymTab Create(TableSize)
  • +
  • Boolean IsIn(symtab, name)
  • +
  • Attribute Find(symtab, name)
  • +
  • SymTab Insert(symtab, name, attr)
  • +
  • SymTab Delete(symtab, name)
  • +
+

Hash Tables

+

image-20210102212608844

+
    +
  • A collision occurs when we hash two nonidentical identifiers into the same bucket.
  • +
  • An overflow occurs when we hash a new identifier into a full bucket.
  • +
+
+

8.2 Hash Function

+
    +
  • \(f(x)\) must be easy to compute and minimize the number of collisions.
  • +
  • \(f(x)\) should be unbiased. For any \(x\) and any \(i\), we have that \(Probability(f(x)=i)=\frac{1}{b}\). Such kind of a hash function is called a uniform hash function.
  • +
+
+

8.3 Separate Chaining

+
    +
  • keep a list of all keys that hash to the same value
  • +
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
struct ListNode; 
+typedef struct ListNode *Position; 
+struct HashTbl; 
+typedef struct HashTbl *HashTable; 
+struct ListNode { 
+    ElementType Element; 
+    Position Next; 
+}; 
+typedef Position List; 
+/* List *TheList will be an array of lists, allocated later */ 
+/* The lists use headers (for simplicity), */ 
+/* though this wastes space */ 
+struct HashTbl { 
+    int TableSize; 
+    List *TheLists; 
+}; 
+
+

Create an empty table

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
HashTable InitializeTable( int TableSize ) 
+{   
+    HashTable H; 
+    int i; 
+    if ( TableSize < MinTableSize ) 
+    { 
+        Error( "Table size too small" );  
+        return NULL;  
+    } 
+    H = malloc( sizeof( struct HashTbl ) );  /*Allocate table*/
+    if ( H == NULL ) FatalError( "Out of space!!!" ); 
+    H->TableSize = NextPrime( TableSize );  /*Better be prime*/
+    H->TheLists = malloc( sizeof( List )* H->TableSize );  /*Array of lists*/
+    if ( H->TheLists == NULL ) FatalError( "Out of space!!!" );
+    H->TheList = malloc(H->TableSize*sizeof(struct ListNode));
+    for( i = 0; i < H->TableSize; i++ ) 
+    {   /*Allocate list headers*/
+        //H->TheLists[ i ] = malloc( sizeof( struct ListNode ) ); /* Slow! */
+        if ( H->TheLists[ i ] == NULL ) FatalError( "Out of space!!!" ); 
+        else H->TheLists[ i ]->Next = NULL;
+    } 
+    return H; 
+} 
+
+

Find a key from a hash table

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
Position Find ( ElementType Key, HashTable H ) 
+{ 
+    Position P; 
+    List L; 
+    L = H->TheLists[ Hash( Key, H->TableSize ) ]; 
+    P = L->Next; 
+    while( P != NULL && P->Element != Key )  /*Probably need strcmp*/ 
+        P = P->Next; 
+    return P; 
+} 
+
+

Insert a key into a hash table

+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
void Insert ( ElementType Key, HashTable H ) 
+{ 
+    Position Pos, NewCell; 
+    List L; 
+    Pos = Find( Key, H ); 
+    if ( Pos == NULL ) 
+    {   /*Key is not found, then insert*/
+        NewCell = malloc( sizeof( struct ListNode ) ); 
+        if ( NewCell == NULL ) FatalError( "Out of space!!!" ); 
+        else 
+        { 
+            L = H->TheLists[ Hash( Key, H->TableSize ) ]; /*Compute again is bad*/
+            NewCell->Next = L->Next; 
+            NewCell->Element = Key; /*Probably need strcpy!*/ 
+            L->Next = NewCell; 
+        } 
+    } 
+} 
+
+
+

Note : Make the TableSize about as large as the number of keys expected (i.e. to make the loading density factor \(\lambda\approx\)1).

+
+
+

8.4 Open Addressing

+
    +
  • find another empty cell to solve collision(avoiding pointers)
  • +
+
Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
Algorithm: insert key into an array of hash table
+{
+    index = hash(key);
+    initialize i = 0 ------ the counter of probing;
+    while (collision at index) 
+    {
+        index = (hash(key)+f(i))%TableSize; /*f(i) is collision resolving function*/
+        if (table is full) break;
+        else i++;
+    }
+    if (table is full) ERROR (“No space left”);
+    else insert key at index;
+}
+
+
+

Note : Generally \(\lambda<0.5\).

+
+

Linear Probing

+
    +
  • \(F(i)\) is a linear function of \(i\), such as \(F(i)=i\).
  • +
  • 逐个探测每个单元(必要时可以绕回)以查找出一个空单元
  • +
  • 使用线性探测的预期探测次数对于插入和不成功的查找来说大约是\(\frac{1}{2}(1+\frac{1}{(1-\lambda)^2})\),对于成功的查找来说是\(\frac{1}{2}(1+\frac{1}{1-\lambda})\)
  • +
  • Cause primary clustering : any key that hashes into the cluster will add to the cluster after several attempts to resolve the collision.
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK15/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK15/index.html" new file mode 100644 index 00000000..b3179512 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/DS WEEK15/index.html" @@ -0,0 +1,4866 @@ + + + + + + + + + + + + + + + + + + + + + + + + + rehashing quadratic probing - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

WEEK 15

+

Quadratic Probing

+
    +
  • \(F(i)\) is a quadratic function of \(i\), such as \(F(i)=i^2\).
  • +
+
[Theorem] If quadratic probing is used, and the table size is prime, then a new element can always be inserted if the table is at least half empty.
+

image-20210104154133711

+
+

Note : If the table size is a prime of the form \(4k + 3\), then the quadratic probing \(f(i) = \pm i^2\) can probe the entire table.

+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
HashTable InitializeTable(int TableSize)
+{
+    HashTable H;
+    int i;
+    if(TableSize < MinTableSize)
+    {
+        Error("Table size too small");
+        return NULL;
+    }
+    /*Allocate table*/
+    H = malloc(sizeof(struct HashTbl));
+    if(H == NULL)
+        Fatal Error("Out of space!!!");
+    H->TableSize = NextPrime(TableSize);
+
+    /*Allocate array of Cells*/
+    H->TheCells = malloc(sizeof(Cell)*H->TableSize);
+    if(H->TheCells == NULL)
+        FatalError("Out of space!!!");
+
+    for(i = 0; i < H->TableSize; i++)
+        H->TheCells[ i ].Info = Empty;
+    return H;
+}
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
Position Find(ElementType Key, HashTable H) 
+{   
+    Position CurrentPos; 
+    int CollisionNum; 
+    CollisionNum = 0; 
+    CurrentPos = Hash(Key, H->TableSize); 
+    while(H->TheCells[ CurrentPos ].Info != Empty &&
+          H->TheCells[ CurrentPos ].Element != Key) 
+    { 
+        CurrentPos += 2*++CollisionNum-1; 
+        if (CurrentPos >= H->TableSize)  
+            CurrentPos -= H->TableSize;   /*Faster than mod*/
+    } 
+    return CurrentPos; 
+} 
+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
void Insert(ElementType Key, HashTable H) 
+{ 
+    Position Pos; 
+    Pos = Find(Key, H); 
+    if (H->TheCells[ Pos ].Info != Legitimate) 
+    { /*OK to insert here*/ 
+        H->TheCells[ Pos ].Info = Legitimate; 
+        H->TheCells[ Pos ].Element = Key; /*Probably need strcpy*/ 
+    } 
+} 
+
+
+

Note :

+
    +
  • Insertion will be seriously slowed down if there are too many deletions intermixed with insertions.
  • +
  • Although primary clustering is solved, secondary clustering occurs, that is, keys that hash to the same position will probe the same alternative cells.
  • +
+
+

Double Hashing

+
    +
  • \(f(i)=i*hash_2(x)\)
  • +
  • \(hash_2(x)\not\equiv 0\)
  • +
  • make sure that all cells can be probed
  • +
  • \(hash_2(x)=R-(x\%R)\) with \(R\) a prime smaller than TableSize, will work well.
  • +
+
+

Note :

+
    +
  • If double hashing is correctly implemented, simulations imply that the expected number of probes is almost the same as for a random collision resolution strategy.
  • +
  • Quadratic probing does not require the use of a second hash function and is thus likely to be simpler and faster in practice.
  • +
+
+
+

8.5 Rehashing

+
    +
  • Build another table that is about twice as big.
  • +
  • Scan down the entire original hash table for non-deleted elements.
  • +
  • Use a new function to hash those elements into the new table.
  • +
  • When to rehash
  • +
  • As soon as the table is half full
  • +
  • When an insertion fails
  • +
  • When the table reaches a certain load factor
  • +
+
+

Note : Usually there should have been N/2 insertions before rehash, so O(N) rehash only adds a constant cost to each insertion. However, in an interactive system, the unfortunate user whose insertion caused a rehash could see a slowdown.

+
+
C
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
HashTable Rehash(HashTable H)
+{
+    int i, OldSize;
+    Cell *OldCells;
+    OldCells = H->TheCells;
+    OldSize = H->TableSize;
+
+    /*Get a new, empty table*/
+    H = InitializeTable(2*OldSize);
+    /*Scan through old table, reinserting into new*/
+    for(i = 0; i < OldSize; i++)
+        if(OldCells[i].Info == Legitimate)
+            Insert(OldCells[i].Element, H);
+    free(OldCells);
+
+    return H;
+}
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/LICENSE" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/LICENSE" new file mode 100644 index 00000000..8d47b316 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/LICENSE" @@ -0,0 +1,64 @@ +CC-BY-NC-ND license +Attribution-NonCommercial-NoDerivs 3.0 United States + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with one or more other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + "Licensor" means the individual, individuals, entity or entities that offers the Work under the terms of this License. + "Original Author" means the individual, individuals, entity or entities who created the Work. + "Work" means the copyrightable work of authorship offered under the terms of this License. + "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; and, + to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Derivative Works. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(d) and 4(e). + +4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of a recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. When You distribute, publicly display, publicly perform, or publicly digitally perform the Work, You may not impose any technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by Section 4(c), as requested. + You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + If You distribute, publicly display, publicly perform, or publicly digitally perform the Work (as defined in Section 1 above) or Collective Works (as defined in Section 1 above), You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collective Work, at a minimum such credit will appear, if a credit for all contributing authors of the Collective Work appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this clause for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + For the avoidance of doubt, where the Work is a musical composition: + Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect whether individually or, in the event that Licensor is a member of a performance rights society (e.g. ASCAP, BMI, SESAC), via that society, royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. + Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collective Works (as defined in Section 1 above) from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + Each time You distribute or publicly digitally perform the Work (as defined in Section 1 above) or a Collective Work (as defined in Section 1 above), the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. + +Creative Commons may be contacted at https://creativecommons.org/. diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/2-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/2-1.png" new file mode 100644 index 00000000..085cca90 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/2-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/2-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/2-2.png" new file mode 100644 index 00000000..4d6a4b46 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/2-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JheW5vckZURA==,size_16,color_FFFFFF,t_70.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JheW5vckZURA==,size_16,color_FFFFFF,t_70.png" new file mode 100644 index 00000000..a7e65178 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JheW5vckZURA==,size_16,color_FFFFFF,t_70.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/index.html" new file mode 100644 index 00000000..455c14d6 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/index.html" @@ -0,0 +1,4624 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 写在前面 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Notes for Data Structure

+

Stars +Forks +repo-size +Contributors

+

This is my personal notes for The Foundation of Data Structure course in Zhejiang University.

+

Since it’s the first time I’ve learned data structure systematically, I wish I could detail the information which will make it easier for me to review in the future.

+

Also hope that my notes can help someone else a little bit.

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-1.png" new file mode 100644 index 00000000..c3dfeb99 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-2.png" new file mode 100644 index 00000000..e08e8f9d Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-3.png" new file mode 100644 index 00000000..bbcca68c Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/1-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-1.png" new file mode 100644 index 00000000..085cca90 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-2.png" new file mode 100644 index 00000000..4d6a4b46 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-3.png" new file mode 100644 index 00000000..3c3e19e7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/2-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-1.png" new file mode 100644 index 00000000..34f5d557 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-2.png" new file mode 100644 index 00000000..0d0239e3 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-3.png" new file mode 100644 index 00000000..d08eba18 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-4.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-4.png" new file mode 100644 index 00000000..f1b3e89a Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/3-4.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-1.png" new file mode 100644 index 00000000..fd2be340 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-2.png" new file mode 100644 index 00000000..2890eae4 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-3.png" new file mode 100644 index 00000000..1456eb67 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-4.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-4.png" new file mode 100644 index 00000000..8938cb08 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/4-4.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/5-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/5-1.png" new file mode 100644 index 00000000..f89e2081 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/5-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/6-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/6-1.png" new file mode 100644 index 00000000..46ef6328 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/6-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/6-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/6-2.png" new file mode 100644 index 00000000..03545bd3 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/6-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-1.png" new file mode 100644 index 00000000..5c29a4df Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-2.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-2.png" new file mode 100644 index 00000000..c3f6d641 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-2.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-3.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-3.png" new file mode 100644 index 00000000..470c9ade Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/7-3.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/8-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/8-1.png" new file mode 100644 index 00000000..bf91df52 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/8-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/9-1.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/9-1.png" new file mode 100644 index 00000000..6d76949a Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/9-1.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201206175230349.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201206175230349.png" new file mode 100644 index 00000000..c669e428 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201206175230349.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201207194401819.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201207194401819.png" new file mode 100644 index 00000000..6e505d8f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201207194401819.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201207194413257.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201207194413257.png" new file mode 100644 index 00000000..9e6e4bfe Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201207194413257.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201208110403641.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201208110403641.png" new file mode 100644 index 00000000..6c92a67f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201208110403641.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201208110506092.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201208110506092.png" new file mode 100644 index 00000000..66efe63f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201208110506092.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201214133747061.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201214133747061.png" new file mode 100644 index 00000000..83265b6d Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201214133747061.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203533117.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203533117.png" new file mode 100644 index 00000000..21b49e03 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203533117.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203826847.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203826847.png" new file mode 100644 index 00000000..b1c431fc Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203826847.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203950519.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203950519.png" new file mode 100644 index 00000000..c843528e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20201221203950519.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211456822.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211456822.png" new file mode 100644 index 00000000..233565fa Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211456822.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211604977.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211604977.png" new file mode 100644 index 00000000..ab154bcc Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211604977.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211647809.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211647809.png" new file mode 100644 index 00000000..8f0eeaeb Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102211647809.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102212103035.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102212103035.png" new file mode 100644 index 00000000..8c3782ac Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102212103035.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102212608844.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102212608844.png" new file mode 100644 index 00000000..4c2de4ba Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210102212608844.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210104154133711.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210104154133711.png" new file mode 100644 index 00000000..a9285333 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210104154133711.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210123194735917.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210123194735917.png" new file mode 100644 index 00000000..d927b70e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210123194735917.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163038265.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163038265.png" new file mode 100644 index 00000000..48f4b54e Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163038265.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163301833.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163301833.png" new file mode 100644 index 00000000..f74632db Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163301833.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163324744.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163324744.png" new file mode 100644 index 00000000..90170dca Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163324744.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163641976.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163641976.png" new file mode 100644 index 00000000..0ee31332 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124163641976.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124164607434.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124164607434.png" new file mode 100644 index 00000000..fa48eb8c Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124164607434.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124164723362.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124164723362.png" new file mode 100644 index 00000000..43663053 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124164723362.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124165346405.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124165346405.png" new file mode 100644 index 00000000..e3ed91c5 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124165346405.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185420522.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185420522.png" new file mode 100644 index 00000000..a21aa907 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185420522.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185508683.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185508683.png" new file mode 100644 index 00000000..32787e2f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185508683.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185541801.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185541801.png" new file mode 100644 index 00000000..86501bf7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124185541801.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124214008496.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124214008496.png" new file mode 100644 index 00000000..52bfde08 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210124214008496.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125070700824.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125070700824.png" new file mode 100644 index 00000000..87f4fa15 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125070700824.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125115951471.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125115951471.png" new file mode 100644 index 00000000..c3a8a729 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125115951471.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125151728720.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125151728720.png" new file mode 100644 index 00000000..9236af61 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/2 \346\225\260\346\215\256\347\273\223\346\236\204/webnotes/picture/image-20210125151728720.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/DIP/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/DIP/index.html" new file mode 100644 index 00000000..c95a0202 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/DIP/index.html" @@ -0,0 +1,4828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + DIP - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

图像信息处理

+

课程学习内容

+

教授内容以图像基本概念、基本操作为基础,围绕图像合成与编辑核心,并介绍了当前数字图像处理的现状、发展和一些关键技术。 主要知识点为:

+
    +
  • 图像获取
  • +
  • 图像显示和打印
  • +
  • 图像存储和传输
  • +
  • 图像增强和恢复
  • +
  • 图像识别和理解
  • +
+

分数构成

+

卷面(60%)+ 作业(40%)

+

一学期大概会有 5~7 次作业,要使用 C/C++ 编程,不可调用 OpenCV 等图形处理库。

+

矢量图格式

+

BITMAPFILEHEADER

+

BITMAPINFOHEDER

+

morphing 变形、映射

+

bilateral filter 双边滤波

+

guided filter

+

数字图像基本处理——空间滤波(spatial filtering) - Bracer - 博客园 (cnblogs.com)

+

Chapter 1 Basic concept and programming introduction

+

图像信息处理的应用: image retrieval, scene classification

+

Object recognition: face detection

+

Interactive image retrieval: Mindfinder-> 根据sketch和附加的prompt(颜色,文本)来找网上的图片

+

▪Grayscale image and color image representation

+

▪Color space transfer

+

▪Image format

+

image-20240106114157123

+

image-20240106115620257

+

image-20240106115756758

+

▪Data structure of image: some typical ones

+

▪Programming for image processing

+

▪An image in computer: array(s)

+

▪Image file: its format and read/write

+

▪Access DIB: some Windows APIs

+

▪An image processing example for VC++

+

▪Image processing in Matlab: some typical instructions

+

▪Popular image processing softwares

+

光圈的大小与景深有密切关系

+

对于给定的主体取景和相机位置,DOF 受镜头光圈直径的控制,光圈直径通常指定为 f 数,即镜头焦距与光圈直径的比值。减小光圈直径(增大 f 值)可以增大景深;但同时也会减小透射光的数量,并增加衍射,这就对通过减小光圈直径来增大景深的程度施加了实际限制。

+

焦点前后各有一个容许弥散圆,他们之间的距离叫做景深。景深随镜头的焦距、光圈值、拍摄距离而变化

+

](1)、镜头光圈: + 光圈越大,景深越小;光圈越小,景深越大; + (2)、镜头焦距 + 镜头焦距越长,景深越小;焦距越短,景深越大; + (3)、拍摄距离 + 距离越远,景深越大;距离越近,景深越小

+

For a given subject framing and camera position, the DOF is controlled by the lens aperture diameter, which is usually specified as the f-number, the ratio of lens focal length to aperture diameter. Reducing the aperture diameter (increasing the f-number) increases the DOF; however, it also reduces the amount of light transmitted, and increases diffraction, placing a practical limit on the extent to which DOF can be increased by reducing the aperture diameter.

+

对于给定的主体取景和相机位置,景深受镜头光圈直径的控制,光圈直径通常指定为 f 数,即镜头焦距与光圈直径的比值。减小光圈直径(增大 f 值)可以增大景深;但同时也会减小透射光的数量,并增加衍射,这就对通过减小光圈直径来增大景深的程度施加了实际限制。

+

Chapter 2 •Binary image and morphology

+

–Binary image

+

–How to obtain a binary image: binarization

+

–Image morphological operation

+

–Definition of ‘set’

+

–Erosion

+

–Dilation

+

–‘Open’ operation

+

–‘Close’ operation

+

–Hit-or-miss transform

+

Chapter 3 •Basic operations on image (I)

+

–Grayscale image transform

+

•Visibility of image

+

•Visibility enhancement: Logarithm

+

•Histogram of image

+

•Histogram equalization

+

•Etc.

+

Chapter 4 •Basic operations on image(II)

+

–Simple geometric transform

+

旋转

+

–Interpolation

+

–Application

+

Chapter 5 •Image morphing

+

–Image morphing basic

+

–Static morphing

+

–Dynamic morphing

+

–Feature point based morphing

+

–Grid based morphing

+

这里讨论的Morph变形不同于一般的几何变换(Warp)。

+

Morph变形指景物的形体变化,它是使一幅图像逐步变化到另一幅图像的处理方法。

+

这是一种较复杂的二维图像处理,需要对各像素点的颜色、位置作变换。

+

变形的起始图像和结束图像分别为两幅关键帧,从起始形状变化到结束形状的关键在于自动地生成中间形状,也即自动生成中间帧。

+

大小相同的两幅图的转换作静态变换。从一幅图a逐渐变化成第二幅图b。

+

原理:让图a中每个像素的颜色,逐渐变成图b相同位置像素的颜色。

+

方法:根据变换的快慢,设置相应的步长,将图a每一点的RGB逐渐变成图b相同位置象素的RGB。可以选择等比或等差的方式,或其它方式让:ra-->rb。

+

对于灰度图像,可以直接用等比或等差级数定义步长,使颜色从原图变到目标图。

+

基于特征点的变形

+

基于特征点的变形涉及识别两幅原始图像中的特定特征或标志,例如面部变形时脸部的关键点。这些特征点被用作变形过程的参考点,确保在转换过程中保留重要的视觉元素。

+

基于网格的变形

+

基于网格的变形,也称为基于格的变形,将图像分成网格或格点。这些点作为控制顶点,可以被操纵以使图像发生变形。通过平滑地插值这些网格点的移动,从第一幅图像到第二幅图像,实现了图像的变形,使得变形更加灵活和详细。

+

总之,图像变形涉及通过一系列中间图像将一幅图像转换成另一幅图像。静态变形关注单一、静态的转换,而动态变形考虑了时间上的转换。基于特征点的变形依赖于特定的标志来进行变形,而基于网格的变形使用一系列点来进行更加灵活和详细的变形。每种方法都提供了独特的方式来实现视觉上引人注目的图像转换。

+

Chapter 6 •Image convolution

+

–1-D convolution

+

–Property of convolution

+

–Discrete convolution

+

Chapter 7 •Image filtering

+

–Smoothing

+

–Sharpening

+

–Bilateral filter

+

–Guided filter (Optional)

+

去除噪音 image smoothing

+

高斯模糊

+

Split an image into:

+

large-scale features, structure

+

small-scale features, texture

+

bilateral filtering:

+

An image has two main characteristics

+

▪The space domain S, which is the set of possible positions in an image. This is related to the resolution, i.e., the number of rows and columns in the image.

+

▪The intensity domain R, which is the set of possible pixel values. The number of bits used to represent the pixel value may vary. Common pixel representations are unsigned bytes (0 to 255) and floating point.

+

Every sample is replaced by a weighted average of its neighbors,

+

These weights reflect two forces

+

▪How close are the neighbor and the center sample, so that larger weight to closer samples,

+

▪How similar are the neighbor and the center sample – larger weight to similar samples.

+

All the weights should be normalized to preserve the local mean.

+

回顾高斯模糊的问题:确实使图片更平滑了,但是没有保留边缘信息,

+

Does smooth images But smooths too much: edges are blurred.

+

▪Only spatial distance matters

+

▪No edge term

+

Space and Intensity Parameters

+

◼space \(\sigma_s\) : spatial extent of the kernel, size of the considered neighborhood.

+

◼intensity \(\sigma_r\) : amplitude extent of an edge

+

image-20240106101913583

+

\(\sigma_{r}\)趋于无穷,就是高斯模糊(整个图都考虑,相当于没考虑)

+

\(\sigma_{s}\)变大的时候边界内部的纹理被模糊的程度加深,但边界被保留

+

选择参数取决于应用场景

+

For instance:

+

space parameter: proportional to image size e.g., 2% of image diagonal

+

intensity parameter: proportional to edge amplitude

+

e.g., mean or median of image gradients independent of resolution and exposure

+

图像灰度梯度的中位数/平均数受极端情况影响较小,能够反映图像整体边缘纹理特征的强烈程度,不受分辨率和曝光程度影响

+

降噪选择小的spatial \(\sigma_{s}\)不用加速操作,Adapt intensity sigma \(\sigma_{s}\) to noise level

+

导向滤波:guided filtering 输入一个guided image

+

解决gradient reversal的问题

+

在导向滤波(guided filtering)中,导向图像(guided image)通常是从输入图像中得到的。导向图像用于指导滤波器以更好地保留图像的细节和边缘信息。

+

一种常见的方法是使用输入图像本身作为导向图像。这意味着在进行滤波时,输入图像的某个版本(通常是平滑版本)被用作自身的引导。这种方法有助于确保在进行滤波时保留原始图像中的细节和结构。

+

另一种方法是通过使用与输入图像相关的其他信息来生成导向图像。例如,可以使用输入图像的梯度信息或者其他相关图像的信息作为导向图像,以便在滤波过程中更好地保留特定的细节和结构。

+

总的来说,导向图像的获取方式取决于具体的应用场景和对图像细节保留的要求。

+

Lab 1

+

◼Read a color bmp;

+

◼RGB->YUV;

+

◼Color to gray: gray=Y in YUV color space;

+

◼Rearrange gray intensity to lie between [0,255];

+

◼Write a grayscale bmp;

+

◼Change the luminance value Y;

+

◼YUV->RGB;

+

◼Write a color bmp.

+

图像文件头,信息头格式,读写操作

+

图像增强技术

+

Chapter 8 •Fourier transform

+

–Fourier and his work

+

–Background of Fourier transform

+

–Fourier transform

+

–Discrete Fourier transform (1D)

+

–FFT

+

–FFT in Matlab

+

–2D Fourier transform

+

Chapter 9 •Image feature

+

–SIFT

+

–SURF

+

–Deep feature

+

引入卷积神经网络(CNN)可以大规模减少权重参数训练量的主要原因如下:

+
    +
  1. 参数共享:在CNN中,卷积层使用参数共享的方式进行特征提取。这意味着卷积核在整个输入图像上滑动,通过同样的权重进行特征提取。这种共享权重的方式大大减少了需要训练的参数数量。例如,对于一个3x3的卷积核,在输入图像的不同位置使用的权重是相同的,因此参数的数量大大减少了。
  2. +
  3. 稀疏连接:在传统的全连接神经网络中,每个神经元都与上一层的所有神经元相连,导致参数数量巨大。相比之下,CNN中的卷积层只与输入的局部区域相连接,通过卷积操作实现特征提取,这样的稀疏连接方式也大大减少了参数数量。
  4. +
  5. 平移不变性:图像中的物体通常不依赖于其绝对位置,而是依赖于其相对位置。卷积操作可以捕捉到平移不变性,即学习到的特征对于图像中的不同位置都是有效的。这种特性减少了需要训练的参数数量,因为相同的特征可以在不同位置共享相同的权重。
  6. +
+

综上所述,引入CNN可以通过参数共享、稀疏连接和平移不变性等特性,大规模减少权重参数训练量,从而使得神经网络在处理图像等二维数据时更加高效。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/Scale Invariant Detector/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/Scale Invariant Detector/index.html" new file mode 100644 index 00000000..a54a3089 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/Scale Invariant Detector/index.html" @@ -0,0 +1,4692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 尺度不变性检测器 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Scale Invariant Feature Transform

+

对于每个不同尺度的图片,还是使用harris corner detector 来检测可能的特殊点

+

在不同尺度上检查特殊点,使用Laplace算子,也就是两个二次偏导和的形式,这个值产生峰值的地方,且在不同大小的图片中产生峰值的地方就是特殊点blob可能出现的位置

+

DoG:difference of guassian:高斯函数的差分值

+

Maxima and minima

+

Compare x with its 26 neighbors at 3 scales

+

基本思想

+
    +
  • 在检测到的特征角点周围选取 16×16 的方形窗口
  • +
  • 计算每个像素的边的朝向(梯度的角度- 90°)
  • +
  • 剔除弱边缘(小于阈值梯度幅度)
  • +
  • 创建剩下边的方向的直方图
  • +
+

img

+

img

+

完整版:

+
    +
  • 将 16×16 的窗口 划分为 4×4 的网格
  • +
  • 对每个网格计算其方向直方图
  • +
  • 16 cells * 8 orientations = 128 dimensional descriptor(128 维向量)
  • +
+

SIFT Feature

+
    +
  • Descriptor 128-D
  • +
  • +
  • 可以通过去掉光照变化带来的影响
  • +
  • 位置 (�,�)
  • +
  • 尺度,控制特征提取的覆盖范围
  • +
  • 方向,实现旋转不变的 descriptor
  • +
+

SIFT 特征可以对图像进行分类 +Bag of visual words 提取SIFT特征,将特征做一个聚类(kmeans),将每个聚类中心称为 visual word 视觉单词

+

Conclusion of SIFT

+
    +
  • 优点
  • +
  • 期望在比例、旋转、光照等变化中的不变性。
  • +
  • 局部 patch 具有很强的区分性和表征能力。
  • +
  • 在刚性对象表示上非常有效。
  • +
  • 缺点
  • +
  • 提取耗时 + 对于大小为400 * 400的图像,平均需要1秒。
  • +
  • 对非刚性物体性能较差。 + 如人脸、动物等。
  • +
  • 在严重的仿射失真下可能无法工作。 + 局部补丁是一个圆,而不是一个椭圆调整到仿射失真。
  • +
+

创建直方图的作用是为了对关键点周围的梯度方向进行统计,以便后续确定关键点的主导方向。这种方向直方图的创建有助于实现SIFT算法的方向不变性,具体包括以下步骤:

+
    +
  1. 方向信息统计:通过将关键点周围的像素根据其梯度方向分配到对应的方向区间内,并对该区间内的计数进行累加,可以得到该区间内梯度方向的统计信息。
  2. +
  3. 主导方向选择:通过分析这些统计信息,SIFT算法会选择在方向直方图中具有最大累加计数的方向作为该关键点的主导方向。这样做的目的是为了确保描述符能够相对于主导方向进行归一化,以实现旋转不变性。
  4. +
  5. 描述符计算:在后续计算关键点的描述符时,会相对于主导方向对梯度方向进行调整,以确保描述符对于旋转的变化是不变的。这意味着无论图像如何旋转,描述符都能够在旋转后正确匹配。
  6. +
+

通过这种方向直方图的创建和主导方向的选择,SIFT算法实现了对于图像局部特征的方向不变性,使得检测到的关键点能够在一定程度上抵抗图像的旋转变换。

+

SURF相比SIFT的进步之处在于以下几个方面:

+
    +
  1. 计算速度:SURF使用积分图像(Integral Image)进行快速计算,这使得特征点检测和描述符计算的速度得到显著提高。相比之下,SIFT算法中使用高斯金字塔进行图像尺度空间的变换,计算量较大,因此在速度上不如SURF。
  2. +
  3. 描述符计算:SURF使用盒状滤波器(Box Filter)来近似高斯差分滤波器,这简化了描述符计算的复杂度,使得SURF的特征描述符计算更加高效。
  4. +
  5. 维度低, 只用 64 维特征
  6. +
  7. 在均匀、渐变、只有一条边的图像上 SIFT 无法分辨,但 SURF 可以
  8. +
  9. 带噪声会使 SIFT 特征凌乱,对 SURF 几乎没有影响
  10. +
+

关于Integral Image 允许我们对滤波器进行上采样而不是对图像进行下采样的意思是,积分图像的使用允许我们通过对滤波器进行上采样来实现尺度不变性,而不是像SIFT那样通过对图像进行下采样来实现尺度不变性。这种方法使得算法更快速,因为上采样可以通过积分图像直接实现,而无需对原始图像进行复杂的操作。

+

至于为什么SURF需要计算二阶导数,这是因为SURF中的描述符计算涉及对Hessian矩阵的计算,而Hessian矩阵包括二阶导数信息,这对于确定特征点的局部特征形状非常重要。

+

接下来,对于9x9滤波器的情况,l0 = 3 表示在导数方向上正负半轴的长度。为了保持中心像素,必须至少增加2个像素,因此必须将 l0 增加至少2个像素,这意味着需要增加6个像素的滤波器维度。因此,滤波器的尺寸为:9x9, 15x15, 21x21, 27x27。

+

这些内容的具体含义是,SURF算法通过使用积分图像实现了对滤波器的上采样,从而实现了尺度不变性,同时利用二阶导数信息来计算特征点的局部特征形状,这些都是SURF相对于SIFT的改进之处。

+

Hessian矩阵在图像处理中扮演着重要的角色,特别是在特征检测和特征描述方面。其作用主要体现在以下两个方面:

+
    +
  1. 特征点检测:Hessian矩阵可以用来检测图像中的角点或者边缘等局部特征。通过计算Hessian矩阵的特征值,可以判断局部图像区域的曲率,从而找到潜在的关键点位置。在这种情况下,Hessian矩阵的特征值能够指示出图像区域的变化情况,帮助确定图像中的关键点。
  2. +
  3. 特征描述:在特征点确定后,Hessian矩阵也可以用来计算描述该特征点周围区域的形状信息。这种形状信息对于后续的特征匹配和识别非常重要,因为它能够帮助区分不同的特征点,并提供更加丰富的特征描述信息。
  4. +
+

至于为什么要进行插值,这是因为在实际图像中,特征点的位置通常不会精确地落在像素的中心点上,而是落在像素之间的某个位置。为了更准确地计算Hessian矩阵,需要对局部图像区域进行插值,以便在子像素级别上计算梯度和曲率信息。通过插值,可以更精确地估计局部特征点的梯度和曲率,从而提高特征点检测和描述的精度。

+

Harris角点检测算法使用Hessian矩阵的特征值来判断图像中的角点。在该算法中,使用λ1和λ2中的较小值作为检测依据的原因如下:

+
    +
  1. Sensitivity to Edges:Harris角点检测算法旨在检测角点,而不是边缘。边缘通常具有一个特征值远远大于另一个特征值的Hessian矩阵。因此,通过选择较小的特征值,可以确保检测到的特征更可能代表角点而非边缘。
  2. +
  3. Local Image Structure:在角点周围的图像区域,特征值λ1和λ2的大小与图像局部结构的变化有关。较小的特征值通常对应着图像中的变化较小的方向。因此,选择较小的特征值有助于捕捉局部结构的变化,这正是角点所具有的特性。
  4. +
  5. Noise Robustness:选择较小的特征值还可以增强算法对噪声的鲁棒性。在受到噪声影响时,较小的特征值更不容易受到干扰,因此能够更可靠地反映图像局部的角点结构。
  6. +
+

综上所述,Harris角点检测中使用λ1和λ2的较小值作为检测依据,主要是为了确保检测到的特征更可能代表角点而非边缘,同时提高算法对噪声的鲁棒性,并捕捉局部结构的变化。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/202212162013160.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/202212162013160.png" new file mode 100644 index 00000000..9c0f5ae9 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/202212162013160.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/202212162013746.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/202212162013746.png" new file mode 100644 index 00000000..125e5939 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/202212162013746.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/2023-11-30.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/2023-11-30.png" new file mode 100644 index 00000000..82fa5800 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/2023-11-30.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/539bc8392654f31ba8aa83d9024d0fec.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/539bc8392654f31ba8aa83d9024d0fec.png" new file mode 100644 index 00000000..5e389b02 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/539bc8392654f31ba8aa83d9024d0fec.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106101913583.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106101913583.png" new file mode 100644 index 00000000..3eebe89b Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106101913583.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106114157123-1704512519246-4.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106114157123-1704512519246-4.png" new file mode 100644 index 00000000..7741d7c7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106114157123-1704512519246-4.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106114157123.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106114157123.png" new file mode 100644 index 00000000..7741d7c7 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106114157123.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115501544.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115501544.png" new file mode 100644 index 00000000..b217c86c Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115501544.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115620257.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115620257.png" new file mode 100644 index 00000000..bfc6c192 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115620257.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115756758.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115756758.png" new file mode 100644 index 00000000..afe8024f Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240106115756758.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110145317828.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110145317828.png" new file mode 100644 index 00000000..149acb16 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110145317828.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110145422395.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110145422395.png" new file mode 100644 index 00000000..62add6f0 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110145422395.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110150241570.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110150241570.png" new file mode 100644 index 00000000..9618b2b8 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110150241570.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110150337848.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110150337848.png" new file mode 100644 index 00000000..9c8b5d21 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110150337848.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110153910399.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110153910399.png" new file mode 100644 index 00000000..19019c11 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110153910399.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110160214325.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110160214325.png" new file mode 100644 index 00000000..a1efe3ce Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110160214325.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110160243700.png" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110160243700.png" new file mode 100644 index 00000000..5ab2e3d1 Binary files /dev/null and "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/assets/image-20240110160243700.png" differ diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/gauss filtering medium filtering/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/gauss filtering medium filtering/index.html" new file mode 100644 index 00000000..a78e59d7 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/gauss filtering medium filtering/index.html" @@ -0,0 +1,4633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 高斯/中值滤波 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

高斯滤波和中值滤波

+

SNF sparse norm filtering

+

高斯滤波、均值滤波和中值滤波是常见的图像滤波技术,它们在图像处理中有不同的应用场景和效果特点。

+
    +
  1. 高斯滤波:
  2. +
  3. 原理: 高斯滤波使用一个高斯核对图像进行卷积,核的中心具有最高的权重,周围的权重逐渐减小,形成一个高斯分布。这种权重分布有助于平滑图像,同时保留边缘。
  4. +
  5. 效果特点: 高斯滤波主要用于去除图像中的高频噪声,同时能够在一定程度上保留图像的边缘。它对于平滑图像整体结构效果较好。
  6. +
  7. 均值滤波:
  8. +
  9. 原理: 均值滤波使用一个平均权重的核对图像进行卷积,核中的每个权重都相等。这样的平均操作有助于去除噪声,但也可能导致图像的模糊。
  10. +
  11. 效果特点: 均值滤波适用于去除图像中的均匀噪声,但在平滑过程中可能会损失一些图像的细节信息。它对于一些简单场景的噪声去除效果较好。
  12. +
  13. 中值滤波:
  14. +
  15. 原理: 中值滤波使用一个滑动窗口,在窗口中取中值作为当前像素的值。这种操作对于去除椒盐噪声等离群值非常有效。
  16. +
  17. 效果特点: 中值滤波在处理图像中的椒盐噪声等离群值时表现出色,能够有效地保留图像的细节。但对于高斯噪声等均匀噪声效果相对较差。
  18. +
+

image-20240110160243700

+

p=2时为均值滤波,p=1时是中值滤波

+

p值足够小:能够保边

+

HDR compression

+

保证梯度不会逆转

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\217\214\350\276\271\346\273\244\346\263\242 bilateral filtering/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\217\214\350\276\271\346\273\244\346\263\242 bilateral filtering/index.html" new file mode 100644 index 00000000..40a82b6b --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\217\214\350\276\271\346\273\244\346\263\242 bilateral filtering/index.html" @@ -0,0 +1,4677 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 双边滤波 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

双边滤波原理

+

Bilateral filtering

+

能够保边,但不能保方向

+

存在梯度逆转问题

+

image-20240110145317828

+

image-20240110145422395

+

sigma s 一般设为图像对角线的2%这么大 +sigma r 一般设为gradient的均值或中位值?

+

the halo nightmare

+

HDR压缩到标准动态范围

+

通过感受野压缩图像 从低到高

+

residual 感受野的大小带来的残差

+

高频,低频

+

使用信号处理方式快速近似双边滤波

+

双边滤波加速算法 Fast Bilateral Filter - 知乎 (zhihu.com)

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2671/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2671/index.html" new file mode 100644 index 00000000..6aef49a1 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2671/index.html" @@ -0,0 +1,4709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 回忆卷1 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

课程共享计划 回忆卷1

+
    +
  1. +

    简述光圈和景深的关系;相机是如何调整光圈的;简述数码相机的原理。

    +
  2. +
  3. +

    光圈和景深的关系:

    +
      +
    • 光圈(Aperture): 指的是相机镜头中的光圈孔径的大小。光圈的大小通常用f值表示,例如f/2.8、f/4等,其中较小的f值表示较大的光圈,而较大的f值表示较小的光圈。
    • +
    • 景深(Depth of Field,DOF): 是指一张照片中被视为清晰的区域。较大的景深意味着照片中更多的区域都是清晰的,而较小的景深则使得只有一小部分区域是清晰的。
    • +
    • 关系: 光圈的大小直接影响景深。较大的光圈(小f值)产生较小的景深,而较小的光圈(大f值)则产生较大的景深。这是因为较大的光圈允许更多的光线通过,导致聚焦范围较小,而较小的光圈减少了光线的进入,导致更多区域保持清晰。
    • +
    +
  4. +
  5. 相机调整光圈的方法:
      +
    • 光圈环: 大多数相机镜头上都有一个光圈环,通过旋转该环可以调整光圈大小。
    • +
    • 摄影模式: 在一些相机上,可以通过不同的摄影模式(如光圈优先模式或手动模式)来手动设置光圈值。
    • +
    +
  6. +
  7. 数码相机的工作原理:
      +
    • 光学系统: 数码相机的镜头通过光学系统将场景中的光线聚焦到感光元件上(如CMOS或CCD芯片)。
    • +
    • 感光元件: 光线进入感光元件后,光能被转换为电信号,形成图像。
    • +
    • 数字信号处理: 数字相机将感光元件捕捉到的模拟信号转换为数字信号,然后通过数字信号处理器进行处理,包括白平衡、色彩校正、锐化等。
    • +
    • 存储和显示: 处理后的图像可以被存储在存储卡上,也可以通过LCD屏幕或取景器进行实时预览。后续可以通过连接到计算机或打印机进行进一步处理或输出。
    • +
    +
  8. +
+

### 2.

+

### 1. 计算机里灰度用几位表示,一共几个灰度梯度;

+

### 2. 写出至少五种颜色空间,并解释两种颜色空间每一维的含义;

+

### 3. 用于表示加色和减色的颜色空间是什么,解释这两个空间每一维的含义,并说明它们的应用场合。

+
    +
  1. 灰度表示:
      +
    • 在计算机中,灰度通常用8位(1字节)表示,取值范围为0到255。这意味着有256个不同的灰度级别,从纯黑色(0)到纯白色(255)。
    • +
    +
  2. +
  3. 颜色空间和各自含义:
      +
    • RGB(红绿蓝): 每个像素由红色(R)、绿色(G)、蓝色(B)三个分量组成。每个分量的取值范围通常为0到255,表示颜色的亮度。
    • +
    • HSV(色相、饱和度、明度): 色相表示颜色的类型,饱和度表示颜色的纯度,明度表示颜色的亮度。HSV空间更符合人类对颜色的感知。
    • +
    • CMYK(青、品红、黄、黑): 主要用于印刷,每个分量表示一种颜色的浓度,而黑色表示颜色的深度。
    • +
    • YUV(亮度、色度): Y表示亮度信息,而UV表示颜色信息。这种颜色空间常用于视频编码。
    • +
    • LAB(CIE Lab): L表示亮度,a表示红绿通道,b表示黄蓝通道。LAB是一种设备无关的颜色空间,对于色彩和亮度的感知更加一致。
    • +
    +
  4. +
  5. 加色和减色的颜色空间:
      +
    • 加色空间: RGB是一个典型的加色空间。在RGB中,通过叠加不同强度的红、绿、蓝光可以形成各种颜色。每个分量表示一种颜色的亮度,叠加产生彩色。
    • +
    • 减色空间: CMYK是一个典型的减色空间。在CMYK中,通过混合不同浓度的青、品红、黄颜料可以减少光的反射,从而形成不同颜色。每个分量表示一种颜色的浓度。
    • +
    +
  6. +
+

应用场合:

+
    +
  • 加色空间的应用场合: 用于显示设备(如电脑显示器、电视屏幕等),摄影领域等,因为这些场合中是通过发光或发色的方式来呈现图像的。
  • +
  • +

    减色空间的应用场合: 用于印刷行业,因为印刷是通过减少光的反射来呈现图像的,使用CMYK颜色空间可以更好地控制颜色和浓度,以适应印刷机的特性。

    +
  • +
  • +

    BMP 图像的图像数据(bitmap data)部分中,每一行的数据存储有什么要求?如果想要存储 12 34 56 78 9A BC(具体数据不是这个,忘了,不过没差- -),应该怎样存储? (我不知道描述清楚了没有- -应该问的是四字节对齐的事情...)

    +
  • +
  • +

    给出一个结构元和一个二值图像,问这个结构元和二值图像进行膨胀操作后的结果是什么,并简述膨胀操作的物理意义。

    +
  • +
  • +
      +
    1. 简述把灰度图像二值化的步骤;如果一张灰度图像的光照变化比较大,应该如何二值化?
    2. +
    +
  • +
  • 给出一张二值图像,求行进间编码,并简述你是怎么求出来的。
  • +
+

当一张灰度图像的光照变化比较大时,简单的全局阈值二值化方法可能无法很好地处理图像。在这种情况下,可以考虑使用自适应阈值二值化方法,例如局部自适应阈值二值化。这种方法允许根据图像的局部特征来确定每个像素的阈值,从而更好地处理光照变化较大的图像。

+

你可以使用一些常见的算法,如基于局部均值的方法(如Sauvola算法),基于局部高斯模型的方法(如Niblack算法),或者基于局部中值的方法(如Otsu算法)来进行局部自适应阈值二值化。

+
    +
  1. +

    给一个 8 个梯度的灰度分布,求灰度均衡化后的结果,并简述步骤(我记得这题的数据和 ppt 上的好像是一样的)。

    +
  2. +
  3. +
      +
    1. 简述如何利用双线性插值求出某个点的灰度;
    2. +
    +
  4. +
  5. +

    给一张 5 × 5 的灰度图,求用 3 × 3 的 mask 进行中值滤波后的结果,忽略图像边界。

    +
  6. +
  7. +

    简述用 ratio image 将 source 人脸的表情转移到 target 人脸上的步骤。

    +
  8. +
  9. +

    给出双边滤波的公式,简述双边滤波的基本思想,并解释公式里各符号的意义。

    +
  10. +
  11. +

    简述如何用 log algorithm 增强图像的可视性。

    +
  12. +
  13. +

    选择图像信息处理的一种应用,尽量详细地说明原理。

    +
  14. +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2672/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2672/index.html" new file mode 100644 index 00000000..2398957e --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2672/index.html" @@ -0,0 +1,4747 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 回忆卷2 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

回忆卷2

+ +

[DIP] [图像信息处理] 2022-2023秋冬学期真题

+
+

注:题目是中英对照的,回答用中文或英文均可

+
+

一、填空题(1*n)

+
    +
  1. +

    Digital image (or video stream) 数字图像 is the main form to present information. For human beings, more than 60% of information is obtained through vision 视觉.

    +
  2. +
  3. +

    设备相关的颜色空间:(RGB)(YUV)(CMYK)

    +
  4. +
+

设备无关的颜色空间:(sRGB)(CIEXYZ)(Lab)

+
    +
  1. +

    Image Data 要求每一行必须是 4 的倍数,例如 13 A1 17 19 18 15 在文件中存储为:(13 A1 17 19)(18 15 00 00)

    +
  2. +
  3. +

    BMP图像的文件结构:(文件头)(位图信息头)(调色板)(图像数据)

    +
  4. +
+

二、说明题

+
    +
  1. 数码相机成像原理(6')
  2. +
+

给了PPT上那张图

+
    +
  1. JPEG压缩的基本思想和优势
  2. +
+

压缩策略:根据压缩比要求,从高频到低频逐步削减信息

+

优势:高频信息占用存储空间大,减少高频信息更容易获得高压缩比;低频信息可以保留物体的基本轮廓和色彩分布,最大限度维持图像质量;适合用于互联网的视觉媒体。

+
    +
  1. BMP图像调色板的作用(4')
  2. +
  3. 获取二值图像时,如何确定一个好的阈值
  4. +
  5. 腐蚀操作的物理意义;给出 input image 和 struct element 要求画出腐蚀后的矩阵
  6. +
  7. 解释可视化增强的对数操作
  8. +
  9. 直方图均衡化为什么不能做到真正均衡
  10. +
  11. 解释最近邻插值的过程
  12. +
  13. 表情比例图的方法
  14. +
  15. 写出双边滤波的 general idea 和双边滤波与高斯滤波的区别
  16. +
  17. SIFT 的 full version
  18. +
  19. Back-propagation 的方法
  20. +
  21. RLE(给一张图,要求写出编码)
  22. +
+

三、计算题(5)

+
    +
  1. w=0.8, 模型取点数为3,问最少要取几个点才能保证概率>95%RANSEC收敛
  2. +
+

四、证明题(4+6)

+
    +
  1. 请证明膨胀和腐蚀的对偶关系(4')
  2. +
  3. 请证明SNF中p=1时是中值滤波,p=2时是均值滤波(6')
  4. +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2673/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2673/index.html" new file mode 100644 index 00000000..aea61eb8 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\233\236\345\277\206\345\215\2673/index.html" @@ -0,0 +1,4724 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 回忆卷3 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

2022-2023秋冬

+

填空题

+
    +
  1. 成像方式,除了可见光之外写三种
  2. +
  3. 灰度图和彩色图在计算机中的储存(字节数,色彩数)
  4. +
  5. 均值滤波、中值滤波、标准拉普拉斯滤波结果
  6. +
  7. 图像压缩方式(另单独问了JPEG的压缩方式)
  8. +
+

简答题

+
    +
  1. 光圈大小对成像的影响?光圈如何影响景深,为什么?
  2. +
  3. 解释视觉感知系统的认知优先级和敏感度
  4. +
  5. 双边滤波和引导滤波的原理,以及不同之处
  6. +
  7. Harris角点检测对于亮度、旋转、平移和尺度的不变性?解释原因
  8. +
  9. 解释RANSAC
  10. +
  11. Expression Mapping的过程
  12. +
+

计算题

+
    +
  1. 给图,计算腐蚀、膨胀、开运算、闭运算结果
  2. +
  3. 计算双线性插值,给公式和过程
  4. +
  5. 直方图均衡化填表(和ppt基本一致)
  6. +
+

证明题

+
    +
  1. 直方图均衡化公式推导(s和r的关系,仅连续情况)
  2. +
  3. Harris角点检测公式推导,说明两个矩阵特征值与角点判断的关系(三种情况)
  4. +
+

不同格式的图像压缩方式可以分为有损压缩和无损压缩两种。以下是几种常见图像格式(JPEG、TIFF、BMP、JPG)的压缩方式:

+
    +
  1. JPEG(Joint Photographic Experts Group):
  2. +
  3. 压缩方式: JPEG 使用有损压缩,通过去除图像中的高频信息和一些细节,以达到压缩的目的。
  4. +
  5. 适用场景: 主要用于存储照片和彩色图像,适合于需要较高压缩比但可以容忍一定质量损失的应用。
  6. +
  7. TIFF(Tagged Image File Format):
  8. +
  9. 压缩方式: TIFF 文件格式支持多种压缩方式,可以是无损的(例如LZW压缩),也可以是有损的(例如JPEG压缩)。
  10. +
  11. 适用场景: TIFF 可以存储无损或有损的图像,适用于需要保存图像质量的专业图像处理和打印领域。
  12. +
  13. BMP(Bitmap):
  14. +
  15. 压缩方式: BMP 使用无损压缩,每个像素都有精确的颜色信息,不进行数据丢失的压缩。
  16. +
  17. 适用场景: 适合存储图像质量要求高,不希望有任何压缩损失的应用。但文件大小相对较大。
  18. +
  19. JPG(JPEG Image):
  20. +
  21. 压缩方式: JPG 是 JPEG 格式的文件扩展名,使用有损压缩,适用于存储照片和彩色图像。
  22. +
  23. 适用场景: 常用于 Web 上的图像展示,由于其较高的压缩比,适合用于在线传输和存储。
  24. +
+

总的来说,选择图像格式和压缩方式取决于应用需求。无损压缩适合需要保持图像质量的场景,而有损压缩适合对图像质量要求较低但需要节省存储空间或加快传输速度的场景。

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\257\274\345\220\221\346\273\244\346\263\242\350\247\243\351\207\212 guided filtering/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\257\274\345\220\221\346\273\244\346\263\242\350\247\243\351\207\212 guided filtering/index.html" new file mode 100644 index 00000000..9752b057 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\345\257\274\345\220\221\346\273\244\346\263\242\350\247\243\351\207\212 guided filtering/index.html" @@ -0,0 +1,4636 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 导向滤波 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Guided filtering

+

引导滤波,基本思想

+

导向滤波是一种图像处理技术,主要用于图像去噪和增强的目的。其基本原理是利用一个附加的辅助图像(称为导向图像)的信息来引导滤波过程,从而更好地保留图像中的细节和结构。

+

以下是导向滤波的基本原理和作用:

+
    +
  1. 导向图像: 导向滤波使用了一个附加的导向图像,该图像包含了原始图像中的一些特征信息,比如梯度、边缘等。导向图像用于指导滤波器如何在图像上进行平滑。
  2. +
  3. 滤波过程: 导向滤波的核心是在每个像素位置上应用一个滤波器,该滤波器的方向和强度由导向图像的对应位置决定。这样,滤波器的行为在不同的图像区域会有所不同,更好地适应图像的结构。
  4. +
  5. 保留细节和边缘: 由于导向滤波使用导向图像的信息,它能够更好地保留图像中的细节和边缘。在导向图像中有强烈梯度的区域,滤波器更加注重保留细节,而在平坦区域则进行更强的平滑。
  6. +
  7. 去噪和增强: 导向滤波广泛应用于图像去噪和增强。通过结合导向图像的信息,它能够有效地减少图像中的噪声,同时增强图像中的有用信息。
  8. +
  9. 适用范围: 导向滤波适用于各种图像处理任务,包括但不限于去噪、增强、图像平滑和边缘保留等。它在计算机视觉和图像处理领域中得到了广泛的应用。
  10. +
+

总体而言,导向滤波通过结合导向图像的信息,使得滤波过程更具方向性和适应性,从而在图像处理中取得更好的效果。

+

暴力双边滤波迭代次数非常大

+

img

+

解决双边滤波中的梯度反转、计算缓慢问题,能够保边、非迭代 +I是guide,p是输入图,q是输出图。输出是I的线性表达 +$$ + min\sum(aI_i+b-p_i)^2+\epsilon a^2\ + q_i=\hat a_iI_i+\hat b_i +$$ +​

+

image-20240110153910399

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\347\251\272\351\227\264\346\273\244\346\263\242 spatial filtering/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\347\251\272\351\227\264\346\273\244\346\263\242 spatial filtering/index.html" new file mode 100644 index 00000000..df4c9707 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\212/3 \345\233\276\345\203\217\344\277\241\346\201\257\345\244\204\347\220\206 DIP/\347\251\272\351\227\264\346\273\244\346\263\242 spatial filtering/index.html" @@ -0,0 +1,4618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 空间滤波 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+ +
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\213/1 \351\253\230\347\272\247\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\345\210\206\346\236\220/ADS-notes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\213/1 \351\253\230\347\272\247\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\345\210\206\346\236\220/ADS-notes/index.html" new file mode 100644 index 00000000..e17213d5 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\213/1 \351\253\230\347\272\247\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\345\210\206\346\236\220/ADS-notes/index.html" @@ -0,0 +1,4610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + mynotes - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

mynotes

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\213/2 \346\225\260\346\215\256\345\272\223\347\263\273\347\273\237/Database-notes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\213/2 \346\225\260\346\215\256\345\272\223\347\263\273\347\273\237/Database-notes/index.html" new file mode 100644 index 00000000..bd0d3389 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\213/2 \346\225\260\346\215\256\345\272\223\347\263\273\347\273\237/Database-notes/index.html" @@ -0,0 +1,4610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + mynotes - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

mynotes

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\213/3 \350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/\347\273\204\346\210\220-notes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\213/3 \350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/\347\273\204\346\210\220-notes/index.html" new file mode 100644 index 00000000..0f74111a --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\213/3 \350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/\347\273\204\346\210\220-notes/index.html" @@ -0,0 +1,4610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + mynotes - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

mynotes

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/JY_HU/\345\244\247\344\272\214\344\270\213/4 \351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241/OOP-notes/index.html" "b/JY_HU/\345\244\247\344\272\214\344\270\213/4 \351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241/OOP-notes/index.html" new file mode 100644 index 00000000..ac9b46c3 --- /dev/null +++ "b/JY_HU/\345\244\247\344\272\214\344\270\213/4 \351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241/OOP-notes/index.html" @@ -0,0 +1,4610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + mynotes - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

mynotes

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Others/CS61A-python/index.html b/Others/CS61A-python/index.html new file mode 100644 index 00000000..eb0b3542 --- /dev/null +++ b/Others/CS61A-python/index.html @@ -0,0 +1,5001 @@ + + + + + + + + + + + + + + + + + + + + + + + + + CS61A - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

CS61a PYTHON

+

answer = get_string()

+

print("hello,",answer) 两个参数中间自动加括号

+

print(f"hello,{answer}")

+

f为formatted string 格式化字符串

+

数据类型

+

删去了c中的 long double

+

只有bool float int str

+

加了range list tuple dict set

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
words = set() #直接将一个hash table 赋给word
+#dict的实现?
+def check(word):
+    if word.lower() in words:
+        return True
+    else:
+        return False
+def load(dictionary):
+    file = open(dictionary, "r")
+    for line in file:
+        word = line.rstrip() #
+        words.add(line)
+    close(file)
+    return True
+
+def size():
+    return len(word)
+
+def unload():
+    #free memory
+    return True
+
+

image-20231022201934658

+

所谓oop就是有内置的函数

+

s.lower() 要非常注意python中的浅拷贝和深拷贝

+

image-20231022204754522

+
Python
1
+2
+3
#py不需要prototype,但是需要call main
+
+main函数写在最后不用缩进
+
+
Python
1
+2
+3
+4
+5
+6
+7
#try-except语句
+#抛出错误,然后
+try:
+
+except:
+
+else:
+
+
Python
1
+2
+3
+4
for i in range(4):
+    print("?",end="\n")->print("?",end="")
+=print("?"*4)
+#没有分配内存,没有指针
+
+

global frame(全局帧)

+

全局帧是程序的顶层帧,包含了全局范围内定义的变量。这些变量被称为全局变量,因为它们可以在整个程序的任何地方访问。全局帧中的变量对整个程序都是可见的。

+

local frame(局部帧)

+

每当你调用一个函数,Python会为该函数创建一个局部帧。这个局部帧包含了函数中定义的局部变量和参数。这些变量只能在函数内部访问,而在函数执行完毕后,局部帧也会被销毁。这有助于保持变量的隔离性,防止不同函数之间的变量名冲突。

+

举例来说,如果你在Python中定义一个函数,函数内的变量会存在于该函数的局部帧中。同时,如果你在函数外定义一个变量,它会存在于全局帧中。这种分层的帧结构有助于组织和管理变量,使其具有适当的作用域。局部帧和全局帧的交互是Python中变量作用域的核心概念,它确保了变量在程序中的合理可见性和隔离性。

+

$python3 -i example.py

+

以交互式命令行运行python,可以通过键入变量值查看执行完成后的各个变量,无需print

+

$python3 -m doctest example.py

+

运行docstring所指定的示例,如果没有输出则直接返回

+

$python3 -m doctest -v example.py

+

打印输出所有的docstring测试结果,相当于自测情况

+

def嵌套定义

+

image-20231025192930643

+

image-20231025193350857

+

image-20231025193538460

+

image-20231025193656724

+

image-20231025201005992

+

lambda x : f(x)==y 返回一个x

+

image-20231025201319301

+

control statements

+

image-20231025213614688

+

验证递归的正确性/如何写递归->分解问题,就好像n-1的答案已经写好了,只需要从n-1得到n

+

用数归!

+

1.base case

+

2.假设n-1的情况正确执行,正确返回,如何利用n-1的情况得出n

+

image-20231025203103916

+

image-20231025204447557

+

上面是循环,迭代

+

下面是递归!

+

迭代每次while循环内的赋值变成了递归调用时的参数

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
def factorial_recursive(n):
+    if n == 0:
+        return 1
+    else:
+        return n * factorial_recursive(n - 1)
+
+def factorial_iterative(n):
+    result = 1
+    for i in range(1, n + 1):
+        result *= i
+    return result
+
+

分清楚base case和else

+

image-20231025210814628

+

image-20231025211259401

+

image-20231025214141514

+

怎么分解问题比较关键

+

counting partitions

+

image-20231025214423305

+

image-20231025214609959

+

image-20231025215321140

+

python列表(list)和元组(tuple)详解_木子林_的博客-CSDN博客

+

一篇讲list和tuple区别的blog,非常细致,可以细看

+

Python的enumerate函数-CSDN博客

+

method :和instance绑定的函数

+

method的第一个隐形的参数是self,调用的方式是dot(.)

+

instance有属性,但是class也可以有自己的属性

+

类名.函数名

+

Account.deposit(account_john,10)属于直接访问类的method

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
class Account:
+    interest = 0.02
+    def __init__(self,account_holder):
+        self.balance = 0
+        self.holder = account_holder
+    def withdraw(self,amount):
+        if self.balance-amount<0:
+            return 'Insufficient funds'
+        else
+        self.balance = self.balance-amount
+        return self.balance
+    def deposit(slef,amount):
+        self.balance = self.balance+amount
+        return self.balance
+    #additional methods would be defined here
+class CheckingAccount(Account):
+    #递归查看是否有对应的attribute,如果找到的attribute是一个bound method就返回函数计算后的值,如果是一个值,就返回该值
+    #初始化的时候
+    withdraw_fee = 1
+    interest = 0.01
+    def withdraw(self,amount):
+        return Account.withdraw(self,amount+self.withdraw_fee)#这里体现了继承的另一种用法
+    #递归查看,withdraw在子类中有同名的重构实现,所以按照子类的来,但是因为方便,可以调用父类的withdraw函数,所以使用Account.withdraw来访问父类中的withdraw,但需要提供self参数,因为并未初始化account属性下的withdraw,所以需要提供self参数
+    #即使已被overridden的属性也可以通过直接访问类对象访问
+tom_account = Account("Tom")
+>>>tom_account.interest
+a = Account("John")
+b = CheckingAccount('Jack')
+>>>a.deposit(100)
+100
+>>>b.deposit(100)
+100
+>>>a.withdraw(100)
+90
+>>>b.withdraw(100)
+89
+    0.02
+    #初始化的实例没有interest这个属性,但是类有,也可以访问到
+
+

面向对象编程中,所有东西是object:对象

+

在oop python中,所有东西(object)都有属性(attributes),以键值对(name-value pairs)表示

+

类(classes)也是object:对象,因此类有自己的属性

+

实例的属性:初始化的实例具有的属性

+

类的属性:初始化的实例所属的类所具有的属性

+

类的def方法定义的method/函数返回不返回(return有没有内容视情况需要,如果在实际实例化调用类时需要将初始化过的东西接收,例如a = open_account("john",5),则需要返回,否则不一定需要写return什么

+

has-a和is-a关系

+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
class Bank:
+    #a bank has accounts:has-a关系
+    def __init__(self):
+        self.accounts = []
+    def open_account(self,holder,amount,kind = Account):
+        account = kind(holder)
+        account.deposit(amount)
+        self.accounts.append(account)
+        return account
+    def pay_interest(self):
+        for a in self.accounts:
+            a.deposit(a.balance*a.interest)
+    def too_big_to_fail(self):
+        return len(self.account)>1
+
+
Python
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
class A:
+    z = -1
+    def f(self,x):
+        return B(x-1)
+class B(A):
+    n = 4
+    def __init__(self,y):
+        if y:
+            self.z = self.f(y)
+        else:
+            self.z = C(y+1)
+class C(B):
+    def f(self,x):
+        return x
+a = A()
+b = B(1)
+b.n = 5
+print(C(2).n)
+print(a.z==C.z)
+print(a.z==b.z)
+print(b.z)
+print(b.z.z)
+print(b.z.z.z)
+print(b.z.z.z.z)
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Others/assets/1.png b/Others/assets/1.png new file mode 100644 index 00000000..e09dae67 Binary files /dev/null and b/Others/assets/1.png differ diff --git a/Others/assets/66646e87f910c17833690f30f578caf.jpg b/Others/assets/66646e87f910c17833690f30f578caf.jpg new file mode 100644 index 00000000..ef22eda9 Binary files /dev/null and b/Others/assets/66646e87f910c17833690f30f578caf.jpg differ diff --git a/Others/assets/7632ee568647b5f23225b90b68ac767.jpg b/Others/assets/7632ee568647b5f23225b90b68ac767.jpg new file mode 100644 index 00000000..1cc143d5 Binary files /dev/null and b/Others/assets/7632ee568647b5f23225b90b68ac767.jpg differ diff --git a/Others/assets/98d47fe968364f4096cb4163f8d0564.jpg b/Others/assets/98d47fe968364f4096cb4163f8d0564.jpg new file mode 100644 index 00000000..24e1f402 Binary files /dev/null and b/Others/assets/98d47fe968364f4096cb4163f8d0564.jpg differ diff --git a/Others/assets/e00d05ed33af0c9f314fdc5e19ec47f.jpg b/Others/assets/e00d05ed33af0c9f314fdc5e19ec47f.jpg new file mode 100644 index 00000000..cb5c00d9 Binary files /dev/null and b/Others/assets/e00d05ed33af0c9f314fdc5e19ec47f.jpg differ diff --git a/Others/assets/f12baf1ea40a1928d7d717c595c9a07.jpg b/Others/assets/f12baf1ea40a1928d7d717c595c9a07.jpg new file mode 100644 index 00000000..3844b922 Binary files /dev/null and b/Others/assets/f12baf1ea40a1928d7d717c595c9a07.jpg differ diff --git a/Others/assets/image-20231119131157151-1700483378065-5.png b/Others/assets/image-20231119131157151-1700483378065-5.png new file mode 100644 index 00000000..98a87611 Binary files /dev/null and b/Others/assets/image-20231119131157151-1700483378065-5.png differ diff --git a/Others/assets/image-20231119131157151.png b/Others/assets/image-20231119131157151.png new file mode 100644 index 00000000..98a87611 Binary files /dev/null and b/Others/assets/image-20231119131157151.png differ diff --git a/Others/assets/image-20231120201554458.png b/Others/assets/image-20231120201554458.png new file mode 100644 index 00000000..c10b5dac Binary files /dev/null and b/Others/assets/image-20231120201554458.png differ diff --git a/Others/assets/image-20231120201822638.png b/Others/assets/image-20231120201822638.png new file mode 100644 index 00000000..a1d68890 Binary files /dev/null and b/Others/assets/image-20231120201822638.png differ diff --git a/Others/assets/image-20231120201906942.png b/Others/assets/image-20231120201906942.png new file mode 100644 index 00000000..a1d68890 Binary files /dev/null and b/Others/assets/image-20231120201906942.png differ diff --git a/Others/assets/image-20231120202158410.png b/Others/assets/image-20231120202158410.png new file mode 100644 index 00000000..55a6b83e Binary files /dev/null and b/Others/assets/image-20231120202158410.png differ diff --git a/Others/assets/image-20231122212434109.png b/Others/assets/image-20231122212434109.png new file mode 100644 index 00000000..60d90915 Binary files /dev/null and b/Others/assets/image-20231122212434109.png differ diff --git a/Others/assets/image-20231122212445416.png b/Others/assets/image-20231122212445416.png new file mode 100644 index 00000000..38eea3ac Binary files /dev/null and b/Others/assets/image-20231122212445416.png differ diff --git a/Others/assets/image-20231122212455299.png b/Others/assets/image-20231122212455299.png new file mode 100644 index 00000000..261693d2 Binary files /dev/null and b/Others/assets/image-20231122212455299.png differ diff --git a/Others/assets/image-20231122212504669.png b/Others/assets/image-20231122212504669.png new file mode 100644 index 00000000..54d3e8e2 Binary files /dev/null and b/Others/assets/image-20231122212504669.png differ diff --git a/Others/content block example/index.html b/Others/content block example/index.html new file mode 100644 index 00000000..ac0a02cb --- /dev/null +++ b/Others/content block example/index.html @@ -0,0 +1,4676 @@ + + + + + + + + + + + + + + + + + + + + + + + content - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

content

+ +
+

Nested Code Blocks

+
+
+
+
Markdown
1
+2
+3
* Sed sagittis eleifend rutrum
+* Donec vitae suscipit est
+* Nulla tempor lobortis orci
+
+
+
+
Markdown
1
+2
+3
1. Sed sagittis eleifend rutrum
+2. Donec vitae suscipit est
+3. Nulla tempor lobortis orci
+
+
+
+
+
+
+

Another List

+
+
+
+
Markdown
1
+2
+3
* Sed sagittis eleifend rutrum
+* Donec vitae suscipit est
+* Nulla tempor lobortis orci
+
+
+
+
Markdown
1
+2
+3
1. Sed sagittis eleifend rutrum
+2. Donec vitae suscipit est
+3. Nulla tempor lobortis orci
+
+
+
+
+
+

nested code block

+
+
+
+
C
1
+2
+3
+4
+5
+6
#include <stdio.h>
+
+int main(void) {
+    printf("Hello world!\n");
+    return 0;
+}
+
+
+
+
C++
1
+2
+3
+4
+5
+6
#include <iostream>
+
+int main(void) {
+    std::cout << "Hello world!" << std::endl;
+    return 0;
+}
+
+
+
+
+
+展开查看nested +

note

+
+

image-20231122212434109 + image-20231122212445416 + image-20231122212455299 + image-20231122212504669

+
+

语法格式:

+

tab间隔,建议在vscode/typora原格式(raw)下编辑,可以选中tab +alt text形式是直接采用在md文件的同目录下插入,可以在nested tab中插入 +Alt text

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/Others/git\344\275\277\347\224\250\346\225\231\347\250\213/index.html" "b/Others/git\344\275\277\347\224\250\346\225\231\347\250\213/index.html" new file mode 100644 index 00000000..e2f3dc0c --- /dev/null +++ "b/Others/git\344\275\277\347\224\250\346\225\231\347\250\213/index.html" @@ -0,0 +1,4655 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Git 基础 - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

git使用教程

+

image-20231119131157151

+

image-20231120201822638

+

发现只要是在这个文件结构下的图片都会正常显示

+

因为实际上typora编辑器的设置中拷贝图片时会将assets会单独复制一份

+

image-20231120201554458

+

然而,拷贝后进行缩放,就是改为了html格式,就不能够正常渲染?

+

image-20231120201906942

+

image-20231120202158410

+

发现mkdocs在渲染导出HTML时是会将除了md格式的所有东西都拷贝一份到自己的目录下面的

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Others/image.png b/Others/image.png new file mode 100644 index 00000000..9f3cd9a7 Binary files /dev/null and b/Others/image.png differ diff --git "a/Others/linux \345\220\257\345\212\250/index.html" "b/Others/linux \345\220\257\345\212\250/index.html" new file mode 100644 index 00000000..2dd088f1 --- /dev/null +++ "b/Others/linux \345\220\257\345\212\250/index.html" @@ -0,0 +1,4942 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Linux服务器运维(x)把玩(√) - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

linux

+
    +
  1. 云计算和虚拟化:
  2. +
  3. 学习如何配置和管理云服务器,理解云计算概念和服务模型。
  4. +
  5. 掌握虚拟化技术,如容器化和虚拟机管理。
  6. +
  7. 网络和安全:
  8. +
  9. 配置和管理网络服务,学习网络安全的基础知识。
  10. +
  11. 实施防火墙、身份验证和访问控制。
  12. +
  13. 分布式系统:
  14. +
  15. 学习如何构建和管理分布式系统,包括数据库、消息队列和负载均衡器。
  16. +
  17. 研究容错性和分布式一致性的理论和实践。
  18. +
  19. 自动化和编排:
  20. +
  21. 使用自动化工具和编排框架来管理和部署应用程序。
  22. +
  23. 学习脚本语言和配置管理工具。
  24. +
  25. 大数据和数据科学:
  26. +
  27. 学习如何使用云平台处理和分析大规模数据。
  28. +
  29. 探索机器学习和人工智能应用。
  30. +
  31. Web开发和应用部署:
  32. +
  33. 构建和部署Web应用程序,了解云上的托管服务。
  34. +
  35. 学习使用容器和服务器less架构。
  36. +
  37. 容器化技术:
  38. +
  39. 使用Docker等容器技术构建、部署和管理应用程序。
  40. +
  41. 学习Kubernetes等容器编排工具。
  42. +
+

aliyun服务器: ssh root@101.201.46.135

+

宝塔面板

+

最后还是采用ssh的方法

+

SSH免密登录(SSH Public Key Authentication)是一种通过使用密钥对而不是密码进行SSH登录的方法,提高了安全性并简化了登录过程。以下是SSH免密登录的配置过程:

+
    +
  1. 生成密钥对: 在本地机器上生成一对密钥,包括私钥和公钥。私钥存储在本地机器上,而公钥会被传输到远程机器上。
  2. +
+

使用以下命令生成密钥对:

+
Text Only
1
+2
bashCopy code
+ssh-keygen -t rsa
+
+

这会在~/.ssh/目录下生成id_rsa(私钥)和id_rsa.pub(公钥)文件。

+
    +
  1. 将公钥复制到远程服务器: 将本地生成的公钥复制到远程服务器的~/.ssh/authorized_keys文件中。可以使用ssh-copy-id命令,它会自动将公钥添加到目标用户的authorized_keys文件中。
  2. +
+
Text Only
1
+2
bashCopy code
+ssh-copy-id username@remote_host
+
+

如果ssh-copy-id命令不可用,可以手动将公钥内容追加到远程服务器的~/.ssh/authorized_keys文件中。

+
    +
  1. 设置权限: 确保~/.ssh/ 目录和 ~/.ssh/authorized_keys 文件的权限正确。权限设置对于SSH的安全性至关重要。
  2. +
+
Text Only
1
+2
bashCopy codechmod 700 ~/.ssh
+chmod 600 ~/.ssh/authorized_keys
+
+
    +
  1. 测试SSH免密登录: 尝试使用SSH连接到远程服务器,应该不再需要输入密码。
  2. +
+
Text Only
1
+2
bashCopy code
+ssh username@remote_host
+
+

如果一切设置正确,你将可以无密码登录到远程服务器。

+

请注意,为了安全起见,私钥文件(id_rsa)应该保持在本地机器上,并且不应该分享给其他人。同时,公钥文件(id_rsa.pub)需要传输到需要访问的远程服务器。

+

[Linux]创建新用户及用户权限 - 知乎 (zhihu.com)

+
C
1
+2
scp -r /home/user/documents username@remote_host:/var/www/
+scp -P 80 baseline2.cu hjy@10.78.18.247:~/gemm
+
+

11-16

+

服务器改名

+

找到/etc/hosts sudo vim hosts 添加一行 101.201.46.135 server_jy 再在ssh时重新add一下这个别名,完成

+

以后就叫server_jy了~

+

监听端口

+

安全组

+

查找命令

+

```[root@iZ2ze72tpnr9ta1r8uvbujZ /]# find / -name nginx +[root@iZ2ze72tpnr9ta1r8uvbujZ /]# find / -name nginx +/www/server/nginx +/www/server/nginx/src/objs/nginx +/www/server/nginx/sbin/nginx +/www/server/panel/rewrite/nginx +/www/server/panel/vhost/nginx +/www/server/panel/vhost/template/nginx +/etc/rc.d/init.d/nginx +/usr/bin/nginx +/usr/local/nginx +[root@iZ2ze72tpnr9ta1r8uvbujZ /]# +

Text Only
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
/usr/bin
+
+/usr/local
+
+```c
+[root@iZ2ze72tpnr9ta1r8uvbujZ /]# start nginx
+-bash: start: command not found
+[root@iZ2ze72tpnr9ta1r8uvbujZ /]# nginx
+nginx: [emerg] bind() to 0.0.0.0:888 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:888 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:888 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:888 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:888 failed (98: Address already in use)
+nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
+nginx: [emerg] still could not bind()
+[root@iZ2ze72tpnr9ta1r8uvbujZ /]# sudo lsof -i :80
+COMMAND      PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
+AliYunDun   1473 root   11u  IPv4  27166      0t0  TCP iZ2ze72tpnr9ta1r8uvbujZ:37902->100.100.30.26:http (ESTABLISHED)
+nginx     269834 root    9u  IPv4 679139      0t0  TCP *:http (LISTEN)
+nginx     269835  www    9u  IPv4 679139      0t0  TCP *:http (LISTEN)
+nginx     269836  www    9u  IPv4 679139      0t0  TCP *:http (LISTEN)
+[root@iZ2ze72tpnr9ta1r8uvbujZ /]#
+
+

grep

+

grep是一个在文本中搜索模式的强大命令行工具。它的名字来源于全局正则表达式打印(Global Regular Expression Print)。

+

下面是grep命令的基本用法和一些常见选项:

+
Text Only
1
+2
bashCopy code
+grep [options] pattern [file...]
+
+
    +
  • pattern:要搜索的模式,可以是字符串或正则表达式。
  • +
  • file:要在其中搜索模式的文件。如果没有提供文件名,grep将从标准输入中读取。
  • +
+

常见选项:

+
    +
  • -i:忽略大小写。
  • +
  • -r-R:递归搜索子目录。
  • +
  • -n:显示匹配行的行号。
  • +
  • -v:反向选择,显示不匹配的行。
  • +
  • -l:只显示包含匹配项的文件名。
  • +
  • -c:只显示匹配的行数而不显示匹配的内容。
  • +
  • -A-B-C:显示匹配行的上下文行。
  • +
  • -e:指定多个模式。
  • +
+

示例:

+
    +
  1. 在文件中搜索包含关键字的行:
  2. +
+
Text Only
1
+2
bashCopy code
+grep "keyword" filename
+
+
    +
  1. 递归搜索目录下所有文件中包含关键字的行:
  2. +
+
Text Only
1
+2
bashCopy code
+grep -r "keyword" directory
+
+
    +
  1. 忽略大小写:
  2. +
+
Text Only
1
+2
bashCopy code
+grep -i "keyword" filename
+
+
    +
  1. 显示匹配行的行号:
  2. +
+
Text Only
1
+2
bashCopy code
+grep -n "keyword" filename
+
+
    +
  1. 反向选择,显示不匹配的行:
  2. +
+
Text Only
1
+2
bashCopy code
+grep -v "keyword" filename
+
+

这只是一些grep命令的基本用法和选项,grep有很多其他选项和功能,你可以通过man grep查看grep的手册页以获取更多详细信息。\

+

竟然没有apt-get??

+
C
1
+2
+3
+4
+5
+6
[root@iZ2ze72tpnr9ta1r8uvbujZ hjy]# lsb_release -a
+LSB Version:    :core-4.1-amd64:core-4.1-noarch
+Distributor ID: AlibabaCloud
+Description:    Alibaba Cloud Linux release 3 (Soaring Falcon)
+Release:        3
+Codename:       SoaringFalcon
+
+

为什么命令查找不到是bash打头

+
C
bash: apt-get: command not found
+
+

如果你在使用命令时遇到 "命令找不到" 的错误,这可能有多个原因。一种可能性是系统无法找到或识别该命令,这可能与环境变量或命令的位置有关。以下是一些可能的原因和解决方法:

+
    +
  1. 环境变量问题: 确保命令所在的路径包含在系统的PATH环境变量中。PATH环境变量包含一组目录,系统在这些目录中查找可执行文件。你可以使用以下命令查看PATH
  2. +
+
Text Only
1
+2
bashCopy code
+echo $PATH
+
+

如果命令所在的目录不在PATH中,你可以将其添加到PATH。例如:

+
Text Only
1
+2
bashCopy code
+export PATH=$PATH:/path/to/your/command
+
+

在这里,将/path/to/your/command替换为包含你的命令的实际路径。

+
    +
  1. +

    命令未安装: 确保你尝试运行的命令已经安装在系统上。有些命令可能需要单独安装。你可以使用系统的包管理器安装它们。

    +
  2. +
  3. +

    文件权限问题: 检查命令文件的权限,确保你有执行权限。你可以使用ls -l命令查看文件权限,例如:

    +
  4. +
+
Text Only
1
+2
bashCopy code
+ls -l /path/to/your/command
+
+

如果没有执行权限,可以使用chmod命令添加执行权限:

+
Text Only
1
+2
bashCopy code
+chmod +x /path/to/your/command
+
+
    +
  1. 命令拼写错误: 请确保你正确拼写了要运行的命令。
  2. +
+

如果你能提供更具体的错误信息或命令示例,我可以提供更详细的帮助。

+
Text Only
1
+2
[root@iZ2ze72tpnr9ta1r8uvbujZ hjy]# echo $PATH
+/home/hjy/.local/bin:/home/hjy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
+
+

发行版问题

+

没有apt-get

+
C
1
+2
+3
+4
+5
sudo dnf install ?
+[root@iZ2ze72tpnr9ta1r8uvbujZ hjy]# sudo dnf install pip
+Last metadata expiration check: 3:41:20 ago on Sat Nov 18 08:06:48 2023.
+No match for argument: pip
+Error: Unable to find a match: pip
+
+

wordpress建站 ok

+

mysql数据库使用

+

域名只不过是将101.201.46.135之类的ip地址用DNS服务器映射到可记忆的字符串?

+

是的,域名系统(DNS)的主要作用是将易于记忆的域名映射到计算机网络中的IP地址。IP地址是互联网上计算机的唯一标识符,通过将域名映射到IP地址,人们可以使用容易记忆的名称来访问网站、服务器或其他网络服务,而不必记住复杂的数字地址。

+

例如,将域名 "example.com" 映射到 IP 地址 "101.201.46.135"。当你在浏览器中键入 "example.com" 时,计算机首先会查询DNS服务器,获取与 "example.com" 相关联的IP地址,然后使用这个IP地址建立连接到相应的服务器。

+

DNS使用一个层次化的结构,包括顶级域(如.com、.org)、二级域(如example.com)、子域等。这个结构允许全球范围内唯一地标识不同的域名,并通过分布式的DNS服务器系统来管理这些映射关系。

+

总的来说,域名的作用是提供一个便于记忆和使用的方式来访问互联网上的资源,而不必记住它们的具体IP地址。

+

自行建站有很多选择,取决于你的技术水平、需求、预算和个人偏好。以下是一些常见的自行建站工具和平台:

+
    +
  1. WordPress: WordPress 是一个流行的开源内容管理系统 (CMS),适用于各种类型的网站,从博客到企业网站。它有大量的主题和插件,易于使用,适合不具备编程技能的用户。
  2. +
  3. Jekyll: Jekyll 是一个静态网站生成器,使用 Ruby 语言。它适用于博客和简单的网站,生成的网站可以部署到几乎任何托管服务上。
  4. +
  5. Hugo: Hugo 是另一个静态网站生成器,用 Go 语言编写,具有快速的构建速度。它适用于个人博客和小型网站。
  6. +
  7. GitHub Pages: 如果你使用 Git 进行版本控制,并且喜欢在 GitHub 上托管代码,GitHub Pages 是一个免费的静态网站托管服务。它与 Jekyll 集成得很好,但也支持其他静态网站生成器。
  8. +
  9. Wix: Wix 是一个易于使用的网站构建平台,提供各种模板和拖放式编辑器。适合那些不具备编码经验的用户。
  10. +
  11. Squarespace: Squarespace 是一个集成的网站建设平台,提供专业设计的模板和简单的拖放编辑工具。适用于创意和商业网站。
  12. +
  13. Django: 如果你有编程经验,并且想要更大的灵活性,Django 是一个强大的Python框架,适用于开发复杂的Web应用程序。
  14. +
  15. VuePress 和 Nuxt.js: 如果你熟悉 Vue.js,VuePress 适用于文档和博客。而 Nuxt.js 则是一个用于构建Vue.js应用程序的框架,也可以用于服务器渲染和静态站点生成。
  16. +
+

选择哪个工具取决于你的具体需求和技术偏好。对于初学者,使用WordPress、Wix或Squarespace可能是更容易上手的选择。对于有一些编程经验的人来说,静态网站生成器如Jekyll、Hugo或VuePress可能是一个不错的选择。

+

image-20231118203501265

+

2023_DD是guahao老师在github上的仓库的全部内容,其中并未包括node_modules,src/assets/javascripts文件的内容,请问

+

github.io建站过程

+

使用

+

image-20231119000619441

+

image-20231119000627543

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Others/memories/index.html b/Others/memories/index.html new file mode 100644 index 00000000..7832cdfa --- /dev/null +++ b/Others/memories/index.html @@ -0,0 +1,4612 @@ + + + + + + + + + + + + + + + + + + + + + + + + + memories - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 跳转至 + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

memories should be well kept

+

7632ee568647b5f23225b90b68ac767

+

e00d05ed33af0c9f314fdc5e19ec47f

+

66646e87f910c17833690f30f578caf

+

f12baf1ea40a1928d7d717c595c9a07

+

98d47fe968364f4096cb4163f8d0564

+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/artifacts/file.pdf b/artifacts/file.pdf new file mode 100644 index 00000000..ffeea3ac Binary files /dev/null and b/artifacts/file.pdf differ diff --git a/artifacts/test/index.html b/artifacts/test/index.html new file mode 100644 index 00000000..443f86b3 --- /dev/null +++ b/artifacts/test/index.html @@ -0,0 +1,4602 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Embedding a PDF file - JY-HF learning site + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + + + + +

Embedding a PDF file

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/1.jpg b/assets/1.jpg new file mode 100644 index 00000000..e9399eb4 Binary files /dev/null and b/assets/1.jpg differ diff --git a/assets/f79b764f05e06fb90e8b137d0dd9930.jpg b/assets/f79b764f05e06fb90e8b137d0dd9930.jpg new file mode 100644 index 00000000..cff2cc0b Binary files /dev/null and b/assets/f79b764f05e06fb90e8b137d0dd9930.jpg differ diff --git a/assets/image-20231119162719305.png b/assets/image-20231119162719305.png new file mode 100644 index 00000000..dbb0f8ed Binary files /dev/null and b/assets/image-20231119162719305.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.fe8b6f2b.min.js b/assets/javascripts/bundle.fe8b6f2b.min.js new file mode 100644 index 00000000..cf778d42 --- /dev/null +++ b/assets/javascripts/bundle.fe8b6f2b.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var M=f()(_);return u("cut"),M},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(j,"px"),M.setAttribute("readonly",""),M.value=V,M}var te=function(_,M){var j=A(_);M.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,M):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,M):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(M){return typeof M}:H=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},H(V)}var mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=_.action,j=M===void 0?"copy":M,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(M){return typeof M}:Ie=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var M=0;M<_.length;M++){var j=_[M];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,M){return _&&ro(V.prototype,_),M&&ro(V,M),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(M){return M.__proto__||Object.getPrototypeOf(M)},Wt(V)}function vr(V,_){var M="data-clipboard-".concat(V);if(_.hasAttribute(M))return _.getAttribute(M)}var Ri=function(V){Ci(M,V);var _=Hi(M);function M(j,D){var Y;return _i(this,M),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(M,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),M}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ft(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ft(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=bt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(gt);var me=new Mo(Oo);var O=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[ht])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return O}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),G(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(E(r=>r.observe(t)),v(r=>Go.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),G(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),v(t=>en.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(v(t=>t?O:e))}function xe(){return new URL(location.href)}function pt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),b(t=>t.length>0),G(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():O))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function B(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!B("announce.dismiss")||!e.childElementCount)return O;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,c)," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Sn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Mn(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:O),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),ee(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?O:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):O})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:O)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),Na(n).pipe(E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>B("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(v(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return O;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(b(()=>B("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?O:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Kn(e){let t=$("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return O;let r=e.target.closest("a");if(r===null)return O;if(r.target||e.metaKey||e.ctrlKey)return O;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):O}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),O}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return O;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),v(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),O)))),v(Xn),v(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),s.pipe(v(()=>e),Z("pathname"),v(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>O)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>d(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),ee(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?O:(i.preventDefault(),I(p))}}return O}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),G(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),v(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),v(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?O:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>O),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>O),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>O),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return O}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return O}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>O),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),v(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),st({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),st({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>$(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title"))):O})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(v(()=>$(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(v(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),b(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),G(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;B("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Qn(e,{viewport$:Oe,header$:rt})),G(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>B("search.highlight")?mi(e,{index$:Mi,location$:jt}):O),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(v(()=>hs),Pe(ds),G(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.fe8b6f2b.min.js.map + diff --git a/assets/javascripts/bundle.fe8b6f2b.min.js.map b/assets/javascripts/bundle.fe8b6f2b.min.js.map new file mode 100644 index 00000000..82635852 --- /dev/null +++ b/assets/javascripts/bundle.fe8b6f2b.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an