#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_odeiv2.h>
#include <gsl/gsl_math.h>

/* Enums will be used for indexing purposes.   */
enum stateVariable { _gaba, _gabaGABABR, _gabaGABABRGi, _gabaGABABRGibg, _GABABR, _GABABRGi, _Gi, _GiaGDP, _GiaGTP, _GiaGTPRGS, _Gibg, _GIRK, _GIRKGibg, _GIRKGibg2, _GIRKGibg3, _GIRKGibg4, _RGS, _VGCC, _VGCCGibg, numStateVar };
enum param { _kf_R0, _kf_R1, _kr_R1, _kf_R2, _kr_R2, _kf_R3, _kf_R4, _kf_R5, _kr_R5, _kf_R6, _kr_R6, _kf_R7, _kr_R7, _kf_R8, _kf_R9, _kf_R10, _kr_R10, _kf_R11, _kr_R11, _kf_R12, _kr_R12, _kf_R13, _kr_R13, _kf_R14, _kr_R14, _k_gaba, numParam };
enum func { _oGIRKGibg4, _oVGCCGibg, _ogaba, numFunc };
enum eventLabel { on, off, numEvents };

/* The error codes indicate how many values a function returns.                             */
/* Each function expects the output buffer to be allocated with at least that many values   */

/* ODE vector field: y' = f(t,y;p)   */
int GABAB_signaling_vf(double t, const double y_[], double *f_, void *par){
	double *p_=par;
	if (!y_ || !f_) return 19;
/* 	constants   */
/* 	parameter values   */
	double kf_R0 = p_[_kf_R0];                                          /* [  0] */
	double kf_R1 = p_[_kf_R1];                                          /* [  1] */
	double kr_R1 = p_[_kr_R1];                                          /* [  2] */
	double kf_R2 = p_[_kf_R2];                                          /* [  3] */
	double kr_R2 = p_[_kr_R2];                                          /* [  4] */
	double kf_R3 = p_[_kf_R3];                                          /* [  5] */
	double kf_R4 = p_[_kf_R4];                                          /* [  6] */
	double kf_R5 = p_[_kf_R5];                                          /* [  7] */
	double kr_R5 = p_[_kr_R5];                                          /* [  8] */
	double kf_R6 = p_[_kf_R6];                                          /* [  9] */
	double kr_R6 = p_[_kr_R6];                                          /* [ 10] */
	double kf_R7 = p_[_kf_R7];                                          /* [ 11] */
	double kr_R7 = p_[_kr_R7];                                          /* [ 12] */
	double kf_R8 = p_[_kf_R8];                                          /* [ 13] */
	double kf_R9 = p_[_kf_R9];                                          /* [ 14] */
	double kf_R10 = p_[_kf_R10];                                        /* [ 15] */
	double kr_R10 = p_[_kr_R10];                                        /* [ 16] */
	double kf_R11 = p_[_kf_R11];                                        /* [ 17] */
	double kr_R11 = p_[_kr_R11];                                        /* [ 18] */
	double kf_R12 = p_[_kf_R12];                                        /* [ 19] */
	double kr_R12 = p_[_kr_R12];                                        /* [ 20] */
	double kf_R13 = p_[_kf_R13];                                        /* [ 21] */
	double kr_R13 = p_[_kr_R13];                                        /* [ 22] */
	double kf_R14 = p_[_kf_R14];                                        /* [ 23] */
	double kr_R14 = p_[_kr_R14];                                        /* [ 24] */
	double k_gaba = p_[_k_gaba];                                        /* [ 25] */
/* 	state variables   */
	double gaba = y_[_gaba];                                            /* [  0] */
	double gabaGABABR = y_[_gabaGABABR];                                /* [  1] */
	double gabaGABABRGi = y_[_gabaGABABRGi];                            /* [  2] */
	double gabaGABABRGibg = y_[_gabaGABABRGibg];                        /* [  3] */
	double GABABR = y_[_GABABR];                                        /* [  4] */
	double GABABRGi = y_[_GABABRGi];                                    /* [  5] */
	double Gi = y_[_Gi];                                                /* [  6] */
	double GiaGDP = y_[_GiaGDP];                                        /* [  7] */
	double GiaGTP = y_[_GiaGTP];                                        /* [  8] */
	double GiaGTPRGS = y_[_GiaGTPRGS];                                  /* [  9] */
	double Gibg = y_[_Gibg];                                            /* [ 10] */
	double GIRK = y_[_GIRK];                                            /* [ 11] */
	double GIRKGibg = y_[_GIRKGibg];                                    /* [ 12] */
	double GIRKGibg2 = y_[_GIRKGibg2];                                  /* [ 13] */
	double GIRKGibg3 = y_[_GIRKGibg3];                                  /* [ 14] */
	double GIRKGibg4 = y_[_GIRKGibg4];                                  /* [ 15] */
	double RGS = y_[_RGS];                                              /* [ 16] */
	double VGCC = y_[_VGCC];                                            /* [ 17] */
	double VGCCGibg = y_[_VGCCGibg];                                    /* [ 18] */
/* 	expressions   */
	double R0 = k_gaba - kf_R0*gaba;
	double R1 = kf_R1*gaba*GABABR-kr_R1*gabaGABABR;
	double R2 = kf_R2*gabaGABABR*Gi-kr_R2*gabaGABABRGi;
	double R3 = kf_R3*gabaGABABRGi;
	double R4 = kf_R4*gabaGABABRGibg;
	double R5 = kf_R5*GABABR*Gi-kr_R5*GABABRGi;
	double R6 = kf_R6*gaba*GABABRGi-kr_R6*gabaGABABRGi;
	double R7 = kf_R7*GiaGTP*RGS-kr_R7*GiaGTPRGS;
	double R8 = kf_R8*GiaGTPRGS;
	double R9 = kf_R9*GiaGDP*Gibg;
	double R10 = kf_R10*GIRK*Gibg-kr_R10*GIRKGibg;
	double R11 = kf_R11*GIRKGibg*Gibg-kr_R11*GIRKGibg2;
	double R12 = kf_R12*GIRKGibg2*Gibg-kr_R12*GIRKGibg3;
	double R13 = kf_R13*GIRKGibg3*Gibg-kr_R13*GIRKGibg4;
	double R14 = kf_R14*VGCC*Gibg-kr_R14*VGCCGibg;
	memset(f_,0,sizeof(double)*19); /* initialize with 0.0 */
	f_[0] = +R0-R1-R6;
	f_[1] = +R1-R2+R4;
	f_[2] = +R2-R3+R6;
	f_[3] = +R3-R4;
	f_[4] = -R1-R5;
	f_[5] = +R5-R6;
	f_[6] = -R2-R5+R9;
	f_[7] = +R8-R9;
	f_[8] = +R3-R7;
	f_[9] = +R7-R8;
	f_[10] = +R4-R9-R10-R11-R12-R13-R14;
	f_[11] = -R10;
	f_[12] = +R10-R11;
	f_[13] = +R11-R12;
	f_[14] = +R12-R13;
	f_[15] = +R13;
	f_[16] = -R7+R8;
	f_[17] = -R14;
	f_[18] = +R14;
	return GSL_SUCCESS;
}

