In [1]:
import numpy as np
from pycalphad import Model, Database, calculate, equilibrium
import pycalphad.variables as v

#dbf = Database('2016-08-10-AlGdMgand18RLPSO-for 3d plot.tdb')
dbf = Database('alfe_sei.TDB')
models = {key: Model(dbf, ['AL', 'FE', 'VA'], key) for key in dbf.phases.keys()}

In [2]:
#Set compiler directives (cf. http://docs.cython.org/src/reference/compilation.html)
%load_ext cython
from Cython.Compiler.Options import _directive_defaults

_directive_defaults['linetrace'] = True
_directive_defaults['binding'] = True


/home/rotis/anaconda/envs/calphadpy3/lib/python3.5/site-packages/Cython/Distutils/old_build_ext.py:30: UserWarning: Cython.Distutils.old_build_ext does not properly handle dependencies and is deprecated.
  "Cython.Distutils.old_build_ext does not properly handle dependencies "

In [28]:
%%cython -a -f --compile-args=-DCYTHON_TRACE=1
import pycalphad.variables as v
from pycalphad.core.utils import unpack_kwarg
from pycalphad.core.utils import unpack_condition, unpack_phases
from pycalphad import calculate, Model
from pycalphad.constraints import mole_fraction
from pycalphad.core.lower_convex_hull import lower_convex_hull
from pycalphad.core.sympydiff_utils import build_functions as compiled_build_functions
from pycalphad.core.constants import MIN_SITE_FRACTION
from pycalphad.core.eqsolver import _solve_eq_at_conditions
from sympy import Add, Symbol
import dask
from dask import delayed
import dask.multiprocessing, dask.async
from xarray import Dataset
cimport numpy as np
import numpy as np
from collections import namedtuple, OrderedDict
from datetime import datetime
from pycalphad.core.phase_rec cimport PhaseRecord, obj, grad, hess
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
def _build_multiphase_system(int[:] phase_dof, phases, cur_conds, double[:] site_fracs, double[:] phase_fracs,
                              l_constraints, constraint_jac,
                              np.ndarray[ndim=3, dtype=np.float64_t] constraint_hess,
                              np.ndarray[ndim=1, dtype=np.float64_t] l_multipliers,
                              phase_records):
    cdef double[::1] obj_result =  np.empty(1)
    cdef double[::1] obj_res = np.empty(1)
    cdef int max_phase_dof = max(phase_dof)
    cdef double[::1] grad_res = np.empty(2+max_phase_dof)
    cdef double[::1,:] tmp_hess = np.empty((2+max_phase_dof, 2+max_phase_dof), order='F')
    cdef double* tmp_hess_ptr = &tmp_hess[0,0]
    cdef double[::1] dof = np.empty(2+max_phase_dof)
    cdef double[::1,:] dof_2d_view = <double[:1:1, :dof.shape[0]]>&dof[0]
    cdef int num_vars = len(site_fracs) + len(phases)
    cdef double[::1,:] l_hessian = np.zeros((num_vars, num_vars), order='F')
    cdef double[::1] gradient_term = np.zeros(num_vars)
    cdef int var_offset = 0
    cdef int phase_idx = 0
    cdef int cur_phase_dof, constraint_idx, dof_x_idx, dof_y_idx, hess_x, hess_y, hess_idx
    cdef double phase_frac
    cdef PhaseRecord prn
    dof[0] = cur_conds['P']
    dof[1] = cur_conds['T']

    for name, phase_frac in zip(phases, phase_fracs):
        prn = phase_records[name]
        with nogil:
            cur_phase_dof = <int>phase_dof[phase_idx]
            dof[2:2+cur_phase_dof] = site_fracs[var_offset:var_offset + cur_phase_dof]
            obj(prn, obj_res, dof_2d_view, 1)
            grad(prn, grad_res, dof)
            hess(prn, tmp_hess, dof)
            for dof_x_idx in range(cur_phase_dof):
                gradient_term[var_offset + dof_x_idx] = \
                    phase_frac * grad_res[2+dof_x_idx]  # Remove P,T grad part
            gradient_term[site_fracs.shape[0] + phase_idx] = obj_res[0]

            for dof_x_idx in range(cur_phase_dof):
                for dof_y_idx in range(dof_x_idx,cur_phase_dof):
                    l_hessian[var_offset+dof_x_idx, var_offset+dof_y_idx] = \
                      phase_frac * tmp_hess_ptr[2+dof_x_idx + (2+cur_phase_dof)*(2+dof_y_idx)]
                    l_hessian[var_offset+dof_y_idx, var_offset+dof_x_idx] = \
                      l_hessian[var_offset+dof_x_idx, var_offset+dof_y_idx]
                # Phase fraction / site fraction cross derivative
                l_hessian[site_fracs.shape[0] + phase_idx, var_offset + dof_x_idx] = \
                     grad_res[2+dof_x_idx] # Remove P,T grad part
                l_hessian[var_offset + dof_x_idx, site_fracs.shape[0] + phase_idx] = grad_res[2+dof_x_idx]
            var_offset += cur_phase_dof
            phase_idx += 1
    l_hessian -= np.einsum('i,ijk->jk', l_multipliers, constraint_hess, order='F')
    return np.asarray(l_hessian), np.asarray(gradient_term)


Out[28]:
Cython: _cython_magic_c9e2ae6042f41ab910df839a817d1108.pyx

Generated by Cython 0.25.1

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

+01: import pycalphad.variables as v
  __Pyx_TraceLine(1,0,__PYX_ERR(0, 1, __pyx_L1_error))
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s__35);
  __Pyx_GIVEREF(__pyx_n_s__35);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s__35);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_pycalphad_variables, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_v, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
