igo/dictionary/
matrix.rs

1use std::io::{self, BufReader};
2
3use crate::util::*;
4
5/// 形態素の連接コスト表を扱う
6pub struct Matrix {
7    left_size: i32,
8    #[allow(dead_code)]
9    right_size: i32,
10    matrix: Box<[i16]>,
11}
12
13impl Matrix {
14    pub fn new(dir: &mut dyn DirLike) -> io::Result<Matrix> {
15        let mut reader = BufReader::new(dir.open("matrix.bin")?);
16        let left_size = reader.get_int()?;
17        let right_size = reader.get_int()?;
18
19        Ok(Matrix {
20            left_size,
21            right_size,
22            matrix: reader.get_short_array((left_size * right_size) as usize)?,
23        })
24    }
25
26    /// 形態素同士の連接コストを求める
27    pub fn link_cost(&self, left_id: i16, right_id: i16) -> i32 {
28        i32::from(self.matrix[(right_id as usize) * (self.left_size as usize) + (left_id as usize)])
29    }
30}