/* ODE Jacobian: df(t,y;p)/dy   */
int GABAB_signaling_jac(double t, const double y_[], double *jac_, double *dfdt_, void *par){
	double *p_=par;
	if (!y_ || !jac_) return 361;
/* 	constants   */
/* 	parameter values   */
	double kf_R0 = p_[_kf_R0];                                          /* [  0] */
	double kf_R1 = p_[_kf_R1];                                          /* [  1] */
	double kr_R1 = p_[_kr_R1];                                          /* [  2] */
	double kf_R2 = p_[_kf_R2];                                          /* [  3] */
	double kr_R2 = p_[_kr_R2];                                          /* [  4] */
	double kf_R3 = p_[_kf_R3];                                          /* [  5] */
	double kf_R4 = p_[_kf_R4];                                          /* [  6] */
	double kf_R5 = p_[_kf_R5];                                          /* [  7] */
	double kr_R5 = p_[_kr_R5];                                          /* [  8] */
	double kf_R6 = p_[_kf_R6];                                          /* [  9] */
	double kr_R6 = p_[_kr_R6];                                          /* [ 10] */
	double kf_R7 = p_[_kf_R7];                                          /* [ 11] */
	double kr_R7 = p_[_kr_R7];                                          /* [ 12] */
	double kf_R8 = p_[_kf_R8];                                          /* [ 13] */
	double kf_R9 = p_[_kf_R9];                                          /* [ 14] */
	double kf_R10 = p_[_kf_R10];                                        /* [ 15] */
	double kr_R10 = p_[_kr_R10];                                        /* [ 16] */
	double kf_R11 = p_[_kf_R11];                                        /* [ 17] */
	double kr_R11 = p_[_kr_R11];                                        /* [ 18] */
	double kf_R12 = p_[_kf_R12];                                        /* [ 19] */
	double kr_R12 = p_[_kr_R12];                                        /* [ 20] */
	double kf_R13 = p_[_kf_R13];                                        /* [ 21] */
	double kr_R13 = p_[_kr_R13];                                        /* [ 22] */
	double kf_R14 = p_[_kf_R14];                                        /* [ 23] */
	double kr_R14 = p_[_kr_R14];                                        /* [ 24] */
	double k_gaba = p_[_k_gaba];                                        /* [ 25] */
/* 	state variables   */
	double gaba = y_[_gaba];                                            /* [  0] */
	double gabaGABABR = y_[_gabaGABABR];                                /* [  1] */
	double gabaGABABRGi = y_[_gabaGABABRGi];                            /* [  2] */
	double gabaGABABRGibg = y_[_gabaGABABRGibg];                        /* [  3] */
	double GABABR = y_[_GABABR];                                        /* [  4] */
	double GABABRGi = y_[_GABABRGi];                                    /* [  5] */
	double Gi = y_[_Gi];                                                /* [  6] */
	double GiaGDP = y_[_GiaGDP];                                        /* [  7] */
	double GiaGTP = y_[_GiaGTP];                                        /* [  8] */
	double GiaGTPRGS = y_[_GiaGTPRGS];                                  /* [  9] */
	double Gibg = y_[_Gibg];                                            /* [ 10] */
	double GIRK = y_[_GIRK];                                            /* [ 11] */
	double GIRKGibg = y_[_GIRKGibg];                                    /* [ 12] */
	double GIRKGibg2 = y_[_GIRKGibg2];                                  /* [ 13] */
	double GIRKGibg3 = y_[_GIRKGibg3];                                  /* [ 14] */
	double GIRKGibg4 = y_[_GIRKGibg4];                                  /* [ 15] */
	double RGS = y_[_RGS];                                              /* [ 16] */
	double VGCC = y_[_VGCC];                                            /* [ 17] */
	double VGCCGibg = y_[_VGCCGibg];                                    /* [ 18] */
/* 	expressions   */
	double R0 = k_gaba - kf_R0*gaba;
	double R1 = kf_R1*gaba*GABABR-kr_R1*gabaGABABR;
	double R2 = kf_R2*gabaGABABR*Gi-kr_R2*gabaGABABRGi;
	double R3 = kf_R3*gabaGABABRGi;
	double R4 = kf_R4*gabaGABABRGibg;
	double R5 = kf_R5*GABABR*Gi-kr_R5*GABABRGi;
	double R6 = kf_R6*gaba*GABABRGi-kr_R6*gabaGABABRGi;
	double R7 = kf_R7*GiaGTP*RGS-kr_R7*GiaGTPRGS;
	double R8 = kf_R8*GiaGTPRGS;
	double R9 = kf_R9*GiaGDP*Gibg;
	double R10 = kf_R10*GIRK*Gibg-kr_R10*GIRKGibg;
	double R11 = kf_R11*GIRKGibg*Gibg-kr_R11*GIRKGibg2;
	double R12 = kf_R12*GIRKGibg2*Gibg-kr_R12*GIRKGibg3;
	double R13 = kf_R13*GIRKGibg3*Gibg-kr_R13*GIRKGibg4;
	double R14 = kf_R14*VGCC*Gibg-kr_R14*VGCCGibg;
	memset(jac_,0,sizeof(double)*361); /* initialize with 0.0 */
	/*[ 0, 0]*/  jac_[0] = -(kf_R0+kf_R1*GABABR+kf_R6*GABABRGi);
	/*[ 0, 1]*/  jac_[1] = kr_R1;
	/*[ 0, 2]*/  jac_[2] = kr_R6;
	/*[ 0, 4]*/  jac_[4] = -kf_R1*gaba;
	/*[ 0, 5]*/  jac_[5] = -kf_R6*gaba;
	/*[ 1, 0]*/  jac_[19] = kf_R1*GABABR;
	/*[ 1, 1]*/  jac_[20] = -(kr_R1+kf_R2*Gi);
	/*[ 1, 2]*/  jac_[21] = kr_R2;
	/*[ 1, 3]*/  jac_[22] = kf_R4;
	/*[ 1, 4]*/  jac_[23] = kf_R1*gaba;
	/*[ 1, 6]*/  jac_[25] = -kf_R2*gabaGABABR;
	/*[ 2, 0]*/  jac_[38] = kf_R6*GABABRGi;
	/*[ 2, 1]*/  jac_[39] = kf_R2*Gi;
	/*[ 2, 2]*/  jac_[40] = -(kr_R6+kr_R2+kf_R3);
	/*[ 2, 5]*/  jac_[43] = kf_R6*gaba;
	/*[ 2, 6]*/  jac_[44] = kf_R2*gabaGABABR;
	/*[ 3, 2]*/  jac_[59] = kf_R3;
	/*[ 3, 3]*/  jac_[60] = -kf_R4;
	/*[ 4, 0]*/  jac_[76] = -kf_R1*GABABR;
	/*[ 4, 1]*/  jac_[77] = kr_R1;
	/*[ 4, 4]*/  jac_[80] = -(kf_R1*gaba+kf_R5*Gi);
	/*[ 4, 5]*/  jac_[81] = kr_R5;
	/*[ 4, 6]*/  jac_[82] = -kf_R5*GABABR;
	/*[ 5, 0]*/  jac_[95] = -kf_R6*GABABRGi;
	/*[ 5, 2]*/  jac_[97] = kr_R6;
	/*[ 5, 4]*/  jac_[99] = kf_R5*Gi;
	/*[ 5, 5]*/  jac_[100] = -(kr_R5+kf_R6*gaba);
	/*[ 5, 6]*/  jac_[101] = kf_R5*GABABR;
	/*[ 6, 1]*/  jac_[115] = -kf_R2*Gi;
	/*[ 6, 2]*/  jac_[116] = kr_R2;
	/*[ 6, 4]*/  jac_[118] = -kf_R5*Gi;
	/*[ 6, 5]*/  jac_[119] = kr_R5;
	/*[ 6, 6]*/  jac_[120] = -(kf_R2*gabaGABABR+kf_R5*GABABR);
	/*[ 6, 7]*/  jac_[121] = kf_R9*Gibg;
	/*[ 6,10]*/  jac_[124] = kf_R9*GiaGDP;
	/*[ 7, 7]*/  jac_[140] = -kf_R9*Gibg;
	/*[ 7, 9]*/  jac_[142] = kf_R8;
	/*[ 7,10]*/  jac_[143] = -kf_R9*GiaGDP;
	/*[ 8, 2]*/  jac_[154] = kf_R3;
	/*[ 8, 8]*/  jac_[160] = -kf_R7*RGS;
	/*[ 8, 9]*/  jac_[161] = kr_R7;
	/*[ 8,16]*/  jac_[168] = -kf_R7*GiaGTP;
	/*[ 9, 8]*/  jac_[179] = kf_R7*RGS;
	/*[ 9, 9]*/  jac_[180] = -(kr_R7+kf_R8);
	/*[ 9,16]*/  jac_[187] = kf_R7*GiaGTP;
	/*[10, 3]*/  jac_[193] = kf_R4;
	/*[10, 7]*/  jac_[197] = -kf_R9*Gibg;
	/*[10,10]*/  jac_[200] = -(kf_R9*GiaGDP+kf_R10*GIRK+kf_R11*GIRKGibg+kf_R12*GIRKGibg2+kf_R13*GIRKGibg3+kf_R14*VGCC);
	/*[10,11]*/  jac_[201] = -kf_R10*Gibg;
	/*[10,12]*/  jac_[202] = kr_R10-kf_R11*Gibg;
	/*[10,13]*/  jac_[203] = kr_R11-kf_R12*Gibg;
	/*[10,14]*/  jac_[204] = kr_R12-kf_R13*Gibg;
	/*[10,15]*/  jac_[205] = kr_R13;
	/*[10,17]*/  jac_[207] = -kf_R14*Gibg;
	/*[10,18]*/  jac_[208] = kr_R14;
	/*[11,10]*/  jac_[219] = -kf_R10*GIRK;
	/*[11,11]*/  jac_[220] = -kf_R10*Gibg;
	/*[11,12]*/  jac_[221] = kr_R10;
	/*[12,10]*/  jac_[238] = kf_R10*GIRK-kf_R11*GIRKGibg;
	/*[12,11]*/  jac_[239] = kf_R10*Gibg;
	/*[12,12]*/  jac_[240] = -(kr_R10+kf_R11*Gibg);
	/*[12,13]*/  jac_[241] = kr_R11;
	/*[13,10]*/  jac_[257] = kf_R11*GIRKGibg-kf_R12*GIRKGibg2;
	/*[13,12]*/  jac_[259] = kf_R11*Gibg;
	/*[13,13]*/  jac_[260] = -(kr_R11+kf_R12*Gibg);
	/*[13,14]*/  jac_[261] = kr_R12;
	/*[14,10]*/  jac_[276] = kf_R12*GIRKGibg2-kf_R13*GIRKGibg3;
	/*[14,13]*/  jac_[279] = kf_R12*Gibg;
	/*[14,14]*/  jac_[280] = -(kr_R12+kf_R13*Gibg);
	/*[14,15]*/  jac_[281] = kr_R13;
	/*[15,10]*/  jac_[295] = kf_R13*GIRKGibg3;
	/*[15,14]*/  jac_[299] = kf_R13*Gibg;
	/*[15,15]*/  jac_[300] = -kr_R13;
	/*[16, 8]*/  jac_[312] = -kf_R7*RGS;
	/*[16, 9]*/  jac_[313] = kr_R7+kf_R8;
	/*[16,16]*/  jac_[320] = -kf_R7*GiaGTP;
	/*[17,10]*/  jac_[333] = -kf_R14*VGCC;
	/*[17,17]*/  jac_[340] = -kf_R14*Gibg;
	/*[17,18]*/  jac_[341] = kr_R14;
	/*[18,10]*/  jac_[352] = kf_R14*VGCC;
	/*[18,17]*/  jac_[359] = kf_R14*Gibg;
	/*[18,18]*/  jac_[360] = -kr_R14;
	return GSL_SUCCESS;
}