/* … */
  __Pyx_TraceLine(1,0,__PYX_ERR(0, 1, __pyx_L1_error))
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+02: from pycalphad.core.utils import unpack_kwarg
  __Pyx_TraceLine(2,0,__PYX_ERR(0, 2, __pyx_L1_error))
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_unpack_kwarg);
  __Pyx_GIVEREF(__pyx_n_s_unpack_kwarg);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_unpack_kwarg);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_pycalphad_core_utils, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_unpack_kwarg); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_unpack_kwarg, __pyx_t_3) < 0) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+03: from pycalphad.core.utils import unpack_condition, unpack_phases
  __Pyx_TraceLine(3,0,__PYX_ERR(0, 3, __pyx_L1_error))
  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_unpack_condition);
  __Pyx_GIVEREF(__pyx_n_s_unpack_condition);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_unpack_condition);
  __Pyx_INCREF(__pyx_n_s_unpack_phases);
  __Pyx_GIVEREF(__pyx_n_s_unpack_phases);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_unpack_phases);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_pycalphad_core_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_unpack_condition); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_unpack_condition, __pyx_t_2) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_unpack_phases); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_unpack_phases, __pyx_t_2) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+04: from pycalphad import calculate, Model
  __Pyx_TraceLine(4,0,__PYX_ERR(0, 4, __pyx_L1_error))
  __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_calculate);
  __Pyx_GIVEREF(__pyx_n_s_calculate);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_calculate);
  __Pyx_INCREF(__pyx_n_s_Model);
  __Pyx_GIVEREF(__pyx_n_s_Model);
  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_Model);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_pycalphad, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_calculate); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_calculate, __pyx_t_3) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Model); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Model, __pyx_t_3) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+05: from pycalphad.constraints import mole_fraction
  __Pyx_TraceLine(5,0,__PYX_ERR(0, 5, __pyx_L1_error))
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_mole_fraction);
  __Pyx_GIVEREF(__pyx_n_s_mole_fraction);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_mole_fraction);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_pycalphad_constraints, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_mole_fraction); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_mole_fraction, __pyx_t_2) < 0) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+06: from pycalphad.core.lower_convex_hull import lower_convex_hull
  __Pyx_TraceLine(6,0,__PYX_ERR(0, 6, __pyx_L1_error))
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_lower_convex_hull);
  __Pyx_GIVEREF(__pyx_n_s_lower_convex_hull);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_lower_convex_hull);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_pycalphad_core_lower_convex_hull, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_lower_convex_hull); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_lower_convex_hull, __pyx_t_3) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+07: from pycalphad.core.sympydiff_utils import build_functions as compiled_build_functions
  __Pyx_TraceLine(7,0,__PYX_ERR(0, 7, __pyx_L1_error))
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_build_functions);
  __Pyx_GIVEREF(__pyx_n_s_build_functions);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_build_functions);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_pycalphad_core_sympydiff_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_build_functions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_compiled_build_functions, __pyx_t_2) < 0) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+08: from pycalphad.core.constants import MIN_SITE_FRACTION
  __Pyx_TraceLine(8,0,__PYX_ERR(0, 8, __pyx_L1_error))
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_MIN_SITE_FRACTION);
  __Pyx_GIVEREF(__pyx_n_s_MIN_SITE_FRACTION);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_MIN_SITE_FRACTION);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_pycalphad_core_constants, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_MIN_SITE_FRACTION); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_MIN_SITE_FRACTION, __pyx_t_3) < 0) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+09: from pycalphad.core.eqsolver import _solve_eq_at_conditions
  __Pyx_TraceLine(9,0,__PYX_ERR(0, 9, __pyx_L1_error))
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_solve_eq_at_conditions);
  __Pyx_GIVEREF(__pyx_n_s_solve_eq_at_conditions);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_solve_eq_at_conditions);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_pycalphad_core_eqsolver, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_solve_eq_at_conditions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_solve_eq_at_conditions, __pyx_t_2) < 0) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+10: from sympy import Add, Symbol
  __Pyx_TraceLine(10,0,__PYX_ERR(0, 10, __pyx_L1_error))
  __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_Add);
  __Pyx_GIVEREF(__pyx_n_s_Add);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_Add);
  __Pyx_INCREF(__pyx_n_s_Symbol);
  __Pyx_GIVEREF(__pyx_n_s_Symbol);
  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_Symbol);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_sympy, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Add); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Add, __pyx_t_3) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Symbol); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Symbol, __pyx_t_3) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+11: import dask
  __Pyx_TraceLine(11,0,__PYX_ERR(0, 11, __pyx_L1_error))
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_dask, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dask, __pyx_t_2) < 0) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+12: from dask import delayed
  __Pyx_TraceLine(12,0,__PYX_ERR(0, 12, __pyx_L1_error))
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_delayed);
  __Pyx_GIVEREF(__pyx_n_s_delayed);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_delayed);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_dask, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_delayed); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_delayed, __pyx_t_2) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+13: import dask.multiprocessing, dask.async
  __Pyx_TraceLine(13,0,__PYX_ERR(0, 13, __pyx_L1_error))
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_dask_multiprocessing, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dask, __pyx_t_3) < 0) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_dask_async, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dask, __pyx_t_3) < 0) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+14: from xarray import Dataset
  __Pyx_TraceLine(14,0,__PYX_ERR(0, 14, __pyx_L1_error))
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_Dataset);
  __Pyx_GIVEREF(__pyx_n_s_Dataset);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_Dataset);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_xarray, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Dataset); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Dataset, __pyx_t_3) < 0) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 15: cimport numpy as np
+16: import numpy as np
  __Pyx_TraceLine(16,0,__PYX_ERR(0, 16, __pyx_L1_error))
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+17: from collections import namedtuple, OrderedDict
  __Pyx_TraceLine(17,0,__PYX_ERR(0, 17, __pyx_L1_error))
  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_namedtuple);
  __Pyx_GIVEREF(__pyx_n_s_namedtuple);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_namedtuple);
  __Pyx_INCREF(__pyx_n_s_OrderedDict);
  __Pyx_GIVEREF(__pyx_n_s_OrderedDict);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_OrderedDict);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_collections, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_namedtuple); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_namedtuple, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_OrderedDict); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_OrderedDict, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+18: from datetime import datetime
  __Pyx_TraceLine(18,0,__PYX_ERR(0, 18, __pyx_L1_error))
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_datetime);
  __Pyx_GIVEREF(__pyx_n_s_datetime);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_datetime);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_datetime, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_datetime); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_datetime, __pyx_t_3) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 19: from pycalphad.core.phase_rec cimport PhaseRecord, obj, grad, hess
 20: cimport cython
 21: 
 22: @cython.boundscheck(False)
 23: @cython.wraparound(False)
