| qubx_model.h.html | mathcode2html |
| Source file: qubx_model.h | |
| Converted: Wed Jan 6 2016 at 15:24:06 | |
| This documentation file will not reflect any later changes in the source file. |
$$\phantom{******** If you see this on the webpage then the
browser could not locate *********}$$
$$\phantom{******** jsMath/easy/load.js or the variable root
is set wrong in this file *********}$$
$$\newcommand{\vector}[1]{\left[\begin{array}{c} #1 \end{array}\right]}$$
$$\newenvironment{matrix}{\left[\begin{array}{cccccccccc}} {\end{array}\right]}$$
$$\newcommand{\A}{{\cal A}}$$
$$\newcommand{\W}{{\cal W}}$$
/* Copyright 2008-2011 Research Foundation State University of New York */
/* This file is part of QUB Express. */
/* QUB Express is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation, either version 3 of the License, or */
/* (at your option) any later version. */
/* QUB Express is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* You should have received a copy of the GNU General Public License, */
/* named LICENSE.txt, in the QUB Express program directory. If not, see */
/* <http://www.gnu.org/licenses/>. */
#ifndef QUBX_MODEL_H
#define QUBX_MODEL_H
#include "qubfast.h"
#ifdef __cplusplus
extern "C" {
#endif
// Model has constant rates, amps etc.
#pragma pack(push, 1)
typedef struct {
// maintained by model:
int version;
void *storage;
int Nstate, Nclass;
int *clazz; // clazz[i] = class_index of state i
// you set these:
int usePeq, IeqFv;
int Nchannel;
int iVoltage; // 1-based index of voltage signal (since 0 is the current)
#ifdef EMSCRIPTEN
int r1; // emscripten wants doubles aligned at 64
#endif
double Gleak, Vleak, Vrev;
// and fill these:
double amp0, var0; // per-class; honored only if IeqFv
double *amp, *var; // per class; units of IeqFv ? pS : pA; IeqFv: excess conductance; else: total single-channel current
double *P0; // per state
double **K0, **K1;
int **L, **V;
// set nonzero to interrupt
int stop_flag;
int progress; // 0 to 100
#ifdef EMSCRIPTEN
int r2;
#endif
// see calc_std funcs:
double d_Nchannel;
double d_amp0, d_var0;
double *d_amp, *d_var;
double **d_K0, **d_K1;
// end version 1
double **K2, **d_K2;
int **P;
// end version 2
} qubx_model;
#pragma pack(pop)
QUBFAST_API qubx_model* qubx_model_create(int Nstate, int Nclass, int *class_of_state,
callbk_reportfun report_cb, void *report_data);
QUBFAST_API void qubx_model_free(qubx_model *m);
typedef struct {
int version;
void *storage;
qubx_model *single_model;
qubx_model *multi_model;
int nmutistate, nmutipath, nmuticlass, nclass_order, npath;
int *class_order, *cmutistate, *path, *mutistate, *mutipath;
// end version 1
} qubx_multi_model;
QUBFAST_API void qubx_mutimakv_size(int nchannel, int nstate, int npath, int *path,
int *nmutistate, int *nmutipath);
// returns upper bound on array sizes needed for mutistate and mutipath, via args
QUBFAST_API void qubx_mutimakv(int nchannel, int nstate, int npath, int *state, int *path, float *ratio,
int nmutistate, int nmutipath, int* nmuticlass, int* mutistate, int* mutipath);
// mutistate = new int[nmutistate * (nstate + 1)]
// mutipath = new int[nmutipath * 4]
QUBFAST_API qubx_multi_model* qubx_multi_model_create(qubx_model *single_model);
QUBFAST_API void qubx_multi_model_free(qubx_multi_model *mm);
QUBFAST_API void qubx_multi_model_update(qubx_multi_model *mm); // single_model -> multi_model amps and rates
typedef struct {
int version;
void *storage;
int Npar, NparR, NfPar, Ncns, NcnsR;
double **Ain, *Bin;
double *pars, *fPars;
double **Acns, **Ascal;
double *Bcns, *Bscal;
// end version 1
} qubx_constrained;
QUBFAST_API qubx_constrained* qubx_constrained_create(int Npar);
QUBFAST_API void qubx_constrained_free(qubx_constrained *obj);
QUBFAST_API int qubx_constrained_setup(qubx_constrained *obj);
QUBFAST_API void qubx_constrained_free_to_pars(qubx_constrained *obj);
QUBFAST_API void qubx_constrained_pars_to_free(qubx_constrained *obj);
QUBFAST_API void qubx_constrained_calc_std(qubx_constrained *obj, double *InvHessian, double *dPar);
typedef struct {
int version;
void *storage;
qubx_model *model;
int Nstim, Nsig;
double *stimclasses;
double *sc_frac;
qubx_constrained *cns;
double **sc_amp, **sc_var, **sc_std;
// end version 1
} qubx_stim_amps;
// define param order: amp[0], var[0], amp[1], var[1], ..., amp0, var0
QUBFAST_API qubx_stim_amps* qubx_stim_amps_create(qubx_model *m, int Nstim_, int Nsig_,
double *stimclasses_, double *sc_frac_);
QUBFAST_API void qubx_stim_amps_free(qubx_stim_amps *obj);
QUBFAST_API void qubx_stim_amps_setup_scs(qubx_stim_amps *obj);
QUBFAST_API void qubx_stim_amps_pars_to_model(qubx_stim_amps *obj);
QUBFAST_API void qubx_stim_amps_model_to_pars(qubx_stim_amps *obj);
QUBFAST_API void qubx_stim_amps_fix_amp0(qubx_stim_amps *obj);
QUBFAST_API void qubx_stim_amps_fix_var0(qubx_stim_amps *obj);
QUBFAST_API void qubx_stim_amps_fix_amp(qubx_stim_amps *obj, int cls);
QUBFAST_API void qubx_stim_amps_fix_var(qubx_stim_amps *obj, int cls);
QUBFAST_API void qubx_stim_amps_calc_std(qubx_stim_amps *obj, double *InvHessian);
typedef int (*eigen_func)(int Nstate, double *a, double *wr, double *wi, double *v, double *v_inv);
typedef struct {
int version;
void *storage;
qubx_model *model;
eigen_func custom_eigen; // you can do better than the built-in (e.g. wrap scipy or linpack)
int Nstim, Nsig;
double *stimclasses;
double *sc_frac;
qubx_constrained *cns;
double ***QQ, ***AA, **QQ_eig, **QQ_imag, ***QQ_evec, ***QQ_einv;
double **A; // of requested sc, t
// end version 1
} qubx_stim_rates;
// param order from qubx_constraints: K01toK
QUBFAST_API qubx_stim_rates *qubx_stim_rates_create(qubx_model *model, int Nstim_, int Nsig_,
double *stimclasses_, double *sc_frac_, double sampling,
eigen_func custom_eigen);
QUBFAST_API void qubx_stim_rates_free(qubx_stim_rates *obj);
QUBFAST_API void qubx_stim_rates_setup_QQ(qubx_stim_rates *obj); // from rates
QUBFAST_API void qubx_stim_rates_setup_AA(qubx_stim_rates *obj); // and QQ_*; from QQ
QUBFAST_API void qubx_stim_rates_setup_A(qubx_stim_rates *obj, int sc, double dt);
QUBFAST_API void qubx_stim_rates_fix_rate(qubx_stim_rates *obj, int a, int b);
QUBFAST_API void qubx_stim_rates_fix_exp(qubx_stim_rates *obj, int a, int b);
QUBFAST_API void qubx_stim_rates_scale_rate(qubx_stim_rates *obj, int a, int b, int c, int d);
QUBFAST_API void qubx_stim_rates_scale_exp(qubx_stim_rates *obj, int a, int b, int c, int d);
QUBFAST_API void qubx_stim_rates_balance_loop(qubx_stim_rates *obj, int Nloop, int *loopstates);
QUBFAST_API void qubx_stim_rates_balance_loops(qubx_stim_rates *obj);
QUBFAST_API int qubx_stim_rates_setup_constraints(qubx_stim_rates *obj);
QUBFAST_API void qubx_stim_rates_pars_to_model(qubx_stim_rates *obj);
QUBFAST_API void qubx_stim_rates_model_to_pars(qubx_stim_rates *obj);
QUBFAST_API void qubx_stim_rates_calc_std(qubx_stim_rates *obj, double *InvHessian);
#ifdef __cplusplus
}
#endif
#endif