/* ODE parameter Jacobian: df(t,y;p)/dp   */
int GABAB_signaling_jacp(double t, const double y_[], double *jacp_, double *dfdt_, void *par){
	double *p_=par;
	if (!y_ || !jacp_) return 494;
/* 	constants   */
/* 	parameter values   */
	double kf_R0 = p_[_kf_R0];                                          /* [  0] */
	double kf_R1 = p_[_kf_R1];                                          /* [  1] */
	double kr_R1 = p_[_kr_R1];                                          /* [  2] */
	double kf_R2 = p_[_kf_R2];                                          /* [  3] */
	double kr_R2 = p_[_kr_R2];                                          /* [  4] */
	double kf_R3 = p_[_kf_R3];                                          /* [  5] */
	double kf_R4 = p_[_kf_R4];                                          /* [  6] */
	double kf_R5 = p_[_kf_R5];                                          /* [  7] */
	double kr_R5 = p_[_kr_R5];                                          /* [  8] */
	double kf_R6 = p_[_kf_R6];                                          /* [  9] */
	double kr_R6 = p_[_kr_R6];                                          /* [ 10] */
	double kf_R7 = p_[_kf_R7];                                          /* [ 11] */
	double kr_R7 = p_[_kr_R7];                                          /* [ 12] */
	double kf_R8 = p_[_kf_R8];                                          /* [ 13] */
	double kf_R9 = p_[_kf_R9];                                          /* [ 14] */
	double kf_R10 = p_[_kf_R10];                                        /* [ 15] */
	double kr_R10 = p_[_kr_R10];                                        /* [ 16] */
	double kf_R11 = p_[_kf_R11];                                        /* [ 17] */
	double kr_R11 = p_[_kr_R11];                                        /* [ 18] */
	double kf_R12 = p_[_kf_R12];                                        /* [ 19] */
	double kr_R12 = p_[_kr_R12];                                        /* [ 20] */
	double kf_R13 = p_[_kf_R13];                                        /* [ 21] */
	double kr_R13 = p_[_kr_R13];                                        /* [ 22] */
	double kf_R14 = p_[_kf_R14];                                        /* [ 23] */
	double kr_R14 = p_[_kr_R14];                                        /* [ 24] */
	double k_gaba = p_[_k_gaba];                                        /* [ 25] */
/* 	state variables   */
	double gaba = y_[_gaba];                                            /* [  0] */
	double gabaGABABR = y_[_gabaGABABR];                                /* [  1] */
	double gabaGABABRGi = y_[_gabaGABABRGi];                            /* [  2] */
	double gabaGABABRGibg = y_[_gabaGABABRGibg];                        /* [  3] */
	double GABABR = y_[_GABABR];                                        /* [  4] */
	double GABABRGi = y_[_GABABRGi];                                    /* [  5] */
	double Gi = y_[_Gi];                                                /* [  6] */
	double GiaGDP = y_[_GiaGDP];                                        /* [  7] */
	double GiaGTP = y_[_GiaGTP];                                        /* [  8] */
	double GiaGTPRGS = y_[_GiaGTPRGS];                                  /* [  9] */
	double Gibg = y_[_Gibg];                                            /* [ 10] */
	double GIRK = y_[_GIRK];                                            /* [ 11] */
	double GIRKGibg = y_[_GIRKGibg];                                    /* [ 12] */
	double GIRKGibg2 = y_[_GIRKGibg2];                                  /* [ 13] */
	double GIRKGibg3 = y_[_GIRKGibg3];                                  /* [ 14] */
	double GIRKGibg4 = y_[_GIRKGibg4];                                  /* [ 15] */
	double RGS = y_[_RGS];                                              /* [ 16] */
	double VGCC = y_[_VGCC];                                            /* [ 17] */
	double VGCCGibg = y_[_VGCCGibg];                                    /* [ 18] */
/* 	expressions   */
	double R0 = k_gaba - kf_R0*gaba;
	double R1 = kf_R1*gaba*GABABR-kr_R1*gabaGABABR;
	double R2 = kf_R2*gabaGABABR*Gi-kr_R2*gabaGABABRGi;
	double R3 = kf_R3*gabaGABABRGi;
	double R4 = kf_R4*gabaGABABRGibg;
	double R5 = kf_R5*GABABR*Gi-kr_R5*GABABRGi;
	double R6 = kf_R6*gaba*GABABRGi-kr_R6*gabaGABABRGi;
	double R7 = kf_R7*GiaGTP*RGS-kr_R7*GiaGTPRGS;
	double R8 = kf_R8*GiaGTPRGS;
	double R9 = kf_R9*GiaGDP*Gibg;
	double R10 = kf_R10*GIRK*Gibg-kr_R10*GIRKGibg;
	double R11 = kf_R11*GIRKGibg*Gibg-kr_R11*GIRKGibg2;
	double R12 = kf_R12*GIRKGibg2*Gibg-kr_R12*GIRKGibg3;
	double R13 = kf_R13*GIRKGibg3*Gibg-kr_R13*GIRKGibg4;
	double R14 = kf_R14*VGCC*Gibg-kr_R14*VGCCGibg;
	memset(jacp_,0,sizeof(double)*494); /* initialize with 0.0 */
	/*[ 0, 0]*/  jacp_[0] = -gaba;
	/*[ 0, 1]*/  jacp_[1] = -gaba*GABABR;
	/*[ 0, 2]*/  jacp_[2] = gabaGABABR;
	/*[ 0, 9]*/  jacp_[9] = -gaba*GABABRGi;
	/*[ 0,10]*/  jacp_[10] = gabaGABABRGi;
	/*[ 0,25]*/  jacp_[25] = 1;
	/*[ 1, 1]*/  jacp_[27] = gaba*GABABR;
	/*[ 1, 2]*/  jacp_[28] = -gabaGABABR;
	/*[ 1, 3]*/  jacp_[29] = -gabaGABABR*Gi;
	/*[ 1, 4]*/  jacp_[30] = gabaGABABRGi;
	/*[ 1, 6]*/  jacp_[32] = gabaGABABRGibg;
	/*[ 2, 3]*/  jacp_[55] = gabaGABABR*Gi;
	/*[ 2, 4]*/  jacp_[56] = -gabaGABABRGi;
	/*[ 2, 5]*/  jacp_[57] = -gabaGABABRGi;
	/*[ 2, 9]*/  jacp_[61] = gaba*GABABRGi;
	/*[ 2,10]*/  jacp_[62] = -gabaGABABRGi;
	/*[ 3, 5]*/  jacp_[83] = gabaGABABRGi;
	/*[ 3, 6]*/  jacp_[84] = -gabaGABABRGibg;
	/*[ 4, 1]*/  jacp_[105] = -gaba*GABABR;
	/*[ 4, 2]*/  jacp_[106] = gabaGABABR;
	/*[ 4, 7]*/  jacp_[111] = -GABABR*Gi;
	/*[ 4, 8]*/  jacp_[112] = GABABRGi;
	/*[ 5, 7]*/  jacp_[137] = GABABR*Gi;
	/*[ 5, 8]*/  jacp_[138] = -GABABRGi;
	/*[ 5, 9]*/  jacp_[139] = -gaba*GABABRGi;
	/*[ 5,10]*/  jacp_[140] = gabaGABABRGi;
	/*[ 6, 3]*/  jacp_[159] = -gabaGABABR*Gi;
	/*[ 6, 4]*/  jacp_[160] = gabaGABABRGi;
	/*[ 6, 7]*/  jacp_[163] = -GABABR*Gi;
	/*[ 6, 8]*/  jacp_[164] = GABABRGi;
	/*[ 6,14]*/  jacp_[170] = GiaGDP*Gibg;
	/*[ 7,13]*/  jacp_[195] = GiaGTPRGS;
	/*[ 7,14]*/  jacp_[196] = -GiaGDP*Gibg;
	/*[ 8, 5]*/  jacp_[213] = gabaGABABRGi;
	/*[ 8,11]*/  jacp_[219] = -GiaGTP*RGS;
	/*[ 8,12]*/  jacp_[220] = GiaGTPRGS;
	/*[ 9,11]*/  jacp_[245] = GiaGTP*RGS;
	/*[ 9,12]*/  jacp_[246] = -GiaGTPRGS;
	/*[ 9,13]*/  jacp_[247] = -GiaGTPRGS;
	/*[10, 6]*/  jacp_[266] = gabaGABABRGibg;
	/*[10,14]*/  jacp_[274] = -GiaGDP*Gibg;
	/*[10,15]*/  jacp_[275] = -GIRK*Gibg;
	/*[10,16]*/  jacp_[276] = GIRKGibg;
	/*[10,17]*/  jacp_[277] = -GIRKGibg*Gibg;
	/*[10,18]*/  jacp_[278] = GIRKGibg2;
	/*[10,19]*/  jacp_[279] = -GIRKGibg2*Gibg;
	/*[10,20]*/  jacp_[280] = GIRKGibg3;
	/*[10,21]*/  jacp_[281] = -GIRKGibg3*Gibg;
	/*[10,22]*/  jacp_[282] = GIRKGibg4;
	/*[10,23]*/  jacp_[283] = -VGCC*Gibg;
	/*[10,24]*/  jacp_[284] = VGCCGibg;
	/*[11,15]*/  jacp_[301] = -GIRK*Gibg;
	/*[11,16]*/  jacp_[302] = GIRKGibg;
	/*[12,15]*/  jacp_[327] = GIRK*Gibg;
	/*[12,16]*/  jacp_[328] = -GIRKGibg;
	/*[12,17]*/  jacp_[329] = -GIRKGibg*Gibg;
	/*[12,18]*/  jacp_[330] = GIRKGibg2;
	/*[13,17]*/  jacp_[355] = GIRKGibg*Gibg;
	/*[13,18]*/  jacp_[356] = -GIRKGibg2;
	/*[13,19]*/  jacp_[357] = -GIRKGibg2*Gibg;
	/*[13,20]*/  jacp_[358] = GIRKGibg3;
	/*[14,19]*/  jacp_[383] = GIRKGibg2*Gibg;
	/*[14,20]*/  jacp_[384] = -GIRKGibg3;
	/*[14,21]*/  jacp_[385] = -GIRKGibg3*Gibg;
	/*[14,22]*/  jacp_[386] = GIRKGibg4;
	/*[15,21]*/  jacp_[411] = GIRKGibg3*Gibg;
	/*[15,22]*/  jacp_[412] = -GIRKGibg4;
	/*[16,11]*/  jacp_[427] = -GiaGTP*RGS;
	/*[16,12]*/  jacp_[428] = GiaGTPRGS;
	/*[16,13]*/  jacp_[429] = GiaGTPRGS;
	/*[17,23]*/  jacp_[465] = -VGCC*Gibg;
	/*[17,24]*/  jacp_[466] = VGCCGibg;
	/*[18,23]*/  jacp_[491] = VGCC*Gibg;
	/*[18,24]*/  jacp_[492] = -VGCCGibg;
	return GSL_SUCCESS;
}