+24: def _build_multiphase_system(int[:] phase_dof, phases, cur_conds, double[:] site_fracs, double[:] phase_fracs,
/* Python wrapper */
static PyObject *__pyx_pw_46_cython_magic_c9e2ae6042f41ab910df839a817d1108_1_build_multiphase_system(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_46_cython_magic_c9e2ae6042f41ab910df839a817d1108_1_build_multiphase_system = {"_build_multiphase_system", (PyCFunction)__pyx_pw_46_cython_magic_c9e2ae6042f41ab910df839a817d1108_1_build_multiphase_system, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_46_cython_magic_c9e2ae6042f41ab910df839a817d1108_1_build_multiphase_system(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_phase_dof = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_phases = 0;
  PyObject *__pyx_v_cur_conds = 0;
  __Pyx_memviewslice __pyx_v_site_fracs = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_phase_fracs = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED PyObject *__pyx_v_l_constraints = 0;
  CYTHON_UNUSED PyObject *__pyx_v_constraint_jac = 0;
  PyArrayObject *__pyx_v_constraint_hess = 0;
  PyArrayObject *__pyx_v_l_multipliers = 0;
  PyObject *__pyx_v_phase_records = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_build_multiphase_system (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_phase_dof,&__pyx_n_s_phases,&__pyx_n_s_cur_conds,&__pyx_n_s_site_fracs,&__pyx_n_s_phase_fracs,&__pyx_n_s_l_constraints,&__pyx_n_s_constraint_jac,&__pyx_n_s_constraint_hess,&__pyx_n_s_l_multipliers,&__pyx_n_s_phase_records,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_phase_dof)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_phases)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 1); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_cur_conds)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 2); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_site_fracs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 3); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_phase_fracs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 4); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  5:
        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_l_constraints)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 5); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  6:
        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_constraint_jac)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 6); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  7:
        if (likely((values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_constraint_hess)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 7); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  8:
        if (likely((values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_l_multipliers)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 8); __PYX_ERR(0, 24, __pyx_L3_error)
        }
        case  9:
        if (likely((values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_phase_records)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, 9); __PYX_ERR(0, 24, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_build_multiphase_system") < 0)) __PYX_ERR(0, 24, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 10) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
      values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
    }
    __pyx_v_phase_dof = __Pyx_PyObject_to_MemoryviewSlice_ds_int(values[0]); if (unlikely(!__pyx_v_phase_dof.memview)) __PYX_ERR(0, 24, __pyx_L3_error)
    __pyx_v_phases = values[1];
    __pyx_v_cur_conds = values[2];
    __pyx_v_site_fracs = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[3]); if (unlikely(!__pyx_v_site_fracs.memview)) __PYX_ERR(0, 24, __pyx_L3_error)
    __pyx_v_phase_fracs = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[4]); if (unlikely(!__pyx_v_phase_fracs.memview)) __PYX_ERR(0, 24, __pyx_L3_error)
    __pyx_v_l_constraints = values[5];
    __pyx_v_constraint_jac = values[6];
    __pyx_v_constraint_hess = ((PyArrayObject *)values[7]);
    __pyx_v_l_multipliers = ((PyArrayObject *)values[8]);
    __pyx_v_phase_records = values[9];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_build_multiphase_system", 1, 10, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 24, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cython_magic_c9e2ae6042f41ab910df839a817d1108._build_multiphase_system", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_constraint_hess), __pyx_ptype_5numpy_ndarray, 1, "constraint_hess", 0))) __PYX_ERR(0, 26, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_l_multipliers), __pyx_ptype_5numpy_ndarray, 1, "l_multipliers", 0))) __PYX_ERR(0, 27, __pyx_L1_error)
  __pyx_r = __pyx_pf_46_cython_magic_c9e2ae6042f41ab910df839a817d1108__build_multiphase_system(__pyx_self, __pyx_v_phase_dof, __pyx_v_phases, __pyx_v_cur_conds, __pyx_v_site_fracs, __pyx_v_phase_fracs, __pyx_v_l_constraints, __pyx_v_constraint_jac, __pyx_v_constraint_hess, __pyx_v_l_multipliers, __pyx_v_phase_records);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_46_cython_magic_c9e2ae6042f41ab910df839a817d1108__build_multiphase_system(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_phase_dof, PyObject *__pyx_v_phases, PyObject *__pyx_v_cur_conds, __Pyx_memviewslice __pyx_v_site_fracs, __Pyx_memviewslice __pyx_v_phase_fracs, CYTHON_UNUSED PyObject *__pyx_v_l_constraints, CYTHON_UNUSED PyObject *__pyx_v_constraint_jac, PyArrayObject *__pyx_v_constraint_hess, PyArrayObject *__pyx_v_l_multipliers, PyObject *__pyx_v_phase_records) {
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_obj_result = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_obj_res = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_max_phase_dof;
  __Pyx_memviewslice __pyx_v_grad_res = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_tmp_hess = { 0, 0, { 0 }, { 0 }, { 0 } };
  double *__pyx_v_tmp_hess_ptr;
  __Pyx_memviewslice __pyx_v_dof = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dof_2d_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_num_vars;
  __Pyx_memviewslice __pyx_v_l_hessian = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_gradient_term = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_var_offset;
  int __pyx_v_phase_idx;
  int __pyx_v_cur_phase_dof;
  int __pyx_v_dof_x_idx;
  int __pyx_v_dof_y_idx;
  double __pyx_v_phase_frac;
  struct PhaseRecordObject *__pyx_v_prn = 0;
  PyObject *__pyx_v_name = NULL;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_constraint_hess;
  __Pyx_Buffer __pyx_pybuffer_constraint_hess;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_l_multipliers;
  __Pyx_Buffer __pyx_pybuffer_l_multipliers;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj_)
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_build_multiphase_system", 0);
  __Pyx_TraceCall("_build_multiphase_system", __pyx_f[0], 24, 0, __PYX_ERR(0, 24, __pyx_L1_error));
  __pyx_pybuffer_constraint_hess.pybuffer.buf = NULL;
  __pyx_pybuffer_constraint_hess.refcount = 0;
  __pyx_pybuffernd_constraint_hess.data = NULL;
  __pyx_pybuffernd_constraint_hess.rcbuffer = &__pyx_pybuffer_constraint_hess;
  __pyx_pybuffer_l_multipliers.pybuffer.buf = NULL;
  __pyx_pybuffer_l_multipliers.refcount = 0;
  __pyx_pybuffernd_l_multipliers.data = NULL;
  __pyx_pybuffernd_l_multipliers.rcbuffer = &__pyx_pybuffer_l_multipliers;
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer, (PyObject*)__pyx_v_constraint_hess, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 3, 0, __pyx_stack) == -1)) __PYX_ERR(0, 24, __pyx_L1_error)
  }
  __pyx_pybuffernd_constraint_hess.diminfo[0].strides = __pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_constraint_hess.diminfo[0].shape = __pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_constraint_hess.diminfo[1].strides = __pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_constraint_hess.diminfo[1].shape = __pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer.shape[1]; __pyx_pybuffernd_constraint_hess.diminfo[2].strides = __pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer.strides[2]; __pyx_pybuffernd_constraint_hess.diminfo[2].shape = __pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer.shape[2];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_l_multipliers.rcbuffer->pybuffer, (PyObject*)__pyx_v_l_multipliers, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 24, __pyx_L1_error)
  }
  __pyx_pybuffernd_l_multipliers.diminfo[0].strides = __pyx_pybuffernd_l_multipliers.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_l_multipliers.diminfo[0].shape = __pyx_pybuffernd_l_multipliers.rcbuffer->pybuffer.shape[0];
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __PYX_XDEC_MEMVIEW(&__pyx_t_3, 1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1);
  __Pyx_XDECREF(((PyObject *)__pyx_t_13));
  __PYX_XDEC_MEMVIEW(&__pyx_t_22, 1);
  __Pyx_XDECREF(__pyx_t_42);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_l_multipliers.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("_cython_magic_c9e2ae6042f41ab910df839a817d1108._build_multiphase_system", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_constraint_hess.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_l_multipliers.rcbuffer->pybuffer);
  __pyx_L2:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_obj_result, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_obj_res, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_grad_res, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_tmp_hess, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dof, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dof_2d_view, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_l_hessian, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_gradient_term, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_prn);
  __Pyx_XDECREF(__pyx_v_name);
  __PYX_XDEC_MEMVIEW(&__pyx_v_phase_dof, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_site_fracs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_phase_fracs, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__36 = PyTuple_Pack(33, __pyx_n_s_phase_dof, __pyx_n_s_phases, __pyx_n_s_cur_conds, __pyx_n_s_site_fracs, __pyx_n_s_phase_fracs, __pyx_n_s_l_constraints, __pyx_n_s_constraint_jac, __pyx_n_s_constraint_hess, __pyx_n_s_l_multipliers, __pyx_n_s_phase_records, __pyx_n_s_obj_result, __pyx_n_s_obj_res, __pyx_n_s_max_phase_dof, __pyx_n_s_grad_res, __pyx_n_s_tmp_hess, __pyx_n_s_tmp_hess_ptr, __pyx_n_s_dof, __pyx_n_s_dof_2d_view, __pyx_n_s_num_vars, __pyx_n_s_l_hessian, __pyx_n_s_gradient_term, __pyx_n_s_var_offset, __pyx_n_s_phase_idx, __pyx_n_s_cur_phase_dof, __pyx_n_s_constraint_idx, __pyx_n_s_dof_x_idx, __pyx_n_s_dof_y_idx, __pyx_n_s_hess_x, __pyx_n_s_hess_y, __pyx_n_s_hess_idx, __pyx_n_s_phase_frac, __pyx_n_s_prn, __pyx_n_s_name); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__36);
  __Pyx_GIVEREF(__pyx_tuple__36);
