packages feed

hanalyze-0.2.0.0: src/Hanalyze/Design/MultiRSM.hs

{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module      : Hanalyze.Design.MultiRSM
-- Description : 複数応答同時の Response Surface Methodology (各応答の二次モデル並列 fit + 極値解析)
-- Copyright   : (c) 2026 Aelysce Project (Toshiaki Honda)
-- License     : BSD-3-Clause
--
-- Multi-response Response Surface Methodology.
--
-- Fits a quadratic model to each response @y_j@ and performs the extremum
-- analysis @q@ times in parallel. As a starting point for multi-objective
-- optimization, this presents the individual optimum of each response.
module Hanalyze.Design.MultiRSM
  ( MultiQuadFit (..)
  , fitMultiQuadratic
  , optimumPointsMulti
  ) where

import qualified Numeric.LinearAlgebra as LA
import Hanalyze.Design.RSM (QuadFit (..), fitQuadratic, optimumPoint)

-- | Aggregated multi-response quadratic fit.
data MultiQuadFit = MultiQuadFit
  { mqFits :: [QuadFit]   -- ^ Per-response quadratic fits (length @q@).
  , mqK    :: Int         -- ^ Number of factors @k@.
  , mqQ    :: Int         -- ^ Number of responses @q@.
  } deriving (Show)

-- | Multi-response quadratic regression: apply 'fitQuadratic' to each
-- response column independently.
fitMultiQuadratic :: [[Double]]            -- ^ Design matrix (@n × k@).
                  -> LA.Matrix Double      -- ^ Response @Y@ (@n × q@).
                  -> MultiQuadFit
fitMultiQuadratic design y =
  let q = LA.cols y
      k = if null design then 0 else length (head design)
      colFit j = fitQuadratic design (LA.toList (LA.flatten (y LA.¿ [j])))
      fits = [colFit j | j <- [0 .. q - 1]]
  in MultiQuadFit fits k q

-- | Compute 'optimumPoint' for each response and aggregate the
-- extremum information.
optimumPointsMulti :: MultiQuadFit -> [([Double], Double, [Double])]
optimumPointsMulti mq = map optimumPoint (mqFits mq)