OpenMythosのサンプルプログラムを動かしました

1.概要 前回、OpenMythosの環境構築まで実現したので、GitHubにあるサンプルプログラム(Usage)を動かしてみました。一部エラーが発生しましたが、結果出力部分なので修正をしました。その内容を記述します。 2.詳細 Usageに記載されているPythonプログラムをopenmythos_usage.pyとして作成します。 $ source ~/mypy/bin/activate (mypy) $ pythoh3 openmythos_usage.py 下記エラーとなります [MLA] Parameters: 1,538,626 [MLA] Logits shape: torch.Size([2, 16, 1000]) [MLA] Generated shape: torch.Size([2, 24]) Traceback (most recent call last):   File "/home/nakasima/openmythos/openmythos_usage.py", line 48, in <module>     rho = torch.linalg.eigvals(A).abs().max().item()           ^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: linalg.eig: The input tensor A must have at least 2 dimensions. コードの下記部分を修正します #rho = torch.linalg.eigvals(A).abs().max().item() rho = A.abs().max().item() $ source ~/mypy/bin/activate (mypy) $ pythoh3 openmythos_usage.py [MLA] Parameters: 1,538,626 [MLA] Logits shape: torch.Size([2, 16, 1000]) [MLA] Generated shape: torch.Size([2, 24]) [MLA] Spectral radius ρ(A) = 0.3679 (mus...

テスト駆動開発を利用したfibonacciのコード作成 再帰呼出編

1.概要

開発手法としてKent BeckのTDD(Test-Driven Development)を活用しています。参考書籍ではJavaを利用してfibonacci関数をTDDで開発する手法が紹介されています。ここでは、Pythonを利用してJava版と同じことを実施します。

TDDはテストコードを作成し、そのテストコードがパスするコードを作成するという作業を続けて、目的とするコードを作成する手法です。アジャイル(XP手法)の1つであり、スクラムなどの開発でも幅広く利用されている方法です。テストコードはUnitテスト方式で作成します。UnitテストはKent Beckが開発したものです。

2.詳細

fibonacci数列は、0,1,1,2,3,5,8,13,.....と継続する数列で、先行する2つの数値を足した値が、次の数値になる無限に続く数列です。初期値と次の値は、0と1になっています。

(1) testcode(TestFibonacci.py)を作成
import unittest
from fibonacci import Fibonacci

class TestFibonacci(unittest.TestCase):
    None

if __name__ == '__main__':
    unittest.main()

(2) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py

fibonacciが存在しないとのエラー発生

Traceback (most recent call last):
  File "TestFibonacci.py", line 4, in <module>
    from fibonacci import Fibonacci
ModuleNotFoundError: No module named 'fibonacci'

(3) code(finonacci.py)を作成
class Fibonacci:
    None

if __name__ == '__main__':
    obj = Fibonacci()

(4) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py

実行エラーがなくなりました。これで、testcodeとcodeのベースができました

Ran 0 tests in 0.000s
OK

(5) testcode(TestFibonacci.py)を修正
初期値の0,1を記述します。

import unittest
from fibonacci import Fibonacci

class TestFibonacci(unittest.TestCase):

    def setUp(self):
        self.obj = Fibonacci()
    def tearDown(self):
        del self.obj
    def testFibonacci01(self):
        assert(self.obj.fibonacci(0) == 0)
        assert(self.obj.fibonacci(1) == 1)
        
if __name__ == '__main__':
    unittest.main()

(6) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py

testFibonacci01でエラー発生。fibonacci(0)が計算できていない

ERROR: testFibonacci01 (__main__.TestFibonacci)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "TestFibonacci.py", line 13, in testFibonacci01
    assert(self.obj.fibonacci(0) == 0)
AttributeError: 'Fibonacci' object has no attribute 'fibonacci'

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)

(7) code(finonacci.py)を修正
初期値処理を追加します

class Fibonacci:
    def fibonacci(self, number):
        if number == 0:
            return 0
        if number == 1:
            return 1

if __name__ == '__main__':
    obj = Fibonacci()

(8) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
エラーがなくなります

Ran 1 test in 0.000s
OK

(9) testcode(TestFibonacci.py)を修正
3番目の項目の試験を記述します。
1番目と2番目の項目を加えると、3番目の項目になります。

import unittest
from fibonacci import Fibonacci

class TestFibonacci(unittest.TestCase):
    def setUp(self):
        self.obj = Fibonacci()
    def tearDown(self):
        del self.obj
    def testFibonacci01(self):
        assert(self.obj.fibonacci(0) == 0)
        assert(self.obj.fibonacci(1) == 1)
        assert(self.obj.fibonacci(2) == \
                self.obj.fibonacci(0) + self.obj.fibonacci(1))

if __name__ == '__main__':
    unittest.main()

(10) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
testFibonacci01でエラー発生。fibonacci(2)が計算できていない

FAIL: testFibonacci01 (__main__.TestFibonacci)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "TestFibonacci.py", line 15, in testFibonacci01
    assert(self.obj.fibonacci(2) == \
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)

(11) code(finonacci.py)を修正
3番目以降の処理を追加します

class Fibonacci:
    def fibonacci(self, number):
        if number == 0:
            return 0
        if number == 1:
            return 1
        return (self.fibonacci(number-2) + self.fibonacci(number-1))

if __name__ == '__main__':
    obj = Fibonacci()

(12) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py
エラーがなくなります
Ran 1 test in 0.000s
OK

(13) testcode(TestFibonacci.py)を修正
10番目の項目の試験を記述します。
8番目と9番目の項目を加えると、10番目の項目になります。

import unittest
from fibonacci import Fibonacci

class TestFibonacci(unittest.TestCase):
    def setUp(self):
        self.obj = Fibonacci()
    def tearDown(self):
        del self.obj
    def testFibonacci01(self):
        assert(self.obj.fibonacci(0) == 0)
        assert(self.obj.fibonacci(1) == 1)
        assert(self.obj.fibonacci(2) == \
                self.obj.fibonacci(0) + self.obj.fibonacci(1))
        assert(self.obj.fibonacci(10) == \
                self.obj.fibonacci(8) + self.obj.fibonacci(9))

if __name__ == '__main__':
    unittest.main()

(14) testcode(TestFibonacci.py)を実行
python3 TestFibonacci.py

Ran 1 test in 0.000s
OK

これで、fibonacci関数プログラムfibonacci.pyが完成しました。

参考

テスト駆動開発入門 ケント・ベック著 

コメント

このブログの人気の投稿

miniPCのBMAXでWindows11のsecure boot設定漏れでトラブル発生

LinuxMint-22.3にWine 11.6をサクッと入れてみました

LinuxMint 21.3にWinBoat導入を試してみました