/* … */
  __Pyx_TraceLine(24,0,__PYX_ERR(0, 24, __pyx_L1_error))
  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_46_cython_magic_c9e2ae6042f41ab910df839a817d1108_1_build_multiphase_system, 0, __pyx_n_s_build_multiphase_system, NULL, __pyx_n_s_cython_magic_c9e2ae6042f41ab910, __pyx_d, ((PyObject *)__pyx_codeobj_)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_build_multiphase_system, __pyx_t_2) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj_ = (PyObject*)__Pyx_PyCode_New(10, 0, 33, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rotis_cache_ipython_cython, __pyx_n_s_build_multiphase_system, 24, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj_)) __PYX_ERR(0, 24, __pyx_L1_error)
 25:                               l_constraints, constraint_jac,
 26:                               np.ndarray[ndim=3, dtype=np.float64_t] constraint_hess,
 27:                               np.ndarray[ndim=1, dtype=np.float64_t] l_multipliers,
 28:                               phase_records):
+29:     cdef double[::1] obj_result =  np.empty(1)
  __Pyx_TraceLine(29,0,__PYX_ERR(0, 29, __pyx_L1_error))
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_1);
  if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_obj_result = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
/* … */
  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 29, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);
+30:     cdef double[::1] obj_res = np.empty(1)
  __Pyx_TraceLine(30,0,__PYX_ERR(0, 30, __pyx_L1_error))
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_1);
  if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_obj_res = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
/* … */
  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
