Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 
bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import theano.tensor as T
WARNING (theano.gof.cmodule): OPTIMIZATION WARNING: Theano was not able to 
find the g++ parameters that tune the compilation to your  specific CPU. 
This can slow down the execution of Theano functions. Please submit the 
following lines to Theano's mailing list so that we can fix this problem:
 <generator object decode_iter at 0x04173E10>
===============================
00001    #include <Python.h>
00002    #include "theano_mod_helper.h"
00003    #include "structmember.h"
00004    #include <sys/time.h>
00005    
00006    #if PY_VERSION_HEX >= 0x03000000
00007    #include "numpy/npy_3kcompat.h"
00008    #define PyCObject_AsVoidPtr  NpyCapsule_AsVoidPtr
00009    #define PyCObject_GetDesc  NpyCapsule_GetDesc
00010    #define PyCObject_Check NpyCapsule_Check
00011    #endif
00012    
00013    #ifndef Py_TYPE
00014    #define Py_TYPE(obj) obj->ob_type
00015    #endif
00016    
00017    /**
00018    
00019    TODO: 
00020    - Check max supported depth of recursion
00021    - CLazyLinker should add context information to errors caught 
during evaluation. Say what node we were on, add the traceback attached to 
the node.
00022    - Clear containers of fully-useed intermediate results if allow_gc 
is 1
00023    - Add timers for profiling
00024    - Add support for profiling space used.
00025    
00026    
00027      */
00028    static double pytime(const struct timeval * tv)
00029    {
00030      struct timeval t;
00031      if (!tv)
00032        {
00033          tv = &t;
00034          gettimeofday(&t, NULL);
00035        }
00036      return (double) tv->tv_sec + (double) tv->tv_usec / 1000000.0;
00037    }
00038    
00039    /**
00040      Helper routine to convert a PyList of integers to a c array of 
integers.
00041      */
00042    static int unpack_list_of_ssize_t(PyObject * pylist, Py_ssize_t 
**dst, Py_ssize_t *len,
00043                                      const char* kwname)
00044    {
00045      Py_ssize_t buflen, *buf;
00046      if (!PyList_Check(pylist))
00047        {
00048          PyErr_Format(PyExc_TypeError, "%s must be list", kwname);
00049          return -1;
00050        }
00051      assert (NULL == *dst);
00052      *len = buflen = PyList_Size(pylist);
00053      *dst = buf = (Py_ssize_t*)calloc(buflen, sizeof(Py_ssize_t));
00054      assert(buf);
00055      for (int ii = 0; ii < buflen; ++ii)
00056        {
00057          PyObject * el_i = PyList_GetItem(pylist, ii);
00058          Py_ssize_t n_i = PyNumber_AsSsize_t(el_i, PyExc_IndexError);
00059          if (PyErr_Occurred())
00060            {
00061              free(buf);
00062              *dst = NULL;
00063              return -1;
00064            }
00065          buf[ii] = n_i;
00066        }
00067      return 0;
00068    }
00069    
00070    /**
00071    
00072      CLazyLinker
00073    
00074    
00075      */
00076    typedef struct {
00077        PyObject_HEAD
00078        /* Type-specific fields go here. */
00079        PyObject * nodes; // the python list of nodes
00080        PyObject * thunks; // python list of thunks
00081        PyObject * pre_call_clear; //list of cells to clear on call.
00082        int allow_gc;
00083        Py_ssize_t n_applies;
00084        int n_vars;    // number of variables in the graph
00085        int * var_computed; // 1 or 0 for every variable
00086        PyObject ** var_computed_cells;
00087        PyObject ** var_value_cells;
00088        Py_ssize_t **dependencies; // list of vars dependencies for GC
00089        Py_ssize_t *n_dependencies;
00090    
00091        Py_ssize_t n_output_vars;
00092        Py_ssize_t * output_vars; // variables that *must* be 
evaluated by call
00093    
00094        int * is_lazy; // 1 or 0 for every thunk
00095    
00096        Py_ssize_t * var_owner; // nodes[[var_owner[var_idx]]] is 
var[var_idx]->owner
00097        int * var_has_owner; //  1 or 0
00098    
00099        Py_ssize_t * node_n_inputs;
00100        Py_ssize_t * node_n_outputs;
00101        Py_ssize_t ** node_inputs;
00102        Py_ssize_t ** node_outputs;
00103        Py_ssize_t * node_inputs_outputs_base; // node_inputs and 
node_outputs point into this
00104        Py_ssize_t * node_n_prereqs;
00105        Py_ssize_t ** node_prereqs;
00106    
00107        Py_ssize_t * update_storage; // input cells to update with the 
last outputs in output_vars
00108        Py_ssize_t n_updates;
00109    
00110        void ** thunk_cptr_fn;
00111        void ** thunk_cptr_data;
00112        PyObject * call_times;
00113        PyObject * call_counts;
00114        int do_timing;
00115        int need_update_inputs;
00116        int position_of_error; // -1 for no error, otw the index into 
`thunks` that failed.
00117    } CLazyLinker;
00118    
00119    
00120    static void
00121    CLazyLinker_dealloc(PyObject* _self)
00122    {
00123      CLazyLinker* self = (CLazyLinker *) _self;
00124      free(self->thunk_cptr_fn);
00125      free(self->thunk_cptr_data);
00126    
00127      free(self->is_lazy);
00128    
00129      free(self->update_storage);
00130    
00131      if (self->node_n_prereqs)
00132        {
00133          for (int i = 0; i < self->n_applies; ++i)
00134            {
00135              free(self->node_prereqs[i]);
00136            }
00137        }
00138      free(self->node_n_prereqs);
00139      free(self->node_prereqs);
00140      free(self->node_inputs_outputs_base);
00141      free(self->node_n_inputs);
00142      free(self->node_n_outputs);
00143      free(self->node_inputs);
00144      free(self->node_outputs);
00145    
00146      if (self->dependencies)
00147        {
00148          for (int i = 0; i < self->n_vars; ++i)
00149            {
00150              free(self->dependencies[i]);
00151            }
00152          free(self->dependencies);
00153          free(self->n_dependencies);
00154        }
00155    
00156      free(self->var_owner);
00157      free(self->var_has_owner);
00158      free(self->var_computed);
00159      if (self->var_computed_cells)
00160        {
00161          for (int i = 0; i < self->n_vars; ++i)
00162            {
00163              Py_DECREF(self->var_computed_cells[i]);
00164              Py_DECREF(self->var_value_cells[i]);
00165            }
00166        }
00167      free(self->var_computed_cells);
00168      free(self->var_value_cells);
00169      free(self->output_vars);
00170    
00171      Py_XDECREF(self->nodes);
00172      Py_XDECREF(self->thunks);
00173      Py_XDECREF(self->call_times);
00174      Py_XDECREF(self->call_counts);
00175      Py_XDECREF(self->pre_call_clear);
00176      Py_TYPE(self)->tp_free((PyObject*)self);
00177    }
00178    static PyObject *
00179    CLazyLinker_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
00180    {
00181        CLazyLinker *self;
00182    
00183        self = (CLazyLinker *)type->tp_alloc(type, 0);
00184        if (self != NULL) {
00185          self->nodes = NULL;
00186          self->thunks = NULL;
00187          self->pre_call_clear = NULL;
00188    
00189          self->allow_gc = 1;
00190          self->n_applies = 0;
00191          self->n_vars = 0;
00192          self->var_computed = NULL;
00193          self->var_computed_cells = NULL;
00194          self->var_value_cells = NULL;
00195          self->dependencies = NULL;
00196          self->n_dependencies = NULL;
00197    
00198          self->n_output_vars = 0;
00199          self->output_vars = NULL;
00200    
00201          self->is_lazy = NULL;
00202    
00203          self->var_owner = NULL;
00204          self->var_has_owner = NULL;
00205    
00206          self->node_n_inputs = NULL;
00207          self->node_n_outputs = NULL;
00208          self->node_inputs = NULL;
00209          self->node_outputs = NULL;
00210          self->node_inputs_outputs_base = NULL;
00211          self->node_prereqs = NULL;
00212          self->node_n_prereqs = NULL;
00213    
00214          self->update_storage = NULL;
00215          self->n_updates = 0;
00216    
00217          self->thunk_cptr_data = NULL;
00218          self->thunk_cptr_fn = NULL;
00219          self->call_times = NULL;
00220          self->call_counts = NULL;
00221          self->do_timing = 0;
00222    
00223          self->need_update_inputs = 0;
00224          self->position_of_error = -1;
00225        }
00226        return (PyObject *)self;
00227    }
00228    
00229    static int
00230    CLazyLinker_init(CLazyLinker *self, PyObject *args, PyObject *kwds)
00231    {
00232        static char *kwlist[] = {
00233          (char*)"nodes",
00234          (char*)"thunks",
00235          (char*)"pre_call_clear",
00236          (char*)"allow_gc",
00237          (char*)"call_counts",
00238          (char*)"call_times",
00239          (char*)"compute_map_list",
00240          (char*)"storage_map_list",
00241          (char*)"base_input_output_list",
00242          (char*)"node_n_inputs",
00243          (char*)"node_n_outputs",
00244          (char*)"node_input_offset",
00245          (char*)"node_output_offset",
00246          (char*)"var_owner",
00247          (char*)"is_lazy_list",
00248          (char*)"output_vars",
00249          (char*)"node_prereqs",
00250          (char*)"node_output_size",
00251          (char*)"update_storage",
00252          (char*)"dependencies",
00253          NULL};
00254    
00255        PyObject *compute_map_list=NULL,
00256                 *storage_map_list=NULL,
00257                 *base_input_output_list=NULL,
00258                 *node_n_inputs=NULL,
00259                 *node_n_outputs=NULL,
00260                 *node_input_offset=NULL,
00261                 *node_output_offset=NULL,
00262                 *var_owner=NULL,
00263                 *is_lazy=NULL,
00264                 *output_vars=NULL,
00265                 *node_prereqs=NULL,
00266                 *node_output_size=NULL,
00267                 *update_storage=NULL,
00268                 *dependencies=NULL;
00269    
00270        assert(!self->nodes);
00271        if (! PyArg_ParseTupleAndKeywords(args, kwds, 
"OOOiOOOOOOOOOOOOOOOO", kwlist,
00272                                          &self->nodes,
00273                                          &self->thunks,
00274                                          &self->pre_call_clear,
00275                                          &self->allow_gc,
00276                                          &self->call_counts,
00277                                          &self->call_times,
00278                                          &compute_map_list,
00279                                          &storage_map_list,
00280                                          &base_input_output_list,
00281                                          &node_n_inputs,
00282                                          &node_n_outputs,
00283                                          &node_input_offset,
00284                                          &node_output_offset,
00285                                          &var_owner,
00286                                          &is_lazy,
00287                                          &output_vars,
00288                                          &node_prereqs,
00289                                          &node_output_size,
00290                                          &update_storage,
00291                                          &dependencies
00292                                          ))
00293            return -1;
00294        Py_INCREF(self->nodes);
00295        Py_INCREF(self->thunks);
00296        Py_INCREF(self->pre_call_clear);
00297        Py_INCREF(self->call_counts);
00298        Py_INCREF(self->call_times);
00299    
00300        Py_ssize_t n_applies = PyList_Size(self->nodes);
00301    
00302        self->n_applies = n_applies;
00303        self->n_vars = PyList_Size(var_owner);
00304    
00305        if (PyList_Size(self->thunks) != n_applies) return -1;
00306        if (PyList_Size(self->call_counts) != n_applies) return -1;
00307        if (PyList_Size(self->call_times) != n_applies) return -1;
00308    
00309        // allocated and initialize thunk_cptr_data and thunk_cptr_fn
00310        if (n_applies)
00311          {
00312            self->thunk_cptr_data = (void**)calloc(n_applies, 
sizeof(void*));
00313            self->thunk_cptr_fn = (void**)calloc(n_applies, 
sizeof(void*));
00314            self->is_lazy = (int*)calloc(n_applies, sizeof(int));
00315            self->node_prereqs = (Py_ssize_t**)calloc(n_applies, 
sizeof(Py_ssize_t*));
00316            self->node_n_prereqs = (Py_ssize_t*)calloc(n_applies, 
sizeof(Py_ssize_t));
00317            assert(self->node_prereqs);
00318            assert(self->node_n_prereqs);
00319            assert(self->is_lazy);
00320            assert(self->thunk_cptr_fn);
00321            assert(self->thunk_cptr_data);
00322    
00323            for (int i = 0; i < n_applies; ++i)
00324              {
00325                PyObject * thunk = PyList_GetItem(self->thunks, i);
00326                //thunk is borrowed
00327                if (PyObject_HasAttrString(thunk, "cthunk"))
00328                  {
00329                    PyObject * cthunk = PyObject_GetAttrString(thunk, 
"cthunk");
00330                    //new reference
00331                    assert (cthunk && PyCObject_Check(cthunk));
00332                    self->thunk_cptr_fn[i] = 
PyCObject_AsVoidPtr(cthunk);
00333                    self->thunk_cptr_data[i] = 
PyCObject_GetDesc(cthunk);
00334                    Py_DECREF(cthunk);
00335                    // cthunk is kept alive by membership in 
self->thunks
00336                  }
00337    
00338                PyObject * el_i = PyList_GetItem(is_lazy, i);
00339                self->is_lazy[i] = PyNumber_AsSsize_t(el_i, NULL);
00340    
00341                /* now get the prereqs */
00342                el_i = PyList_GetItem(node_prereqs, i);
00343                assert (PyList_Check(el_i));
00344                self->node_n_prereqs[i] = PyList_Size(el_i);
00345                if (self->node_n_prereqs[i])
00346                  {
00347                    self->node_prereqs[i] = (Py_ssize_t*)malloc(
00348                                  
PyList_Size(el_i)*sizeof(Py_ssize_t));
00349                    for (int j = 0; j < PyList_Size(el_i); ++j)
00350                      {
00351                        PyObject * el_ij = PyList_GetItem(el_i, j);
00352                        Py_ssize_t N = PyNumber_AsSsize_t(el_ij, 
PyExc_IndexError);
00353                        if (PyErr_Occurred())
00354                          return -1;
00355                        // N < n. variables
00356                        assert(N < PyList_Size(var_owner));
00357                        self->node_prereqs[i][j] = N;
00358                      }
00359                  }
00360              }
00361          }
00362        if (PyList_Check(base_input_output_list))
00363          {
00364            Py_ssize_t n_inputs_outputs_base = 
PyList_Size(base_input_output_list);
00365            self->node_inputs_outputs_base = 
(Py_ssize_t*)calloc(n_inputs_outputs_base,sizeof(Py_ssize_t));
00366            assert(self->node_inputs_outputs_base);
00367            for (int i = 0; i < n_inputs_outputs_base; ++i)
00368              {
00369                PyObject *el_i = 
PyList_GetItem(base_input_output_list, i);
00370                Py_ssize_t idx = PyNumber_AsSsize_t(el_i, 
PyExc_IndexError);
00371                if (PyErr_Occurred()) return -1;
00372                self->node_inputs_outputs_base[i] = idx;
00373              }
00374            self->node_n_inputs = 
(Py_ssize_t*)calloc(n_applies,sizeof(Py_ssize_t));
00375            assert(self->node_n_inputs);
00376            self->node_n_outputs = 
(Py_ssize_t*)calloc(n_applies,sizeof(Py_ssize_t));
00377            assert(self->node_n_outputs);
00378            self->node_inputs = 
(Py_ssize_t**)calloc(n_applies,sizeof(Py_ssize_t*));
00379            assert(self->node_inputs);
00380            self->node_outputs = 
(Py_ssize_t**)calloc(n_applies,sizeof(Py_ssize_t*));
00381            assert(self->node_outputs);
00382            for (int i = 0; i < n_applies; ++i)
00383              {
00384                Py_ssize_t N;
00385                N = PyNumber_AsSsize_t(PyList_GetItem(node_n_inputs, 
i),PyExc_IndexError);
00386                if (PyErr_Occurred()) return -1;
00387                assert (N <= n_inputs_outputs_base);
00388                self->node_n_inputs[i] = N;
00389                N = PyNumber_AsSsize_t(PyList_GetItem(node_n_outputs, 
i),PyExc_IndexError);
00390                if (PyErr_Occurred()) return -1;
00391                assert (N <= n_inputs_outputs_base);
00392                self->node_n_outputs[i] = N;
00393                N = 
PyNumber_AsSsize_t(PyList_GetItem(node_input_offset, i),PyExc_IndexError);
00394                if (PyErr_Occurred()) return -1;
00395                assert (N <= n_inputs_outputs_base);
00396                self->node_inputs[i] = 
&self->node_inputs_outputs_base[N];
00397                N = 
PyNumber_AsSsize_t(PyList_GetItem(node_output_offset, i),PyExc_IndexError);
00398                if (PyErr_Occurred()) return -1;
00399                assert (N <= n_inputs_outputs_base);
00400                self->node_outputs[i] = 
&self->node_inputs_outputs_base[N];
00401              }
00402          }
00403        else
00404          {
00405            PyErr_SetString(PyExc_TypeError, "base_input_output_list 
must be list");
00406            return -1;
00407          }
00408    
00409        // allocation for var_owner
00410        if (PyList_Check(var_owner))
00411          {
00412            self->var_owner = 
(Py_ssize_t*)calloc(self->n_vars,sizeof(Py_ssize_t));
00413            self->var_has_owner = 
(int*)calloc(self->n_vars,sizeof(int));
00414            self->var_computed = 
(int*)calloc(self->n_vars,sizeof(int));
00415            self->var_computed_cells = 
(PyObject**)calloc(self->n_vars,sizeof(PyObject*));
00416            self->var_value_cells = 
(PyObject**)calloc(self->n_vars,sizeof(PyObject*));
00417            for (int i = 0; i < self->n_vars; ++i)
00418              {
00419                PyObject * el_i = PyList_GetItem(var_owner, i);
00420                if (el_i == Py_None)
00421                  {
00422                    self->var_has_owner[i] = 0;
00423                  }
00424                else
00425                  {
00426                    Py_ssize_t N = PyNumber_AsSsize_t(el_i, 
PyExc_IndexError);
00427                    if (PyErr_Occurred()) return -1;
00428                    assert (N <= n_applies);
00429                    self->var_owner[i] = N;
00430                    self->var_has_owner[i] = 1;
00431                  }
00432                self->var_computed_cells[i] = 
PyList_GetItem(compute_map_list, i);
00433                Py_INCREF(self->var_computed_cells[i]);
00434                self->var_value_cells[i] = 
PyList_GetItem(storage_map_list, i);
00435                Py_INCREF(self->var_value_cells[i]);
00436              }
00437          }
00438        else
00439          {
00440            PyErr_SetString(PyExc_TypeError, "var_owner must be list");
00441            return -1;
00442          }
00443    
00444        if (dependencies != Py_None)
00445          {
00446            self->dependencies = (Py_ssize_t**)calloc(self->n_vars, 
sizeof(Py_ssize_t *));
00447            self->n_dependencies = (Py_ssize_t*)calloc(self->n_vars, 
sizeof(Py_ssize_t));
00448            assert(self->dependencies);
00449            assert(self->n_dependencies);
00450    
00451            for (int i = 0; i < self->n_vars; ++i)
00452              {
00453                PyObject *tmp = PyList_GetItem(dependencies, i);
00454                // refcounting - tmp is borrowed
00455                if (unpack_list_of_ssize_t(tmp, 
&self->dependencies[i], &self->n_dependencies[i],
00456                                           "dependencies"))
00457                  return -1;
00458              }
00459          }
00460    
00461        if (unpack_list_of_ssize_t(output_vars, &self->output_vars, 
&self->n_output_vars,
00462                                   "output_vars"))
00463          return -1;
00464        for (int i = 0; i < self->n_output_vars; ++i)
00465          {
00466            assert(self->output_vars[i] < self->n_vars);
00467          }
00468        if (unpack_list_of_ssize_t(update_storage, 
&self->update_storage, &self->n_updates,
00469                                   "updates_storage"))
00470          return -1;
00471        return 0;
00472    }
00473    static void set_position_of_error(CLazyLinker * self, int 
owner_idx)
00474    {
00475      if (self->position_of_error == -1)
00476        {
00477          self->position_of_error = owner_idx;
00478        }
00479    }
00480    static PyObject * pycall(CLazyLinker * self, Py_ssize_t node_idx, 
int verbose)
00481    {
00482      // call thunk to see which inputs it wants
00483      PyObject * thunk = PyList_GetItem(self->thunks, node_idx);
00484      // refcounting - thunk is borrowed
00485      PyObject * rval = NULL;
00486      if (self->do_timing)
00487        {
00488          double t0 = pytime(NULL);
00489          if (verbose) fprintf(stderr, "calling via Python (node 
%i)\n", (int)node_idx);
00490          rval = PyObject_CallObject(thunk, NULL);
00491          if (rval)
00492            {
00493              double t1 = pytime(NULL);
00494              double ti = PyFloat_AsDouble(
00495                             PyList_GetItem(self->call_times, 
node_idx));
00496              PyList_SetItem(self->call_times, node_idx,
00497                             PyFloat_FromDouble(t1 - t0 + ti));
00498              PyObject * count = PyList_GetItem(self->call_counts, 
node_idx);
00499              long icount = PyInt_AsLong(count);
00500              PyList_SetItem(self->call_counts, node_idx,
00501                             PyInt_FromLong(icount + 1));
00502          }
00503        }
00504      else
00505        {
00506          if (verbose)
00507            {
00508              fprintf(stderr, "calling via Python (node %i)\n", 
(int)node_idx);
00509            }
00510          rval = PyObject_CallObject(thunk, NULL);
00511        }
00512      return rval;
00513    }
00514    static int c_call(CLazyLinker * self, Py_ssize_t node_idx, int 
verbose)
00515    {
00516      void * ptr_addr = self->thunk_cptr_fn[node_idx];
00517      int (*fn)(void*) = (int (*)(void*))(ptr_addr);
00518      if (verbose) fprintf(stderr, "calling non-lazy shortcut (node 
%i)\n", (int)node_idx);
00519      int err = 0;
00520      if (self->do_timing)
00521        {
00522          double t0 = pytime(NULL);
00523          err = fn(self->thunk_cptr_data[node_idx]);
00524          double t1 = pytime(NULL);
00525          double ti = 
PyFloat_AsDouble(PyList_GetItem(self->call_times, node_idx));
00526          PyList_SetItem(self->call_times, node_idx, 
PyFloat_FromDouble(t1 - t0 + ti));
00527          PyObject * count = PyList_GetItem(self->call_counts, 
node_idx);
00528          long icount = PyInt_AsLong(count);
00529          PyList_SetItem(self->call_counts, node_idx, 
PyInt_FromLong(icount+1));
00530        }
00531      else
00532        {
00533          err = fn(self->thunk_cptr_data[node_idx]);
00534        }
00535    
00536      if (err)
00537        {
00538          // cast the argument to a PyList (as described near line 226 
of cc.py)
00539          PyObject * __ERROR = 
((PyObject**)self->thunk_cptr_data[node_idx])[0];
00540          assert (PyList_Check(__ERROR));
00541          assert (PyList_Size(__ERROR) == 3);
00542          PyObject * err_type = PyList_GetItem(__ERROR, 0); //stolen 
ref
00543          PyObject * err_msg = PyList_GetItem(__ERROR, 1); //stolen ref
00544          PyObject * err_trace = PyList_GetItem(__ERROR, 2); //stolen 
ref
00545          PyList_SET_ITEM(__ERROR, 0, Py_None); Py_INCREF(Py_None); 
//clobbers old ref
00546          PyList_SET_ITEM(__ERROR, 1, Py_None); Py_INCREF(Py_None); 
//clobbers old ref
00547          PyList_SET_ITEM(__ERROR, 2, Py_None); Py_INCREF(Py_None); 
//clobbers old ref
00548    
00549          assert(!PyErr_Occurred()); // because CLinker hid the 
exception in __ERROR aka data
00550          PyErr_Restore(err_type, err_msg, err_trace); //steals refs 
to args
00551        }
00552      if (err) set_position_of_error(self, node_idx);
00553      return err;
00554    }
00555    static
00556    int lazy_rec_eval(CLazyLinker * self, Py_ssize_t var_idx, 
PyObject*one, PyObject*zero)
00557    {
00558      PyObject *rval = NULL;
00559      int verbose = 0;
00560      int err = 0;
00561    
00562      if (verbose) fprintf(stderr, "lazy_rec computing %i\n", 
(int)var_idx);
00563    
00564      if (self->var_computed[var_idx] || !self->var_has_owner[var_idx])
00565        return 0;
00566    
00567      Py_ssize_t owner_idx = self->var_owner[var_idx];
00568    
00569      // STEP 1: compute the pre-requirements of the node
00570      // Includes input nodes for non-lazy ops.
00571      for (int i = 0; i < self->node_n_prereqs[owner_idx]; ++i)
00572        {
00573          Py_ssize_t prereq_idx = self->node_prereqs[owner_idx][i];
00574          if (!self->var_computed[prereq_idx])
00575            {
00576              err = lazy_rec_eval(self, prereq_idx, one, zero);
00577              if (err) return err;
00578            }
00579          assert (self->var_computed[prereq_idx]);
00580        }
00581    
00582      // STEP 2: compute the node itself
00583      if (self->is_lazy[owner_idx])
00584        {
00585          // update the compute_map cells corresponding to the inputs 
of this thunk
00586          for (int i = 0; i < self->node_n_inputs[owner_idx]; ++i)
00587            {
00588              int in_idx = self->node_inputs[owner_idx][i];
00589              if (self->var_computed[in_idx])
00590                {
00591                  Py_INCREF(one);
00592                  err = 
PyList_SetItem(self->var_computed_cells[in_idx], 0, one);
00593                }
00594              else
00595                {
00596                  Py_INCREF(zero);
00597                  err = 
PyList_SetItem(self->var_computed_cells[in_idx], 0, zero);
00598                }
00599              if (err) goto fail;
00600            }
00601    
00602          rval = pycall(self, owner_idx, verbose);
00603          // refcounting - rval is new ref
00604          //TODO: to prevent infinite loops
00605          // - consider check that a thunk does not ask for an input 
that is already computed
00606          if (rval == NULL)
00607            {
00608              assert (PyErr_Occurred());
00609              err = 1;
00610              goto fail;
00611            }
00612    
00613          //update the computed-ness of any output cells
00614          for (int i = 0; i < self->node_n_outputs[owner_idx]; ++i)
00615            {
00616              int out_idx = self->node_outputs[owner_idx][i];
00617              PyObject * el_i = 
PyList_GetItem(self->var_computed_cells[out_idx], 0);
00618              Py_ssize_t N = PyNumber_AsSsize_t(el_i, 
PyExc_IndexError);
00619              if (PyErr_Occurred())
00620                {
00621                  err = -1;
00622                  goto pyfail;
00623                }
00624              assert (N==0 || N==1);
00625              self->var_computed[out_idx] = N;
00626            }
00627          if (!self->var_computed[var_idx])
00628            {
00629              /*
00630               * If self is not computed after the call, this means 
that some
00631               * inputs are needed.  Compute the ones on the returned 
list
00632               * and try to compute the current node again (with 
recursive call).
00633               * This allows a node to request more nodes more than 
once before
00634               * finally yielding a result.
00635               */
00636              if (!PyList_Check(rval))
00637                {
00638                  //TODO: More helpful error to help find *which node* 
made this
00639                  // bad thunk
00640                  PyErr_SetString(PyExc_TypeError,
00641                                  "lazy thunk should return a list");
00642                  err = 1;
00643                  goto pyfail;
00644                }
00645    
00646              if (!PyList_Size(rval))
00647                {
00648                  PyErr_SetString(PyExc_ValueError,
00649                                  "lazy thunk returned empty list 
without computing output");
00650                  err = 1;
00651                  goto pyfail;
00652                }
00653    
00654              for (int i = 0; i < PyList_Size(rval); ++i)
00655                {
00656                  PyObject * el_i = PyList_GetItem(rval, i);
00657                  Py_ssize_t N = PyNumber_AsSsize_t(el_i, 
PyExc_IndexError);
00658                  if (PyErr_Occurred())
00659                    {
00660                      err = 1;
00661                      goto pyfail;
00662                    }
00663                  assert (N <= self->node_n_inputs[owner_idx]);
00664                  Py_ssize_t input_idx = 
self->node_inputs[owner_idx][N];
00665                  err = lazy_rec_eval(self, input_idx, one, zero);
00666                  if (err) goto pyfail;
00667                }
00668    
00669              Py_DECREF(rval);
00670              /*
00671               * We intentionally skip all the end-of-function 
processing
00672               * (mark outputs, GC) as it will be performed by the call
00673               * that actually manages to compute the result.
00674               */
00675              return lazy_rec_eval(self, var_idx, one, zero);
00676            }
00677    
00678          Py_DECREF(rval);
00679        }
00680      else //owner is not a lazy op. Ensure all intputs are evaluated.
00681        {
00682          // loop over inputs to owner
00683          // call lazy_rec_eval on each one that is not computed.
00684          // if there's an error, pass it up the stack
00685          for (int i = 0; i < self->node_n_inputs[owner_idx]; ++i)
00686            {
00687              Py_ssize_t input_idx = self->node_inputs[owner_idx][i];
00688              if (!self->var_computed[input_idx])
00689                {
00690                  err = lazy_rec_eval(self, input_idx, one, zero);
00691                  if (err) return err;
00692                }
00693              assert (self->var_computed[input_idx]);
00694            }
00695    
00696          // call the thunk for this owner.
00697          if (self->thunk_cptr_fn[owner_idx])
00698            {
00699              err = c_call(self, owner_idx, verbose);
00700              if (err) goto fail;
00701            }
00702          else
00703            {
00704              rval = pycall(self, owner_idx, verbose);
00705              //rval is new ref
00706              if (rval) //pycall returned normally (no exception)
00707                {
00708                  if (rval == Py_None)
00709                    {
00710                      Py_DECREF(rval); //ignore a return of None
00711                    }
00712                  else if (PyList_Check(rval))
00713                    {
00714                      PyErr_SetString(PyExc_TypeError,
00715                                      "non-lazy thunk should return 
None, not list");
00716                      err = 1;
00717                      goto pyfail;
00718                    }
00719                  else // don't know what it returned, but it wasn't 
right.
00720                    {
00721                      PyErr_SetObject(PyExc_TypeError, rval);
00722                      err = 1;
00723                      // We don't release rval since we put it in the 
error above
00724                      goto fail;
00725                    }
00726                }
00727              else // pycall returned NULL (internal error)
00728                {
00729                  err = 1;
00730                  goto fail;
00731                }
00732            }
00733        }
00734    
00735      // loop over all outputs and mark them as computed
00736      for (int i = 0; i < self->node_n_outputs[owner_idx]; ++i)
00737        {
00738          self->var_computed[self->node_outputs[owner_idx][i]] = 1;
00739        }
00740    
00741      // Free vars that are not needed anymore
00742      if (self->allow_gc)
00743        {
00744          for (int i = 0; i < self->node_n_inputs[owner_idx]; ++i)
00745            {
00746              int cleanup = 1;
00747              Py_ssize_t i_idx = self->node_inputs[owner_idx][i];
00748              if (!self->var_has_owner[i_idx])
00749                continue;
00750    
00751              for (int j = 0; j < self->n_output_vars; ++j)
00752                {
00753                  if (i_idx == self->output_vars[j])
00754                    {
00755                      cleanup = 0;
00756                      break;
00757                    }
00758                }
00759              if (!cleanup) continue;
00760    
00761              for (int j = 0; j < self->n_dependencies[i_idx]; ++j)
00762                {
00763                  if 
(!self->var_computed[self->dependencies[i_idx][j]])
00764                    {
00765                      cleanup = 0;
00766                      break;
00767                    }
00768                }
00769              if (!cleanup) continue;
00770    
00771              Py_INCREF(Py_None);
00772              err = PyList_SetItem(self->var_value_cells[i_idx], 0, 
Py_None);
00773    //See the Stack gc implementation for why we change it to 2 and 
not 0.
00774              self->var_computed[i_idx] = 2;
00775              if (err) goto fail;
00776            }
00777        }
00778    
00779      return 0;
00780     pyfail:
00781      Py_DECREF(rval);
00782     fail:
00783      set_position_of_error(self, owner_idx);
00784      return err;
00785    }
00786    
00787    static PyObject *
00788    CLazyLinker_call(PyObject *_self, PyObject *args, PyObject *kwds)
00789    {
00790      CLazyLinker * self = (CLazyLinker*)_self;
00791      static char *kwlist[] = {
00792        (char*)"time_thunks",
00793        (char *)"n_calls",
00794        NULL};
00795      int n_calls=1;
00796      if (! PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist,
00797                                        &self->do_timing,
00798                                        &n_calls))
00799        return NULL;
00800      int err = 0;
00801      self->position_of_error = -1;
00802      // create constants used to fill the var_compute_cells
00803      PyObject * one = PyInt_FromLong(1);
00804      PyObject * zero = PyInt_FromLong(0);
00805    
00806      // pre-allocate our return value
00807      Py_INCREF(Py_None);
00808      PyObject * rval = Py_None;
00809      //clear storage of pre_call_clear elements
00810      for (int call_i = 0; call_i < n_calls && (!err); ++call_i)
00811        {
00812          Py_ssize_t n_pre_call_clear = 
PyList_Size(self->pre_call_clear);
00813          assert(PyList_Check(self->pre_call_clear));
00814          for (int i = 0; i < n_pre_call_clear; ++i)
00815            {
00816              PyObject * el_i = PyList_GetItem(self->pre_call_clear, 
i);
00817              Py_INCREF(Py_None);
00818              PyList_SetItem(el_i, 0, Py_None);
00819            }
00820          //clear the computed flag out of all non-input vars
00821          for (int i = 0; i < self->n_vars; ++i)
00822            {
00823              self->var_computed[i] = !self->var_has_owner[i];
00824              if (self->var_computed[i])
00825                {
00826                  Py_INCREF(one);
00827                  PyList_SetItem(self->var_computed_cells[i], 0, one);
00828                }
00829              else
00830                {
00831                  Py_INCREF(zero);
00832                  PyList_SetItem(self->var_computed_cells[i], 0, zero);
00833                }
00834            }
00835    
00836          for (int i = 0; i < self->n_output_vars && (!err); ++i)
00837            {
00838              err = lazy_rec_eval(self, self->output_vars[i], one, 
zero);
00839            }
00840    
00841          if (!err)
00842            {
00843              // save references to outputs prior to updating storage 
containers
00844              assert (self->n_output_vars >= self->n_updates);
00845              Py_DECREF(rval);
00846              rval = PyList_New(self->n_output_vars);
00847              for (int i = 0; i < (self->n_output_vars); ++i)
00848                {
00849                  Py_ssize_t src = self->output_vars[i];
00850                  PyObject * item = 
PyList_GetItem(self->var_value_cells[src], 0);
00851                  if (self->var_computed[src] != 1)
00852                    {
00853                      err = 1;
00854                      PyErr_Format(PyExc_AssertionError,
00855                                   "The compute map of output %d 
should contain "
00856                                   "1 at the end of execution, not 
%d.",
00857                                   i, self->var_computed[src]);
00858                      break;
00859                    }
00860                  Py_INCREF(item);
00861                  PyList_SetItem(rval, i, item);
00862                }
00863            }
00864    
00865          if (!err)
00866            {
00867              // Update the inputs that have an update rule
00868              for (int i = 0; i < self->n_updates; ++i)
00869                {
00870                  PyObject* tmp = PyList_GetItem(rval, 
self->n_output_vars - self->n_updates + i);
00871                  Py_INCREF(tmp);
00872                  Py_ssize_t dst = self->update_storage[i];
00873                  PyList_SetItem(self->var_value_cells[dst], 0, tmp);
00874                }
00875            }
00876        }
00877    
00878      /*
00879        Clear everything that is left and not an output.  This is 
needed
00880        for lazy evaluation since the current GC algo is too 
conservative
00881        with lazy graphs.
00882      */
00883      if (self->allow_gc && !err)
00884        {
00885          for (Py_ssize_t i = 0; i < self->n_vars; ++i)
00886            {
00887              int do_cleanup = 1;
00888              if (!self->var_has_owner[i] || !self->var_computed[i])
00889                continue;
00890              for (int j = 0; j < self->n_output_vars; ++j)
00891                {
00892                  if (i == self->output_vars[j])
00893                    {
00894                      do_cleanup = 0;
00895                      break;
00896                    }
00897                }
00898              if (!do_cleanup)
00899                continue;
00900              Py_INCREF(Py_None);
00901              PyList_SetItem(self->var_value_cells[i], 0, Py_None);
00902            }
00903        }
00904      Py_DECREF(one);
00905      Py_DECREF(zero);
00906      if (err)
00907        {
00908          Py_DECREF(rval);
00909          return NULL;
00910        }
00911      return rval;
00912    }
00913    
00914    #if 0
00915    static PyMethodDef CLazyLinker_methods[] = {
00916        {
00917          //"name", (PyCFunction)CLazyLinker_accept, METH_VARARGS, 
"Return the name, combining the first and last name"
00918        },
00919        {NULL}  /* Sentinel */
00920    };
00921    #endif
00922    
00923    
00924    static PyObject *
00925    CLazyLinker_get_allow_gc(CLazyLinker *self, void *closure)
00926    {
00927        return PyBool_FromLong(self->allow_gc);
00928    }
00929    
00930    static int
00931    CLazyLinker_set_allow_gc(CLazyLinker *self, PyObject *value, void 
*closure)
00932    {
00933      if(!PyBool_Check(value))
00934        return -1;
00935    
00936      if (value == Py_True)
00937        self->allow_gc = true;
00938      else
00939        self->allow_gc = false;
00940      return 0;
00941    }
00942    
00943    static PyGetSetDef CLazyLinker_getset[] = {
00944      {(char*)"allow_gc",
00945       (getter)CLazyLinker_get_allow_gc,
00946       (setter)CLazyLinker_set_allow_gc,
00947       (char*)"do this function support allow_gc",
00948       NULL},
00949      {NULL, NULL, NULL, NULL}  /* Sentinel */
00950    };
00951    static PyMemberDef CLazyLinker_members[] = {
00952        {(char*)"nodes", T_OBJECT_EX, offsetof(CLazyLinker, nodes), 0,
00953         (char*)"list of nodes"},
00954        {(char*)"thunks", T_OBJECT_EX, offsetof(CLazyLinker, thunks), 
0,
00955         (char*)"list of thunks in program"},
00956        {(char*)"call_counts", T_OBJECT_EX, offsetof(CLazyLinker, 
call_counts), 0,
00957         (char*)"number of calls of each thunk"},
00958        {(char*)"call_times", T_OBJECT_EX, offsetof(CLazyLinker, 
call_times), 0,
00959         (char*)"total runtime in each thunk"},
00960        {(char*)"position_of_error", T_INT, offsetof(CLazyLinker, 
position_of_error), 0,
00961         (char*)"position of failed thunk"},
00962        {(char*)"time_thunks", T_INT, offsetof(CLazyLinker, 
do_timing), 0,
00963         (char*)"bool: nonzero means call will time thunks"},
00964        {(char*)"need_update_inputs", T_INT, offsetof(CLazyLinker, 
need_update_inputs), 0,
00965         (char*)"bool: nonzero means Function.__call__ must implement 
update mechanism"},
00966        {NULL}  /* Sentinel */
00967    };
00968    
00969    static PyTypeObject lazylinker_ext_CLazyLinkerType = {
00970    #if defined(NPY_PY3K)
00971        PyVarObject_HEAD_INIT(NULL, 0)
00972    #else
00973        PyObject_HEAD_INIT(NULL)
00974        0,                         /*ob_size*/
00975    #endif
00976        "lazylinker_ext.CLazyLinker",             /*tp_name*/
00977        sizeof(CLazyLinker), /*tp_basicsize*/
00978        0,                         /*tp_itemsize*/
00979        CLazyLinker_dealloc,       /*tp_dealloc*/
00980        0,                         /*tp_print*/
00981        0,                         /*tp_getattr*/
00982        0,                         /*tp_setattr*/
00983        0,                         /*tp_compare*/
00984        0,                         /*tp_repr*/
00985        0,                         /*tp_as_number*/
00986        0,                         /*tp_as_sequence*/
00987        0,                         /*tp_as_mapping*/
00988        0,                         /*tp_hash */
00989        CLazyLinker_call,          /*tp_call*/
00990        0,                         /*tp_str*/
00991        0,                         /*tp_getattro*/
00992        0,                         /*tp_setattro*/
00993        0,                         /*tp_as_buffer*/
00994        Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,        /*tp_flags*/
00995        "CLazyLinker object",      /* tp_doc */
00996        0,                         /* tp_traverse */
00997        0,                         /* tp_clear */
00998        0,                         /* tp_richcompare */
00999        0,                         /* tp_weaklistoffset */
01000        0,                         /* tp_iter */
01001        0,                         /* tp_iternext */
01002        0,//CLazyLinker_methods,       /* tp_methods */
01003        CLazyLinker_members,       /* tp_members */
01004        CLazyLinker_getset,        /* tp_getset */
01005        0,                         /* tp_base */
01006        0,                         /* tp_dict */
01007        0,                         /* tp_descr_get */
01008        0,                         /* tp_descr_set */
01009        0,                         /* tp_dictoffset */
01010        (initproc)CLazyLinker_init,/* tp_init */
01011        0,                         /* tp_alloc */
01012        CLazyLinker_new,           /* tp_new */
01013    };
01014    
01015    static PyObject * get_version(PyObject *dummy, PyObject *args)
01016    {
01017      PyObject *result = PyFloat_FromDouble(0.21);
01018      return result;
01019    }
01020    
01021    static PyMethodDef lazylinker_ext_methods[] = {
01022      {"get_version",  get_version, METH_VARARGS, "Get extension 
version."},
01023      {NULL, NULL, 0, NULL}        /* Sentinel */
01024    };
01025    
01026    #if defined(NPY_PY3K)
01027    static struct PyModuleDef moduledef = {
01028            PyModuleDef_HEAD_INIT,
01029            "lazylinker_ext",
01030            NULL,
01031            -1,
01032            lazylinker_ext_methods,
01033            NULL,
01034            NULL,
01035            NULL,
01036            NULL
01037    };
01038    #endif
01039    #if defined(NPY_PY3K)
01040    #define RETVAL m
01041    PyMODINIT_FUNC
01042    PyInit_lazylinker_ext(void) {
01043    #else
01044    #define RETVAL
01045    PyMODINIT_FUNC
01046    initlazylinker_ext(void) 
01047    {
01048    #endif
01049        PyObject* m;
01050    
01051        lazylinker_ext_CLazyLinkerType.tp_new = PyType_GenericNew;
01052        if (PyType_Ready(&lazylinker_ext_CLazyLinkerType) < 0)
01053            return RETVAL;
01054    #if defined(NPY_PY3K)
01055        m = PyModule_Create(&moduledef);
01056    #else
01057        m = Py_InitModule3("lazylinker_ext", lazylinker_ext_methods,
01058                           "Example module that creates an extension 
type.");
01059    #endif
01060        Py_INCREF(&lazylinker_ext_CLazyLinkerType);
01061        PyModule_AddObject(m, "CLazyLinker", (PyObject 
*)&lazylinker_ext_CLazyLinkerType);
01062    
01063        return RETVAL;
01064    }
01065    
===============================
Problem occurred during compilation with the command line below:
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\g++.exe -shared -g 
-DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -m32 -IC:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\numpy\core\include
 
-IC:\Program Files (x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\include 
-IC:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\gof 
-o 
C:\Users\hghg\AppData\Local\Theano\compiledir_Windows-8.1-6.3.9600-SP0-Intel64_Family_6_Model_69_Stepping_1_GenuineIntel-3.5.2-32\lazylinker_ext\lazylinker_ext.pyd
 
C:\Users\hghg\AppData\Local\Theano\compiledir_Windows-8.1-6.3.9600-SP0-Intel64_Family_6_Model_69_Stepping_1_GenuineIntel-3.5.2-32\lazylinker_ext\mod.cpp
 
-LC:\Program Files (x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\libs 
-LC:\Program Files (x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2 -lpython35
g++.exe: unrecognized option `-shared'
In file included from C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\include\Python.h:8,
                 from 
C:\Users\hghg\AppData\Local\Theano\compiledir_Windows-8.1-6.3.9600-SP0-Intel64_Family_6_Model_69_Stepping_1_GenuineIntel-3.5.2-32\lazylinker_ext\mod.cpp:1:
C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\include\pyconfig.h:258: 
warning: #warning "Please use an up-to-date version of gcc! (>2.91 
recommended)"
cc1plus.exe: Invalid option `32'
In file included from C:\\Program Files 
(x86)\\WinPython-32bit-3.5.2.2Qt5\\python-3.5.2\\include\\Python.h:132,
                 from 
C:\\Users\\hghg\\AppData\\Local\\Theano\\compiledir_Windows-8.1-6.3.9600-SP0-Intel64_Family_6_Model_69_Stepping_1_GenuineIntel-3.5.2-32\\lazylinker_ext\\mod.cpp:1:
C:\\Program Files 
(x86)\\WinPython-32bit-3.5.2.2Qt5\\python-3.5.2\\include\\fileutils.h:23: 
syntax error before `;'
C:\\Program Files 
(x86)\\WinPython-32bit-3.5.2.2Qt5\\python-3.5.2\\include\\fileutils.h:29: 
syntax error before `;'
[main] 
C:\cygnus\cygwin-b20\H-i586-cygwin32\lib\gcc-lib\i586-cygwin32\egcs-2.91.57\cc1plus.exe
 
1002 (0) handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
[main] cc1plus 1002 (0) handle_exceptions: Dumping stack trace to 
cc1plus.exe.core

Traceback (most recent call last):
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\gof\lazylinker_c.py",
 
line 74, in <module>
    raise ImportError()
ImportError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\gof\lazylinker_c.py",
 
line 91, in <module>
    raise ImportError()
ImportError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import theano.tensor as T
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\__init__.py",
 
line 63, in <module>
    from theano.compile import (
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\compile\__init__.py",
 
line 9, in <module>
    from theano.compile.function_module import *
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\compile\function_module.py",
 
line 22, in <module>
    import theano.compile.mode
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\compile\mode.py",
 
line 12, in <module>
    import theano.gof.vm
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\gof\vm.py",
 
line 638, in <module>
    from . import lazylinker_c
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\gof\lazylinker_c.py",
 
line 126, in <module>
    preargs=args)
  File "C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\lib\site-packages\theano\gof\cmodule.py",
 
line 2204, in compile_str
    (status, compile_stderr.replace('\n', '. ')))
Exception: Compilation failed (return status=1): g++.exe: unrecognized 
option `-shared'. In file included from C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\include\Python.h:8,.              
    
from 
C:\Users\hghg\AppData\Local\Theano\compiledir_Windows-8.1-6.3.9600-SP0-Intel64_Family_6_Model_69_Stepping_1_GenuineIntel-3.5.2-32\lazylinker_ext\mod.cpp:1:.
 
C:\Program Files 
(x86)\WinPython-32bit-3.5.2.2Qt5\python-3.5.2\include\pyconfig.h:258: 
warning: #warning "Please use an up-to-date version of gcc! (>2.91 
recommended)". cc1plus.exe: Invalid option `32'. In file included from 
C:\\Program Files 
(x86)\\WinPython-32bit-3.5.2.2Qt5\\python-3.5.2\\include\\Python.h:132,.        
          
from 
C:\\Users\\hghg\\AppData\\Local\\Theano\\compiledir_Windows-8.1-6.3.9600-SP0-Intel64_Family_6_Model_69_Stepping_1_GenuineIntel-3.5.2-32\\lazylinker_ext\\mod.cpp:1:.
 
C:\\Program Files 
(x86)\\WinPython-32bit-3.5.2.2Qt5\\python-3.5.2\\include\\fileutils.h:23: 
syntax error before `;'. C:\\Program Files 
(x86)\\WinPython-32bit-3.5.2.2Qt5\\python-3.5.2\\include\\fileutils.h:29: 
syntax error before `;'. [main] 
C:\cygnus\cygwin-b20\H-i586-cygwin32\lib\gcc-lib\i586-cygwin32\egcs-2.91.57\cc1plus.exe
 
1002 (0) handle_exceptions: Exception: STATUS_ACCESS_VIOLATION. [main] 
cc1plus 1002 (0) handle_exceptions: Dumping stack trace to 
cc1plus.exe.core. 
>>> 

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to