/* Output Function (Observables)   */
int GABAB_signaling_func(double t, const double y_[], double *func_, void *par){
	double *p_=par;
	if (!y_ || !func_) return 3;
/* 	constants   */
/* 	parameter values   */
	double kf_R0 = p_[_kf_R0];                                          /* [  0] */
	double kf_R1 = p_[_kf_R1];                                          /* [  1] */
	double kr_R1 = p_[_kr_R1];                                          /* [  2] */
	double kf_R2 = p_[_kf_R2];                                          /* [  3] */
	double kr_R2 = p_[_kr_R2];                                          /* [  4] */
	double kf_R3 = p_[_kf_R3];                                          /* [  5] */
	double kf_R4 = p_[_kf_R4];                                          /* [  6] */
	double kf_R5 = p_[_kf_R5];                                          /* [  7] */
	double kr_R5 = p_[_kr_R5];                                          /* [  8] */
	double kf_R6 = p_[_kf_R6];                                          /* [  9] */
	double kr_R6 = p_[_kr_R6];                                          /* [ 10] */
	double kf_R7 = p_[_kf_R7];                                          /* [ 11] */
	double kr_R7 = p_[_kr_R7];                                          /* [ 12] */
	double kf_R8 = p_[_kf_R8];                                          /* [ 13] */
	double kf_R9 = p_[_kf_R9];                                          /* [ 14] */
	double kf_R10 = p_[_kf_R10];                                        /* [ 15] */
	double kr_R10 = p_[_kr_R10];                                        /* [ 16] */
	double kf_R11 = p_[_kf_R11];                                        /* [ 17] */
	double kr_R11 = p_[_kr_R11];                                        /* [ 18] */
	double kf_R12 = p_[_kf_R12];                                        /* [ 19] */
	double kr_R12 = p_[_kr_R12];                                        /* [ 20] */
	double kf_R13 = p_[_kf_R13];                                        /* [ 21] */
	double kr_R13 = p_[_kr_R13];                                        /* [ 22] */
	double kf_R14 = p_[_kf_R14];                                        /* [ 23] */
	double kr_R14 = p_[_kr_R14];                                        /* [ 24] */
	double k_gaba = p_[_k_gaba];                                        /* [ 25] */
/* 	state variables   */
	double gaba = y_[_gaba];                                            /* [  0] */
	double gabaGABABR = y_[_gabaGABABR];                                /* [  1] */
	double gabaGABABRGi = y_[_gabaGABABRGi];                            /* [  2] */
	double gabaGABABRGibg = y_[_gabaGABABRGibg];                        /* [  3] */
	double GABABR = y_[_GABABR];                                        /* [  4] */
	double GABABRGi = y_[_GABABRGi];                                    /* [  5] */
	double Gi = y_[_Gi];                                                /* [  6] */
	double GiaGDP = y_[_GiaGDP];                                        /* [  7] */
	double GiaGTP = y_[_GiaGTP];                                        /* [  8] */
	double GiaGTPRGS = y_[_GiaGTPRGS];                                  /* [  9] */
	double Gibg = y_[_Gibg];                                            /* [ 10] */
	double GIRK = y_[_GIRK];                                            /* [ 11] */
	double GIRKGibg = y_[_GIRKGibg];                                    /* [ 12] */
	double GIRKGibg2 = y_[_GIRKGibg2];                                  /* [ 13] */
	double GIRKGibg3 = y_[_GIRKGibg3];                                  /* [ 14] */
	double GIRKGibg4 = y_[_GIRKGibg4];                                  /* [ 15] */
	double RGS = y_[_RGS];                                              /* [ 16] */
	double VGCC = y_[_VGCC];                                            /* [ 17] */
	double VGCCGibg = y_[_VGCCGibg];                                    /* [ 18] */
/* 	expressions   */
	double R0 = k_gaba - kf_R0*gaba;
	double R1 = kf_R1*gaba*GABABR-kr_R1*gabaGABABR;
	double R2 = kf_R2*gabaGABABR*Gi-kr_R2*gabaGABABRGi;
	double R3 = kf_R3*gabaGABABRGi;
	double R4 = kf_R4*gabaGABABRGibg;
	double R5 = kf_R5*GABABR*Gi-kr_R5*GABABRGi;
	double R6 = kf_R6*gaba*GABABRGi-kr_R6*gabaGABABRGi;
	double R7 = kf_R7*GiaGTP*RGS-kr_R7*GiaGTPRGS;
	double R8 = kf_R8*GiaGTPRGS;
	double R9 = kf_R9*GiaGDP*Gibg;
	double R10 = kf_R10*GIRK*Gibg-kr_R10*GIRKGibg;
	double R11 = kf_R11*GIRKGibg*Gibg-kr_R11*GIRKGibg2;
	double R12 = kf_R12*GIRKGibg2*Gibg-kr_R12*GIRKGibg3;
	double R13 = kf_R13*GIRKGibg3*Gibg-kr_R13*GIRKGibg4;
	double R14 = kf_R14*VGCC*Gibg-kr_R14*VGCCGibg;
	func_[_oGIRKGibg4] = GIRKGibg4;
	func_[_oVGCCGibg] = VGCCGibg;
	func_[_ogaba] = gaba;
	return GSL_SUCCESS;
}