+31:     cdef int max_phase_dof = max(phase_dof)
  __Pyx_TraceLine(31,0,__PYX_ERR(0, 31, __pyx_L1_error))
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_phase_dof, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_max, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_max_phase_dof = __pyx_t_4;
+32:     cdef double[::1] grad_res = np.empty(2+max_phase_dof)
  __Pyx_TraceLine(32,0,__PYX_ERR(0, 32, __pyx_L1_error))
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_long((2 + __pyx_v_max_phase_dof)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_6) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_5)) {
      PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) {
      PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 32, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_1);
  if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_grad_res = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
+33:     cdef double[::1,:] tmp_hess = np.empty((2+max_phase_dof, 2+max_phase_dof), order='F')
  __Pyx_TraceLine(33,0,__PYX_ERR(0, 33, __pyx_L1_error))
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_long((2 + __pyx_v_max_phase_dof)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyInt_From_long((2 + __pyx_v_max_phase_dof)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_7);
  __pyx_t_1 = 0;
  __pyx_t_7 = 0;
  __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_order, __pyx_n_u_F) < 0) __PYX_ERR(0, 33, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dcd__double(__pyx_t_1);
  if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_tmp_hess = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+34:     cdef double* tmp_hess_ptr = &tmp_hess[0,0]
  __Pyx_TraceLine(34,0,__PYX_ERR(0, 34, __pyx_L1_error))
  __pyx_t_9 = 0;
  __pyx_t_10 = 0;
  __pyx_v_tmp_hess_ptr = (&(*((double *) ( /* dim=1 */ (( /* dim=0 */ ((char *) (((double *) __pyx_v_tmp_hess.data) + __pyx_t_9)) ) + __pyx_t_10 * __pyx_v_tmp_hess.strides[1]) ))));
+35:     cdef double[::1] dof = np.empty(2+max_phase_dof)
  __Pyx_TraceLine(35,0,__PYX_ERR(0, 35, __pyx_L1_error))
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_long((2 + __pyx_v_max_phase_dof)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_7, function);
    }
  }
  if (!__pyx_t_5) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_7)) {
      PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) {
      PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    {
      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_1);
  if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_dof = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
+36:     cdef double[::1,:] dof_2d_view = <double[:1:1, :dof.shape[0]]>&dof[0]
  __Pyx_TraceLine(36,0,__PYX_ERR(0, 36, __pyx_L1_error))
  __pyx_t_11 = 0;
  __pyx_t_12 = (&(*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_dof.data) + __pyx_t_11)) ))));
  if (unlikely(!__pyx_v_dof.memview)) { __Pyx_RaiseUnboundLocalError("dof"); __PYX_ERR(0, 36, __pyx_L1_error) }
  if (!__pyx_t_12) {
    PyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer");
    __PYX_ERR(0, 36, __pyx_L1_error)
  }
  __pyx_t_7 = __pyx_format_from_typeinfo(&__Pyx_TypeInfo_double);
  __pyx_t_1 = Py_BuildValue((char*) "("  __PYX_BUILD_PY_SSIZE_T  __PYX_BUILD_PY_SSIZE_T  ")", ((Py_ssize_t)1), ((Py_ssize_t)(__pyx_v_dof.shape[0])));
  if (unlikely(!__pyx_t_7 || !__pyx_t_1 || !PyBytes_AsString(__pyx_t_7))) __PYX_ERR(0, 36, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_13 = __pyx_array_new(__pyx_t_1, sizeof(double), PyBytes_AS_STRING(__pyx_t_7), (char *) "fortran", (char *) __pyx_t_12);
  if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 36, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dcd__double(((PyObject *)__pyx_t_13));
  if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 36, __pyx_L1_error)
  __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
  __pyx_v_dof_2d_view = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+37:     cdef int num_vars = len(site_fracs) + len(phases)
  __Pyx_TraceLine(37,0,__PYX_ERR(0, 37, __pyx_L1_error))
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_site_fracs, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 37, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_14 = PyObject_Length(__pyx_t_7); if (unlikely(__pyx_t_14 == -1)) __PYX_ERR(0, 37, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_15 = PyObject_Length(__pyx_v_phases); if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(0, 37, __pyx_L1_error)
  __pyx_v_num_vars = (__pyx_t_14 + __pyx_t_15);
+38:     cdef double[::1,:] l_hessian = np.zeros((num_vars, num_vars), order='F')
  __Pyx_TraceLine(38,0,__PYX_ERR(0, 38, __pyx_L1_error))
  __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_num_vars); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_num_vars); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_6);
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_order, __pyx_n_u_F) < 0) __PYX_ERR(0, 38, __pyx_L1_error)
  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dcd__double(__pyx_t_7);
  if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_l_hessian = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+39:     cdef double[::1] gradient_term = np.zeros(num_vars)
  __Pyx_TraceLine(39,0,__PYX_ERR(0, 39, __pyx_L1_error))
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 39, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_num_vars); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 39, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_6);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_6, function);
    }
  }
  if (!__pyx_t_1) {
    __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_7);
  } else {
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_6)) {
      PyObject *__pyx_temp[2] = {__pyx_t_1, __pyx_t_2};
      __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
      PyObject *__pyx_temp[2] = {__pyx_t_1, __pyx_t_2};
      __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    {
      __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 39, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_5, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 39, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_dc_double(__pyx_t_7);
  if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 39, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_gradient_term = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
+40:     cdef int var_offset = 0
  __Pyx_TraceLine(40,0,__PYX_ERR(0, 40, __pyx_L1_error))
  __pyx_v_var_offset = 0;
+41:     cdef int phase_idx = 0
  __Pyx_TraceLine(41,0,__PYX_ERR(0, 41, __pyx_L1_error))
  __pyx_v_phase_idx = 0;
 42:     cdef int cur_phase_dof, constraint_idx, dof_x_idx, dof_y_idx, hess_x, hess_y, hess_idx
 43:     cdef double phase_frac
 44:     cdef PhaseRecord prn
+45:     dof[0] = cur_conds['P']
  __Pyx_TraceLine(45,0,__PYX_ERR(0, 45, __pyx_L1_error))
  __pyx_t_7 = PyObject_GetItem(__pyx_v_cur_conds, __pyx_n_u_P); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 45, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_16 = __pyx_PyFloat_AsDouble(__pyx_t_7); if (unlikely((__pyx_t_16 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_17 = 0;
  *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_dof.data) + __pyx_t_17)) )) = __pyx_t_16;
