2017年5月28日日曜日

開発環境

行列プログラマー(Philip N. Klein (著)、 松田 晃一 (翻訳)、 弓林 司 (翻訳)、 脇本 佑紀 (翻訳)、 中田 洋 (翻訳)、 齋藤 大吾 (翻訳)、オライリージャパン)の3章(ベクトル空間)、3.8(問題)、Vec の確認(コンテナの中のベクトル)問題3.8.1、3.8.2を取り組んでみる。

問題3.8.1、3.8.2

コード(Emacs)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from vec import Vec
import unittest


def vec_select(veclist, k):
    return [v for v in veclist if v[k] == 0]


def vec_sum(veclist, D):
    return sum([Vec(D, {k: v[k] for k in D}) for v in veclist], Vec(D, {}))


def vec_select_sum(D, veclist, k):
    return vec_sum(vec_select(veclist, k), D)


def scale_vecs(vecdict):
    return [(1 / k) * v for k, v in vecdict.items()]


class Test(unittest.TestCase):

    def setUp(self):
        self.d = d = {'a', 'b'}

    def tearDown(self):
        pass

    # 3.8.1
    # 1
    def test_select0(self):
        v1 = Vec(self.d, {'a': 1, 'b': 2})
        v2 = Vec(self.d, {'a': 3, 'b': 4})
        veclist = [v1, v2]
        self.assertEqual(vec_select(veclist, 'a'), [])

    def test_select1(self):
        v1 = Vec(self.d, {'b': 2})
        v2 = Vec(self.d, {'a': 3, 'b': 4})
        veclist = [v1, v2]
        self.assertEqual(vec_select(veclist, 'a'), [v1])

    def test_select2(self):
        v1 = Vec(self.d, {'b': 1})
        v2 = Vec(self.d, {'b': 2})
        veclist = [v1, v2]
        self.assertEqual(vec_select(veclist, 'a'), [v1, v2])

    # 2
    def test_sum0(self):
        self.assertEqual(vec_sum([], set()), Vec(set(), {}))

    def test_sum1(self):
        v1 = Vec(self.d, {'a': 1})
        self.assertEqual(vec_sum([v1], self.d), v1)

    def test_sum2(self):
        v1 = Vec(self.d, {'a': 1})
        d = {'a', 'b', 'c'}
        v2 = Vec(d, {'a': 3, 'b': 4, 'c': 5})
        self.assertEqual(vec_sum([v1, v2], {'a', 'b'}), Vec(
            self.d, {'a': 4, 'b': 4}))

    def test_select_sum0(self):
        self.assertEqual(vec_select_sum(set(), [], 0), Vec(set(), {}))

    def test_select_sum1(self):
        v1 = Vec(self.d, {'a': 1})
        v2 = Vec(self.d, {'b': 2})
        self.assertEqual(vec_select_sum(self.d, [v1, v2], 'a'), v2)

    def test_select_sum1(self):
        v1 = Vec(self.d, {'b': 1})
        v2 = Vec(self.d, {'b': 2})
        self.assertEqual(vec_select_sum(self.d, [v1, v2], 'a'),
                         Vec(self.d, {'b': 3}))

    # 3.8.2
    def test_scale_vecs0(self):
        self.assertEqual(scale_vecs({}), [])

    def test_scale_vecs1(self):
        v1 = Vec(self.d, {'a': 1})
        v2 = Vec(self.d, {'b': 2})
        vecdict = {1: v1, 2: v2}
        self.assertEqual(scale_vecs(vecdict), [v1, 1 / 2 * v2])

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

入出力結果(Terminal, IPython)

$ ./sample6.py -v
test_scale_vecs0 (__main__.Test) ... ok
test_scale_vecs1 (__main__.Test) ... ok
test_select0 (__main__.Test) ... ok
test_select1 (__main__.Test) ... ok
test_select2 (__main__.Test) ... ok
test_select_sum0 (__main__.Test) ... ok
test_select_sum1 (__main__.Test) ... ok
test_sum0 (__main__.Test) ... ok
test_sum1 (__main__.Test) ... ok
test_sum2 (__main__.Test) ... ok

----------------------------------------------------------------------
Ran 10 tests in 0.001s

OK
$

0 コメント:

コメントを投稿