int GABAB_signaling_default(double t, double *p_){
	if (!p_) return numParam;
/* 	constants   */
	memset(p_,0,sizeof(double)*26); /* initialize with 0.0 */
	p_[_kf_R0] = 0.0535168989262411;
	p_[_kf_R1] = 0.00285888595867763;
	p_[_kr_R1] = 0.314477455454539;
	p_[_kf_R2] = 0.0251449235770638;
	p_[_kr_R2] = 0.0419082059617731;
	p_[_kf_R3] = 0.0209541029808865;
	p_[_kf_R4] = 0.167632823847092;
	p_[_kf_R5] = 0.0125724617885319;
	p_[_kr_R5] = 0.0209541029808865;
	p_[_kf_R6] = 0.00285888595867763;
	p_[_kr_R6] = 0.314477455454539;
	p_[_kf_R7] = 2e-06;
	p_[_kr_R7] = 0.002;
	p_[_kf_R8] = 0.03;
	p_[_kf_R9] = 0.00125;
	p_[_kf_R10] = 0.000154358980053402;
	p_[_kr_R10] = 0.0669308830676273;
	p_[_kf_R11] = 0.000154358980053402;
	p_[_kr_R11] = 0.0669308830676273;
	p_[_kf_R12] = 0.000154358980053402;
	p_[_kr_R12] = 0.0669308830676273;
	p_[_kf_R13] = 0.000154358980053402;
	p_[_kr_R13] = 0.0669308830676273;
	p_[_kf_R14] = 0.000154358980053402;
	p_[_kr_R14] = 0.0669308830676273;
	return GSL_SUCCESS;
}