+46:     dof[1] = cur_conds['T']
  __Pyx_TraceLine(46,0,__PYX_ERR(0, 46, __pyx_L1_error))
  __pyx_t_7 = PyObject_GetItem(__pyx_v_cur_conds, __pyx_n_u_T); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_16 = __pyx_PyFloat_AsDouble(__pyx_t_7); if (unlikely((__pyx_t_16 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_18 = 1;
  *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_dof.data) + __pyx_t_18)) )) = __pyx_t_16;
 47: 
+48:     for name, phase_frac in zip(phases, phase_fracs):
  __Pyx_TraceLine(48,0,__PYX_ERR(0, 48, __pyx_L1_error))
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_phase_fracs, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_v_phases);
  __Pyx_GIVEREF(__pyx_v_phases);
  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_phases);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
  __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_6, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  if (likely(PyList_CheckExact(__pyx_t_7)) || PyTuple_CheckExact(__pyx_t_7)) {
    __pyx_t_6 = __pyx_t_7; __Pyx_INCREF(__pyx_t_6); __pyx_t_15 = 0;
    __pyx_t_19 = NULL;
  } else {
    __pyx_t_15 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 48, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_19 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 48, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  for (;;) {
    if (likely(!__pyx_t_19)) {
      if (likely(PyList_CheckExact(__pyx_t_6))) {
        if (__pyx_t_15 >= PyList_GET_SIZE(__pyx_t_6)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_7 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_15); __Pyx_INCREF(__pyx_t_7); __pyx_t_15++; if (unlikely(0 < 0)) __PYX_ERR(0, 48, __pyx_L1_error)
        #else
        __pyx_t_7 = PySequence_ITEM(__pyx_t_6, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        #endif
      } else {
        if (__pyx_t_15 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_15); __Pyx_INCREF(__pyx_t_7); __pyx_t_15++; if (unlikely(0 < 0)) __PYX_ERR(0, 48, __pyx_L1_error)
        #else
        __pyx_t_7 = PySequence_ITEM(__pyx_t_6, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        #endif
      }
    } else {
      __pyx_t_7 = __pyx_t_19(__pyx_t_6);
      if (unlikely(!__pyx_t_7)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 48, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_7);
    }
    if ((likely(PyTuple_CheckExact(__pyx_t_7))) || (PyList_CheckExact(__pyx_t_7))) {
      PyObject* sequence = __pyx_t_7;
      #if !CYTHON_COMPILING_IN_PYPY
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 48, __pyx_L1_error)
      }
      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_2);
      #else
      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 48, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      #endif
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_1 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_20 = Py_TYPE(__pyx_t_1)->tp_iternext;
      index = 0; __pyx_t_5 = __pyx_t_20(__pyx_t_1); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_5);
      index = 1; __pyx_t_2 = __pyx_t_20(__pyx_t_1); if (unlikely(!__pyx_t_2)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_2);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_20(__pyx_t_1), 2) < 0) __PYX_ERR(0, 48, __pyx_L1_error)
      __pyx_t_20 = NULL;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_20 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 48, __pyx_L1_error)
      __pyx_L6_unpacking_done:;
    }
    __pyx_t_16 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_16 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 48, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_v_phase_frac = __pyx_t_16;
/* … */
    __Pyx_TraceLine(48,0,__PYX_ERR(0, 48, __pyx_L1_error))
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+49:         prn = phase_records[name]
    __Pyx_TraceLine(49,0,__PYX_ERR(0, 49, __pyx_L1_error))
    __pyx_t_7 = PyObject_GetItem(__pyx_v_phase_records, __pyx_v_name); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 49, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_9pycalphad_4core_9phase_rec_PhaseRecord))))) __PYX_ERR(0, 49, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_prn, ((struct PhaseRecordObject *)__pyx_t_7));
    __pyx_t_7 = 0;
+50:         with nogil:
    __Pyx_TraceLine(50,0,__PYX_ERR(0, 50, __pyx_L1_error))
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        #endif
        /*try:*/ {
/* … */
        __Pyx_TraceLine(50,1,__PYX_ERR(0, 50, __pyx_L1_error))
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L11;
          }
          __pyx_L10_error: {
            #ifdef WITH_THREAD
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L1_error;
          }
          __pyx_L11:;
        }
    }
+51:             cur_phase_dof = <int>phase_dof[phase_idx]
          __Pyx_TraceLine(51,1,__PYX_ERR(0, 51, __pyx_L10_error))
          __pyx_t_21 = __pyx_v_phase_idx;
          __pyx_v_cur_phase_dof = ((int)(*((int *) ( /* dim=0 */ (__pyx_v_phase_dof.data + __pyx_t_21 * __pyx_v_phase_dof.strides[0]) ))));
+52:             dof[2:2+cur_phase_dof] = site_fracs[var_offset:var_offset + cur_phase_dof]
          __Pyx_TraceLine(52,1,__PYX_ERR(0, 52, __pyx_L10_error))
          __pyx_t_22.data = __pyx_v_site_fracs.data;
          __pyx_t_22.memview = __pyx_v_site_fracs.memview;
          __PYX_INC_MEMVIEW(&__pyx_t_22, 0);
          __pyx_t_4 = -1;
          if (unlikely(__pyx_memoryview_slice_memviewslice(
    &__pyx_t_22,
    __pyx_v_site_fracs.shape[0], __pyx_v_site_fracs.strides[0], __pyx_v_site_fracs.suboffsets[0],
    0,
    0,
    &__pyx_t_4,
    __pyx_v_var_offset,
    (__pyx_v_var_offset + __pyx_v_cur_phase_dof),
    0,
    1,
    1,
    0,
    1) < 0))
{
    __PYX_ERR(0, 52, __pyx_L10_error)
}

