Project dependencies may have API risk issues
PyDeps opened this issue · comments
Hi, In Theano, inappropriate dependency versioning constraints can cause risks.
Below are the dependencies and version constraints that the project is using
nose
numpy
parameterized
requests
scipy
six
sympy
The version constraint == will introduce the risk of dependency conflicts because the scope of dependencies is too strict.
The version constraint No Upper Bound and * will introduce the risk of the missing API Error because the latest version of the dependencies may remove some APIs.
After further analysis, in this project,
The version constraint of dependency six can be changed to >=1.9.0,<=1.16.0.
The above modification suggestions can reduce the dependency conflicts as much as possible,
and introduce the latest version as much as possible without calling Error in the projects.
The invocation of the current project includes all the following methods.
In version six-1.8.0, the API six.raise_from whch is used by the current project in theano/scan_module/scan_op.py is missing.
The calling methods from the six
six.iterkeys six.itervalues six.reraise six.iteritems six.with_metaclass six.b six.raise_from
The calling methods from the all methods
flatbody pygpu.gpuarray.empty basic_ops.gpuarray_helper_inc_dir self.get_gpu_context_c_name general_toposort _gemm_from_factored_list GpuDnnSoftmax myThread.start out_idx_list.append self._nodes_removed.update warnings.filterwarnings ret_idx.ret_val.op.idx_dtype.op.sorted.op.axis.TopKOp theano.tensor.elemwise.Sum sd_csr s.input_shape.all keys.setdefault axis.elemwise.Any self.BORDER_MODE.c_support_code distutils.command.build_py.build_py.run Alloc numpy.array SoftmaxWithBias.c_code_cache_version numpy.product nd.op.outer_mitsot_outs theano.compile.mode.get_default_mode.excluding mod blocks.append new_order.input.type.broadcastable.op.__class__ self.use_blas theano.config.floatX.np.sctypeDict self.grad fig.add_subplot.legend recursive_destroys_finder i.self.types.values_eq_approx used_ids.done.StringIO.new_r.theano.compile.debugmode.debugprint.getvalue cudnn_defs.get_definitions self.Erfcx.super.impl true_div code_gen re.type.values_eq_approx Ceil x.c_lib_dirs l.strip.append feature.orderings seed.as_scalar.astype theano.tensor.as_tensor_variable.__setitem__ theano.tensor.arange numpy.absolute theano.tensor.slinalg.cholesky A.dtype.startswith self.__get_expanded_dim obj.toposort LocalOptGroup Canonizer out.insert as_tensor_variable Composite attach reverse_dict impl random_projection new_dims.append nose.tools.assert_raises timings.sort len.DimShuffle ContextNotDefined numpy.arange.copy sp_sum theano.tensor.blas.blas_header_version test.test_gradinput self.axis.iteritems.value.axis.axis.x.type.broadcastable.axis.Rebroadcast theano.scan_module.scan_op.Scan.inner_sitsot eye len.type node.op.unshared.node.op.num_groups.node.op.filter_dilation.node.op.subsample.node.op.border_mode.CorrMM_gradInputs mode.Choose Subtensor self.expand_in Corr3dMM_gradWeights self.get_lop_op.type apply_local_dimshuffle_lift dtype.theano.scalar.Scalar.make_variable self.type theano.gof.cc.get_module_cache.refresh ctc_available x.c_header_dirs theano.tensor.basic.le indices.ndim.basic.TensorType os.path.normcase theano.tensor.type.TensorType.zeros_like var_name as_tensor_variable.reshape post_thunk_clear.append theano.tensor.prod numpy.fft.irfftn l.pop self.items theano.gof.cc.failure_code potrf_bufferSize self.variable_strides.get theano.tensor.matrix.type self._gw_fft Trunc os.path.dirname ArcTanh UnaryScalarOp.__hash__ length.range.list.difference.input.type.broadcastable.dim_shuffle theano.compat.DefaultOrderedDict DeviceParam self.get_node_infer_shape CuDNNV51ConvCaseGenerator Maker kern.type.clone.filter_variable self.get_lop_op theano.gof.opt.TopoOptimizer.optimize self.MaxPoolRop.super.c_headers self.__setup_node__ nd.op.outer_nitsot self.CorrMM_gradWeights.super.c_code_helper sub_policy _structured_dot theano.tensor.nnet.corr.CorrMM shutil.move theano.tensor.nnet.blocksparse.sparse_block_gemv_inplace try_march_flag movable.append six.raise_from ctx_name.y_idx.type.broadcastable.x.type.dtype.GpuArrayType subtensor.GpuAdvancedIncSubtensor1_dev20 numpy.int32 plus_or_dot fig.add_subplot.plot uniform self.AdvancedIncSubtensor.super.make_node theano.gpuarray.tests.check_dnn_conv.CheckDnn.print_infos get_loop_strides node.op.c_code_cache_version_apply self.reciprocal self.GpuCorrMM_gradInputs.super.__init__ copy.copy._k_reduce_buf_multiple l.strip in1.astype pydot.Dot.add_subgraph x_.shape.x_flat.reshape.transpose theano.tensor.floor o_fn theano_dtype Invert LeafPrinter.process to_del.append theano.gof.opt.PatternSub self.make_node.run_params opt.excluding self.update_shape theano.tensor.as_tensor_variable.__getitem__ and_ render Usmm theano.tensor.extra_ops.repeat theano.scan_module.scan_utils.equal_computations datetime.datetime.now Count h.pop baseline.values _type.c_lib_dirs merge_two_slices copy.copy.summary self.__dict__.clear inputs.type.context_name.GpuFromHost self.deepcopy get_lines.split shf.reshape.dimshuffle to_sum.append fname.open.close AddConfigVar gradients.dimshuffle.grad_op.T.basic.batched_dot.dimshuffle self.op_may_fail_with_subsample self.unshared.self.num_groups.self.filter_dilation.self.filter_flip.self.subsample.self.border_mode.self.kshp.self.imshp.AbstractConv2d_gradWeights exec_multilayer_conv_nnet self.seq_opt _type.c_no_compile_args _is_const operator_eq_cplx collections.OrderedDict.items z_dims.append theano.compile.OpFromGraph.make_node app.add_stylesheet theano.gof.Optimizer.__init__ elemwise.Elemwise theano.tensor.basic.maximum ConvCase clone ind2.ind1.x.np.asarray.flatten theano.tensor.subtensor.Subtensor irfft_op attr.startswith _get_atol_rtol self.num_groups.self.filter_dilation.self.subsample.self.border_mode.Corr3dMM_gradInputs LessEqualSS sphinx_rtd_theme.get_html_theme_path self.__infer_shape scipy.special.psi self.convert_variable _prepare_batch_normalization_axes broadcastable.kern.type.clone self.f.sync inputs.dtype.inputs.dtype.op.axis.GpuDnnReduction reduced.dimshuffle _sum_grad_over_bcasted_dims theano.gof.link.gc_helper outer_input_indices.append pygpu.concatenate CodeBlock inputs.astype.dimshuffle result.cache.get rfft_op ret.requiring.requiring run_with_tensortype_filter_check self.GpuKernelBase.super.c_header_dirs theano.tensor.as_tensor_variable.min spec_pos theano.gof.cmodule.GCC_compiler.compile_args list.reverse GpuGer self.mitmot_taps self.L_op theano.tensor.basic.as_tensor_variable.max switch_neg_step theano.tensor.zeros_like.flatten theano.gof.MergeOptimizer usmm_csc_dense_inplace self.mode.self.ignore_border.self.ndim.AveragePoolGrad init_dev CGemv precision.dtype.self.ndim.algo.cudnn_conv_case_generator.fwd.get_cases theano.gradient.grad_undefined gf x.op.__class__.__name__.lower.startswith the_split theano.gpuarray.basic_ops.GpuFromHost self.simplify_constants find_node self.c_compiler.compile_str theano.tensor.basic.ones_like opt.register_opt2 theano.tensor.basic.sqrt self.outer_shared theano.gof.cc.CLinker.accept.make_thunk BinaryScalarOp.__init__ node.op.dtype.opt_type d.get.get TriGamma.st_impl theano.scalar.basic.Apply self.info.get git_versions_from_keywords chol_x.T.dot theano.tensor.DimShuffle theano.tensor.as_tensor_variable.dot self.AND.super.c_code_cache_version open.write numpy.linalg.det self.msg.replace.replace.Assert self.params_type.c_code_cache_version self.get_grad b_shape.insert new_r.equivalence_sets.update _topk_py_impl param_list.append theano.gof.utils.from_return_values GraphToGPUDB AddSSData self.num_groups.self.filter_dilation.self.subsample.self.border_mode.GpuCorr3dMM_gradInputs theano.tensor.as_tensor_variable.sum ctc.GpuConnectionistTemporalClassification.local_optimizer MulSS self.fields.index os.path.dirname.startswith node.op.ops_with_inner_function.free dnn_batch_normalization_test.dimshuffle theano.tensor.basic.constant.signature copt.merge_profile GpuArraySignature self.variables.set.difference slicetype csm_grad type_instance.c_support_code theano.configparser.BoolParam idx.append numpy.random.uniform Mul self.cpu_conv_class Choose RandomStateType scan_perform.scan_perform.get_version new_scan_args.inner_out_nit_sot.extend rest.append theano.tensor.flatten reindent.Reindenter GpuPool numpy.ndarray.copy theano.gpuarray.blas.gpu_dot22 ScalarSigmoid theano.gof.LocalGroupDB theano.sparse.utils.hash_from_sparse shape_infer theano.gof.cmodule.DynamicModule multinomial.ChoiceFromUniform actual.dimshuffle theano.sparse.basic.as_sparse_variable.type theano.scalar.as_common_dtype run_command prof2.index theano.gof.optdb.LocalGroupDB theano.gof.MethodNotDefined patternbroadcast self.Param.super.__init__ numpy.dtype self.rng.randn op.join add_clear_storage self.fields.join.encode dct.get numpy.random.RandomState.get_state self._sympy_c_code.split abs_ src.encode.encode Compositef32 f.__file__.os.path.split.os.path.join.open.read x.dtype.broadcastable.basic.TensorType.append self.attach_updater self._update ob.input.type.dtype.TensorType theano.tensor.as_tensor_variable.sort_indices self.types.t.t.str.join.encode dtype.scalar.Scalar _is_sparse_variable ScalarSharedVariable test.test_gradweight_runtime_algorithms self.lines.insert nw_x.type.filter scipy.special.i0 redux.append self.Sgn.super.c_code_cache_version GreaterEqualSS itertools.product mode.QRFull p.replace.replace dnn_gradweight theano.Out collections.deque.extendleft precision.dtype.self.ndim.algo.cudnn_conv_case_generator.gw.get_cases theano.gof.Apply new_l_names.index pattern.xmax.broadcastable.DimShuffle T.arange rval1_scal.pow2_scal.theano.scalar.Composite.Elemwise.make_node train input_.clone cond.zeros_like version_type SparseFromDense components.sum N.rng.randint.astype dropoutdesc_type std_include_dirs six.BytesIO OpFromGraph._filter_rop_var theano.tensor.basic.Tensor self.typeInfer extraopts.append theano.tensor.elemwise.DimShuffle op.__class__.make_node numpy.random.random o.dimshuffle.reshape numpy.isscalar used_ids.done.StringIO.new_r.debugprint.getvalue node.fgraph.shape_feature.shape_ir _unitary bcast.self.dtype.inp.type.clone hash outer_fun GpuCorrMM_gradInputs filtersflipped.reshape.reshape inspect.getsourcelines ctx_name.img.dtype.GpuAllocEmpty is_mul Gemv num_groups.GpuDnnConv dx_terms.append scipy.special.erfcx power self.inplace_pattern.keys dtype.theano.tensor.opt.MakeVector theano.tensor.log2 Dot22 get_inp_idx theano.gof.utils.get_variable_trace_string exp_float32_op theano.gof.toolbox.NodeFinder leaves.pop out_map.get six.reraise encompasses_broadcastable mitmot_idx.new_mit_mot_out_slices.remove i.x_shp.arange.dimshuffle input.type.dtype_specs all_orderings.append theano.tensor.as_tensor_variable.dimshuffle six.b.endswith theano.gpuarray.cudnn_defs.get_definitions.bwd_filter_algo_supports_dtype_config opt.transform isinf_ self.mode.np.cumprod.np.cumsum n.op.connection_pattern var.clients.append new_outer_out_mit_mot.append fn_gov self.optimizer_profile.print_profile node.op.__class__.__name__.lower.startswith save_commit_message dr_vals.get git_describe.rindex.rindex self.num_groups.self.filter_dilation.self.subsample.self.border_mode.GpuCorr3dMM inputs.astype t.upper.upper SoftmaxWithBias conv.get b.broadcastable.GpuDimShuffle property gpu_reconstruct_graph numpy.distutils.misc_util.get_numpy_include_dirs root.GITS.run_command.strip.strip CSMProperties rlist.append broadcastable_to_str theano.scan_module.scan_op.Scan.inner_mitsot op.R_op self.CAReduceDtype.super.__setstate__ theano.misc.ordered_set.OrderedSet.i.self.view_o.setdefault.add get_module_cache.module_from_key os.path.getsize os.rmdir k.owner.outputs.index AdvancedIncSubtensor self.loaded_key_pkl.remove rightdims.leftdims.GpuReshape MPIRecvWait dnn_present theano.tensor.basic.eq copy.copy._acc_dtype EquilibriumOptimizer theano.compile.shared_constructor self.TensorVariable.super.__init__ theano.compile.optdb.register self.noinput_nodes.discard self.CEnumType.super.c_code_cache_version self.unshared.self.num_groups.self.filter_dilation.self.subsample.self.border_mode.CorrMM_gradWeights _make_rnn_desc Expm1 self.scale_numpy_arrays_inplace TestDnnConv2D self.lscalar_one.equals v.type.filter_variable filter_dilation.subsample.border_mode.GpuCorr3dMM copy.copy.add theano.scalar.basic.upcast theano.tensor.nnet.blocksparse.sparse_block_outer_inplace str self.class_impl numpy.asarray.all context_name.inp2.broadcastable.inp1.dtype.GpuArrayType pattern.get self.dy.self.dx.zz.copy axis.CumOp pattern.clone v.get_value self.EquilibriumDB.super.query numpy.complex64 theano.tensor.basic.sum.astype compose_impl op.outer_seqs.dimshuffle i.opts.print_profile diff_file.write as_sparse_variable.type inplace_pattern.new_scal.self.op numpy.std numpy.sin.zeros_like old_f mean self.kernel_version log_thunk_trace round_half_away_from_zero self.ConvOp.super.__init__ compute_uv.full_matrices.SVD copy.copy.pop potrs v.zeros_like.astype dnn_conv theano.tensor.opt.ShapeFeature theano.misc.windows.subprocess_Popen.rstrip os.system basic_ops.infer_context_name._RNNParamSize Exp2 tensor.zeros_like crossentropy_categorical_1hot_grad NotThisMethod six.moves.reduce.remove c.self.local_optimizers_map.setdefault.append init_tasks.append seq.append theano.scan_module.scan_utils.isNaN_or_Inf_or_None imp.find_module getrf_bufferSize theano.config.blas.ldflags.split offset.idx.mitmot_inp_taps.append pycuda.compiler.SourceModule specify_shape six.moves.cPickle.load.add_key self.SequenceDB.super.register new_then_branch.append GpuFromHost theano.tensor.subtensor.make_constant.append self.n_streams theano.gof.link.PerformLinker scipy.signal.signaltools._valfrommode GpuKernelBase.gpu_kernels StructuredDotGradCSC NoCuDNNRaise numpy.getbuffer self.scalar_op.c_support_code plugins.append constant os.makedirs collections.defaultdict.update theano.scan_module.scan type.EQ_MAP.get keyring.set_password ConfigParser.SafeConfigParser.has_option open.flush AbstractBatchNormInference theano.gof.DestroyHandler theano.tensor.elemwise.DimShuffle.make_node self.check_key self.summary_nodes sum copy.copy.c_code_reduce_01X self.section_re.split node_output_size.append self.ndim.self.mode.self.ignore_border.DownsampleFactorMaxGradGrad self.odtype.theano.scalar.Scalar.dtype_specs pre_v_shape.append localop belongs_to_set_idx.all_sets.append GetCheckpoint theano.tensor.nlinalg.trace complex assert_op theano.tensor.pow ctypes.addressof theano.tensor.ceil_intdiv a_shape.insert test.test_fwd theano.gof.cmodule.DynamicModule.add_include cast.flatten theano.gof.MissingInputError theano.tensor.elemwise.CAReduceDtype.make_node logging.getLogger theano.tensor.basic.invert self._as_tuple_of_tuples self.dtype.scal.get_scalar_type.c_compile_args self.ttype.values_eq DisconnectedInputError six.moves.StringIO.r.debugprint.getvalue theano.tensor.nonzero count_minimum_peak is_double_config var.type.context_name.var.type.dtype.GpuAllocEmpty out.eliminate_zeros GpuDnnPoolGrad inline_reduce_max theano.tensor.opt.register_specialize_device IncSubtensor theano.tensor.basic.nonzero_values platform.platform numpy.minimum.argmax type_instance.c_init mode.GpuDnnPool input.clone outputs.gpu_x.owner.op.transfer self._lop_op out.__len__ theano.configdefaults.config.init_gpu_device.startswith s.np.arange.reshape OpenMPOp.test_gxx_support bcast.append os.path.islink theano.tensor.basic.prod.insert tensout.ndim.tensor.DimShuffle structured_dot_grad theano.tensor.opt.local_elemwise_fusion_op scipy.linalg.cholesky inline_reduce_sum numpy.prod json.dumps Images2Neibs set.update as_sparse_variable.__class__ self.assertFunctionContains make_vector gpu_cast_op gw.np.diag.dot basic_ops.empty_like theano.tensor.basic.max_and_argmax thunk1 GradClip self.wrapper.self.linkers.self.type.accept input theano.tensor.basic.Rebroadcast self.printers.insert self._dilations p_size.cur_pos.cur_pos.x.reshape value.np.isnan.sum UPLO.Eigh typename compute_out numpy.tri getattr s.prod.out.astype TopoOptimizer self.Constant._as_TensorVariable tmp_input.index theano.tensor.elemwise.CAReduceDtype.make_node.copy Clip self.CuDNNV6.super.bwd_data_algo_supports_dtype_config d.copy.get as_scalar self.tag_to_remove.extend theano.tensor.Rop reverse idx.mitmot_out_taps.append theano.printing.pd.Dot.add_node CorrMM_gradWeights DoubleOp basic_ops.infer_context_name._DropoutDescriptor dnn_batch_normalization_train theano.gof.link.Container self.inner_non_seqs theano.grad types_string.hashlib.sha256.hexdigest op.old_op.global_fn outer_inp_sitsot.append theano.compat.configparser.SafeConfigParser.ConfigParser.ConfigParser.PY3.read v.owner.outputs.index self.rng.normal theano.gof.fg.FunctionGraph.destroyers set_type.remove reduce node.op.make_py_thunk x.astype.astype sys.stderr.write u.owner.op r.owner.op.type.self.printers_dict.process DeepCopyOp self.EquilibriumOptimizer.super.add_requirements locals.strip local_gpua_specifyShape_graph self.linker.clone item.equals trans_solve_op itertools.count v.astype self.test_fwd_runtime_algorithms sub.copy.copy numpy.linalg.norm c.get_value.sync d.copy.copy inp.type.clone scipy.special.jv theano.tensor.basic.div_proxy verbose.unroll_patch.unroll_kern.unroll_batch.conv_mode.ss.ss.bsize.nkern.kshp.imshp.ConvOp get_module_cache node.inputs.type.dtype_specs ipt.zeros_like _grad_helper inputs.zeros_like.astype fgraph.destroy_handler.root_destroyer.get search_make_one_sub theano.compile.optdb.add_tags zip_file.write six.b w.type.append theano.gof.EquilibriumDB basic_ops.gpu_contiguous.append string.split theano.tensor.opt.local_rebroadcast_lift.transform self.fgraph.orderings.get v.owner.op.perform _Linker as_sparse_variable.zeros_like self.inner_mitmot_outs self.RandomStreams.super.__init__ o.append self.copy_into feats.rng.randn.astype theano.tensor.basic.constant self.known_fgraphs.add theano.compile.function_module.std_fgraph theano.tensor.basic.extract_constant theano.configparser.IntParam self.gpu_kernels _scal_elemwise_with_nfunc rval.extend in2.astype TensorSolve self.Corr3dMM_gradWeights.super.c_code_helper self.BNComposite.super.__init__ theano.compile.pfunc.pfunc theano.gof.graph.io_toposort local_dimshuffle_lift.transform SparseType.may_share_memory clone_d.setdefault GpuToGpu i.owner.op.scalar_op digest self.Chi2SF.super.impl x.type.format.out_dtype.SparseType run_mercurial_command theano.tensor.scalar_from_tensor numpy.isnan Psi.st_impl GammaInc.st_impl self.__query__ numpy.exp.sum theano.gof.cmodule.GCC_compiler.try_compile_tmp theano.tensor.as_tensor_variable.zeros_like alloc_diag theano.tensor.ones_like self.__setstate__ theano.compile.mode.get_default_mode.including.excluding recursive_merge self.tri0 MakeVector dnn_case.is_bwd_data used_ids.done.StringIO.r.theano.compile.debugmode.debugprint.getvalue c_no_compile_args_list.extend input.dimshuffle.dimshuffle inp.clone theano.tests.run_tests_in_batch.main self.allow_gc.self.type.accept theano.gof.CLinker.cmodule_key_ pvi.astype six.b.split tmp_s_input.append PPrinter temp Cast theano.tensor.arctan self.direction_mode.self.rnn_mode.GpuDnnRNNOp transfer._others.append os.getenv.split NEQ _val.dimshuffle.reshape theano.tensor.basic.get_vector_length.extend importlib.invalidate_caches theano.shared.transfer pygpu.empty theano.tensor.zeros_like.type self.In.super.__init__ node.inputs.type.format.AddSD_ccode _gemm_from_node2 sit_sot_inner_slices.append inc_spec_pos linker.accept numpy.exp2 shuffle_ind.transpose.flatten execute self.axis.x.sum.np.asarray.ravel os.path.split HStack clip Prepend_scalar_constant_to_each_row UltraFastScalarSigmoid pydot.Dot.write cls._try_compile_tmp self.make_vm self.variable_shape.get cos self.d.setdefault _dnn_conv self.conv join.print_summary flags.extend blas.GpuCorrMM_gradWeights theano.compile.In.append Abs load_back self.Variable.super.__init__ self._gi_winograd numpy.where AdvancedBooleanIncSubtensor self.nodes_seen.add b_val.type inline_reduce_fixed_shared grad_input_op inp.type.value_zeros value.min s.fgraph.toposort T.as_tensor potrf theano.tensor.ivector givens.keys optimizer self.inner_mitsot_outs local_gpua_assert_graph ax.numerator.shape.astype GpuSoftmaxWithBias node_prereqs.append CuDNNV6ConvCaseGenerator theano.tensor.inc_subtensor NotImplementedError numpy.int8 client.op.__class__.__name__.lower theano.compile.orig_function self.BaseCorrMM.super.c_compile_args node.outputs.dtype.tensor.TensorType.dtype_specs theano.tensor.arcsin stdout.flush self.Any.super.make_node IsNan softmax_op a2.append Validator.on_attach copy.copy._get_vnames maximum TensorInv self._sum.np.asarray.item zip Unlocker theano.tensor.basic.gt os.path.realpath.read self.make_view_array broadcastable.x.type.clone compute_all_gradients key_data.get_entry.startswith out.Composite.super.__init__ wrapper self.d.get pickle.Pickler distutils.command.sdist.sdist.make_release_tree self.op.get_params os.path.isabs self.process_node self.refresh c_header_dirs_list.extend theano.tensor.blas.blas_optdb.register self.GpuCorrMM_gradWeights.super.__init__ results_to_print.append theano.sparse.basic.csm_indices getattr.get _type.c_init_code cleanup_sub_profs.extend theano.tensor.basic.as_tensor_variable.fill theano.gof.type.Generic SparseConstantSignature theano.tensor.basic.min LE theano.tensor.nnet.ultra_fast_sigmoid theano.tensor.opt.apply_rebroadcast_opt rval.reshape.reshape self.DnnBase.super.c_code_cache_version distutils.sysconfig.get_python_inc theano.compile.mode.AddFeatureOptimizer mitmot_inp_taps.append theano.tensor.blas.blas_header_text Rebroadcast input_update.items platform.processor six.moves.xrange.Sum node.op.unshared.node.op.num_groups.node.op.filter_dilation.node.op.subsample.node.op.border_mode.GpuCorrMM_gradWeights var.type.may_share_memory numpy.random.rand.astype ...
@developer
Could please help me check this issue?
May I pull a request to fix it?
Thank you very much.
Theano isn't developed anymore. See the warning at the top of this readme:
https://github.com/Theano/Theano