use super::*;
#[derive(Clone)]
pub struct BinomialLocationScaleFamily {
pub y: Array1<f64>,
pub weights: Array1<f64>,
pub link_kind: InverseLink,
pub threshold_design: Option<DesignMatrix>,
pub log_sigma_design: Option<DesignMatrix>,
pub policy: crate::solver::resource::ResourcePolicy,
}
macro_rules! impl_binomial_location_scale_joint_psi_family {
($family:ty, $label:literal) => {
impl LocationScaleJointPsiFamily for $family {
type Direction = LocationScaleJointPsiDirection;
const LABEL: &'static str = $label;
fn ws_policy(&self) -> &crate::solver::resource::ResourcePolicy {
&self.policy
}
fn ws_exact_joint_dense_block_designs<'a>(
&'a self,
specs: Option<&'a [ParameterBlockSpec]>,
) -> Result<Option<(Cow<'a, Array2<f64>>, Cow<'a, Array2<f64>>)>, String> {
self.exact_joint_dense_block_designs(specs)
}
fn ws_psi_direction(
&self,
block_states: &[ParameterBlockState],
derivative_blocks: &[Vec<crate::custom_family::CustomFamilyBlockPsiDerivative>],
psi_index: usize,
design_loc: &Array2<f64>,
design_scale: &Array2<f64>,
policy: &crate::solver::resource::ResourcePolicy,
) -> Result<Option<LocationScaleJointPsiDirection>, String> {
self.exact_newton_joint_psi_direction(
block_states,
derivative_blocks,
psi_index,
design_loc,
design_scale,
policy,
)
}
fn ws_psi_second_order_terms_from_parts(
&self,
block_states: &[ParameterBlockState],
derivative_blocks: &[Vec<crate::custom_family::CustomFamilyBlockPsiDerivative>],
psi_a: &LocationScaleJointPsiDirection,
psi_b: &LocationScaleJointPsiDirection,
design_loc: &Array2<f64>,
design_scale: &Array2<f64>,
subsample: Option<&[crate::solver::outer_subsample::WeightedOuterRow]>,
) -> Result<ExactNewtonJointPsiSecondOrderTerms, String> {
assert!(subsample.is_none());
self.exact_newton_joint_psisecond_order_terms_from_parts(
block_states,
derivative_blocks,
psi_a,
psi_b,
design_loc,
design_scale,
)
}
fn ws_psi_hessian_directional_from_parts(
&self,
block_states: &[ParameterBlockState],
psi_dir: &LocationScaleJointPsiDirection,
d_beta_flat: &Array1<f64>,
design_loc: &Array2<f64>,
design_scale: &Array2<f64>,
subsample: Option<&[crate::solver::outer_subsample::WeightedOuterRow]>,
) -> Result<Array2<f64>, String> {
assert!(subsample.is_none());
self.exact_newton_joint_psihessian_directional_derivative_from_parts(
block_states,
psi_dir,
d_beta_flat,
design_loc,
design_scale,
)
}
}
};
}
impl_binomial_location_scale_joint_psi_family!(
BinomialLocationScaleFamily,
"BinomialLocationScaleFamily"
);
impl_binomial_location_scale_joint_psi_family!(
BinomialLocationScaleWiggleFamily,
"BinomialLocationScaleWiggleFamily"
);
pub(crate) type BinomialLocationScaleExactNewtonJointPsiWorkspace =
LocationScaleJointPsiWorkspace<BinomialLocationScaleFamily>;
pub(crate) type BinomialLocationScaleWiggleExactNewtonJointPsiWorkspace =
LocationScaleJointPsiWorkspace<BinomialLocationScaleWiggleFamily>;