__pyx_t_3.data = __pyx_v_dof.data;
          __pyx_t_3.memview = __pyx_v_dof.memview;
          __PYX_INC_MEMVIEW(&__pyx_t_3, 0);
          __pyx_t_4 = -1;
          if (unlikely(__pyx_memoryview_slice_memviewslice(
    &__pyx_t_3,
    __pyx_v_dof.shape[0], __pyx_v_dof.strides[0], __pyx_v_dof.suboffsets[0],
    0,
    0,
    &__pyx_t_4,
    2,
    (2 + __pyx_v_cur_phase_dof),
    0,
    1,
    1,
    0,
    1) < 0))
{
    __PYX_ERR(0, 52, __pyx_L10_error)
}

if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_22, __pyx_t_3, 1, 1, 0) < 0)) __PYX_ERR(0, 52, __pyx_L10_error)
          __PYX_XDEC_MEMVIEW(&__pyx_t_3, 0);
          __pyx_t_3.memview = NULL;
          __pyx_t_3.data = NULL;
          __PYX_XDEC_MEMVIEW(&__pyx_t_22, 0);
          __pyx_t_22.memview = NULL;
          __pyx_t_22.data = NULL;
+53:             obj(prn, obj_res, dof_2d_view, 1)
          __Pyx_TraceLine(53,1,__PYX_ERR(0, 53, __pyx_L10_error))
          __pyx_f_9pycalphad_4core_9phase_rec_obj(__pyx_v_prn, __pyx_v_obj_res, __pyx_v_dof_2d_view, 1);
+54:             grad(prn, grad_res, dof)
          __Pyx_TraceLine(54,1,__PYX_ERR(0, 54, __pyx_L10_error))
          __pyx_f_9pycalphad_4core_9phase_rec_grad(__pyx_v_prn, __pyx_v_grad_res, __pyx_v_dof);
+55:             hess(prn, tmp_hess, dof)
          __Pyx_TraceLine(55,1,__PYX_ERR(0, 55, __pyx_L10_error))
          __pyx_f_9pycalphad_4core_9phase_rec_hess(__pyx_v_prn, __pyx_v_tmp_hess, __pyx_v_dof);
+56:             for dof_x_idx in range(cur_phase_dof):
          __Pyx_TraceLine(56,1,__PYX_ERR(0, 56, __pyx_L10_error))
          __pyx_t_4 = __pyx_v_cur_phase_dof;
          for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_t_4; __pyx_t_23+=1) {
            __pyx_v_dof_x_idx = __pyx_t_23;
+57:                 gradient_term[var_offset + dof_x_idx] = \
            __Pyx_TraceLine(57,1,__PYX_ERR(0, 57, __pyx_L10_error))
            __pyx_t_25 = (__pyx_v_var_offset + __pyx_v_dof_x_idx);
            *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_gradient_term.data) + __pyx_t_25)) )) = (__pyx_v_phase_frac * (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_grad_res.data) + __pyx_t_24)) ))));
          }
+58:                     phase_frac * grad_res[2+dof_x_idx]  # Remove P,T grad part
            __Pyx_TraceLine(58,1,__PYX_ERR(0, 58, __pyx_L10_error))
            __pyx_t_24 = (2 + __pyx_v_dof_x_idx);
+59:             gradient_term[site_fracs.shape[0] + phase_idx] = obj_res[0]
          __Pyx_TraceLine(59,1,__PYX_ERR(0, 59, __pyx_L10_error))
          __pyx_t_26 = 0;
          __pyx_t_27 = ((__pyx_v_site_fracs.shape[0]) + __pyx_v_phase_idx);
          *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_gradient_term.data) + __pyx_t_27)) )) = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_obj_res.data) + __pyx_t_26)) )));
 60: 
+61:             for dof_x_idx in range(cur_phase_dof):
          __Pyx_TraceLine(61,1,__PYX_ERR(0, 61, __pyx_L10_error))
          __pyx_t_4 = __pyx_v_cur_phase_dof;
          for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_t_4; __pyx_t_23+=1) {
            __pyx_v_dof_x_idx = __pyx_t_23;
+62:                 for dof_y_idx in range(dof_x_idx,cur_phase_dof):
            __Pyx_TraceLine(62,1,__PYX_ERR(0, 62, __pyx_L10_error))
            __pyx_t_28 = __pyx_v_cur_phase_dof;
            for (__pyx_t_29 = __pyx_v_dof_x_idx; __pyx_t_29 < __pyx_t_28; __pyx_t_29+=1) {
              __pyx_v_dof_y_idx = __pyx_t_29;
+63:                     l_hessian[var_offset+dof_x_idx, var_offset+dof_y_idx] = \
              __Pyx_TraceLine(63,1,__PYX_ERR(0, 63, __pyx_L10_error))
              __pyx_t_30 = (__pyx_v_var_offset + __pyx_v_dof_x_idx);
              __pyx_t_31 = (__pyx_v_var_offset + __pyx_v_dof_y_idx);
              *((double *) ( /* dim=1 */ (( /* dim=0 */ ((char *) (((double *) __pyx_v_l_hessian.data) + __pyx_t_30)) ) + __pyx_t_31 * __pyx_v_l_hessian.strides[1]) )) = (__pyx_v_phase_frac * (__pyx_v_tmp_hess_ptr[((2 + __pyx_v_dof_x_idx) + ((2 + __pyx_v_cur_phase_dof) * (2 + __pyx_v_dof_y_idx)))]));
 64:                       phase_frac * tmp_hess_ptr[2+dof_x_idx + (2+cur_phase_dof)*(2+dof_y_idx)]
+65:                     l_hessian[var_offset+dof_y_idx, var_offset+dof_x_idx] = \
              __Pyx_TraceLine(65,1,__PYX_ERR(0, 65, __pyx_L10_error))
              __pyx_t_34 = (__pyx_v_var_offset + __pyx_v_dof_y_idx);
              __pyx_t_35 = (__pyx_v_var_offset + __pyx_v_dof_x_idx);
              *((double *) ( /* dim=1 */ (( /* dim=0 */ ((char *) (((double *) __pyx_v_l_hessian.data) + __pyx_t_34)) ) + __pyx_t_35 * __pyx_v_l_hessian.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ ((char *) (((double *) __pyx_v_l_hessian.data) + __pyx_t_32)) ) + __pyx_t_33 * __pyx_v_l_hessian.strides[1]) )));
            }
