旧 julia 包的升级:以 v0.6 升级 v1.0 为例

我印象中肯定在论坛上写过类似的内容。搜帖子没搜到。收藏夹里也没有。
那就重写一版吧。


整体的想法是用 v0.7 版本做中转,v0.7 可以给出大量的弃用警告,便于我们修复旧的代码库。

v0.7 版本的下载

旧版依赖安装

以下以 GitHub - JuliaPapers/MatrixProductStates.jl: Julia implementation of algorithms for matrix product states 为例

MatrixProductStates.jl 的 `` 文件中包含两个依赖项:

这两个包现在还在维护,所以直接尝试用 ] add 安装:

  • ] add LinearMaps:成功安装了 v2.3.0 版本
  • ] add TensorOperations:成功安装了 v0.7.1 版本

我们运气不错可以正常安装。

无法直接安装依赖

更常见的情况是,旧包使用了旧的依赖,依赖项也没有维护了。
这个时候你可能要评估一下

  • 修复这个包和他的依赖树(依赖也有依赖)大致付出的时间是否值得
  • 相对于读源码、论文然后重写一般谁更省事?

生成 Project.toml

切换到 MatrixProductStates.jl 的根目录,打开 julia v0.7

  • 切换到 Pkg 模式,以下操作均在 Pkg 模式中进行:]
  • 激活当前项目:activate .
    Pkg 模式的提示符变为:(MatrixProductStates.jl) pkg>
    这一步也会自动生成:Project.tomlManifest.toml
  • 安装依赖包。注意,刚刚装包是装在全局了
    依赖全局装过了,这一步应该很快
  • 检查已经安装的依赖:st
(MatrixProductStates.jl) pkg> st
    Status `Project.toml`
  [7a12625a] + LinearMaps v2.3.0
  [6aa20fa7] + TensorOperations v0.7.1
  • (可选)预编译依赖:precompile
  • 按退格键/Backspace 返回 julia REPL

补全 Project.toml 信息

name = "MatrixProductStates"
uuid = "28892423-5e71-5a24-babc-7f7f28a8bceb"
authors = [ "James Douglas" ]
version = "0.1.0"

[compat]
julia = "1.0"

原有的 [deps] 一节不要动它,让 Pkg 去管理他

这里说明一下如何生成 uuid

  • v0.7:直接使用 uuid4:using UUIDs; uuid4()
  • v1.6+:使用带命名空间的 uuid,建议直接用作者名:using UUIDs; uuid5(uuid4(), "James Douglas")

尝试运行

在 julia REPL 中

include("src\\MatrixProductStates.jl")

导入时会产生大量的弃用警告:

┌ Warning: Deprecated syntax `multiple line breaks between doc string and object` at E:\opensource-repo\MatrixProductStates.jl\src\MatrixProductStates.jl:41.
│ Use `at most one line break` instead.
└ @ E:\opensource-repo\MatrixProductStates.jl\src\MatrixProductStates.jl:41

...

WARNING: importing deprecated binding Base.AbstractRNG into MatrixProductStates.
WARNING: Base.AbstractRNG is deprecated: it has been moved to the standard library package `Random`.
Add `using Random` to your imports.
  likely near E:\opensource-repo\MatrixProductStates.jl\src\MatrixProductStates.jl:26

...

┌ Warning: The postfix .' syntax is deprecated. For vector v in v.', use transpose(v) instead. For matrix A in A.', use copy(transpose(A)) instead, unless A.' appears as an argument of *, / or \. In those cases, use transpose(A) instead.
└ @ none:0

如果你不介意,现在其实这个包就可用了。
后续的升级就是慢慢的修复警告。

1 个赞

修复警告

Base 函数移动

一些函数从 Base 里移动到了标准库中:

WARNING: Base.AbstractRNG is deprecated: it has been moved to the standard library package `Random`.
Add `using Random` to your imports.
  likely near E:\opensource-repo\MatrixProductStates.jl\src\MatrixProductStates.jl:26
  • ] add Random
  • MatrixProductStates.jl 里上方加一行 using Random
    import Base.randn
    +using Random
    #import CuArrays.CUSOLVER.qrq!
    

文档字符串空行

大概是说,文档字符串必须紧贴注释的对象,不能有空格行

┌ Warning: Deprecated syntax `multiple line breaks between doc string and object` at E:\opensource-repo\MatrixProductStates.jl\src\MatrixProductStates.jl:41.
│ Use `at most one line break` instead.
└ @ E:\opensource-repo\MatrixProductStates.jl\src\MatrixProductStates.jl:41

这个改起来很简单,删掉空行即可。

  • 我选择用正则替换
    """\n+function
    """\nfunction
    
  • constructors.jl 里还有 5 个漏网之鱼,手动修复即可

逐点转置

┌ Warning: The postfix .' syntax is deprecated. For vector v in v.', use transpose(v) instead. For matrix A in A.', use copy(transpose(A)) instead, unless A.' appears as an argument of *, / or \. In those cases, use transpose(A) instead.
└ @ none:0

这个警告并没有标注具体的代码位置,需要搜索一下:.'
一共有 9 处

这个警告需要分类讨论修复方式:
对于 A.' 的旧用法

  • A 里只是数值:替换为 A'
  • 如果 A 里面放的是向量 Vector,替换为 transpose(A)
  • 出现在 *, /, \ 的运算中,替换为 transpose(A)
  • 不在以上运算中,且 A 里面放的是矩阵 Matrix,替换为 copy(transpose(A))

我不数据这个包的代码,所以对于各个变量的类型不太确定,这里就不做修改了。
动态调一边,这几个警告就能修完了。

部分修复完的代码