int GABAB_signaling_init(double t, double *y_, void *par){
	double *p_=par;
	if (!y_ || !y_) return 19;
/* 	constants   */
/* 	parameter values   */
	double kf_R0 = p_[_kf_R0];                                          /* [  0] */
	double kf_R1 = p_[_kf_R1];                                          /* [  1] */
	double kr_R1 = p_[_kr_R1];                                          /* [  2] */
	double kf_R2 = p_[_kf_R2];                                          /* [  3] */
	double kr_R2 = p_[_kr_R2];                                          /* [  4] */
	double kf_R3 = p_[_kf_R3];                                          /* [  5] */
	double kf_R4 = p_[_kf_R4];                                          /* [  6] */
	double kf_R5 = p_[_kf_R5];                                          /* [  7] */
	double kr_R5 = p_[_kr_R5];                                          /* [  8] */
	double kf_R6 = p_[_kf_R6];                                          /* [  9] */
	double kr_R6 = p_[_kr_R6];                                          /* [ 10] */
	double kf_R7 = p_[_kf_R7];                                          /* [ 11] */
	double kr_R7 = p_[_kr_R7];                                          /* [ 12] */
	double kf_R8 = p_[_kf_R8];                                          /* [ 13] */
	double kf_R9 = p_[_kf_R9];                                          /* [ 14] */
	double kf_R10 = p_[_kf_R10];                                        /* [ 15] */
	double kr_R10 = p_[_kr_R10];                                        /* [ 16] */
	double kf_R11 = p_[_kf_R11];                                        /* [ 17] */
	double kr_R11 = p_[_kr_R11];                                        /* [ 18] */
	double kf_R12 = p_[_kf_R12];                                        /* [ 19] */
	double kr_R12 = p_[_kr_R12];                                        /* [ 20] */
	double kf_R13 = p_[_kf_R13];                                        /* [ 21] */
	double kr_R13 = p_[_kr_R13];                                        /* [ 22] */
	double kf_R14 = p_[_kf_R14];                                        /* [ 23] */
	double kr_R14 = p_[_kr_R14];                                        /* [ 24] */
	double k_gaba = p_[_k_gaba];                                        /* [ 25] */
	memset(y_,0,sizeof(double)*19); /* initialize with 0.0 */
	y_[_GABABR] = 400;
	y_[_Gi] = 2600;
	y_[_RGS] = 1000;
	return GSL_SUCCESS;
}

int GABAB_signaling_event(double t, double *y_, double *p_, int EventLabel, double dose){
	if (!y_ || EventLabel<0) return numEvents;
/* 	constants   */
/* 	parameter values   */
	double kf_R0 = p_[_kf_R0];                                          /* [  0] */
	double kf_R1 = p_[_kf_R1];                                          /* [  1] */
	double kr_R1 = p_[_kr_R1];                                          /* [  2] */
	double kf_R2 = p_[_kf_R2];                                          /* [  3] */
	double kr_R2 = p_[_kr_R2];                                          /* [  4] */
	double kf_R3 = p_[_kf_R3];                                          /* [  5] */
	double kf_R4 = p_[_kf_R4];                                          /* [  6] */
	double kf_R5 = p_[_kf_R5];                                          /* [  7] */
	double kr_R5 = p_[_kr_R5];                                          /* [  8] */
	double kf_R6 = p_[_kf_R6];                                          /* [  9] */
	double kr_R6 = p_[_kr_R6];                                          /* [ 10] */
	double kf_R7 = p_[_kf_R7];                                          /* [ 11] */
	double kr_R7 = p_[_kr_R7];                                          /* [ 12] */
	double kf_R8 = p_[_kf_R8];                                          /* [ 13] */
	double kf_R9 = p_[_kf_R9];                                          /* [ 14] */
	double kf_R10 = p_[_kf_R10];                                        /* [ 15] */
	double kr_R10 = p_[_kr_R10];                                        /* [ 16] */
	double kf_R11 = p_[_kf_R11];                                        /* [ 17] */
	double kr_R11 = p_[_kr_R11];                                        /* [ 18] */
	double kf_R12 = p_[_kf_R12];                                        /* [ 19] */
	double kr_R12 = p_[_kr_R12];                                        /* [ 20] */
	double kf_R13 = p_[_kf_R13];                                        /* [ 21] */
	double kr_R13 = p_[_kr_R13];                                        /* [ 22] */
	double kf_R14 = p_[_kf_R14];                                        /* [ 23] */
	double kr_R14 = p_[_kr_R14];                                        /* [ 24] */
	double k_gaba = p_[_k_gaba];                                        /* [ 25] */
/* 	state variables   */
	double gaba = y_[_gaba];                                            /* [  0] */
	double gabaGABABR = y_[_gabaGABABR];                                /* [  1] */
	double gabaGABABRGi = y_[_gabaGABABRGi];                            /* [  2] */
	double gabaGABABRGibg = y_[_gabaGABABRGibg];                        /* [  3] */
	double GABABR = y_[_GABABR];                                        /* [  4] */
	double GABABRGi = y_[_GABABRGi];                                    /* [  5] */
	double Gi = y_[_Gi];                                                /* [  6] */
	double GiaGDP = y_[_GiaGDP];                                        /* [  7] */
	double GiaGTP = y_[_GiaGTP];                                        /* [  8] */
	double GiaGTPRGS = y_[_GiaGTPRGS];                                  /* [  9] */
	double Gibg = y_[_Gibg];                                            /* [ 10] */
	double GIRK = y_[_GIRK];                                            /* [ 11] */
	double GIRKGibg = y_[_GIRKGibg];                                    /* [ 12] */
	double GIRKGibg2 = y_[_GIRKGibg2];                                  /* [ 13] */
	double GIRKGibg3 = y_[_GIRKGibg3];                                  /* [ 14] */
	double GIRKGibg4 = y_[_GIRKGibg4];                                  /* [ 15] */
	double RGS = y_[_RGS];                                              /* [ 16] */
	double VGCC = y_[_VGCC];                                            /* [ 17] */
	double VGCCGibg = y_[_VGCCGibg];                                    /* [ 18] */
/* 	expressions   */
	double R0 = k_gaba - kf_R0*gaba;
	double R1 = kf_R1*gaba*GABABR-kr_R1*gabaGABABR;
	double R2 = kf_R2*gabaGABABR*Gi-kr_R2*gabaGABABRGi;
	double R3 = kf_R3*gabaGABABRGi;
	double R4 = kf_R4*gabaGABABRGibg;
	double R5 = kf_R5*GABABR*Gi-kr_R5*GABABRGi;
	double R6 = kf_R6*gaba*GABABRGi-kr_R6*gabaGABABRGi;
	double R7 = kf_R7*GiaGTP*RGS-kr_R7*GiaGTPRGS;
	double R8 = kf_R8*GiaGTPRGS;
	double R9 = kf_R9*GiaGDP*Gibg;
	double R10 = kf_R10*GIRK*Gibg-kr_R10*GIRKGibg;
	double R11 = kf_R11*GIRKGibg*Gibg-kr_R11*GIRKGibg2;
	double R12 = kf_R12*GIRKGibg2*Gibg-kr_R12*GIRKGibg3;
	double R13 = kf_R13*GIRKGibg3*Gibg-kr_R13*GIRKGibg4;
	double R14 = kf_R14*VGCC*Gibg-kr_R14*VGCCGibg;
	switch(EventLabel){
	case on:
		p_[_k_gaba] = 100;
	break;
	case off:
		p_[_k_gaba] = 0;
	break;
	}
	return GSL_SUCCESS;
}