+66:                       l_hessian[var_offset+dof_x_idx, var_offset+dof_y_idx]
              __Pyx_TraceLine(66,1,__PYX_ERR(0, 66, __pyx_L10_error))
              __pyx_t_32 = (__pyx_v_var_offset + __pyx_v_dof_x_idx);
              __pyx_t_33 = (__pyx_v_var_offset + __pyx_v_dof_y_idx);
 67:                 # Phase fraction / site fraction cross derivative
+68:                 l_hessian[site_fracs.shape[0] + phase_idx, var_offset + dof_x_idx] = \
            __Pyx_TraceLine(68,1,__PYX_ERR(0, 68, __pyx_L10_error))
            __pyx_t_37 = ((__pyx_v_site_fracs.shape[0]) + __pyx_v_phase_idx);
            __pyx_t_38 = (__pyx_v_var_offset + __pyx_v_dof_x_idx);
            *((double *) ( /* dim=1 */ (( /* dim=0 */ ((char *) (((double *) __pyx_v_l_hessian.data) + __pyx_t_37)) ) + __pyx_t_38 * __pyx_v_l_hessian.strides[1]) )) = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_grad_res.data) + __pyx_t_36)) )));
+69:                      grad_res[2+dof_x_idx] # Remove P,T grad part
            __Pyx_TraceLine(69,1,__PYX_ERR(0, 69, __pyx_L10_error))
            __pyx_t_36 = (2 + __pyx_v_dof_x_idx);
+70:                 l_hessian[var_offset + dof_x_idx, site_fracs.shape[0] + phase_idx] = grad_res[2+dof_x_idx]
            __Pyx_TraceLine(70,1,__PYX_ERR(0, 70, __pyx_L10_error))
            __pyx_t_39 = (2 + __pyx_v_dof_x_idx);
            __pyx_t_40 = (__pyx_v_var_offset + __pyx_v_dof_x_idx);
            __pyx_t_41 = ((__pyx_v_site_fracs.shape[0]) + __pyx_v_phase_idx);
            *((double *) ( /* dim=1 */ (( /* dim=0 */ ((char *) (((double *) __pyx_v_l_hessian.data) + __pyx_t_40)) ) + __pyx_t_41 * __pyx_v_l_hessian.strides[1]) )) = (*((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_grad_res.data) + __pyx_t_39)) )));
          }
+71:             var_offset += cur_phase_dof
          __Pyx_TraceLine(71,1,__PYX_ERR(0, 71, __pyx_L10_error))
          __pyx_v_var_offset = (__pyx_v_var_offset + __pyx_v_cur_phase_dof);
+72:             phase_idx += 1
          __Pyx_TraceLine(72,1,__PYX_ERR(0, 72, __pyx_L10_error))
          __pyx_v_phase_idx = (__pyx_v_phase_idx + 1);
        }
+73:     l_hessian -= np.einsum('i,ijk->jk', l_multipliers, constraint_hess, order='F')
  __Pyx_TraceLine(73,0,__PYX_ERR(0, 73, __pyx_L1_error))
  __pyx_t_6 = __pyx_memoryview_fromslice(__pyx_v_l_hessian, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_einsum); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_INCREF(__pyx_kp_u_i_ijk_jk);
  __Pyx_GIVEREF(__pyx_kp_u_i_ijk_jk);
  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_kp_u_i_ijk_jk);
  __Pyx_INCREF(((PyObject *)__pyx_v_l_multipliers));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_l_multipliers));
  PyTuple_SET_ITEM(__pyx_t_7, 1, ((PyObject *)__pyx_v_l_multipliers));
  __Pyx_INCREF(((PyObject *)__pyx_v_constraint_hess));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_constraint_hess));
  PyTuple_SET_ITEM(__pyx_t_7, 2, ((PyObject *)__pyx_v_constraint_hess));
  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_u_F) < 0) __PYX_ERR(0, 73, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_InPlaceSubtract(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dcd__double(__pyx_t_5);
  if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __PYX_XDEC_MEMVIEW(&__pyx_v_l_hessian, 1);
  __pyx_v_l_hessian = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+74:     return np.asarray(l_hessian), np.asarray(gradient_term)
  __Pyx_TraceLine(74,0,__PYX_ERR(0, 74, __pyx_L1_error))
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_l_hessian, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_6, function);
    }
  }
  if (!__pyx_t_7) {
    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 74, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_5);
  } else {
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_6)) {
      PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_1};
      __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
      PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_1};
      __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else
    #endif
    {
      __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7); __pyx_t_7 = NULL;
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_2, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_gradient_term, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  if (!__pyx_t_7) {
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 74, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_6);
  } else {
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_1)) {
      PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_2};
      __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) {
      PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_2};
      __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else
    #endif
    {
      __pyx_t_42 = PyTuple_New(1+1); if (unlikely(!__pyx_t_42)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_42);
      __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_42, 0, __pyx_t_7); __pyx_t_7 = NULL;
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_42, 0+1, __pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_42, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_42); __pyx_t_42 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

In [29]:
%load_ext line_profiler
%lprun -f _build_multiphase_system equilibrium(dbf, ['AL', 'FE', 'VA'], list(dbf.phases.keys()), {v.T: 700, v.X('AL'): (0,1,0.02), v.P: 101325}, model=models, build_multiphase_system=_build_multiphase_system)


The line_profiler extension is already loaded. To reload it, use:
  %reload_ext line_profiler

In [ ]:


In [ ]: